{"version":3,"sources":["/Users/zhangxinjie/WebstormProjects/dynamic-bonding-curve-sdk/packages/dynamic-bonding-curve/dist/index.cjs","../src/services/pool.ts","../src/types.ts","../src/constants.ts","../src/helpers/common.ts","../src/math/curve.ts","../src/math/safeMath.ts","../src/math/utilsMath.ts","../src/helpers/utils.ts","../src/helpers/accounts.ts","../src/helpers/validation.ts","../src/math/rateLimiter.ts","../src/helpers/buildCurve.ts","../src/helpers/createProgram.ts","../src/idl/dynamic-bonding-curve/idl.json","../src/idl/dynamic-vault/idl.json","../src/idl/damm-v1/idl.json","../src/idl/damm-v2/idl.json","../src/helpers/token.ts","../src/helpers/instructions.ts","../src/services/program.ts","../src/math/swapQuote.ts","../src/math/feeMath.ts","../src/math/feeScheduler.ts","../src/services/state.ts","../src/services/migration.ts","../src/services/partner.ts","../src/services/creator.ts","../src/client.ts"],"names":["ActivationType","TokenType","CollectFeeMode","DammV2DynamicFeeMode","MigrationOption","BaseFeeMode","MigrationFeeOption","TokenDecimal","TradeDirection","Rounding","TokenUpdateAuthorityOption","BN","PublicKey","Decimal"],"mappings":"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ACW,IAAA;AACzB,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACgB,IAAA;AAChB,IAAA;AACA,IAAA;AACa,MAAA;AACgB,MAAA;AACC,IAAA;AAC9B,IAAA;AACA,IAAA;AACiB,MAAA;AACyB,MAAA;AACJ,MAAA;AACA,IAAA;AACtC,IAAA;AACU,IAAA;AACV,IAAA;AACA,IAAA;AACA,EAAA;AAEJ,EAAA;AACJ;AZyjDA;AACA;AatwEA;AbwwEA;AACA;AczwEA;AAAA,EAAA;AACa,EAAA;AACC,IAAA;AACF,IAAA;AACG,IAAA;AACH,IAAA;AACO,EAAA;AACjB,EAAA;AACgB,IAAA;AACd,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACE,UAAA;AACG,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACQ,QAAA;AACN,UAAA;AACU,UAAA;AACA,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACA,QAAA;AACV,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,YAAA;AACW,cAAA;AACD,cAAA;AACC,gBAAA;AACP,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,YAAA;AACW,cAAA;AACD,cAAA;AACC,gBAAA;AACP,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACU,UAAA;AACG,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACE,UAAA;AACG,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACQ,QAAA;AACN,UAAA;AACU,UAAA;AACA,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACA,QAAA;AACV,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACE,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACiB,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACI,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACQ,QAAA;AACN,UAAA;AACU,UAAA;AACA,YAAA;AACK,cAAA;AACD,YAAA;AACV,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,QAAA;AACA,MAAA;AACF,MAAA;AACiB,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACD,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACW,QAAA;AACb,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACiB,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACU,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACW,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACQ,QAAA;AACN,UAAA;AACU,UAAA;AACA,YAAA;AACK,cAAA;AACD,YAAA;AACV,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACE,UAAA;AACG,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACW,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACQ,QAAA;AACN,UAAA;AACU,UAAA;AACA,YAAA;AACK,cAAA;AACD,YAAA;AACV,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACE,UAAA;AACG,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACiB,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACE,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACQ,QAAA;AACN,UAAA;AACU,UAAA;AACA,YAAA;AACK,cAAA;AACD,YAAA;AACV,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACE,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACW,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACQ,QAAA;AACN,UAAA;AACU,UAAA;AACA,YAAA;AACK,cAAA;AACD,YAAA;AACV,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACD,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACW,QAAA;AACb,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACW,QAAA;AACb,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACD,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,YAAA;AACW,cAAA;AACD,cAAA;AACC,gBAAA;AACP,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,YAAA;AACW,cAAA;AACD,cAAA;AACC,gBAAA;AACP,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACE,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACW,QAAA;AACb,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACD,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,YAAA;AACW,cAAA;AACD,cAAA;AACC,gBAAA;AACP,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACW,QAAA;AACb,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACD,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,UAAA;AACE,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACA,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACA,QAAA;AACd,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACW,QAAA;AACb,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACiB,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,UAAA;AACF,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACE,UAAA;AACG,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,YAAA;AACW,cAAA;AACD,cAAA;AACC,gBAAA;AACP,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACiB,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACU,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACA,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACQ,QAAA;AACN,UAAA;AACU,UAAA;AACA,YAAA;AACK,cAAA;AACD,YAAA;AACV,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACE,UAAA;AACG,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACL,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,cAAA;AACA,gBAAA;AACU,gBAAA;AACA,cAAA;AACV,YAAA;AACF,YAAA;AACW,cAAA;AACD,cAAA;AACC,gBAAA;AACP,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACS,IAAA;AACX,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACiB,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,MAAA;AACY,QAAA;AACV,UAAA;AACU,UAAA;AACG,QAAA;AACb,QAAA;AACA,UAAA;AACU,UAAA;AACK,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACI,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,QAAA;AACd,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACY,UAAA;AACC,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,UAAA;AACa,YAAA;AACX,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACE,QAAA;AACZ,QAAA;AACA,UAAA;AACU,UAAA;AACA,YAAA;AACN,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,UAAA;AACD,YAAA;AACI,cAAA;AACP,gBAAA;AACU,gBAAA;AACC,kBAAA;AACP,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,kBAAA;AACA,gBAAA;AACF,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,QAAA;AACA,UAAA;AACU,QAAA;AACV,MAAA;AACF,MAAA;AACQ,QAAA;AACN,UAAA;AACU,UAAA;AACA,QAAA;AACV,MAAA;AACF,IAAA;AACF,EAAA;AACF,EAAA;AACY,IAAA;AACV,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AACF,EAAA;AACU,IAAA;AACR,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,QAAA;AACf,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AACF,EAAA;AACU,IAAA;AACR,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,IAAA;AACA,MAAA;AACU,MAAA;AACA,MAAA;AACD,IAAA;AACT,EAAA;AACF,EAAA;AACS,IAAA;AACP,MAAA;AACU,MAAA;AACS,MAAA;AACT,QAAA;AACE,MAAA;AACV,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACiB,MAAA;AACT,QAAA;AACE,MAAA;AACV,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACI,gBAAA;AACG,kBAAA;AACD,gBAAA;AACV,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACC,gBAAA;AACM,kBAAA;AACD,gBAAA;AACV,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,MAAA;AACT,QAAA;AACE,MAAA;AACV,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACC,gBAAA;AACM,kBAAA;AACD,gBAAA;AACV,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,MAAA;AACT,QAAA;AACE,MAAA;AACV,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,MAAA;AACT,QAAA;AACE,MAAA;AACV,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,MAAA;AACT,QAAA;AACE,MAAA;AACV,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN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YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,cAAA;AACG,gBAAA;AACP,kBAAA;AACa,oBAAA;AACD,kBAAA;AACV,gBAAA;AACF,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,cAAA;AACI,gBAAA;AACG,kBAAA;AACD,gBAAA;AACV,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,MAAA;AACT,QAAA;AACE,MAAA;AACV,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACK,gBAAA;AACD,cAAA;AACV,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACG,gBAAA;AACP,gBAAA;AACA,cAAA;AACF,YAAA;AACF,UAAA;AACF,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,MAAA;AACT,QAAA;AACE,MAAA;AACV,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACN,MAAA;AACF,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACA,QAAA;AACE,QAAA;AACE,UAAA;AACR,YAAA;AACU,YAAA;AACA,cAAA;AACN,YAAA;AACF,YAAA;AACQ,UAAA;AACV,UAAA;AACA,YAAA;AACU,YAAA;AACA,cAAA;AACN,cAAA;AACA,cAAA;AACA,YAAA;AACF,YAAA;AACQ,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,IAAA;AACA,MAAA;AACU,MAAA;AACS,MAAA;AACT,QAAA;AACE,MAAA;AACV,MAAA;AACQ,QAAA;AACE,QAAA;AACE,UAAA;AACR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ACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,EAAA;AACJ,EAAA;AACU,IAAA;AACN,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;A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AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,EAAA;AACJ,EAAA;AACU,IAAA;AACN,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;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AA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,EAAA;AACJ,EAAA;AACU,IAAA;AACN,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,IAAA;AACA,MAAA;AACY,MAAA;AACA,MAAA;AACD,IAAA;AACX,EAAA;AACJ,EAAA;AACS,IAAA;AACL,MA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AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACO,gBAAA;AACC,cAAA;AACZ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,kBAAA;AACe,oBAAA;AACC,kBAAA;AACZ,gBAAA;AACJ,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACA,QAAA;AACJ,MAAA;AACJ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACO,gBAAA;AACC,cAAA;AACZ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACM,gBAAA;AACK,kBAAA;AACC,gBAAA;AACZ,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,MAAA;AACT,QAAA;AACI,MAAA;AACZ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,cAAA;AACO,gBAAA;AACC,cAAA;AACZ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACO,gBAAA;AACC,cAAA;AACZ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACA,QAAA;AACJ,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,MAAA;AACiB,MAAA;AACT,QAAA;AACI,MAAA;AACZ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,cAAA;AACJ,cAAA;AACA,cAAA;AACA,YAAA;AACJ,YAAA;AACQ,cAAA;AACO,gBAAA;AACC,cAAA;AACZ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,cAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACO,gBAAA;AACC,cAAA;AACZ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,MAAA;AACT,QAAA;AACI,MAAA;AACZ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,MAAA;AACT,QAAA;AACI,MAAA;AACZ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACO,gBAAA;AACC,cAAA;AACZ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,kBAAA;AACe,oBAAA;AACC,kBAAA;AACZ,gBAAA;AACJ,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,MAAA;AACT,QAAA;AACI,MAAA;AACZ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACA,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACA,QAAA;AACJ,MAAA;AACJ,MAAA;AACiB,MAAA;AACT,QAAA;AACI,MAAA;AACZ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,cAAA;AACA,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACA,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACA,QAAA;AACJ,MAAA;AACJ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACA,QAAA;AACJ,MAAA;AACJ,MAAA;AACiB,MAAA;AACT,QAAA;AACI,MAAA;AACZ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,MAAA;AACT,QAAA;AACI,MAAA;AACZ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACJ,YAAA;AACJ,YAAA;AACQ,UAAA;AACZ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACS,MAAA;AACT,QAAA;AACI,MAAA;AACZ,MAAA;AACQ,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,cAAA;AACK,gBAAA;AACL,gBAAA;AACA,cAAA;AACJ,YAAA;AACJ,UAAA;AACJ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,IAAA;AACA,MAAA;AACY,MAAA;AACA,QAAA;AACI,QAAA;AACE,UAAA;AACN,YAAA;AACY,YAAA;AACA,cAAA;AACM,YAAA;AACd,UAAA;AACJ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,UAAA;AACA,YAAA;AACY,YAAA;AACA,UAAA;AACZ,QAAA;AACJ,MAAA;AACJ,IAAA;AACJ,EAAA;AAER;AjBg+cA;AACA;AalopBO;AAIH,EAAA;AAA2E,IAAA;AACvE,EAAA;AAEJ,EAAA;AAAoB,IAAA;AAChB,IAAA;AACA,EAAA;AAGJ,EAAA;AACJ;AAOO;AAIH,EAAA;AAA2E,IAAA;AACvE,EAAA;AAGJ,EAAA;AACA,EAAA;AACJ;AAOO;AAIH,EAAA;AAA2E,IAAA;AACvE,EAAA;AAGJ,EAAA;AACA,EAAA;AACJ;AAQO;AAIH,EAAA;AAA2E,IAAA;AACvE,EAAA;AAGJ,EAAA;AACA,EAAA;AACJ;AbimpBA;AACA;AkBnrpBA;AAAA;AAEI;AACA;AACA;AACA;AAGJ;AAAA;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAcG;AAQH,EAAA;AAAkB,IAAA;AACd,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AAGJ,EAAA;AACI,IAAA;AACA,IAAA;AAA6C,EAAA;AAE7C,IAAA;AAII,MAAA;AAAW,QAAA;AACP,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AAGJ,MAAA;AAAkC,IAAA;AAGlC,MAAA;AACA,MAAA;AAAM,IAAA;AACV,EAAA;AAER;AASO;AAKH,EAAA;AAAuB,IAAA;AACnB,IAAA;AACA,IAAA;AACA,EAAA;AAEJ,EAAA;AACI,IAAA;AAAoC,MAAA;AAChC,MAAA;AACA,MAAA;AACA,MAAA;AACC,MAAA;AACD,IAAA;AAEJ,IAAA;AAAO,EAAA;AAEX,EAAA;AACJ;AASO;AAKH,EAAA;AAAO,IAAA;AACoB,MAAA;AACP,MAAA;AACF,MAAA;AACA,IAAA;AACb,IAAA;AAC0B,MAAA;AACjB,QAAA;AACF,UAAA;AACY,UAAA;AACE,UAAA;AACE,QAAA;AAChB,MAAA;AACJ,MAAA;AACsC,MAAA;AAC3B,IAAA;AACd,EAAA;AAET;AASO;AAKH,EAAA;AAAiB,IAAA;AACb,MAAA;AAC2B,MAAA;AACC,MAAA;AACE,IAAA;AAC9B,IAAA;AACA,EAAA;AAER;AAQA;AAII,EAAA;AAKA,EAAA;AAEA,EAAA;AAAuB,IAAA;AACnB,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AAEJ,EAAA;AACJ;AAOO;AACH,EAAA;AAGJ;AAQA;AAII,EAAA;AACA,EAAA;AACI,IAAA;AAAO,EAAA;AAGX,EAAA;AAGJ;AAYA;AAWI,EAAA;AACA,EAAA;AACU,IAAA;AACF,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AAGR,EAAA;AAEA,EAAA;AACI,IAAA;AACA,IAAA;AAA2B,EAAA;AAG/B,EAAA;AACA,EAAA;AACI,IAAA;AAA+B,EAAA;AAGnC,EAAA;AACJ;AASA;AAOI,EAAA;AACI,IAAA;AACA,IAAA;AACI,MAAA;AAAsD,IAAA;AAC1D,EAAA;AAGJ,EAAA;AACJ;AlByipBA;AACA;AmBr0pBA;AAAA;AAEI;AACA;AAWJ;AAUA;AAUI,EAAA;AAEA,EAAA;AAEA,EAAA;AAEA,EAAA;AAEqB,IAAA;AACN,IAAA;AACK,IAAA;AACD,IAAA;AACH,IAAA;AACR,IAAA;AACM,IAAA;AACQ,IAAA;AACe,EAAA;AAIrC,EAAA;AAAO,IAAA;AACU,IAAA;AACb,IAAA;AACA,IAAA;AACA,EAAA;AAER;AAaA;AAQI,EAAA;AAEqB,IAAA;AACb,IAAA;AACA,IAAA;AACO,IAAA;AACK,IAAA;AACZ,IAAA;AAC6B,EAAA;AAIrC,EAAA;AACJ;AnB6wpBA;AACA;AoB91pBO;AAAiC,EAAA;AAOhC,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAAkB,EAAA;AACtB,EAAA;AAcI,IAAA;AACA,IAAA;AAAM,MAAA;AAC4C,MAAA;AACA,IAAA;AAC5B,MAAA;AAClB,QAAA;AACS,QAAA;AACL,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,MAAA;AACA,QAAA;AACS,QAAA;AACL,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AAEJ,IAAA;AACA,IAAA;AAEA,IAAA;AAA4C,EAAA;AAChD;AAAA;AAAA;AAAA;AAAA,EAAA;AAOI,IAAA;AAAY,EAAA;AAEpB;ApB60pBA;AACA;ACl3pBA;AACA;ADo3pBA;AACA;AqB75pBA;ArB+5pBA;AACA;AsBh6pBA;AtBk6pBA;AACA;AuBn6pBA;AAaO;AAKH,EAAA;AAEA,EAAA;AACI,IAAA;AAAe,EAAA;AAGnB,EAAA;AACJ;AASO;AAKH,EAAA;AACI,IAAA;AAAO,EAAA;AAGX,EAAA;AACI,IAAA;AACA,IAAA;AAAO,MAAA;AACH,MAAA;AACiC,MAAA;AACjC,MAAA;AAAA,IAAA;AAEJ,EAAA;AAIJ,EAAA;AAGA,EAAA;AACA,EAAA;AAAuC,IAAA;AACH,IAAA;AAChC,EAAA;AAEJ,EAAA;AAEA,EAAA;AAGA,EAAA;AACJ;AvB+3pBA;AACA;AsBv6pBO;AAaH,EAAA;AAEA,EAAA;AACI,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AAGA,IAAA;AAA6B,MAAA;AACzB,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACQ,IAAA;AAIZ,IAAA;AACI,MAAA;AAAe,IAAA;AAInB,IAAA;AACA,IAAA;AACI,MAAA;AAAe,IAAA;AAInB,IAAA;AACI,MAAA;AAAe,IAAA;AAGnB,IAAA;AACI,MAAA;AAAO,QAAA;AACK,QAAA;AACR,QAAA;AACsB,QAAA;AACtB,MAAA;AACJ,IAAA;AAEA,MAAA;AAAe,IAAA;AACnB,EAAA;AAEA,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AACI,MAAA;AAAe,IAAA;AAGnB,IAAA;AACA,IAAA;AAEI,MAAA;AAAS,IAAA;AAET,MAAA;AACA,MAAA;AAEA,MAAA;AAAkE,IAAA;AAGtE,IAAA;AAEI,MAAA;AAAO,QAAA;AACK,QAAA;AACR,QAAA;AACA,MAAA;AACJ,IAAA;AAGA,MAAA;AAAO,QAAA;AACK,QAAA;AACR,QAAA;AACA,MAAA;AACJ,IAAA;AACJ,EAAA;AAER;AAQO;AAIH,EAAA;AACI,IAAA;AAAe,EAAA;AAGnB,EAAA;AACI,IAAA;AAAe,EAAA;AAInB,EAAA;AAAwC,IAAA;AAClB,IAAA;AACO,EAAA;AAI7B,EAAA;AAGA,EAAA;AAEA,EAAA;AACA,EAAA;AACA,EAAA;AACJ;AAYO;AAUH,EAAA;AAAyB,IAAA;AACZ,IAAA;AACT,IAAA;AACA,IAAA;AACA,IAAA;AAGM,EAAA;AAIV,EAAA;AACA,EAAA;AACI,IAAA;AAAoB,MAAA;AACP,MAAA;AACT,IAAA;AAEJ,IAAA;AAA+D,EAAA;AAInE,EAAA;AACI,IAAA;AAA4C,EAAA;AAGhD,EAAA;AAAmB,IAAA;AACf,IAAA;AACA,IAAA;AACsB,IAAA;AAAA,EAAA;AAI1B,EAAA;AAEA,EAAA;AAAoB,IAAA;AAChB,IAAA;AACkC,IAAA;AACxB,IAAA;AAAA,EAAA;AAId,EAAA;AAGA,EAAA;AACA,EAAA;AACI,IAAA;AAAc,MAAA;AACV,MAAA;AACkC,MAAA;AACxB,MAAA;AAAA,IAAA;AAEd,EAAA;AAIJ,EAAA;AAEA,EAAA;AAAO,IAAA;AACK,IAAA;AACI,IAAA;AACC,IAAA;AACb,EAAA;AAER;AtBs1pBA;AACA;AqBxiqBO;AAQH,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AACA,EAAA;AACI,IAAA;AAAqC,MAAA;AACjC,MAAA;AACY,MAAA;AACJ,MAAA;AACR,MAAA;AACU,MAAA;AACA,MAAA;AACV,IAAA;AAGJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAA2B,EAAA;AAE3B,IAAA;AAAiB,EAAA;AAIrB,EAAA;AAEU,IAAA;AACI,IAAA;AACU,IAAA;AACV,EAAA;AAEJ,IAAA;AACI,IAAA;AACU,IAAA;AACV,EAAA;AAId,EAAA;AACA,EAAA;AACI,IAAA;AAA6B,EAAA;AAE7B,IAAA;AAAqC,MAAA;AACtB,MAAA;AACC,MAAA;AACJ,MAAA;AACR,MAAA;AACU,MAAA;AACA,MAAA;AACV,IAAA;AAGJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAA4B,EAAA;AAGhC,EAAA;AAAO,IAAA;AACQ,IAAA;AACO,IAAA;AACQ,IAAA;AACrB,MAAA;AACQ,MAAA;AACC,MAAA;AACA,IAAA;AACd,IAAA;AACO,MAAA;AACmB,MAAA;AACA,IAAA;AAC1B,EAAA;AAER;AASO;AAUH,EAAA;AACI,IAAA;AAAO,MAAA;AACmB,MAAA;AACP,IAAA;AACnB,EAAA;AAIJ,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AACI,IAAA;AAII,MAAA;AAAA,IAAA;AAGJ,IAAA;AAEI,MAAA;AAMA,MAAA;AAEA,MAAA;AAAoB,QAAA;AACK,QAAA;AACrB,QAAA;AACA,QAAA;AAAA,MAAA;AAIJ,MAAA;AACI,QAAA;AAAsB,UAAA;AAClB,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AAGJ,QAAA;AAAqB,UAAA;AACjB,UAAA;AACA,UAAA;AACA,UAAA;AAAA,QAAA;AAKJ,QAAA;AAA6B,UAAA;AACzB,UAAA;AACA,QAAA;AAEJ,QAAA;AACA,QAAA;AACA,QAAA;AAAA,MAAA;AAEA,QAAA;AACA,QAAA;AAAqB,UAAA;AACjB,UAAA;AACA,UAAA;AACA,UAAA;AAAA,QAAA;AAKJ,QAAA;AAA6B,UAAA;AACzB,UAAA;AACA,QAAA;AAEJ,QAAA;AACA,QAAA;AAAiD,MAAA;AACrD,IAAA;AACJ,EAAA;AAGJ,EAAA;AACI,IAAA;AAAsB,MAAA;AAClB,MAAA;AACqB,MAAA;AACrB,MAAA;AACA,IAAA;AAGJ,IAAA;AAAqB,MAAA;AACjB,MAAA;AACA,MAAA;AACqB,MAAA;AAAA,IAAA;AAKzB,IAAA;AACA,IAAA;AAAY,EAAA;AAGhB,EAAA;AAAO,IAAA;AACW,IAAA;AACC,EAAA;AAEvB;AAUO;AAUH,EAAA;AACI,IAAA;AAAO,MAAA;AACmB,MAAA;AACP,IAAA;AACnB,EAAA;AAGJ,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AACI,IAAA;AAII,MAAA;AAAA,IAAA;AAIJ,IAAA;AAEA,IAAA;AACI,MAAA;AAAoB,QAAA;AAChB,QAAA;AACqB,QAAA;AACA,QAAA;AAAA,MAAA;AAIzB,MAAA;AACI,QAAA;AAAsB,UAAA;AAClB,UAAA;AACqB,UAAA;AACrB,UAAA;AACA,QAAA;AAGJ,QAAA;AAAqB,UAAA;AACjB,UAAA;AACA,UAAA;AACqB,UAAA;AAAA,QAAA;AAIzB,QAAA;AAA6B,UAAA;AACzB,UAAA;AACA,QAAA;AAEJ,QAAA;AACA,QAAA;AACA,QAAA;AAAA,MAAA;AAEA,QAAA;AACA,QAAA;AAAqB,UAAA;AACjB,UAAA;AACA,UAAA;AACqB,UAAA;AAAA,QAAA;AAIzB,QAAA;AAA6B,UAAA;AACzB,UAAA;AACA,QAAA;AAEJ,QAAA;AACA,QAAA;AAAiD,MAAA;AACrD,IAAA;AACJ,EAAA;AAIJ,EAAA;AACI,IAAA;AAAmE,EAAA;AAGvE,EAAA;AAAO,IAAA;AACW,IAAA;AACC,EAAA;AAEvB;AASO;AAKH,EAAA;AACA,EAAA;AAEA,EAAA;AAGA,EAAA;AAAO,IAAA;AACH,IAAA;AACA,IAAA;AACA,EAAA;AAER;AAaA;AASI,EAAA;AACI,IAAA;AAA2C,EAAA;AAG/C,EAAA;AACI,IAAA;AAAgC,EAAA;AAGpC,EAAA;AAIA,EAAA;AAAgB,IAAA;AACL,IAAA;AACP,IAAA;AACA,EAAA;AAGJ,EAAA;AAAe,IAAA;AACX,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AAIJ,EAAA;AAEI,IAAA;AACA,IAAA;AAGA,IAAA;AAIA,IAAA;AAAO,MAAA;AACA,MAAA;AACH,IAAA;AACJ,EAAA;AAGJ,EAAA;AACJ;AAWO;AAKH,EAAA;AACI,IAAA;AAAe,EAAA;AAGnB,EAAA;AAAwD,IAAA;AACxC,EAAA;AAGhB,EAAA;AACI,IAAA;AAAyB,MAAA;AACL,MAAA;AAAA,MAAA;AAEhB,MAAA;AACY,IAAA;AAGhB,IAAA;AACA,IAAA;AACI,MAAA;AAAoB,QAAA;AACA,QAAA;AACJ,MAAA;AAEhB,MAAA;AAA+D,IAAA;AAInE,IAAA;AAGA,IAAA;AACA,IAAA;AAAO,MAAA;AACH,MAAA;AACsB,MAAA;AACtB,MAAA;AAAA,IAAA;AAEJ,EAAA;AAEA,IAAA;AAAO,EAAA;AAEf;AAQO;AAIH,EAAA;AAAmB,IAAA;AACf,IAAA;AACA,IAAA;AACsB,IAAA;AAAA,EAAA;AAI1B,EAAA;AACA,EAAA;AACJ;AAQO;AAIH,EAAA;AAA0B,IAAA;AACtB,IAAA;AACsB,IAAA;AACuB,IAAA;AAAA,EAAA;AAKjD,EAAA;AAAwB,IAAA;AACpB,IAAA;AACA,EAAA;AAEJ,EAAA;AACI,IAAA;AAAiE,EAAA;AAGrE,EAAA;AACJ;AAYO;AAQH,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AAAyB,IAAA;AACA,IAAA;AACrB,IAAA;AACA,IAAA;AACU,EAAA;AAGd,EAAA;AACA,EAAA;AACI,IAAA;AAAoB,MAAA;AACK,MAAA;AACX,IAAA;AAEd,IAAA;AAA+D,EAAA;AAInE,EAAA;AAGA,EAAA;AAKA,EAAA;AACI,IAAA;AAAqC,MAAA;AACjC,MAAA;AACY,MAAA;AACJ,MAAA;AACR,MAAA;AACU,MAAA;AACA,MAAA;AACV,IAAA;AAGJ,IAAA;AACA,IAAA;AACA,IAAA;AAA8B,EAAA;AAIlC,EAAA;AAEU,IAAA;AACI,IAAA;AACU,IAAA;AACV,EAAA;AAEJ,IAAA;AACI,IAAA;AACU,IAAA;AACV,EAAA;AAId,EAAA;AAKA,EAAA;AACI,IAAA;AAAqC,MAAA;AACjC,MAAA;AACY,MAAA;AACJ,MAAA;AACR,MAAA;AACU,MAAA;AACA,MAAA;AACV,IAAA;AAGJ,IAAA;AACA,IAAA;AACA,IAAA;AAA8B,EAAA;AAGlC,EAAA;AAAO,IAAA;AACQ,IAAA;AACO,IAAA;AACQ,IAAA;AACrB,MAAA;AACQ,MAAA;AACC,MAAA;AACA,IAAA;AACd,IAAA;AACO,MAAA;AACmB,MAAA;AACA,IAAA;AAC1B,EAAA;AAER;AASO;AAKH,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AACI,IAAA;AAII,MAAA;AAAA,IAAA;AAGJ,IAAA;AACI,MAAA;AAKA,MAAA;AAEA,MAAA;AAAqB,QAAA;AACI,QAAA;AACrB,QAAA;AACA,QAAA;AAAA,MAAA;AAIJ,MAAA;AACI,QAAA;AAAsB,UAAA;AAClB,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AAGJ,QAAA;AAAiB,UAAA;AACb,UAAA;AACA,UAAA;AACA,UAAA;AAAA,QAAA;AAIJ,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AAAA,MAAA;AAEA,QAAA;AACA,QAAA;AAAiB,UAAA;AACb,UAAA;AACA,UAAA;AACA,UAAA;AAAA,QAAA;AAIJ,QAAA;AACA,QAAA;AACA,QAAA;AAAkD,MAAA;AACtD,IAAA;AACJ,EAAA;AAGJ,EAAA;AACI,IAAA;AAAsB,MAAA;AAClB,MAAA;AACqB,MAAA;AACrB,MAAA;AACA,IAAA;AAGJ,IAAA;AACI,MAAA;AAAsC,IAAA;AAG1C,IAAA;AAAiB,MAAA;AACb,MAAA;AACA,MAAA;AACqB,MAAA;AAAA,IAAA;AAIzB,IAAA;AACA,IAAA;AAAwB,EAAA;AAG5B,EAAA;AAAO,IAAA;AACW,IAAA;AACC,EAAA;AAEvB;AASO;AAKH,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AACI,IAAA;AAII,MAAA;AAAA,IAAA;AAGJ,IAAA;AAEA,IAAA;AACI,MAAA;AAAqB,QAAA;AACjB,QAAA;AACqB,QAAA;AACA,QAAA;AAAA,MAAA;AAIzB,MAAA;AACI,QAAA;AAAsB,UAAA;AAClB,UAAA;AACqB,UAAA;AACrB,UAAA;AACA,QAAA;AAGJ,QAAA;AAAiB,UAAA;AACb,UAAA;AACA,UAAA;AACqB,UAAA;AAAA,QAAA;AAIzB,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AAAA,MAAA;AAEA,QAAA;AACA,QAAA;AAAiB,UAAA;AACb,UAAA;AACA,UAAA;AACqB,UAAA;AAAA,QAAA;AAIzB,QAAA;AACA,QAAA;AACA,QAAA;AAAkD,MAAA;AACtD,IAAA;AACJ,EAAA;AAGJ,EAAA;AACI,IAAA;AAAsC,EAAA;AAG1C,EAAA;AAAO,IAAA;AACW,IAAA;AACC,EAAA;AAEvB;AAaO;AASH,EAAA;AACI,IAAA;AAA2C,EAAA;AAG/C,EAAA;AACI,IAAA;AAAgC,EAAA;AAGpC,EAAA;AAIA,EAAA;AAAgB,IAAA;AACL,IAAA;AACP,IAAA;AACA,EAAA;AAGJ,EAAA;AAAe,IAAA;AACX,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AAIJ,EAAA;AAEI,IAAA;AACA,IAAA;AAGA,IAAA;AAIA,IAAA;AAAO,MAAA;AACA,MAAA;AACQ,MAAA;AACO,IAAA;AACtB,EAAA;AAGJ,EAAA;AAAO,IAAA;AACA,IAAA;AACe,EAAA;AAE1B;ArBoupBA;AACA;AwBjnrBA;AAiBA;AAEO;AAAsD,EAAA;AAErD,IAAA;AAA4B,EAAA;AAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAO,MAAA;AACH,MAAA;AACA,MAAA;AACK,IAAA;AACT,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA,EAAA;AAOI,IAAA;AAA2C,EAAA;AAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AAAkD,EAAA;AACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAQI,IAAA;AAAO,MAAA;AACH,MAAA;AACA,MAAA;AACK,IAAA;AACT,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA,EAAA;AAOI,IAAA;AAA4C,EAAA;AAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AAAmD,EAAA;AACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AAAmD,EAAA;AACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AACA,IAAA;AAAqC,EAAA;AACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AACI,MAAA;AAA2D,IAAA;AAE/D,IAAA;AACA,IAAA;AACA,IAAA;AAAc,EAAA;AAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AACI,MAAA;AAA2D,IAAA;AAG/D,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AACA,IAAA;AAEA,IAAA;AAEA,IAAA;AAAwC,EAAA;AAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AAEA,IAAA;AAAgD,EAAA;AACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AACA,IAAA;AAAgD,EAAA;AACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAuD,MAAA;AAGd,IAAA;AAGzC,IAAA;AAAO,EAAA;AACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAmBI,IAAA;AACA,IAAA;AACI,MAAA;AAA2D,IAAA;AAG/D,IAAA;AAAO,MAAA;AACM,QAAA;AACgB,QAAA;AACC,QAAA;AACD,QAAA;AACC,MAAA;AAC1B,MAAA;AACO,QAAA;AAC+B,QAAA;AACC,MAAA;AACvC,IAAA;AACJ,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAkBI,IAAA;AAEA,IAAA;AAAoC,MAAA;AACd,MAAA;AACW,MAAA;AACC,MAAA;AACD,MAAA;AACC,MAAA;AACY,MAAA;AACC,IAAA;AAC7C,EAAA;AACN;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAkBI,IAAA;AAEA,IAAA;AAAoC,MAAA;AACd,MAAA;AACW,MAAA;AACC,MAAA;AACD,MAAA;AACC,MAAA;AACY,MAAA;AACC,IAAA;AAC7C,EAAA;AACN;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAEA,IAAA;AAC4D,MAAA;AACpD,IAAA;AAGR,IAAA;AAAO,EAAA;AAEf;AxB8grBA;AACA;ACrxrBA;AAEO;AAAqD,EAAA;AAIpD,IAAA;AACA,IAAA;AAAoD,EAAA;AACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAEJ,IAAA;AACuC,MAAA;AAC/B,MAAA;AACA,MAAA;AACA,IAAA;AAEa,MAAA;AACb,MAAA;AACA,MAAA;AACA,MAAA;AACS,MAAA;AACT,MAAA;AACA,MAAA;AACoB,MAAA;AACpB,MAAA;AACA,MAAA;AACA,MAAA;AACmB,MAAA;AACF,MAAA;AACH,IAAA;AAEL,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAEJ,IAAA;AACwC,MAAA;AAChC,MAAA;AACA,MAAA;AACA,IAAA;AAEa,MAAA;AACb,MAAA;AACA,MAAA;AACA,MAAA;AACS,MAAA;AACT,MAAA;AACoB,MAAA;AACpB,MAAA;AACA,MAAA;AACA,MAAA;AACmB,MAAA;AACL,IAAA;AAEL,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAoBI,IAAA;AACI,MAAA;AAAO,QAAA;AAC+C,QAAA;AACC,QAAA;AACS,QAAA;AACxC,UAAA;AACA,QAAA;AACpB,MAAA;AACJ,IAAA;AAEA,MAAA;AAAO,QAAA;AAC+C,QAAA;AACC,QAAA;AAChC,UAAA;AACC,QAAA;AACpB,QAAA;AAC6D,MAAA;AACjE,IAAA;AACJ,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAqBI,IAAA;AAEA,IAAA;AAEqB,MAAA;AACb,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAES,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAcI,IAAA;AAGA,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AAA4C,MAAA;AACxC,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AACI,MAAA;AACA,MAAA;AAA6D,IAAA;AAE7D,MAAA;AAA8C,IAAA;AAClD,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAoBI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAIJ,IAAA;AAKA,IAAA;AAA6B,MAAA;AACzB,MAAA;AACA,MAAA;AACQ,MAAA;AACA,MAAA;AACA,IAAA;AAGZ,IAAA;AAEA,IAAA;AACS,MAAA;AACD,MAAA;AACA,QAAA;AACI,QAAA;AACU,MAAA;AACd,MAAA;AACA,QAAA;AACI,QAAA;AACA,MAAA;AACJ,IAAA;AAGR,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AAEA,IAAA;AAAM,MAAA;AACoD,MAAA;AACC,IAAA;AACrC,MAAA;AAClB,QAAA;AACS,QAAA;AACL,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACJ,MAAA;AACA,QAAA;AACS,QAAA;AACL,QAAA;AACsB,QAAA;AACtB,QAAA;AACA,QAAA;AACA,MAAA;AACJ,IAAA;AAEJ,IAAA;AACA,IAAA;AAGA,IAAA;AACI,MAAA;AAAgB,QAAA;AACT,UAAA;AACC,UAAA;AACA,UAAA;AAC2B,QAAA;AAC/B,MAAA;AACJ,IAAA;AAIJ,IAAA;AACA,IAAA;AACkD,MAAA;AACrB,IAAA;AAGzB,MAAA;AACA,MAAA;AAA0C,IAAA;AAI9C,IAAA;AACM,MAAA;AACI,QAAA;AACc,QAAA;AACE,QAAA;AACJ,MAAA;AACZ,IAAA;AAIV,IAAA;AACU,MAAA;AACQ,MAAA;AACV,IAAA;AAEa,MAAA;AACb,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACoB,MAAA;AACpB,MAAA;AACA,MAAA;AACA,MAAA;AACO,MAAA;AACW,MAAA;AACC,IAAA;AAKV,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAQI,IAAA;AAGA,IAAA;AAEA,IAAA;AAEA,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AAA4C,MAAA;AACxC,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AACI,MAAA;AACA,MAAA;AAA6D,IAAA;AAE7D,MAAA;AAA8C,IAAA;AAClD,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACG,IAAA;AAGP,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AAGA,IAAA;AAAkC,MAAA;AAC9B,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAGA,IAAA;AAAgC,MAAA;AAC5B,QAAA;AACgC,QAAA;AACpB,QAAA;AACD,MAAA;AACX,MAAA;AACyB,MAAA;AACzB,IAAA;AAEJ,IAAA;AAEA,IAAA;AAAO,EAAA;AACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAcI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACG,IAAA;AAGP,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAGA,IAAA;AAAkC,MAAA;AAC9B,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAIJ,IAAA;AAAgC,MAAA;AAC5B,QAAA;AAC4C,QAAA;AAChC,QAAA;AACD,MAAA;AACX,MAAA;AACqC,MAAA;AACrC,IAAA;AAIJ,IAAA;AACA,IAAA;AAEiE,MAAA;AACjD,IAAA;AAGZ,MAAA;AAAuB,QAAA;AACkB,QAAA;AAEhC,QAAA;AACL,QAAA;AAEK,QAAA;AACgC,QAAA;AACrC,MAAA;AACJ,IAAA;AAGJ,IAAA;AAAO,MAAA;AACH,MAAA;AACA,MAAA;AACA,IAAA;AACJ,EAAA;AACJ,EAAA;AAQI,IAAA;AAEA,IAAA;AAEA,IAAA;AAGA,IAAA;AAAgC,MAAA;AACF,MAAA;AAC1B,MAAA;AACA,IAAA;AAGJ,IAAA;AACA,IAAA;AACI,MAAA;AACI,QAAA;AAA6B,UAAA;AACzB,UAAA;AAC0C,UAAA;AAC1C,UAAA;AACiC,UAAA;AACjC,UAAA;AACA,QAAA;AAEJ,QAAA;AAAyB,MAAA;AAC7B,IAAA;AAGJ,IAAA;AAAO,MAAA;AACH,MAAA;AACA,IAAA;AACJ,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAaI,IAAA;AAEA,IAAA;AAEA,IAAA;AAGA,IAAA;AAAgC,MAAA;AACA,MAAA;AAC5B,MAAA;AACA,IAAA;AAIJ,IAAA;AACA,IAAA;AAII,MAAA;AAAuB,QAAA;AACS,QAAA;AACgB,QAAA;AAC5C,QAAA;AACiC,QAAA;AACjC,QAAA;AACA,MAAA;AACJ,IAAA;AAGJ,IAAA;AAAO,MAAA;AACH,MAAA;AACA,IAAA;AACJ,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAcI,IAAA;AAGA,IAAA;AAEA,IAAA;AAGA,IAAA;AAAgC,MAAA;AACiB,MAAA;AAC7C,MAAA;AACA,IAAA;AAIJ,IAAA;AACA,IAAA;AAEgF,MAAA;AAChE,IAAA;AAGZ,MAAA;AAA8B,QAAA;AAC1B,UAAA;AAE8B,UAAA;AAGI,UAAA;AAGA,UAAA;AAGA,UAAA;AAGA,QAAA;AAClC,QAAA;AAEK,QAAA;AACL,QAAA;AACiC,QAAA;AACjC,QAAA;AACA,MAAA;AACJ,IAAA;AAIJ,IAAA;AACA,IAAA;AAEgF,MAAA;AAChE,IAAA;AAGZ,MAAA;AAA8B,QAAA;AAC1B,UAAA;AAE8B,UAAA;AAGI,UAAA;AAGA,UAAA;AAGA,UAAA;AAGA,QAAA;AAClC,QAAA;AAEK,QAAA;AACL,QAAA;AACiC,QAAA;AACjC,QAAA;AACA,MAAA;AACJ,IAAA;AAGJ,IAAA;AAAO,MAAA;AACH,MAAA;AACA,MAAA;AACA,IAAA;AACJ,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AASI,IAAA;AAEA,IAAA;AACI,MAAA;AAA8D,IAAA;AAGlE,IAAA;AAEA,IAAA;AAIA,IAAA;AAEA,IAAA;AACA,IAAA;AACI,MAAA;AACA,MAAA;AAAiC,IAAA;AAEjC,MAAA;AACA,MAAA;AACA,MAAA;AAAiC,IAAA;AAQrC,IAAA;AAA6B,MAAA;AACQ,MAAA;AACjC,MAAA;AACA,MAAA;AACU,MAAA;AACuB,IAAA;AAGrC,IAAA;AAIA,IAAA;AAAM,MAAA;AACS,MAAA;AACA,MAAA;AACG,IAAA;AACH,MAAA;AACX,MAAA;AACgB,MAAA;AAChB,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAIJ,IAAA;AACI,MAAA;AAAgB,QAAA;AACT,UAAA;AACC,UAAA;AACA,UAAA;AAC0B,QAAA;AAC9B,MAAA;AACJ,IAAA;AAIJ,IAAA;AACA,IAAA;AACkD,MAAA;AACrB,IAAA;AAGzB,MAAA;AACA,MAAA;AAA0C,IAAA;AAI9C,IAAA;AACM,MAAA;AACI,QAAA;AACc,QAAA;AACE,QAAA;AACJ,MAAA;AACZ,IAAA;AAIV,IAAA;AACU,MAAA;AACF,MAAA;AACA,IAAA;AAEa,MAAA;AACO,MAAA;AACO,MAAA;AACX,MAAA;AACK,MAAA;AACC,MAAA;AACJ,MAAA;AACE,MAAA;AACY,MAAA;AAChC,MAAA;AACA,MAAA;AACO,MAAA;AAGD,MAAA;AAGA,IAAA;AAKG,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAcI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACc,MAAA;AACd,MAAA;AACA,IAAA;AAGJ,IAAA;AAAO,MAAA;AACH,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACJ,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAEA,IAAA;AAA4B,MAAA;AACxB,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAAO,MAAA;AACY,IAAA;AACnB,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAQI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACc,MAAA;AACd,MAAA;AACA,IAAA;AAGJ,IAAA;AAAO,MAAA;AACH,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACJ,EAAA;AAER;ADqirBA;AACA;AyB3+sBA;AAAA;AAEI;AACA;AAEA;AACA;AA+CJ;AAAA;AACI;AACA;AACA;AACA;AACA;AAWG;AAA0D,EAAA;AAIzD,IAAA;AACA,IAAA;AAAoD,EAAA;AACxD;AAAA;AAAA;AAAA;AAAA,EAAA;AAOI,IAAA;AAAyC,EAAA;AAC7C;AAAA;AAAA;AAAA;AAAA,EAAA;AAOI,IAAA;AAA0C,EAAA;AAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AAEA,IAAA;AAA0C,MAAA;AACpB,IAAA;AAGtB,IAAA;AACI,MAAA;AAAU,QAAA;AACqD,MAAA;AAC/D,IAAA;AAGJ,IAAA;AAAyC,MAAA;AACpB,IAAA;AAGrB,IAAA;AAEA,IAAA;AAEA,IAAA;AAKA,IAAA;AAAoB,MAAA;AAChB,MAAA;AACiB,MAAA;AACjB,IAAA;AAGJ,IAAA;AAEA,IAAA;AACI,MAAA;AACsB,MAAA;AAClB,MAAA;AACA,MAAA;AACiB,MAAA;AACjB,IAAA;AAGR,IAAA;AAEA,IAAA;AAAiB,MAAA;AACkB,MAAA;AACN,MAAA;AACzB,MAAA;AAC4B,MAAA;AACD,MAAA;AAC3B,MAAA;AAC0B,MAAA;AAC1B,MAAA;AACA,MAAA;AACyB,MAAA;AACzB,MAAA;AACe,MAAA;AACf,MAAA;AAC6B,IAAA;AAGjC,IAAA;AAIiB,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAmC,MAAA;AACT,IAAA;AAG1B,IAAA;AACI,MAAA;AAAU,QAAA;AACyD,MAAA;AACnE,IAAA;AAGJ,IAAA;AAEA,IAAA;AAEA,IAAA;AACA,IAAA;AACU,MAAA;AACG,MAAA;AACK,MAAA;AACM,MAAA;AACM,MAAA;AACtB,MAAA;AACA,IAAA;AAGR,IAAA;AAGA,IAAA;AAEqB,MAAA;AACO,MAAA;AACF,MAAA;AACiB,MAAA;AACnC,MAAA;AACqB,MAAA;AACD,MAAA;AACc,MAAA;AAClC,IAAA;AAGS,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAcI,IAAA;AAA0B,MAAA;AACa,IAAA;AAGvC,IAAA;AAAiB,MAAA;AACmC,MAAA;AACL,MAAA;AAC3C,MAAA;AAC0C,MAAA;AACb,IAAA;AAGjC,IAAA;AAGiB,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAmC,MAAA;AACV,IAAA;AAEzB,IAAA;AACI,MAAA;AAAU,QAAA;AACwD,MAAA;AAClE,IAAA;AAGJ,IAAA;AAEA,IAAA;AAA0B,MAAA;AACD,IAAA;AAGzB,IAAA;AAAiB,MAAA;AACQ,MAAA;AACX,MAAA;AACM,IAAA;AAGpB,IAAA;AAEA,IAAA;AAEA,IAAA;AAA+C,MAAA;AACgB,MAAA;AACO,IAAA;AAGtE,IAAA;AAEA,IAAA;AAAM,MAAA;AACF,QAAA;AACc,QAAA;AACK,QAAA;AACJ,MAAA;AACf,MAAA;AACA,QAAA;AACc,QAAA;AACK,QAAA;AACJ,MAAA;AACf,IAAA;AACA,MAAA;AACkC,MAAA;AACO,IAAA;AAG7C,IAAA;AAAyD,MAAA;AACN,MAAA;AACA,IAAA;AAGnD,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AACI,MAAA;AACU,QAAA;AACQ,QAAA;AACW,QAAA;AACrB,MAAA;AAER,MAAA;AACI,QAAA;AAA+C,MAAA;AACnD,IAAA;AAEA,MAAA;AAA6B,IAAA;AAEjC,IAAA;AACI,MAAA;AACU,QAAA;AACc,QAAA;AACK,QAAA;AACrB,MAAA;AAER,MAAA;AACI,QAAA;AAA+C,MAAA;AACnD,IAAA;AAEA,MAAA;AAA6B,IAAA;AAGjC,IAAA;AAA6B,MAAA;AACkB,MAAA;AACA,IAAA;AAG/C,IAAA;AAAsB,MAAA;AAClB,MAAA;AACK,MAAA;AACL,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAEqB,MAAA;AACqB,MAAA;AAClC,MAAA;AACkB,MAAA;AACE,MAAA;AACd,MAAA;AAC2B,MAAA;AACjC,MAAA;AACsB,MAAA;AACM,MAAA;AAC5B,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACqB,MAAA;AACC,MAAA;AACtB,MAAA;AACA,MAAA;AACA,MAAA;AAC4B,MAAA;AACtB,MAAA;AACN,MAAA;AACiB,MAAA;AACL,MAAA;AACE,MAAA;AACA,MAAA;AACU,IAAA;AAKhC,IAAA;AAAoE,MAAA;AACzD,IAAA;AAGX,IAAA;AAEA,IAAA;AAAO,EAAA;AACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAmC,MAAA;AACR,IAAA;AAG3B,IAAA;AACI,MAAA;AAAU,QAAA;AAC0D,MAAA;AACpE,IAAA;AAGJ,IAAA;AAEA,IAAA;AAAiB,MAAA;AACU,MAAA;AACb,MAAA;AACM,IAAA;AAGpB,IAAA;AAA0B,MAAA;AACC,IAAA;AAG3B,IAAA;AAEA,IAAA;AAAM,MAAA;AACwC,MAAA;AACA,IAAA;AAC1C,MAAA;AACkC,MAAA;AACO,IAAA;AAG7C,IAAA;AAAyD,MAAA;AACN,MAAA;AACA,IAAA;AAGnD,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AACI,MAAA;AACU,QAAA;AACQ,QAAA;AACa,QAAA;AACvB,MAAA;AAER,MAAA;AACI,QAAA;AAA+C,MAAA;AACnD,IAAA;AAEA,MAAA;AAA6B,IAAA;AAEjC,IAAA;AACI,MAAA;AACU,QAAA;AACc,QAAA;AACO,QAAA;AACvB,MAAA;AAER,MAAA;AACI,QAAA;AAA+C,MAAA;AACnD,IAAA;AAEA,MAAA;AAA6B,IAAA;AAGjC,IAAA;AAA6B,MAAA;AACkB,MAAA;AACA,IAAA;AAG/C,IAAA;AAEA,IAAA;AAEA,IAAA;AAEA,IAAA;AACI,MAAA;AAAgB,QAAA;AACZ,QAAA;AACgB,MAAA;AAGpB,MAAA;AAGA,MAAA;AACI,QAAA;AAAiB,UAAA;AACU,UAAA;AACvB,UAAA;AACA,UAAA;AACgB,UAAA;AAChB,UAAA;AACA,QAAA;AAEJ,QAAA;AAAuB,MAAA;AAC3B,IAAA;AAEA,MAAA;AAAgB,QAAA;AACZ,QAAA;AACU,MAAA;AAGd,MAAA;AAGA,MAAA;AACI,QAAA;AAAiB,UAAA;AACU,UAAA;AACvB,UAAA;AACA,UAAA;AACU,UAAA;AACV,UAAA;AACA,QAAA;AAEJ,QAAA;AAAuB,MAAA;AAC3B,IAAA;AAGJ,IAAA;AAAoB,MAAA;AAChB,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AACI,MAAA;AAC2B,MAAA;AACvB,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGR,IAAA;AAEA,IAAA;AAAqB,MAAA;AACjB,MAAA;AACK,MAAA;AACL,IAAA;AAGJ,IAAA;AAEqB,MAAA;AACuB,MAAA;AACpC,MAAA;AACoB,MAAA;AACd,MAAA;AACN,MAAA;AACY,MAAA;AAGI,MAAA;AAChB,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACY,MAAA;AACE,IAAA;AAGL,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAEA,IAAA;AAA0C,MAAA;AACd,IAAA;AAG5B,IAAA;AACI,MAAA;AAAU,QAAA;AAC2D,MAAA;AACrE,IAAA;AAGJ,IAAA;AAAyC,MAAA;AACpB,IAAA;AAGrB,IAAA;AAAiB,MAAA;AACW,MAAA;AACP,MAAA;AACD,IAAA;AAGpB,IAAA;AAA0B,MAAA;AACE,IAAA;AAG5B,IAAA;AAEA,IAAA;AACA,IAAA;AACI,MAAA;AAAmB,QAAA;AACC,QAAA;AAChB,QAAA;AACA,MAAA;AACJ,IAAA;AAEA,MAAA;AAAmB,QAAA;AACE,QAAA;AACjB,QAAA;AACA,MAAA;AACJ,IAAA;AAGJ,IAAA;AAEA,IAAA;AACI,MAAA;AAC4B,MAAA;AACxB,MAAA;AAGuB,MAAA;AACvB,MAAA;AACA,IAAA;AAGR,IAAA;AAEA,IAAA;AAAoB,MAAA;AAChB,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAAiB,MAAA;AACwB,MAAA;AACrC,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AAGuB,MAAA;AACS,MAAA;AAClB,IAAA;AAGlB,IAAA;AAIiB,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAcI,IAAA;AAA0B,MAAA;AACa,IAAA;AAGvC,IAAA;AAAiB,MAAA;AACmC,MAAA;AACL,MAAA;AAC3C,MAAA;AAC0C,MAAA;AACb,IAAA;AAGjC,IAAA;AAGiB,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AAA0C,MAAA;AACjB,IAAA;AAGzB,IAAA;AACI,MAAA;AAAU,QAAA;AACwD,MAAA;AAClE,IAAA;AAGJ,IAAA;AAAyC,MAAA;AACpB,IAAA;AAGrB,IAAA;AAA0B,MAAA;AACD,IAAA;AAGzB,IAAA;AAAiB,MAAA;AACQ,MAAA;AACJ,MAAA;AACD,IAAA;AAGpB,IAAA;AACA,IAAA;AAAsB,MAAA;AACC,IAAA;AAEvB,IAAA;AAAgC,MAAA;AACT,IAAA;AAGvB,IAAA;AACA,IAAA;AAAuB,MAAA;AACC,IAAA;AAExB,IAAA;AAAiC,MAAA;AACT,IAAA;AAGxB,IAAA;AAAoB,MAAA;AAChB,MAAA;AACiB,IAAA;AAGrB,IAAA;AAAoB,MAAA;AAChB,MAAA;AACgB,IAAA;AAGpB,IAAA;AAKA,IAAA;AAKA,IAAA;AAEoB,MAAA;AACsB,MAAA;AAClC,MAAA;AACyB,MAAA;AACzB,MAAA;AACM,MAAA;AACmC,MAAA;AACzC,MAAA;AACA,MAAA;AAC2C,MAAA;AAC3C,MAAA;AACA,MAAA;AACA,MAAA;AACY,MAAA;AACe,MAAA;AACA,MAAA;AAC3B,MAAA;AACA,MAAA;AAC4B,MAAA;AACC,MAAA;AACD,MAAA;AAC5B,MAAA;AACA,MAAA;AACkB,MAAA;AACW,MAAA;AAC7B,IAAA;AAEe,MAAA;AACf,QAAA;AACc,QAAA;AACE,QAAA;AACiB,MAAA;AACjC,IAAA;AAIR,IAAA;AAAoE,MAAA;AACzD,IAAA;AAGX,IAAA;AAEA,IAAA;AAAO,MAAA;AACU,MAAA;AACY,MAAA;AACC,IAAA;AAC9B,EAAA;AAER;AzBqwsBA;AACA;A0BpkuBA;AAAA;AAGI;AA0BJ;AAAA;AACI;AACA;AAIG;AAAwD,EAAA;AAIvD,IAAA;AACA,IAAA;AAAoD,EAAA;AACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACG,IAAA;AAIP,IAAA;AAEA,IAAA;AAEqB,MAAA;AACb,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAES,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAwB,MAAA;AACO,IAAA;AAG/B,IAAA;AAA8D,MAAA;AAC7B,MAAA;AACI,MAAA;AACG,MAAA;AACH,IAAA;AAGrC,IAAA;AAEqB,MAAA;AACb,MAAA;AACkC,MAAA;AACK,MAAA;AACV,IAAA;AAEpB,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AA2BI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AACA,IAAA;AAEA,IAAA;AAAyB,MAAA;AACrB,MAAA;AACU,MAAA;AACV,IAAA;AAGJ,IAAA;AAA0B,MAAA;AACtB,MAAA;AACgB,MAAA;AAChB,IAAA;AAGJ,IAAA;AACI,MAAA;AACI,MAAA;AACA,MAAA;AACA,MAAA;AACU,MAAA;AACV,IAAA;AAER,IAAA;AAGA,IAAA;AACI,MAAA;AACI,MAAA;AACA,MAAA;AACA,MAAA;AACgB,MAAA;AAChB,IAAA;AAER,IAAA;AAGA,IAAA;AACA,IAAA;AAEA,IAAA;AAAiB,MAAA;AACO,MAAA;AACpB,MAAA;AACA,MAAA;AACe,MAAA;AACA,MAAA;AACM,MAAA;AACC,MAAA;AACF,MAAA;AACO,MAAA;AAC3B,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAAqD,EAAA;AACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AA0BI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAAM,MAAA;AACS,MAAA;AACA,MAAA;AACG,IAAA;AACH,MAAA;AACX,MAAA;AACA,MAAA;AACU,MAAA;AACM,MAAA;AAChB,MAAA;AACA,IAAA;AAGJ,IAAA;AAAiB,MAAA;AACO,MAAA;AACpB,MAAA;AACA,MAAA;AACe,MAAA;AACA,MAAA;AACM,MAAA;AACC,MAAA;AACF,MAAA;AACO,MAAA;AAC3B,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAAmC,EAAA;AACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAEA,IAAA;AACI,MAAA;AAAoD,IAAA;AAGxD,IAAA;AAEA,IAAA;AACI,MAAA;AAA2D,IAAA;AAG/D,IAAA;AACA,IAAA;AAA0B,MAAA;AACN,IAAA;AAGpB,IAAA;AAEA,IAAA;AAEI,MAAA;AAKA,MAAA;AAEA,MAAA;AAAgD,QAAA;AAC5C,QAAA;AACA,QAAA;AACA,QAAA;AACkB,QAAA;AACL,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AAGJ,MAAA;AAKiB,IAAA;AAEjB,MAAA;AAEA,MAAA;AAAmD,QAAA;AAC/C,QAAA;AACA,QAAA;AACA,QAAA;AACkB,QAAA;AAClB,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AAGJ,MAAA;AAIiB,IAAA;AACrB,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAEA,IAAA;AACI,MAAA;AAAoD,IAAA;AAGxD,IAAA;AAEA,IAAA;AACI,MAAA;AAA2D,IAAA;AAG/D,IAAA;AACA,IAAA;AAA0B,MAAA;AACN,IAAA;AAGpB,IAAA;AAEA,IAAA;AACI,MAAA;AACA,MAAA;AAEA,MAAA;AAAyB,QAAA;AACrB,QAAA;AACU,QAAA;AACV,MAAA;AAGJ,MAAA;AAA0B,QAAA;AACtB,QAAA;AACgB,QAAA;AAChB,MAAA;AAGJ,MAAA;AACI,QAAA;AACI,QAAA;AACA,QAAA;AACA,QAAA;AACU,QAAA;AACV,MAAA;AAER,MAAA;AAGA,MAAA;AACI,QAAA;AACI,QAAA;AACA,QAAA;AACA,QAAA;AACgB,QAAA;AAChB,MAAA;AAER,MAAA;AAGA,MAAA;AACA,MAAA;AAEA,MAAA;AAAiB,QAAA;AACO,QAAA;AACpB,QAAA;AACe,QAAA;AACA,QAAA;AACM,QAAA;AACC,QAAA;AACF,QAAA;AACO,QAAA;AAC3B,QAAA;AACA,QAAA;AACA,MAAA;AAGJ,MAAA;AAKiB,IAAA;AAEjB,MAAA;AAAmD,QAAA;AAC/C,QAAA;AACA,QAAA;AACa,QAAA;AACK,QAAA;AAClB,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AAEJ,MAAA;AAKiB,IAAA;AACrB,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAmC,MAAA;AACH,IAAA;AAEhC,IAAA;AACI,MAAA;AAAU,QAAA;AAC+D,MAAA;AACzE,IAAA;AAGJ,IAAA;AAEA,IAAA;AAA0B,MAAA;AACN,IAAA;AAGpB,IAAA;AACA,IAAA;AAEA,IAAA;AACU,MAAA;AACG,MAAA;AACW,MAAA;AACY,MAAA;AACA,MAAA;AAC5B,MAAA;AACA,IAAA;AAGR,IAAA;AAGA,IAAA;AACI,MAAA;AAAoB,QAAA;AACY,QAAA;AACA,MAAA;AAEhC,MAAA;AAAgD,IAAA;AAEpD,IAAA;AAEqB,MAAA;AACO,MAAA;AACF,MAAA;AACuB,MAAA;AACzC,MAAA;AACsB,MAAA;AACK,MAAA;AACa,MAAA;AACxC,IAAA;AAIS,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AACA,IAAA;AAAqC,MAAA;AAChB,IAAA;AAErB,IAAA;AACU,MAAA;AACoB,MAAA;AACV,MAAA;AACZ,uBAAA;AACY,MAAA;AACZ,MAAA;AAC0C,IAAA;AAGlD,IAAA;AACA,IAAA;AACI,MAAA;AACA,MAAA;AAA+C,IAAA;AAGnD,IAAA;AAEqB,MAAA;AACO,MAAA;AACK,MAAA;AACzB,MAAA;AACA,MAAA;AAC6B,MAAA;AACN,MAAA;AACvB,MAAA;AAC6D,IAAA;AAMrE,IAAA;AAAO,EAAA;AAEf;A1B04tBA;AACA;A2Bn9uBA;AAAA;AAGI;AAeJ;AAAA;AACI;AACA;AACA;AAcG;AAAwD,EAAA;AAIvD,IAAA;AACA,IAAA;AAAoD,EAAA;AACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAA4B,MAAA;AACO,IAAA;AAEnC,IAAA;AAC+B,MAAA;AACM,MAAA;AACQ,MAAA;AACG,MAAA;AACH,IAAA;AAExB,MAAA;AAC+B,MAAA;AAC5C,MAAA;AACwC,MAAA;AACF,MAAA;AACT,IAAA;AAEpB,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AA0BI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AACA,IAAA;AAEA,IAAA;AAAyB,MAAA;AACrB,MAAA;AACU,MAAA;AACV,IAAA;AAGJ,IAAA;AAA0B,MAAA;AACtB,MAAA;AACgB,MAAA;AAChB,IAAA;AAGJ,IAAA;AACI,MAAA;AACI,MAAA;AACA,MAAA;AACA,MAAA;AACU,MAAA;AACV,IAAA;AAER,IAAA;AAGA,IAAA;AACI,MAAA;AACI,MAAA;AACA,MAAA;AACA,MAAA;AACgB,MAAA;AAChB,IAAA;AAER,IAAA;AAGA,IAAA;AACA,IAAA;AAEA,IAAA;AAAiB,MAAA;AACO,MAAA;AACpB,MAAA;AACe,MAAA;AACA,MAAA;AACM,MAAA;AACC,MAAA;AACF,MAAA;AACO,MAAA;AAC3B,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAAqD,EAAA;AACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAyBI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAAM,MAAA;AACS,MAAA;AACA,MAAA;AACG,IAAA;AACH,MAAA;AACX,MAAA;AACA,MAAA;AACU,MAAA;AACM,MAAA;AAChB,MAAA;AACA,IAAA;AAGJ,IAAA;AAAiB,MAAA;AACO,MAAA;AACpB,MAAA;AACe,MAAA;AACA,MAAA;AACM,MAAA;AACC,MAAA;AACF,MAAA;AACO,MAAA;AAC3B,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAAmC,EAAA;AACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAEA,IAAA;AACI,MAAA;AAAoD,IAAA;AAGxD,IAAA;AAEA,IAAA;AACI,MAAA;AAA2D,IAAA;AAG/D,IAAA;AACA,IAAA;AAA0B,MAAA;AACN,IAAA;AAGpB,IAAA;AAEA,IAAA;AAEI,MAAA;AAGA,MAAA;AAEA,MAAA;AAAgD,QAAA;AAC5C,QAAA;AACA,QAAA;AACA,QAAA;AACa,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AAGJ,MAAA;AAKiB,IAAA;AAGjB,MAAA;AAEA,MAAA;AAAmD,QAAA;AAC/C,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AAEJ,MAAA;AAKiB,IAAA;AACrB,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAAM,MAAA;AACF,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AAGJ,IAAA;AAEA,IAAA;AACI,MAAA;AAAoD,IAAA;AAGxD,IAAA;AAEA,IAAA;AACI,MAAA;AAA2D,IAAA;AAG/D,IAAA;AACA,IAAA;AAA0B,MAAA;AACN,IAAA;AAGpB,IAAA;AAEA,IAAA;AACI,MAAA;AACA,MAAA;AAEA,MAAA;AAAyB,QAAA;AACrB,QAAA;AACU,QAAA;AACV,MAAA;AAGJ,MAAA;AAA0B,QAAA;AACtB,QAAA;AACgB,QAAA;AAChB,MAAA;AAGJ,MAAA;AACI,QAAA;AACI,QAAA;AACA,QAAA;AACA,QAAA;AACU,QAAA;AACV,MAAA;AAER,MAAA;AAGA,MAAA;AACI,QAAA;AACI,QAAA;AACA,QAAA;AACA,QAAA;AACgB,QAAA;AAChB,MAAA;AAER,MAAA;AAGA,MAAA;AACA,MAAA;AAEA,MAAA;AAAiB,QAAA;AACO,QAAA;AACpB,QAAA;AACe,QAAA;AACA,QAAA;AACM,QAAA;AACC,QAAA;AACF,QAAA;AACO,QAAA;AAC3B,QAAA;AACA,QAAA;AACA,MAAA;AAGJ,MAAA;AAKiB,IAAA;AAEjB,MAAA;AAAmD,QAAA;AAC/C,QAAA;AACA,QAAA;AACa,QAAA;AACb,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AAEJ,MAAA;AAKiB,IAAA;AACrB,EAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AAEA,IAAA;AAEA,IAAA;AACI,MAAA;AAA2D,IAAA;AAG/D,IAAA;AAEA,IAAA;AACI,MAAA;AAAkE,IAAA;AAGtE,IAAA;AACA,IAAA;AAEA,IAAA;AAA0B,MAAA;AACtB,MAAA;AACgB,MAAA;AAChB,IAAA;AAGJ,IAAA;AACI,MAAA;AACI,MAAA;AACA,MAAA;AACA,MAAA;AACgB,MAAA;AAChB,IAAA;AAGR,IAAA;AACI,MAAA;AAA8C,IAAA;AAGlD,IAAA;AAEA,IAAA;AACI,MAAA;AACA,MAAA;AACI,QAAA;AAA8B,MAAA;AAClC,IAAA;AAGJ,IAAA;AAAiB,MAAA;AACO,MAAA;AACF,MAAA;AAClB,MAAA;AACA,MAAA;AACsB,MAAA;AACK,MAAA;AAC3B,MAAA;AACmB,IAAA;AAGvB,IAAA;AAKiB,EAAA;AACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AACA,IAAA;AAEA,IAAA;AAEqB,MAAA;AACb,MAAA;AACA,MAAA;AACyB,MAAA;AACzB,IAAA;AAEe,MAAA;AACf,QAAA;AACc,QAAA;AACE,QAAA;AACJ,MAAA;AACZ,IAAA;AAIR,IAAA;AAAO,EAAA;AACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAUI,IAAA;AACA,IAAA;AACA,IAAA;AAAqC,MAAA;AAChB,IAAA;AAErB,IAAA;AACU,MAAA;AACoB,MAAA;AACV,MAAA;AACZ,uBAAA;AACY,MAAA;AACZ,MAAA;AAC0C,IAAA;AAElD,IAAA;AACA,IAAA;AACI,MAAA;AACA,MAAA;AAA+C,IAAA;AAGnD,IAAA;AAEqB,MAAA;AACO,MAAA;AACK,MAAA;AACzB,MAAA;AACA,MAAA;AAC6B,MAAA;AACN,MAAA;AACvB,MAAA;AAC6D,IAAA;AAMrE,IAAA;AAAO,EAAA;AAEf;A3B2xuBA;AACA;A4Bz1vBO;AAAgC,EAAA;AAU/B,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAAkB,EAAA;AACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAWI,IAAA;AAA2D,EAAA;AAEnE;A5B+0vBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/zhangxinjie/WebstormProjects/dynamic-bonding-curve-sdk/packages/dynamic-bonding-curve/dist/index.cjs","sourcesContent":[null,"import {\n    Commitment,\n    PublicKey,\n    TransactionInstruction,\n    type Connection,\n    Transaction,\n    SYSVAR_INSTRUCTIONS_PUBKEY,\n} from '@solana/web3.js'\nimport { DynamicBondingCurveProgram } from './program'\nimport {\n    ActivationType,\n    BaseFeeMode,\n    ConfigParameters,\n    CreateConfigAndPoolParam,\n    CreateConfigAndPoolWithFirstBuyParam,\n    CreatePoolWithFirstBuyParam,\n    CreatePoolWithPartnerAndCreatorFirstBuyParam,\n    FirstBuyParam,\n    InitializePoolBaseParam,\n    PrepareSwapParams,\n    SwapQuoteExactInParam,\n    SwapQuoteExactOutParam,\n    TokenType,\n    type CreatePoolParam,\n    type SwapParam,\n    type SwapQuoteParam,\n    CreatePoolWithBuyTxsParam,\n} from '../types'\nimport {\n    deriveDbcPoolAddress,\n    deriveMintMetadata,\n    getTokenProgram,\n    unwrapSOLInstruction,\n    wrapSOLInstruction,\n    deriveDbcTokenVaultAddress,\n    getTokenType,\n    checkRateLimiterApplied,\n    getOrCreateATAInstruction,\n} from '../helpers'\nimport { NATIVE_MINT, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token'\nimport { METAPLEX_PROGRAM_ID } from '../constants'\nimport {\n    swapQuote,\n    calculateQuoteExactInAmount,\n    swapQuoteExactOut,\n} from '../math/swapQuote'\nimport { StateService } from './state'\nimport {\n    validateConfigParameters,\n    validateSwapAmount,\n} from '../helpers/validation'\nimport BN from 'bn.js'\n\nexport class PoolService extends DynamicBondingCurveProgram {\n    private state: StateService\n\n    constructor(connection: Connection, commitment: Commitment) {\n        super(connection, commitment)\n        this.state = new StateService(connection, commitment)\n    }\n\n    /**\n     * Private method to initialize a pool with SPL token\n     * @param initializeSplPoolParams - The parameters for the initialize SPL pool\n     * @returns A transaction that initializes the pool with SPL token\n     */\n    private async initializeSplPool(\n        initializeSplPoolParams: InitializePoolBaseParam\n    ): Promise<Transaction> {\n        const {\n            name,\n            symbol,\n            uri,\n            pool,\n            config,\n            payer,\n            poolCreator,\n            mintMetadata,\n            baseMint,\n            baseVault,\n            quoteVault,\n            quoteMint,\n        } = initializeSplPoolParams\n        return this.program.methods\n            .initializeVirtualPoolWithSplToken({\n                name,\n                symbol,\n                uri,\n            })\n            .accountsPartial({\n                pool,\n                config,\n                payer,\n                creator: poolCreator,\n                mintMetadata,\n                baseMint,\n                poolAuthority: this.poolAuthority,\n                baseVault,\n                quoteVault,\n                quoteMint,\n                tokenQuoteProgram: TOKEN_PROGRAM_ID,\n                metadataProgram: METAPLEX_PROGRAM_ID,\n                tokenProgram: TOKEN_PROGRAM_ID,\n            })\n            .transaction()\n    }\n\n    /**\n     * Private method to initialize a pool with Token2022\n     * @param initializeToken2022PoolParams - The parameters for the initialize Token2022 pool\n     * @returns A transaction that initializes the pool with Token2022\n     */\n    private async initializeToken2022Pool(\n        initializeToken2022PoolParams: InitializePoolBaseParam\n    ): Promise<Transaction> {\n        const {\n            name,\n            symbol,\n            uri,\n            pool,\n            config,\n            payer,\n            poolCreator,\n            baseMint,\n            baseVault,\n            quoteVault,\n            quoteMint,\n        } = initializeToken2022PoolParams\n        return this.program.methods\n            .initializeVirtualPoolWithToken2022({\n                name,\n                symbol,\n                uri,\n            })\n            .accountsPartial({\n                pool,\n                config,\n                payer,\n                creator: poolCreator,\n                baseMint,\n                poolAuthority: this.poolAuthority,\n                baseVault,\n                quoteVault,\n                quoteMint,\n                tokenQuoteProgram: TOKEN_PROGRAM_ID,\n                tokenProgram: TOKEN_2022_PROGRAM_ID,\n            })\n            .transaction()\n    }\n\n    /**\n     * Private method to prepare swap parameters\n     * @param swapBaseForQuote - Whether to swap base for quote\n     * @param virtualPoolState - The virtual pool state\n     * @param poolConfigState - The pool config state\n     * @returns The prepare swap parameters\n     */\n    private prepareSwapParams(\n        swapBaseForQuote: boolean,\n        virtualPoolState: {\n            baseMint: PublicKey\n            poolType: TokenType\n        },\n        poolConfigState: {\n            quoteMint: PublicKey\n            quoteTokenFlag: TokenType\n        }\n    ): PrepareSwapParams {\n        if (swapBaseForQuote) {\n            return {\n                inputMint: new PublicKey(virtualPoolState.baseMint),\n                outputMint: new PublicKey(poolConfigState.quoteMint),\n                inputTokenProgram: getTokenProgram(virtualPoolState.poolType),\n                outputTokenProgram: getTokenProgram(\n                    poolConfigState.quoteTokenFlag\n                ),\n            }\n        } else {\n            return {\n                inputMint: new PublicKey(poolConfigState.quoteMint),\n                outputMint: new PublicKey(virtualPoolState.baseMint),\n                inputTokenProgram: getTokenProgram(\n                    poolConfigState.quoteTokenFlag\n                ),\n                outputTokenProgram: getTokenProgram(virtualPoolState.poolType),\n            }\n        }\n    }\n\n    /**\n     * Private method to create config transaction\n     * @param configParam - The config parameters\n     * @param config - The config address\n     * @param feeClaimer - The fee claimer address\n     * @param leftoverReceiver - The leftover receiver address\n     * @param quoteMint - The quote mint address\n     * @param payer - The payer address\n     * @returns A transaction that creates the config\n     */\n    private async createConfigTx(\n        configParam: ConfigParameters,\n        config: PublicKey,\n        feeClaimer: PublicKey,\n        leftoverReceiver: PublicKey,\n        quoteMint: PublicKey,\n        payer: PublicKey\n    ): Promise<Transaction> {\n        // error checks\n        validateConfigParameters({ ...configParam, leftoverReceiver })\n\n        return this.program.methods\n            .createConfig(configParam)\n            .accountsPartial({\n                config,\n                feeClaimer,\n                leftoverReceiver,\n                quoteMint,\n                payer,\n            })\n            .transaction()\n    }\n\n    /**\n     * method to create pool transaction\n     * @param createPoolParam - The parameters for the pool\n     * @param tokenType - The token type\n     * @param quoteMint - The quote mint token\n     * @returns A transaction that creates the pool\n     */\n    async createPoolTx(\n        createPoolParam: CreatePoolParam,\n        tokenType: TokenType,\n        quoteMint: PublicKey\n    ): Promise<Transaction> {\n        const { baseMint, name, symbol, uri, poolCreator, config, payer } =\n            createPoolParam\n\n        const pool = deriveDbcPoolAddress(quoteMint, baseMint, config)\n        const baseVault = deriveDbcTokenVaultAddress(pool, baseMint)\n        const quoteVault = deriveDbcTokenVaultAddress(pool, quoteMint)\n\n        const baseParams: InitializePoolBaseParam = {\n            name,\n            symbol,\n            uri,\n            pool,\n            config,\n            payer,\n            poolCreator,\n            baseMint,\n            baseVault,\n            quoteVault,\n            quoteMint,\n        }\n\n        if (tokenType === TokenType.SPL) {\n            const mintMetadata = deriveMintMetadata(baseMint)\n            return this.initializeSplPool({ ...baseParams, mintMetadata })\n        } else {\n            return this.initializeToken2022Pool(baseParams)\n        }\n    }\n\n    /**\n     * method to create first buy transaction\n     * @param firstBuyParam - The parameters for the first buy\n     * @param baseMint - The base mint token\n     * @param config - The config key\n     * @param baseFeeMode - The base fee mode\n     * @param tokenType - The token type\n     * @param quoteMint - The quote mint token\n     * @returns Instructions for the first buy\n     */\n    async swapBuyTx(\n        firstBuyParam: FirstBuyParam,\n        baseMint: PublicKey,\n        config: PublicKey,\n        baseFeeMode: BaseFeeMode,\n        tokenType: TokenType,\n        quoteMint: PublicKey\n    ): Promise<Transaction> {\n        const {\n            buyer,\n            receiver,\n            buyAmount,\n            minimumAmountOut,\n            referralTokenAccount,\n        } = firstBuyParam\n\n        // error checks\n        validateSwapAmount(buyAmount)\n\n        // check if rate limiter is applied\n        // this swapBuyTx is only QuoteToBase direction\n        // this swapBuyTx does not check poolState, so there is no check for activation point\n        const isRateLimiterApplied = checkRateLimiterApplied(\n            baseFeeMode,\n            false,\n            new BN(0),\n            new BN(0),\n            new BN(0)\n        )\n\n        const quoteTokenFlag = await getTokenType(this.connection, quoteMint)\n\n        const { inputMint, outputMint, inputTokenProgram, outputTokenProgram } =\n            this.prepareSwapParams(\n                false,\n                {\n                    baseMint,\n                    poolType: tokenType,\n                },\n                {\n                    quoteMint: quoteMint,\n                    quoteTokenFlag,\n                }\n            )\n\n        const pool = deriveDbcPoolAddress(quoteMint, baseMint, config)\n        const baseVault = deriveDbcTokenVaultAddress(pool, baseMint)\n        const quoteVault = deriveDbcTokenVaultAddress(pool, quoteMint)\n\n        const preInstructions: TransactionInstruction[] = []\n\n        const [\n            { ataPubkey: inputTokenAccount, ix: createAtaTokenAIx },\n            { ataPubkey: outputTokenAccount, ix: createAtaTokenBIx },\n        ] = await Promise.all([\n            getOrCreateATAInstruction(\n                this.connection,\n                inputMint,\n                buyer,\n                buyer,\n                true,\n                inputTokenProgram\n            ),\n            getOrCreateATAInstruction(\n                this.connection,\n                outputMint,\n                receiver ? receiver : buyer,\n                buyer,\n                true,\n                outputTokenProgram\n            ),\n        ])\n        createAtaTokenAIx && preInstructions.push(createAtaTokenAIx)\n        createAtaTokenBIx && preInstructions.push(createAtaTokenBIx)\n\n        // add SOL wrapping instructions if needed\n        if (inputMint.equals(NATIVE_MINT)) {\n            preInstructions.push(\n                ...wrapSOLInstruction(\n                    buyer,\n                    inputTokenAccount,\n                    BigInt(buyAmount.toString())\n                )\n            )\n        }\n\n        // add postInstructions for SOL unwrapping if needed\n        const postInstructions: TransactionInstruction[] = []\n        if (\n            [inputMint.toBase58(), outputMint.toBase58()].includes(\n                NATIVE_MINT.toBase58()\n            )\n        ) {\n            const unwrapIx = unwrapSOLInstruction(buyer, buyer)\n            unwrapIx && postInstructions.push(unwrapIx)\n        }\n\n        // add remaining accounts if rate limiter is applied\n        const remainingAccounts = isRateLimiterApplied\n            ? [\n                  {\n                      isSigner: false,\n                      isWritable: false,\n                      pubkey: SYSVAR_INSTRUCTIONS_PUBKEY,\n                  },\n              ]\n            : []\n\n        return this.program.methods\n            .swap({\n                amountIn: buyAmount,\n                minimumAmountOut,\n            })\n            .accountsPartial({\n                baseMint,\n                quoteMint,\n                pool,\n                baseVault,\n                quoteVault,\n                config,\n                poolAuthority: this.poolAuthority,\n                referralTokenAccount,\n                inputTokenAccount,\n                outputTokenAccount,\n                payer: buyer,\n                tokenBaseProgram: outputTokenProgram,\n                tokenQuoteProgram: inputTokenProgram,\n            })\n            .remainingAccounts(remainingAccounts)\n            .preInstructions(preInstructions)\n            .postInstructions(postInstructions)\n            .transaction()\n    }\n\n    /**\n     * Create a new pool\n     * @param createPoolParam - The parameters for the pool\n     * @returns A new pool\n     */\n    async createPool(createPoolParam: CreatePoolParam): Promise<Transaction> {\n        const { baseMint, config, name, symbol, uri, payer, poolCreator } =\n            createPoolParam\n\n        const poolConfigState = await this.state.getPoolConfig(config)\n\n        const { quoteMint, tokenType } = poolConfigState\n\n        const pool = deriveDbcPoolAddress(quoteMint, baseMint, config)\n        const baseVault = deriveDbcTokenVaultAddress(pool, baseMint)\n        const quoteVault = deriveDbcTokenVaultAddress(pool, quoteMint)\n\n        const baseParams: InitializePoolBaseParam = {\n            name,\n            symbol,\n            uri,\n            pool,\n            config,\n            payer,\n            poolCreator,\n            baseMint,\n            baseVault,\n            quoteVault,\n            quoteMint,\n        }\n\n        if (tokenType === TokenType.SPL) {\n            const mintMetadata = deriveMintMetadata(baseMint)\n            return this.initializeSplPool({ ...baseParams, mintMetadata })\n        } else {\n            return this.initializeToken2022Pool(baseParams)\n        }\n    }\n\n    /**\n     * Create a new config and pool\n     * @param createConfigAndPoolParam - The parameters for the config and pool\n     * @returns A new config and pool\n     */\n    async createConfigAndPool(\n        createConfigAndPoolParam: CreateConfigAndPoolParam\n    ): Promise<Transaction> {\n        const {\n            config,\n            feeClaimer,\n            leftoverReceiver,\n            quoteMint,\n            payer,\n            ...configParam\n        } = createConfigAndPoolParam\n\n        const configKey = new PublicKey(config)\n        const quoteMintToken = new PublicKey(quoteMint)\n        const payerAddress = new PublicKey(payer)\n        const feeClaimerAddress = new PublicKey(feeClaimer)\n        const leftoverReceiverAddress = new PublicKey(leftoverReceiver)\n\n        const tx = new Transaction()\n\n        // create config transaction\n        const createConfigTx = await this.createConfigTx(\n            configParam,\n            configKey,\n            feeClaimerAddress,\n            leftoverReceiverAddress,\n            quoteMintToken,\n            payerAddress\n        )\n\n        tx.add(createConfigTx)\n\n        // create pool transaction\n        const createPoolTx = await this.createPoolTx(\n            {\n                ...createConfigAndPoolParam.preCreatePoolParam,\n                config: configKey,\n                payer: payerAddress,\n            },\n            createConfigAndPoolParam.tokenType,\n            quoteMintToken\n        )\n        tx.add(createPoolTx)\n\n        return tx\n    }\n\n    /**\n     * Create a new config and pool and buy tokens\n     * @param createConfigAndPoolWithFirstBuyParam - The parameters for the config and pool and buy\n     * @returns An object containing the new config transaction, new pool transaction, and first buy transaction\n     */\n    async createConfigAndPoolWithFirstBuy(\n        createConfigAndPoolWithFirstBuyParam: CreateConfigAndPoolWithFirstBuyParam\n    ): Promise<{\n        createConfigTx: Transaction\n        createPoolTx: Transaction\n        swapBuyTx: Transaction | undefined\n    }> {\n        const {\n            config,\n            feeClaimer,\n            leftoverReceiver,\n            quoteMint,\n            payer,\n            ...configParam\n        } = createConfigAndPoolWithFirstBuyParam\n\n        const configKey = new PublicKey(config)\n        const quoteMintToken = new PublicKey(quoteMint)\n        const payerAddress = new PublicKey(payer)\n        const feeClaimerAddress = new PublicKey(feeClaimer)\n        const leftoverReceiverAddress = new PublicKey(leftoverReceiver)\n\n        // create config transaction\n        const createConfigTx = await this.createConfigTx(\n            configParam,\n            configKey,\n            feeClaimerAddress,\n            leftoverReceiverAddress,\n            quoteMintToken,\n            payerAddress\n        )\n\n        // create pool transaction\n        const createPoolTx = await this.createPoolTx(\n            {\n                ...createConfigAndPoolWithFirstBuyParam.preCreatePoolParam,\n                config: configKey,\n                payer: payerAddress,\n            },\n            createConfigAndPoolWithFirstBuyParam.tokenType,\n            quoteMintToken\n        )\n\n        // create first buy transaction\n        let swapBuyTx: Transaction | undefined\n        if (\n            createConfigAndPoolWithFirstBuyParam.firstBuyParam &&\n            createConfigAndPoolWithFirstBuyParam.firstBuyParam.buyAmount.gt(\n                new BN(0)\n            )\n        ) {\n            swapBuyTx = await this.swapBuyTx(\n                createConfigAndPoolWithFirstBuyParam.firstBuyParam,\n                createConfigAndPoolWithFirstBuyParam.preCreatePoolParam\n                    .baseMint,\n                configKey,\n                createConfigAndPoolWithFirstBuyParam.poolFees.baseFee\n                    .baseFeeMode,\n                createConfigAndPoolWithFirstBuyParam.tokenType,\n                quoteMintToken\n            )\n        }\n\n        return {\n            createConfigTx,\n            createPoolTx,\n            swapBuyTx,\n        }\n    }\n\n    async createPoolWithBuyTxs(\n        createPoolWithBuyTxsParam: CreatePoolWithBuyTxsParam\n    ): Promise<{\n        createPoolTx: Transaction\n        swapBuyTxs: Transaction[]\n    }> {\n        const { config } = createPoolWithBuyTxsParam.createPoolParam\n\n        const poolConfigState = await this.state.getPoolConfig(config)\n\n        const { quoteMint, tokenType } = poolConfigState\n\n        // create pool transaction\n        const createPoolTx = await this.createPoolTx(\n            createPoolWithBuyTxsParam.createPoolParam,\n            tokenType,\n            quoteMint\n        )\n\n        let swapBuyTxs: Transaction[] = []\n        for (const buyParm of createPoolWithBuyTxsParam.BuyParms) {\n            if (buyParm.buyAmount.gt(new BN(0))) {\n                const swapBuyTx = await this.swapBuyTx(\n                    buyParm,\n                    createPoolWithBuyTxsParam.createPoolParam.baseMint,\n                    config,\n                    poolConfigState.poolFees.baseFee.baseFeeMode,\n                    tokenType,\n                    quoteMint\n                )\n                swapBuyTxs.push(swapBuyTx)\n            }\n        }\n\n        return {\n            createPoolTx,\n            swapBuyTxs,\n        }\n    }\n\n    /**\n     * Create a new pool and buy tokens\n     * @param createPoolWithFirstBuyParam - The parameters for the pool and buy\n     * @returns An object containing the new pool transaction and swap buy transaction\n     */\n    async createPoolWithFirstBuy(\n        createPoolWithFirstBuyParam: CreatePoolWithFirstBuyParam\n    ): Promise<{\n        createPoolTx: Transaction\n        swapBuyTx: Transaction | undefined\n    }> {\n        const { config } = createPoolWithFirstBuyParam.createPoolParam\n\n        const poolConfigState = await this.state.getPoolConfig(config)\n\n        const { quoteMint, tokenType } = poolConfigState\n\n        // create pool transaction\n        const createPoolTx = await this.createPoolTx(\n            createPoolWithFirstBuyParam.createPoolParam,\n            tokenType,\n            quoteMint\n        )\n\n        // create first buy transaction\n        let swapBuyTx: Transaction | undefined\n        if (\n            createPoolWithFirstBuyParam.firstBuyParam &&\n            createPoolWithFirstBuyParam.firstBuyParam.buyAmount.gt(new BN(0))\n        ) {\n            swapBuyTx = await this.swapBuyTx(\n                createPoolWithFirstBuyParam.firstBuyParam,\n                createPoolWithFirstBuyParam.createPoolParam.baseMint,\n                config,\n                poolConfigState.poolFees.baseFee.baseFeeMode,\n                tokenType,\n                quoteMint\n            )\n        }\n\n        return {\n            createPoolTx,\n            swapBuyTx,\n        }\n    }\n\n    /**\n     * Create a new pool and buy tokens with partner and creator\n     * @param createPoolWithPartnerAndCreatorFirstBuyParam - The parameters for the pool and buy\n     * @returns An object containing the new pool transaction and swap buy transactions\n     */\n    async createPoolWithPartnerAndCreatorFirstBuy(\n        createPoolWithPartnerAndCreatorFirstBuyParam: CreatePoolWithPartnerAndCreatorFirstBuyParam\n    ): Promise<{\n        createPoolTx: Transaction\n        partnerSwapBuyTx: Transaction | undefined\n        creatorSwapBuyTx: Transaction | undefined\n    }> {\n        const { config } =\n            createPoolWithPartnerAndCreatorFirstBuyParam.createPoolParam\n\n        const poolConfigState = await this.state.getPoolConfig(config)\n\n        const { quoteMint, tokenType } = poolConfigState\n\n        // create pool transaction\n        const createPoolTx = await this.createPoolTx(\n            createPoolWithPartnerAndCreatorFirstBuyParam.createPoolParam,\n            tokenType,\n            quoteMint\n        )\n\n        // create partner first buy transaction\n        let partnerSwapBuyTx: Transaction | undefined\n        if (\n            createPoolWithPartnerAndCreatorFirstBuyParam.partnerFirstBuyParam &&\n            createPoolWithPartnerAndCreatorFirstBuyParam.partnerFirstBuyParam.buyAmount.gt(\n                new BN(0)\n            )\n        ) {\n            partnerSwapBuyTx = await this.swapBuyTx(\n                {\n                    buyer: createPoolWithPartnerAndCreatorFirstBuyParam\n                        .partnerFirstBuyParam.partner,\n                    receiver:\n                        createPoolWithPartnerAndCreatorFirstBuyParam\n                            .partnerFirstBuyParam.receiver,\n                    buyAmount:\n                        createPoolWithPartnerAndCreatorFirstBuyParam\n                            .partnerFirstBuyParam.buyAmount,\n                    minimumAmountOut:\n                        createPoolWithPartnerAndCreatorFirstBuyParam\n                            .partnerFirstBuyParam.minimumAmountOut,\n                    referralTokenAccount:\n                        createPoolWithPartnerAndCreatorFirstBuyParam\n                            .partnerFirstBuyParam.referralTokenAccount,\n                },\n                createPoolWithPartnerAndCreatorFirstBuyParam.createPoolParam\n                    .baseMint,\n                config,\n                poolConfigState.poolFees.baseFee.baseFeeMode,\n                tokenType,\n                quoteMint\n            )\n        }\n\n        // create creator first buy transaction\n        let creatorSwapBuyTx: Transaction | undefined\n        if (\n            createPoolWithPartnerAndCreatorFirstBuyParam.creatorFirstBuyParam &&\n            createPoolWithPartnerAndCreatorFirstBuyParam.creatorFirstBuyParam.buyAmount.gt(\n                new BN(0)\n            )\n        ) {\n            creatorSwapBuyTx = await this.swapBuyTx(\n                {\n                    buyer: createPoolWithPartnerAndCreatorFirstBuyParam\n                        .creatorFirstBuyParam.creator,\n                    receiver:\n                        createPoolWithPartnerAndCreatorFirstBuyParam\n                            .creatorFirstBuyParam.receiver,\n                    buyAmount:\n                        createPoolWithPartnerAndCreatorFirstBuyParam\n                            .creatorFirstBuyParam.buyAmount,\n                    minimumAmountOut:\n                        createPoolWithPartnerAndCreatorFirstBuyParam\n                            .creatorFirstBuyParam.minimumAmountOut,\n                    referralTokenAccount:\n                        createPoolWithPartnerAndCreatorFirstBuyParam\n                            .creatorFirstBuyParam.referralTokenAccount,\n                },\n                createPoolWithPartnerAndCreatorFirstBuyParam.createPoolParam\n                    .baseMint,\n                config,\n                poolConfigState.poolFees.baseFee.baseFeeMode,\n                tokenType,\n                quoteMint\n            )\n        }\n\n        return {\n            createPoolTx,\n            partnerSwapBuyTx,\n            creatorSwapBuyTx,\n        }\n    }\n\n    /**\n     * Swap between base and quote\n     * @param pool - The pool address\n     * @param swapParam - The parameters for the swap\n     * @returns A swap transaction\n     */\n    async swap(swapParam: SwapParam): Promise<Transaction> {\n        const poolState = await this.state.getPool(swapParam.pool)\n\n        if (!poolState) {\n            throw new Error(`Pool not found: ${swapParam.pool.toString()}`)\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        const { amountIn, minimumAmountOut, swapBaseForQuote, owner, payer } =\n            swapParam\n\n        // error checks\n        validateSwapAmount(amountIn)\n\n        let currentPoint\n        if (poolConfigState.activationType === ActivationType.Slot) {\n            const currentSlot = await this.connection.getSlot()\n            currentPoint = new BN(currentSlot)\n        } else {\n            const currentSlot = await this.connection.getSlot()\n            const currentTime = await this.connection.getBlockTime(currentSlot)\n            currentPoint = new BN(currentTime)\n        }\n\n        // check if rate limiter is applied if:\n        // 1. rate limiter mode\n        // 2. swap direction is QuoteToBase\n        // 3. current point is greater than activation point\n        // 4. current point is less than activation point + maxLimiterDuration\n        const isRateLimiterApplied = checkRateLimiterApplied(\n            poolConfigState.poolFees.baseFee.baseFeeMode,\n            swapBaseForQuote,\n            currentPoint,\n            poolState.activationPoint,\n            poolConfigState.poolFees.baseFee.secondFactor\n        )\n\n        const { inputMint, outputMint, inputTokenProgram, outputTokenProgram } =\n            this.prepareSwapParams(swapBaseForQuote, poolState, poolConfigState)\n\n        // add preInstructions for ATA creation and SOL wrapping\n        const {\n            ataTokenA: inputTokenAccount,\n            ataTokenB: outputTokenAccount,\n            instructions: preInstructions,\n        } = await this.prepareTokenAccounts(\n            owner,\n            payer ? payer : owner,\n            inputMint,\n            outputMint,\n            inputTokenProgram,\n            outputTokenProgram\n        )\n\n        // add SOL wrapping instructions if needed\n        if (inputMint.equals(NATIVE_MINT)) {\n            preInstructions.push(\n                ...wrapSOLInstruction(\n                    owner,\n                    inputTokenAccount,\n                    BigInt(amountIn.toString())\n                )\n            )\n        }\n\n        // add postInstructions for SOL unwrapping\n        const postInstructions: TransactionInstruction[] = []\n        if (\n            [inputMint.toBase58(), outputMint.toBase58()].includes(\n                NATIVE_MINT.toBase58()\n            )\n        ) {\n            const unwrapIx = unwrapSOLInstruction(owner, owner)\n            unwrapIx && postInstructions.push(unwrapIx)\n        }\n\n        // add remaining accounts if rate limiter is applied\n        const remainingAccounts = isRateLimiterApplied\n            ? [\n                  {\n                      isSigner: false,\n                      isWritable: false,\n                      pubkey: SYSVAR_INSTRUCTIONS_PUBKEY,\n                  },\n              ]\n            : []\n\n        return this.program.methods\n            .swap({\n                amountIn,\n                minimumAmountOut,\n            })\n            .accountsPartial({\n                baseMint: poolState.baseMint,\n                quoteMint: poolConfigState.quoteMint,\n                pool: swapParam.pool,\n                baseVault: poolState.baseVault,\n                quoteVault: poolState.quoteVault,\n                config: poolState.config,\n                poolAuthority: this.poolAuthority,\n                referralTokenAccount: swapParam.referralTokenAccount,\n                inputTokenAccount,\n                outputTokenAccount,\n                payer: owner,\n                tokenBaseProgram: swapBaseForQuote\n                    ? inputTokenProgram\n                    : outputTokenProgram,\n                tokenQuoteProgram: swapBaseForQuote\n                    ? outputTokenProgram\n                    : inputTokenProgram,\n            })\n            .remainingAccounts(remainingAccounts)\n            .preInstructions(preInstructions)\n            .postInstructions(postInstructions)\n            .transaction()\n    }\n\n    /**\n     * Calculate the amount out for a swap (quote)\n     * @param virtualPool - The virtual pool\n     * @param config - The config\n     * @param swapBaseForQuote - Whether to swap base for quote\n     * @param amountIn - The amount in\n     * @param slippageBps - Slippage tolerance in basis points (100 = 1%)\n     * @param hasReferral - Whether the referral is enabled\n     * @param currentPoint - The current point\n     * @returns The swap quote result\n     */\n    swapQuote(swapQuoteParam: SwapQuoteParam) {\n        const {\n            virtualPool,\n            config,\n            swapBaseForQuote,\n            amountIn,\n            slippageBps = 0,\n            hasReferral,\n            currentPoint,\n        } = swapQuoteParam\n\n        return swapQuote(\n            virtualPool,\n            config,\n            swapBaseForQuote,\n            amountIn,\n            slippageBps,\n            hasReferral,\n            currentPoint\n        )\n    }\n\n    /**\n     * Calculate the exact amount in for a swap (quote)\n     * @param swapQuoteExactInParam - The parameters for the swap\n     * @returns The exact amount in for the swap\n     */\n    swapQuoteExactIn(swapQuoteExactInParam: SwapQuoteExactInParam): {\n        exactAmountIn: BN\n    } {\n        const { virtualPool, config, currentPoint } = swapQuoteExactInParam\n\n        const requiredQuoteAmount = calculateQuoteExactInAmount(\n            config,\n            virtualPool,\n            currentPoint\n        )\n\n        return {\n            exactAmountIn: requiredQuoteAmount,\n        }\n    }\n\n    /**\n     * Calculate the amount in for a swap with exact output amount (quote)\n     * @param swapQuoteExactOutParam - The parameters for the swap\n     * @returns The swap quote result with input amount calculated\n     */\n    swapQuoteExactOut(swapQuoteExactOutParam: SwapQuoteExactOutParam) {\n        const {\n            virtualPool,\n            config,\n            swapBaseForQuote,\n            outAmount,\n            slippageBps = 0,\n            hasReferral,\n            currentPoint,\n        } = swapQuoteExactOutParam\n\n        return swapQuoteExactOut(\n            virtualPool,\n            config,\n            swapBaseForQuote,\n            outAmount,\n            slippageBps,\n            hasReferral,\n            currentPoint\n        )\n    }\n}\n","import type { Accounts, BN, IdlAccounts, IdlTypes } from '@coral-xyz/anchor'\nimport type { DynamicBondingCurve } from './idl/dynamic-bonding-curve/idl'\nimport type { Keypair, PublicKey, Transaction } from '@solana/web3.js'\n\n/////////////////\n// IX ACCOUNTS //\n/////////////////\n\nexport type ClaimCreatorTradingFeeAccounts = Accounts<\n    DynamicBondingCurve['instructions']['0']\n>['claimCreatorTradingFee']\n\nexport type ClaimProtocolFeeAccounts = Accounts<\n    DynamicBondingCurve['instructions']['1']\n>['claimProtocolFee']\n\nexport type ClaimTradingFeeAccounts = Accounts<\n    DynamicBondingCurve['instructions']['2']\n>['claimTradingFee']\n\nexport type CloseClaimFeeOperatorAccounts = Accounts<\n    DynamicBondingCurve['instructions']['3']\n>['closeClaimFeeOperator']\n\nexport type CreateClaimFeeOperatorAccounts = Accounts<\n    DynamicBondingCurve['instructions']['4']\n>['createClaimFeeOperator']\n\nexport type CreateConfigAccounts = Accounts<\n    DynamicBondingCurve['instructions']['5']\n>['createConfig']\n\nexport type CreateLockerAccounts = Accounts<\n    DynamicBondingCurve['instructions']['6']\n>['createLocker']\n\nexport type CreatePartnerMetadata = Accounts<\n    DynamicBondingCurve['instructions']['7']\n>['createPartnerMetadata']\n\nexport type CreateVirtualPoolMetadata = Accounts<\n    DynamicBondingCurve['instructions']['8']\n>['createVirtualPoolMetadata']\n\nexport type CreatorWithdrawSurplusAccounts = Accounts<\n    DynamicBondingCurve['instructions']['9']\n>['creatorWithdrawSurplus']\n\nexport type InitializeVirtualPoolWithSplTokenAccounts = Accounts<\n    DynamicBondingCurve['instructions']['10']\n>['initializeVirtualPoolWithSplToken']\n\nexport type InitializeVirtualPoolWithToken2022Accounts = Accounts<\n    DynamicBondingCurve['instructions']['11']\n>['initializeVirtualPoolWithToken2022']\n\nexport type MigrateMeteoraDammAccounts = Accounts<\n    DynamicBondingCurve['instructions']['12']\n>['migrateMeteoraDamm']\n\nexport type MigrateMeteoraDammClaimLpTokenAccounts = Accounts<\n    DynamicBondingCurve['instructions']['13']\n>['migrateMeteoraDammClaimLpToken']\n\nexport type MigrateMeteoraDammLockLpTokenAccounts = Accounts<\n    DynamicBondingCurve['instructions']['14']\n>['migrateMeteoraDammLockLpToken']\n\nexport type MigrationDammV2Accounts = Accounts<\n    DynamicBondingCurve['instructions']['15']\n>['migrationDammV2']\n\nexport type MigrationDammV2CreateMetadataAccounts = Accounts<\n    DynamicBondingCurve['instructions']['16']\n>['migrationDammV2CreateMetadata']\n\nexport type MigrationMeteoraDammCreateMetadataAccounts = Accounts<\n    DynamicBondingCurve['instructions']['17']\n>['migrationMeteoraDammCreateMetadata']\n\nexport type PartnerWithdrawSurplusAccounts = Accounts<\n    DynamicBondingCurve['instructions']['18']\n>['partnerWithdrawSurplus']\n\nexport type SwapAccounts = Accounts<\n    DynamicBondingCurve['instructions']['20']\n>['swap']\n\nexport type TransferPoolCreatorAccounts = Accounts<\n    DynamicBondingCurve['instructions']['21']\n>['transferPoolCreator']\n\nexport type WithdrawLeftoverAccounts = Accounts<\n    DynamicBondingCurve['instructions']['22']\n>['withdrawLeftover']\n\n///////////////\n// IDL Types //\n///////////////\n\nexport type ConfigParameters = IdlTypes<DynamicBondingCurve>['configParameters']\nexport type MigratedPoolFee = IdlTypes<DynamicBondingCurve>['migratedPoolFee']\nexport type LockedVestingParameters =\n    IdlTypes<DynamicBondingCurve>['lockedVestingParams']\nexport type InitializePoolParameters =\n    IdlTypes<DynamicBondingCurve>['initializePoolParameters']\nexport type SwapParameters = IdlTypes<DynamicBondingCurve>['swapParameters']\nexport type PoolFeeParameters =\n    IdlTypes<DynamicBondingCurve>['poolFeeParameters']\nexport type DynamicFeeParameters =\n    IdlTypes<DynamicBondingCurve>['dynamicFeeParameters']\nexport type LiquidityDistributionParameters =\n    IdlTypes<DynamicBondingCurve>['liquidityDistributionParameters']\nexport type PoolFeesConfig = IdlTypes<DynamicBondingCurve>['poolFeesConfig']\nexport type DynamicFeeConfig = IdlTypes<DynamicBondingCurve>['dynamicFeeConfig']\nexport type BaseFeeConfig = IdlTypes<DynamicBondingCurve>['baseFeeConfig']\nexport type PoolFees = IdlTypes<DynamicBondingCurve>['poolFees']\nexport type PoolMetrics = IdlTypes<DynamicBondingCurve>['poolMetrics']\nexport type SwapResult = IdlTypes<DynamicBondingCurve>['swapResult']\nexport type CreatePartnerMetadataParameters =\n    IdlTypes<DynamicBondingCurve>['createPartnerMetadataParameters']\nexport type CreateVirtualPoolMetadataParameters =\n    IdlTypes<DynamicBondingCurve>['createVirtualPoolMetadataParameters']\n\n//////////////////\n// IDL ACCOUNTS //\n//////////////////\n\nexport type ClaimFeeOperator =\n    IdlAccounts<DynamicBondingCurve>['claimFeeOperator']\nexport type Config = IdlAccounts<DynamicBondingCurve>['config']\nexport type MeteoraDammMigrationMetadata =\n    IdlAccounts<DynamicBondingCurve>['meteoraDammMigrationMetadata']\nexport type MeteoraDammV2MigrationMetadata =\n    IdlAccounts<DynamicBondingCurve>['meteoraDammV2Metadata']\nexport type LockEscrow = IdlAccounts<DynamicBondingCurve>['lockEscrow']\nexport type VolatilityTracker =\n    IdlTypes<DynamicBondingCurve>['volatilityTracker']\nexport type VirtualPool = IdlAccounts<DynamicBondingCurve>['virtualPool']\nexport type PoolConfig = IdlAccounts<DynamicBondingCurve>['poolConfig']\nexport type PartnerMetadata =\n    IdlAccounts<DynamicBondingCurve>['partnerMetadata']\nexport type VirtualPoolMetadata =\n    IdlAccounts<DynamicBondingCurve>['virtualPoolMetadata']\n\n///////////\n// ENUMS //\n///////////\n\nexport enum ActivationType {\n    Slot = 0,\n    Timestamp = 1,\n}\n\nexport enum TokenType {\n    SPL = 0,\n    Token2022 = 1,\n}\n\nexport enum CollectFeeMode {\n    QuoteToken = 0,\n    OutputToken = 1,\n}\n\nexport enum DammV2DynamicFeeMode {\n    Disabled = 0,\n    Enabled = 1,\n}\n\nexport enum MigrationOption {\n    MET_DAMM = 0,\n    MET_DAMM_V2 = 1,\n}\n\nexport enum BaseFeeMode {\n    FeeSchedulerLinear = 0,\n    FeeSchedulerExponential = 1,\n    RateLimiter = 2,\n}\n\nexport enum MigrationFeeOption {\n    FixedBps25 = 0,\n    FixedBps30 = 1,\n    FixedBps100 = 2,\n    FixedBps200 = 3,\n    FixedBps400 = 4,\n    FixedBps600 = 5,\n    Customizable = 6, // only for DAMM v2\n}\n\nexport enum TokenDecimal {\n    SIX = 6,\n    SEVEN = 7,\n    EIGHT = 8,\n    NINE = 9,\n}\n\nexport enum TradeDirection {\n    BaseToQuote = 0,\n    QuoteToBase = 1,\n}\n\nexport enum Rounding {\n    Up,\n    Down,\n}\n\nexport enum TokenUpdateAuthorityOption {\n    // Creator has permission to update update_authority\n    CreatorUpdateAuthority = 0,\n    // No one has permission to update the authority\n    Immutable = 1,\n    // Partner has permission to update update_authority\n    PartnerUpdateAuthority = 2,\n    // Creator has permission as mint_authority and update_authority\n    CreatorUpdateAndMintAuthority = 3,\n    // Partner has permission as mint_authority and update_authority\n    PartnerUpdateAndMintAuthority = 4,\n}\n\n///////////\n// TYPES //\n///////////\n\nexport type CreateConfigParam = Omit<\n    CreateConfigAccounts,\n    'program' | 'eventAuthority' | 'systemProgram'\n> &\n    ConfigParameters\n\nexport type CreateDammV1MigrationMetadataParam = {\n    payer: PublicKey\n    virtualPool: PublicKey\n    config: PublicKey\n}\n\nexport type CreateDammV2MigrationMetadataParam =\n    CreateDammV1MigrationMetadataParam\n\nexport type BaseFee = {\n    cliffFeeNumerator: BN\n    firstFactor: number // feeScheduler: numberOfPeriod, rateLimiter: feeIncrementBps\n    secondFactor: BN // feeScheduler: periodFrequency, rateLimiter: maxLimiterDuration\n    thirdFactor: BN // feeScheduler: reductionFactor, rateLimiter: referenceAmount\n    baseFeeMode: BaseFeeMode\n}\n\nexport type FeeSchedulerParams = {\n    startingFeeBps: number\n    endingFeeBps: number\n    numberOfPeriod: number\n    totalDuration: number\n}\n\nexport type RateLimiterParams = {\n    baseFeeBps: number\n    feeIncrementBps: number\n    referenceAmount: number\n    maxLimiterDuration: number\n}\n\nexport type LockedVestingParams = {\n    totalLockedVestingAmount: number\n    numberOfVestingPeriod: number\n    cliffUnlockAmount: number\n    totalVestingDuration: number\n    cliffDurationFromMigrationTime: number\n}\n\nexport type BaseFeeParams =\n    | {\n          baseFeeMode:\n              | BaseFeeMode.FeeSchedulerLinear\n              | BaseFeeMode.FeeSchedulerExponential\n          feeSchedulerParam: FeeSchedulerParams\n      }\n    | {\n          baseFeeMode: BaseFeeMode.RateLimiter\n          rateLimiterParam: RateLimiterParams\n      }\n\nexport type BuildCurveBaseParam = {\n    totalTokenSupply: number\n    migrationOption: MigrationOption\n    tokenBaseDecimal: TokenDecimal\n    tokenQuoteDecimal: TokenDecimal\n    lockedVestingParam: LockedVestingParams\n    baseFeeParams: BaseFeeParams\n    dynamicFeeEnabled: boolean\n    activationType: ActivationType\n    collectFeeMode: CollectFeeMode\n    migrationFeeOption: MigrationFeeOption\n    tokenType: TokenType\n    partnerLpPercentage: number\n    creatorLpPercentage: number\n    partnerLockedLpPercentage: number\n    creatorLockedLpPercentage: number\n    creatorTradingFeePercentage: number\n    leftover: number\n    tokenUpdateAuthority: number\n    migrationFee: {\n        feePercentage: number\n        creatorFeePercentage: number\n    }\n    migratedPoolFee?: {\n        collectFeeMode: CollectFeeMode\n        dynamicFee: DammV2DynamicFeeMode\n        poolFeeBps: number\n    }\n}\n\nexport type BuildCurveParam = BuildCurveBaseParam & {\n    percentageSupplyOnMigration: number\n    migrationQuoteThreshold: number\n}\n\nexport type BuildCurveWithMarketCapParam = BuildCurveBaseParam & {\n    initialMarketCap: number\n    migrationMarketCap: number\n}\n\nexport type BuildCurveWithTwoSegmentsParam = BuildCurveBaseParam & {\n    initialMarketCap: number\n    migrationMarketCap: number\n    percentageSupplyOnMigration: number\n}\n\nexport type BuildCurveWithLiquidityWeightsParam = BuildCurveBaseParam & {\n    initialMarketCap: number\n    migrationMarketCap: number\n    liquidityWeights: number[]\n}\n\nexport type InitializePoolBaseParam = {\n    name: string\n    symbol: string\n    uri: string\n    pool: PublicKey\n    config: PublicKey\n    payer: PublicKey\n    poolCreator: PublicKey\n    baseMint: PublicKey\n    baseVault: PublicKey\n    quoteVault: PublicKey\n    quoteMint: PublicKey\n    mintMetadata?: PublicKey\n}\n\nexport type CreatePoolParam = {\n    name: string\n    symbol: string\n    uri: string\n    payer: PublicKey\n    poolCreator: PublicKey\n    config: PublicKey\n    baseMint: PublicKey\n}\n\nexport type CreateConfigAndPoolParam = CreateConfigParam & {\n    preCreatePoolParam: PreCreatePoolParam\n}\n\nexport type CreateConfigAndPoolWithFirstBuyParam = CreateConfigAndPoolParam & {\n    firstBuyParam?: FirstBuyParam\n}\n\nexport type CreatePoolWithFirstBuyParam = {\n    createPoolParam: CreatePoolParam\n    firstBuyParam?: FirstBuyParam\n}\n\nexport type CreatePoolWithBuyTxsParam = {\n    createPoolParam: CreatePoolParam\n    BuyParms: FirstBuyParam[]\n}\n\nexport type CreatePoolWithPartnerAndCreatorFirstBuyParam = {\n    createPoolParam: CreatePoolParam\n    partnerFirstBuyParam?: PartnerFirstBuyParam\n    creatorFirstBuyParam?: CreatorFirstBuyParam\n}\n\nexport type PreCreatePoolParam = {\n    name: string\n    symbol: string\n    uri: string\n    poolCreator: PublicKey\n    baseMint: PublicKey\n}\n\nexport type FirstBuyParam = {\n    buyer: PublicKey\n    receiver?: PublicKey\n    buyAmount: BN\n    minimumAmountOut: BN\n    referralTokenAccount: PublicKey | null\n}\n\nexport type PartnerFirstBuyParam = {\n    partner: PublicKey\n    receiver: PublicKey\n    buyAmount: BN\n    minimumAmountOut: BN\n    referralTokenAccount: PublicKey | null\n}\n\nexport type CreatorFirstBuyParam = {\n    creator: PublicKey\n    receiver: PublicKey\n    buyAmount: BN\n    minimumAmountOut: BN\n    referralTokenAccount: PublicKey | null\n}\n\nexport type SwapParam = {\n    owner: PublicKey\n    pool: PublicKey\n    amountIn: BN\n    minimumAmountOut: BN\n    swapBaseForQuote: boolean\n    referralTokenAccount: PublicKey | null\n    payer?: PublicKey\n}\n\nexport type SwapQuoteParam = {\n    virtualPool: VirtualPool\n    config: PoolConfig\n    swapBaseForQuote: boolean\n    amountIn: BN\n    slippageBps?: number\n    hasReferral: boolean\n    currentPoint: BN\n}\n\nexport type SwapQuoteExactInParam = {\n    virtualPool: VirtualPool\n    config: PoolConfig\n    currentPoint: BN\n}\n\nexport type SwapQuoteExactOutParam = {\n    virtualPool: VirtualPool\n    config: PoolConfig\n    swapBaseForQuote: boolean\n    outAmount: BN\n    slippageBps?: number\n    hasReferral: boolean\n    currentPoint: BN\n}\n\nexport type MigrateToDammV1Param = {\n    payer: PublicKey\n    virtualPool: PublicKey\n    dammConfig: PublicKey\n}\n\nexport type MigrateToDammV2Param = MigrateToDammV1Param\n\nexport type MigrateToDammV2Response = {\n    transaction: Transaction\n    firstPositionNftKeypair: Keypair\n    secondPositionNftKeypair: Keypair\n}\n\nexport type DammLpTokenParam = {\n    payer: PublicKey\n    virtualPool: PublicKey\n    dammConfig: PublicKey\n    isPartner: boolean\n}\n\nexport type CreateLockerParam = {\n    payer: PublicKey\n    virtualPool: PublicKey\n}\n\nexport type ClaimTradingFeeParam = {\n    feeClaimer: PublicKey\n    payer: PublicKey\n    pool: PublicKey\n    maxBaseAmount: BN\n    maxQuoteAmount: BN\n    receiver?: PublicKey\n    tempWSolAcc?: PublicKey\n}\n\nexport type ClaimTradingFee2Param = {\n    feeClaimer: PublicKey\n    payer: PublicKey\n    pool: PublicKey\n    maxBaseAmount: BN\n    maxQuoteAmount: BN\n    receiver: PublicKey\n}\n\nexport type ClaimPartnerTradingFeeWithQuoteMintNotSolParam = {\n    feeClaimer: PublicKey\n    payer: PublicKey\n    feeReceiver: PublicKey\n    config: PublicKey\n    pool: PublicKey\n    poolState: VirtualPool\n    poolConfigState: PoolConfig\n    tokenBaseProgram: PublicKey\n    tokenQuoteProgram: PublicKey\n}\n\nexport type ClaimPartnerTradingFeeWithQuoteMintSolParam =\n    ClaimPartnerTradingFeeWithQuoteMintNotSolParam & {\n        tempWSolAcc: PublicKey\n    }\n\nexport type ClaimCreatorTradingFeeParam = {\n    creator: PublicKey\n    payer: PublicKey\n    pool: PublicKey\n    maxBaseAmount: BN\n    maxQuoteAmount: BN\n    receiver?: PublicKey\n    tempWSolAcc?: PublicKey\n}\n\nexport type ClaimCreatorTradingFee2Param = {\n    creator: PublicKey\n    payer: PublicKey\n    pool: PublicKey\n    maxBaseAmount: BN\n    maxQuoteAmount: BN\n    receiver: PublicKey\n}\n\nexport type ClaimCreatorTradingFeeWithQuoteMintNotSolParam = {\n    creator: PublicKey\n    payer: PublicKey\n    feeReceiver: PublicKey\n    pool: PublicKey\n    poolState: VirtualPool\n    poolConfigState: PoolConfig\n    tokenBaseProgram: PublicKey\n    tokenQuoteProgram: PublicKey\n}\n\nexport type ClaimCreatorTradingFeeWithQuoteMintSolParam =\n    ClaimCreatorTradingFeeWithQuoteMintNotSolParam & {\n        tempWSolAcc: PublicKey\n    }\n\nexport type PartnerWithdrawSurplusParam = {\n    feeClaimer: PublicKey\n    virtualPool: PublicKey\n}\n\nexport type CreatorWithdrawSurplusParam = {\n    creator: PublicKey\n    virtualPool: PublicKey\n}\n\nexport type WithdrawLeftoverParam = {\n    payer: PublicKey\n    virtualPool: PublicKey\n}\n\nexport type CreateVirtualPoolMetadataParam = {\n    virtualPool: PublicKey\n    name: string\n    website: string\n    logo: string\n    creator: PublicKey\n    payer: PublicKey\n}\n\nexport type CreatePartnerMetadataParam = {\n    name: string\n    website: string\n    logo: string\n    feeClaimer: PublicKey\n    payer: PublicKey\n}\n\nexport type TransferPoolCreatorParam = {\n    virtualPool: PublicKey\n    creator: PublicKey\n    newCreator: PublicKey\n}\n\nexport type WithdrawMigrationFeeParam = {\n    virtualPool: PublicKey\n    sender: PublicKey // sender is creator or partner\n    feePayer?: PublicKey\n}\n\n////////////////\n// INTERFACES //\n////////////////\n\nexport interface FeeResult {\n    amount: BN\n    protocolFee: BN\n    tradingFee: BN\n    referralFee: BN\n}\n\nexport interface FeeMode {\n    feesOnInput: boolean\n    feesOnBaseToken: boolean\n    hasReferral: boolean\n}\n\nexport interface QuoteResult {\n    amountOut: BN\n    minimumAmountOut: BN\n    nextSqrtPrice: BN\n    fee: {\n        trading: BN\n        protocol: BN\n        referral?: BN\n    }\n    price: {\n        beforeSwap: BN\n        afterSwap: BN\n    }\n}\n\nexport interface FeeOnAmountResult {\n    amount: BN\n    protocolFee: BN\n    tradingFee: BN\n    referralFee: BN\n}\n\nexport interface PrepareSwapParams {\n    inputMint: PublicKey\n    outputMint: PublicKey\n    inputTokenProgram: PublicKey\n    outputTokenProgram: PublicKey\n}\n\nexport interface SwapAmount {\n    outputAmount: BN\n    nextSqrtPrice: BN\n}\n","import BN from 'bn.js'\nimport { PublicKey } from '@solana/web3.js'\n\n// Curve + Math constants\nexport const OFFSET: number = 64\nexport const U64_MAX: BN = new BN('18446744073709551615')\nexport const MIN_SQRT_PRICE: BN = new BN('4295048016')\nexport const MAX_SQRT_PRICE: BN = new BN('79226673521066979257578248091')\n\nexport const RESOLUTION = 64\nexport const ONE_Q64 = new BN(1).shln(RESOLUTION)\nexport const FEE_DENOMINATOR = 1_000_000_000\nexport const MAX_FEE_BPS = 9900 // 99%\nexport const MIN_FEE_BPS = 1 // 0.0001%\nexport const MIN_FEE_NUMERATOR = 100_000 // 0.0001%\nexport const MAX_FEE_NUMERATOR = 990_000_000 // 99%\nexport const BASIS_POINT_MAX = 10000\nexport const MAX_CURVE_POINT = 16\nexport const PARTNER_SURPLUS_SHARE = 80 // 80%\nexport const SWAP_BUFFER_PERCENTAGE = 25 // 25%\nexport const MAX_MIGRATION_FEE_PERCENTAGE = 50 // 50%\nexport const MAX_CREATOR_MIGRATION_FEE_PERCENTAGE = 100 // 100%\n\nexport const MAX_RATE_LIMITER_DURATION_IN_SECONDS = 43200 // 12 hours\nexport const MAX_RATE_LIMITER_DURATION_IN_SLOTS = 108000 // 12 hours\n\nexport const SLOT_DURATION = 400\nexport const TIMESTAMP_DURATION = 1000\n\n// Pubkey\nexport const DYNAMIC_BONDING_CURVE_PROGRAM_ID = new PublicKey(\n    'dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN'\n)\nexport const METAPLEX_PROGRAM_ID = new PublicKey(\n    'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s'\n)\nexport const DAMM_V1_PROGRAM_ID = new PublicKey(\n    'Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB'\n)\nexport const DAMM_V2_PROGRAM_ID = new PublicKey(\n    'cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG'\n)\nexport const VAULT_PROGRAM_ID = new PublicKey(\n    '24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi'\n)\nexport const LOCKER_PROGRAM_ID = new PublicKey(\n    'LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn'\n)\nexport const BASE_ADDRESS = new PublicKey(\n    'HWzXGcGHy4tcpYfaRDCyLNzXqBTv3E6BttpCH2vJxArv'\n)\n\n// Dynamic Fee\nexport const DYNAMIC_FEE_FILTER_PERIOD_DEFAULT = 10 // 10 seconds\nexport const DYNAMIC_FEE_DECAY_PERIOD_DEFAULT = 120 // 120 seconds\nexport const DYNAMIC_FEE_REDUCTION_FACTOR_DEFAULT = 5000 // 50%\nexport const MAX_DYNAMIC_FEE_PERCENTAGE = 20 // 20% of base fee\n\nexport const BIN_STEP_BPS_DEFAULT = 1\n//  bin_step << 64 / BASIS_POINT_MAX\nexport const BIN_STEP_BPS_U128_DEFAULT = new BN('1844674407370955')\nexport const MAX_PRICE_CHANGE_BPS_DEFAULT = 1500 // 15%\n\nexport const MIN_MIGRATED_POOL_FEE_BPS = 10 // 0.1%\nexport const MAX_MIGRATED_POOL_FEE_BPS = 1000 // 10%\n\n// DAMM V1 Migration Fee Options\nexport const DAMM_V1_MIGRATION_FEE_ADDRESS = [\n    new PublicKey('8f848CEy8eY6PhJ3VcemtBDzPPSD4Vq7aJczLZ3o8MmX'), // FixedBps25\n    new PublicKey('HBxB8Lf14Yj8pqeJ8C4qDb5ryHL7xwpuykz31BLNYr7S'), // FixedBps30\n    new PublicKey('7v5vBdUQHTNeqk1HnduiXcgbvCyVEZ612HLmYkQoAkik'), // FixedBps100\n    new PublicKey('EkvP7d5yKxovj884d2DwmBQbrHUWRLGK6bympzrkXGja'), // FixedBps200\n    new PublicKey('9EZYAJrcqNWNQzP2trzZesP7XKMHA1jEomHzbRsdX8R2'), // FixedBps400\n    new PublicKey('8cdKo87jZU2R12KY1BUjjRPwyjgdNjLGqSGQyrDshhud'), // FixedBps600\n]\n\n// DAMM V2 Migration Fee Options\nexport const DAMM_V2_MIGRATION_FEE_ADDRESS = [\n    new PublicKey('7F6dnUcRuyM2TwR8myT1dYypFXpPSxqwKNSFNkxyNESd'), // FixedBps25\n    new PublicKey('2nHK1kju6XjphBLbNxpM5XRGFj7p9U8vvNzyZiha1z6k'), // FixedBps30\n    new PublicKey('Hv8Lmzmnju6m7kcokVKvwqz7QPmdX9XfKjJsXz8RXcjp'), // FixedBps100\n    new PublicKey('2c4cYd4reUYVRAB9kUUkrq55VPyy2FNQ3FDL4o12JXmq'), // FixedBps200\n    new PublicKey('AkmQWebAwFvWk55wBoCr5D62C6VVDTzi84NJuD9H7cFD'), // FixedBps400\n    new PublicKey('DbCRBj8McvPYHJG1ukj8RE15h2dCNUdTAESG49XpQ44u'), // FixedBps600\n    new PublicKey('A8gMrEPJkacWkcb3DGwtJwTe16HktSEfvwtuDh2MCtck'), // Customizable\n]\n","import {\n    BaseFee,\n    DynamicFeeParameters,\n    BaseFeeMode,\n    MigrationOption,\n    Rounding,\n    TokenDecimal,\n    type LiquidityDistributionParameters,\n    type LockedVestingParameters,\n    ActivationType,\n    type PoolConfig,\n    CollectFeeMode,\n    DammV2DynamicFeeMode,\n    MigratedPoolFee,\n    MigrationFeeOption,\n} from '../types'\nimport {\n    BASIS_POINT_MAX,\n    BIN_STEP_BPS_DEFAULT,\n    BIN_STEP_BPS_U128_DEFAULT,\n    DYNAMIC_FEE_DECAY_PERIOD_DEFAULT,\n    DYNAMIC_FEE_FILTER_PERIOD_DEFAULT,\n    DYNAMIC_FEE_REDUCTION_FACTOR_DEFAULT,\n    FEE_DENOMINATOR,\n    MAX_FEE_BPS,\n    MAX_FEE_NUMERATOR,\n    MAX_MIGRATION_FEE_PERCENTAGE,\n    MAX_PRICE_CHANGE_BPS_DEFAULT,\n    MAX_RATE_LIMITER_DURATION_IN_SECONDS,\n    MAX_RATE_LIMITER_DURATION_IN_SLOTS,\n    MAX_SQRT_PRICE,\n    MIN_FEE_NUMERATOR,\n    MIN_SQRT_PRICE,\n    ONE_Q64,\n} from '../constants'\nimport BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport {\n    getDeltaAmountQuoteUnsigned,\n    getInitialLiquidityFromDeltaBase,\n    getInitialLiquidityFromDeltaQuote,\n    getNextSqrtPriceFromInput,\n} from '../math/curve'\nimport { Connection, PublicKey } from '@solana/web3.js'\nimport type { DynamicBondingCurve } from '../idl/dynamic-bonding-curve/idl'\nimport { Program } from '@coral-xyz/anchor'\nimport { bpsToFeeNumerator, convertToLamports, fromDecimalToBN } from './utils'\n\n/**\n * Get the first key\n * @param key1 - The first key\n * @param key2 - The second key\n * @returns The first key\n */\nexport function getFirstKey(key1: PublicKey, key2: PublicKey) {\n    const buf1 = key1.toBuffer()\n    const buf2 = key2.toBuffer()\n    // Buf1 > buf2\n    if (Buffer.compare(buf1, buf2) === 1) {\n        return buf1\n    }\n    return buf2\n}\n\n/**\n * Get the second key\n * @param key1 - The first key\n * @param key2 - The second key\n * @returns The second key\n */\nexport function getSecondKey(key1: PublicKey, key2: PublicKey) {\n    const buf1 = key1.toBuffer()\n    const buf2 = key2.toBuffer()\n    // Buf1 > buf2\n    if (Buffer.compare(buf1, buf2) === 1) {\n        return buf2\n    }\n    return buf1\n}\n\n/**\n * Generic account fetch helper\n * @param accountAddress - The address of the account to fetch\n * @param accountType - The type of account to fetch from program.account\n * @returns The fetched account data\n */\nexport async function getAccountData<T>(\n    accountAddress: PublicKey | string,\n    accountType: keyof Program<DynamicBondingCurve>['account'],\n    program: Program<DynamicBondingCurve>\n): Promise<T> {\n    const address =\n        accountAddress instanceof PublicKey\n            ? accountAddress\n            : new PublicKey(accountAddress)\n\n    return (await program.account[accountType].fetchNullable(address)) as T\n}\n\n/**\n * Get creation timestamp for an account\n * @param accountAddress - The address of the account\n * @param connection - The Solana connection instance\n * @returns The creation timestamp as a Date object, or undefined if not found\n */\nexport async function getAccountCreationTimestamp(\n    accountAddress: PublicKey | string,\n    connection: Connection\n): Promise<Date | undefined> {\n    const address =\n        accountAddress instanceof PublicKey\n            ? accountAddress\n            : new PublicKey(accountAddress)\n\n    const signatures = await connection.getSignaturesForAddress(address, {\n        limit: 1,\n    })\n\n    return signatures[0]?.blockTime\n        ? new Date(signatures[0].blockTime * 1000)\n        : undefined\n}\n\n/**\n * Get creation timestamps for multiple accounts\n * @param accountAddresses - Array of account addresses\n * @param connection - The Solana connection instance\n * @returns Array of creation timestamps corresponding to the input addresses\n */\nexport async function getAccountCreationTimestamps(\n    accountAddresses: (PublicKey | string)[],\n    connection: Connection\n): Promise<(Date | undefined)[]> {\n    const timestampPromises = accountAddresses.map((address) =>\n        getAccountCreationTimestamp(address, connection)\n    )\n    return Promise.all(timestampPromises)\n}\n\n/**\n * Get the total token supply\n * @param swapBaseAmount - The swap base amount\n * @param migrationBaseThreshold - The migration base threshold\n * @param lockedVestingParams - The locked vesting parameters\n * @returns The total token supply\n */\nexport function getTotalTokenSupply(\n    swapBaseAmount: BN,\n    migrationBaseThreshold: BN,\n    lockedVestingParams: {\n        amountPerPeriod: BN\n        numberOfPeriod: BN\n        cliffUnlockAmount: BN\n    }\n): BN {\n    try {\n        // calculate total circulating amount\n        const totalCirculatingAmount = swapBaseAmount.add(\n            migrationBaseThreshold\n        )\n\n        // calculate total locked vesting amount\n        const totalLockedVestingAmount =\n            lockedVestingParams.cliffUnlockAmount.add(\n                lockedVestingParams.amountPerPeriod.mul(\n                    lockedVestingParams.numberOfPeriod\n                )\n            )\n\n        // calculate total amount\n        const totalAmount = totalCirculatingAmount.add(totalLockedVestingAmount)\n\n        // check for overflow\n        if (totalAmount.isNeg() || totalAmount.bitLength() > 64) {\n            throw new Error('Math overflow')\n        }\n\n        return totalAmount\n    } catch (error) {\n        throw new Error('Math overflow')\n    }\n}\n\n/**\n * Get the price from the sqrt start price\n * @param sqrtStartPrice - The sqrt start price\n * @param tokenBaseDecimal - The base token decimal\n * @param tokenQuoteDecimal - The quote token decimal\n * @returns The initial price\n */\nexport function getPriceFromSqrtPrice(\n    sqrtPrice: BN,\n    tokenBaseDecimal: TokenDecimal,\n    tokenQuoteDecimal: TokenDecimal\n): Decimal {\n    // lamport price = sqrtStartPrice * sqrtStartPrice / 2^128\n    const sqrtPriceDecimal = new Decimal(sqrtPrice.toString())\n    const lamportPrice = sqrtPriceDecimal\n        .mul(sqrtPriceDecimal)\n        .div(new Decimal(2).pow(128))\n\n    // token price = lamport price * 10^(base_decimal - quote_decimal)\n    const tokenPrice = lamportPrice.mul(\n        new Decimal(10).pow(tokenBaseDecimal - tokenQuoteDecimal)\n    )\n\n    return tokenPrice\n}\n\n/**\n * Get the sqrt price from the price\n * @param price - The price\n * @param tokenADecimal - The decimal of token A\n * @param tokenBDecimal - The decimal of token B\n * @returns The sqrt price\n * price = (sqrtPrice >> 64)^2 * 10^(tokenADecimal - tokenBDecimal)\n */\nexport const getSqrtPriceFromPrice = (\n    price: string,\n    tokenADecimal: number,\n    tokenBDecimal: number\n): BN => {\n    const decimalPrice = new Decimal(price)\n    const adjustedByDecimals = decimalPrice.div(\n        new Decimal(10 ** (tokenADecimal - tokenBDecimal))\n    )\n    const sqrtValue = Decimal.sqrt(adjustedByDecimals)\n    const sqrtValueQ64 = sqrtValue.mul(Decimal.pow(2, 64))\n\n    return new BN(sqrtValueQ64.floor().toFixed())\n}\n\n/**\n * Get the sqrt price from the market cap\n * @param marketCap - The market cap\n * @param totalSupply - The total supply\n * @param tokenBaseDecimal - The decimal of the base token\n * @param tokenQuoteDecimal - The decimal of the quote token\n * @returns The sqrt price\n */\nexport const getSqrtPriceFromMarketCap = (\n    marketCap: number,\n    totalSupply: number,\n    tokenBaseDecimal: number,\n    tokenQuoteDecimal: number\n): BN => {\n    let price = new Decimal(marketCap).div(new Decimal(totalSupply))\n    return getSqrtPriceFromPrice(\n        price.toString(),\n        tokenBaseDecimal,\n        tokenQuoteDecimal\n    )\n}\n\n/**\n * Get the base token for swap\n * @param sqrtStartPrice - The start sqrt price\n * @param sqrtMigrationPrice - The migration sqrt price\n * @param curve - The curve\n * @returns The base token\n */\nexport function getBaseTokenForSwap(\n    sqrtStartPrice: BN,\n    sqrtMigrationPrice: BN,\n    curve: Array<LiquidityDistributionParameters>\n): BN {\n    let totalAmount = new BN(0)\n    for (let i = 0; i < curve.length; i++) {\n        const lowerSqrtPrice = i == 0 ? sqrtStartPrice : curve[i - 1].sqrtPrice\n        if (curve[i].sqrtPrice && curve[i].sqrtPrice.gt(sqrtMigrationPrice)) {\n            const deltaAmount = getDeltaAmountBase(\n                lowerSqrtPrice,\n                sqrtMigrationPrice,\n                curve[i].liquidity\n            )\n            totalAmount = totalAmount.add(deltaAmount)\n            break\n        } else {\n            const deltaAmount = getDeltaAmountBase(\n                lowerSqrtPrice,\n                curve[i].sqrtPrice,\n                curve[i].liquidity\n            )\n            totalAmount = totalAmount.add(deltaAmount)\n        }\n    }\n    return totalAmount\n}\n\n/**\n * Calculates the amount of base token needed for a price range\n * @param lowerSqrtPrice - The lower sqrt price\n * @param upperSqrtPrice - The upper sqrt price\n * @param liquidity - The liquidity\n * @returns The delta amount base\n */\nexport function getDeltaAmountBase(\n    lowerSqrtPrice: BN,\n    upperSqrtPrice: BN,\n    liquidity: BN\n): BN {\n    // Formula: Δx = L * (√Pb - √Pa) / (√Pa * √Pb)\n    // Where:\n    // - L is the liquidity\n    // - √Pa is the lower sqrt price\n    // - √Pb is the upper sqrt price\n    const numerator = liquidity.mul(upperSqrtPrice.sub(lowerSqrtPrice))\n    const denominator = lowerSqrtPrice.mul(upperSqrtPrice)\n    return numerator.add(denominator).sub(new BN(1)).div(denominator)\n}\n\n/**\n * Get migrationQuoteAmount from migrationQuoteThreshold and migrationFeePercent\n * @param migrationQuoteThreshold - The migration quote threshold\n * @param migrationFeePercent - The migration fee percent\n * @returns migration quote amount to deposit to pool\n */\nexport const getMigrationQuoteAmountFromMigrationQuoteThreshold = (\n    migrationQuoteThreshold: Decimal,\n    migrationFeePercent: number\n): Decimal => {\n    const migrationQuoteAmount = migrationQuoteThreshold\n        .mul(new Decimal(100).sub(new Decimal(migrationFeePercent)))\n        .div(new Decimal(100))\n    return migrationQuoteAmount\n}\n\n/**\n * Get migrationQuoteThreshold from migrationQuoteAmount and migrationFeePercent\n * @param migrationQuoteAmount - The migration quote amount\n * @param migrationFeePercent - The migration fee percent\n * @returns migration quote threshold on bonding curve\n */\nexport const getMigrationQuoteThresholdFromMigrationQuoteAmount = (\n    migrationQuoteAmount: Decimal,\n    migrationFeePercent: Decimal\n): Decimal => {\n    const migrationQuoteThreshold = migrationQuoteAmount\n        .mul(new Decimal(100))\n        .div(new Decimal(100).sub(new Decimal(migrationFeePercent)))\n    return migrationQuoteThreshold\n}\n\n/**\n * Get the base token for migration\n * @param migrationQuoteAmount - The migration quote amount to deposit to pool\n * @param sqrtMigrationPrice - The migration sqrt price\n * @param migrationOption - The migration option\n * @returns The base token\n */\nexport const getMigrationBaseToken = (\n    migrationQuoteAmount: BN,\n    sqrtMigrationPrice: BN,\n    migrationOption: MigrationOption\n): BN => {\n    if (migrationOption == MigrationOption.MET_DAMM) {\n        const price = sqrtMigrationPrice.mul(sqrtMigrationPrice)\n        const quote = migrationQuoteAmount.shln(128)\n        const { div: baseDiv, mod } = quote.divmod(price)\n        let div = baseDiv\n        if (!mod.isZero()) {\n            div = div.add(new BN(1))\n        }\n        return div\n    } else if (migrationOption == MigrationOption.MET_DAMM_V2) {\n        const liquidity = getInitialLiquidityFromDeltaQuote(\n            migrationQuoteAmount,\n            MIN_SQRT_PRICE,\n            sqrtMigrationPrice\n        )\n        // calculate base threshold\n        const baseAmount = getDeltaAmountBase(\n            sqrtMigrationPrice,\n            MAX_SQRT_PRICE,\n            liquidity\n        )\n        return baseAmount\n    } else {\n        throw Error('Invalid migration option')\n    }\n}\n\n/**\n * Get the total vesting amount\n * @param lockedVesting - The locked vesting\n * @returns The total vesting amount\n */\nexport const getTotalVestingAmount = (\n    lockedVesting: LockedVestingParameters\n): BN => {\n    const totalVestingAmount = lockedVesting.cliffUnlockAmount.add(\n        lockedVesting.amountPerPeriod.mul(lockedVesting.numberOfPeriod)\n    )\n    return totalVestingAmount\n}\n\n/**\n * Get the liquidity\n * @param baseAmount - The base amount\n * @param quoteAmount - The quote amount\n * @param minSqrtPrice - The min sqrt price\n * @param maxSqrtPrice - The max sqrt price\n * @returns The liquidity\n */\nexport const getLiquidity = (\n    baseAmount: BN,\n    quoteAmount: BN,\n    minSqrtPrice: BN,\n    maxSqrtPrice: BN\n): BN => {\n    const liquidityFromBase = getInitialLiquidityFromDeltaBase(\n        baseAmount,\n        maxSqrtPrice,\n        minSqrtPrice\n    )\n    const liquidityFromQuote = getInitialLiquidityFromDeltaQuote(\n        quoteAmount,\n        minSqrtPrice,\n        maxSqrtPrice\n    )\n    return BN.min(liquidityFromBase, liquidityFromQuote)\n}\n\n/**\n * Get the first curve\n * @param migrationSqrPrice - The migration sqrt price\n * @param migrationAmount - The migration amount\n * @param swapAmount - The swap amount\n * @param migrationQuoteThreshold - The migration quote threshold\n * @param migrationFeePercent - The migration fee percent\n * @returns The first curve\n */\nexport const getFirstCurve = (\n    migrationSqrtPrice: BN,\n    migrationBaseAmount: BN,\n    swapAmount: BN,\n    migrationQuoteThreshold: BN,\n    migrationFeePercent: number\n) => {\n    // Swap_amount = L *(1/Pmin - 1/Pmax) = L * (Pmax - Pmin) / (Pmax * Pmin)       (1)\n    // Quote_amount = L * (Pmax - Pmin)                                             (2)\n    // (Quote_amount * (1-migrationFeePercent/100) / Migration_amount = Pmax ^ 2    (3)\n    const migrationSqrPriceDecimal = new Decimal(migrationSqrtPrice.toString())\n    const migrationBaseAmountDecimal = new Decimal(\n        migrationBaseAmount.toString()\n    )\n    const swapAmountDecimal = new Decimal(swapAmount.toString())\n    const migrationFeePercentDecimal = new Decimal(\n        migrationFeePercent.toString()\n    )\n    // From (1) and (2) => Quote_amount / Swap_amount = (Pmax * Pmin)               (4)\n    // From (3) and (4) => Swap_amount * (1-migrationFeePercent/100) / Migration_amount = Pmax / Pmin\n    // => Pmin = Pmax * Migration_amount / (Swap_amount * (1-migrationFeePercent/100))\n    const denominator = swapAmountDecimal\n        .mul(new Decimal(100).sub(migrationFeePercentDecimal))\n        .div(new Decimal(100))\n\n    const sqrtStartPriceDecimal = migrationSqrPriceDecimal\n        .mul(migrationBaseAmountDecimal)\n        .div(denominator)\n\n    const sqrtStartPrice = new BN(sqrtStartPriceDecimal.floor().toFixed())\n\n    const liquidity = getLiquidity(\n        swapAmount,\n        migrationQuoteThreshold,\n        sqrtStartPrice,\n        migrationSqrtPrice\n    )\n    return {\n        sqrtStartPrice,\n        curve: [\n            {\n                sqrtPrice: migrationSqrtPrice,\n                liquidity,\n            },\n        ],\n    }\n}\n\n/**\n * Get the total supply from curve\n * @param migrationQuoteThreshold - The migration quote threshold\n * @param sqrtStartPrice - The start sqrt price\n * @param curve - The curve\n * @param lockedVesting - The locked vesting\n * @param migrationOption - The migration option\n * @param leftover - The leftover\n * @param migrationFeePercent - The migration fee percent\n * @returns The total supply\n */\nexport const getTotalSupplyFromCurve = (\n    migrationQuoteThreshold: BN,\n    sqrtStartPrice: BN,\n    curve: Array<LiquidityDistributionParameters>,\n    lockedVesting: LockedVestingParameters,\n    migrationOption: MigrationOption,\n    leftover: BN,\n    migrationFeePercent: number\n): BN => {\n    const sqrtMigrationPrice = getMigrationThresholdPrice(\n        migrationQuoteThreshold,\n        sqrtStartPrice,\n        curve\n    )\n    const swapBaseAmount = getBaseTokenForSwap(\n        sqrtStartPrice,\n        sqrtMigrationPrice,\n        curve\n    )\n    const swapBaseAmountBuffer = getSwapAmountWithBuffer(\n        swapBaseAmount,\n        sqrtStartPrice,\n        curve\n    )\n\n    const migrationQuoteAmount =\n        getMigrationQuoteAmountFromMigrationQuoteThreshold(\n            new Decimal(migrationQuoteThreshold.toString()),\n            migrationFeePercent\n        )\n    const migrationBaseAmount = getMigrationBaseToken(\n        fromDecimalToBN(migrationQuoteAmount),\n        sqrtMigrationPrice,\n        migrationOption\n    )\n    const totalVestingAmount = getTotalVestingAmount(lockedVesting)\n    const minimumBaseSupplyWithBuffer = swapBaseAmountBuffer\n        .add(migrationBaseAmount)\n        .add(totalVestingAmount)\n        .add(leftover)\n    return minimumBaseSupplyWithBuffer\n}\n\n/**\n * Get the migration threshold price\n * @param migrationThreshold - The migration threshold\n * @param sqrtStartPrice - The start sqrt price\n * @param curve - The curve\n * @returns The migration threshold price\n */\nexport const getMigrationThresholdPrice = (\n    migrationThreshold: BN,\n    sqrtStartPrice: BN,\n    curve: Array<LiquidityDistributionParameters>\n): BN => {\n    let nextSqrtPrice = sqrtStartPrice\n\n    if (curve.length === 0) {\n        throw Error('Curve is empty')\n    }\n\n    const totalAmount = getDeltaAmountQuoteUnsigned(\n        nextSqrtPrice,\n        curve[0].sqrtPrice,\n        curve[0].liquidity,\n        Rounding.Up\n    )\n    if (totalAmount.gt(migrationThreshold)) {\n        nextSqrtPrice = getNextSqrtPriceFromInput(\n            nextSqrtPrice,\n            curve[0].liquidity,\n            migrationThreshold,\n            false\n        )\n    } else {\n        let amountLeft = migrationThreshold.sub(totalAmount)\n        nextSqrtPrice = curve[0].sqrtPrice\n        for (let i = 1; i < curve.length; i++) {\n            const maxAmount = getDeltaAmountQuoteUnsigned(\n                nextSqrtPrice,\n                curve[i].sqrtPrice,\n                curve[i].liquidity,\n                Rounding.Up\n            )\n            if (maxAmount.gt(amountLeft)) {\n                nextSqrtPrice = getNextSqrtPriceFromInput(\n                    nextSqrtPrice,\n                    curve[i].liquidity,\n                    amountLeft,\n                    false\n                )\n                amountLeft = new BN(0)\n                break\n            } else {\n                amountLeft = amountLeft.sub(maxAmount)\n                nextSqrtPrice = curve[i].sqrtPrice\n            }\n        }\n        if (!amountLeft.isZero()) {\n            let migrationThresholdStr = migrationThreshold.toString()\n            let amountLeftStr = amountLeft.toString()\n            throw Error(\n                `Not enough liquidity, migrationThreshold: ${migrationThresholdStr}  amountLeft: ${amountLeftStr}`\n            )\n        }\n    }\n    return nextSqrtPrice\n}\n\n/**\n * Get the swap amount with buffer\n * @param swapBaseAmount - The swap base amount\n * @param sqrtStartPrice - The start sqrt price\n * @param curve - The curve\n * @returns The swap amount with buffer\n */\nexport const getSwapAmountWithBuffer = (\n    swapBaseAmount: BN,\n    sqrtStartPrice: BN,\n    curve: Array<LiquidityDistributionParameters>\n): BN => {\n    const swapAmountBuffer = swapBaseAmount.add(\n        swapBaseAmount.mul(new BN(25)).div(new BN(100))\n    )\n    const maxBaseAmountOnCurve = getBaseTokenForSwap(\n        sqrtStartPrice,\n        MAX_SQRT_PRICE,\n        curve\n    )\n    return BN.min(swapAmountBuffer, maxBaseAmountOnCurve)\n}\n\n/**\n * Get the percentage of supply that should be allocated to initial liquidity\n * @param initialMarketCap - The initial market cap\n * @param migrationMarketCap - The migration market cap\n * @param lockedVesting - The locked vesting\n * @param totalLeftover - The leftover\n * @param totalTokenSupply - The total token supply\n * @returns The percentage of supply for initial liquidity\n */\nexport const getPercentageSupplyOnMigration = (\n    initialMarketCap: Decimal,\n    migrationMarketCap: Decimal,\n    lockedVesting: LockedVestingParameters,\n    totalLeftover: BN,\n    totalTokenSupply: BN\n): number => {\n    // formula: x = sqrt(initialMC / migrationMC) * (100 - lockedVesting - leftover) / (1 + sqrt(initialMC / migrationMC))\n\n    // sqrtRatio = sqrt(initial_MC / migration_MC)\n    const marketCapRatio = initialMarketCap.div(migrationMarketCap)\n    const sqrtRatio = Decimal.sqrt(marketCapRatio)\n\n    // locked vesting percentage\n    const totalVestingAmount = getTotalVestingAmount(lockedVesting)\n    const vestingPercentage = new Decimal(totalVestingAmount.toString())\n        .mul(new Decimal(100))\n        .div(new Decimal(totalTokenSupply.toString()))\n\n    // leftover percentage\n    const leftoverPercentage = new Decimal(totalLeftover.toString())\n        .mul(new Decimal(100))\n        .div(new Decimal(totalTokenSupply.toString()))\n\n    // (100 * sqrtRatio - (vestingPercentage + leftoverPercentage) * sqrtRatio) / (1 + sqrtRatio)\n    const numerator = new Decimal(100)\n        .mul(sqrtRatio)\n        .sub(vestingPercentage.add(leftoverPercentage).mul(sqrtRatio))\n    const denominator = new Decimal(1).add(sqrtRatio)\n    return numerator.div(denominator).toNumber()\n}\n\n/**\n * Get the migration quote amount\n * @param migrationMarketCap - The migration market cap\n * @param percentageSupplyOnMigration - The percentage of supply on migration\n * @returns The migration quote amount\n */\nexport const getMigrationQuoteAmount = (\n    migrationMarketCap: Decimal,\n    percentageSupplyOnMigration: Decimal\n): Decimal => {\n    // migrationMC * x / 100\n    return migrationMarketCap\n        .mul(percentageSupplyOnMigration)\n        .div(new Decimal(100))\n}\n\n/**\n * Get the fee scheduler parameters\n * @param {number} startingBaseFeeBps - Starting fee in basis points\n * @param {number} endingBaseFeeBps - Ending fee in basis points\n * @param {BaseFeeMode} baseFeeMode - Mode for fee reduction (Linear or Exponential)\n * @param {number} numberOfPeriod - Number of periods over which to schedule fee reduction\n * @param {BN} totalDuration - Total duration of the fee scheduler\n *\n * @returns {BaseFee}\n */\nexport function getFeeSchedulerParams(\n    startingBaseFeeBps: number,\n    endingBaseFeeBps: number,\n    baseFeeMode: BaseFeeMode,\n    numberOfPeriod: number,\n    totalDuration: number\n): BaseFee {\n    if (startingBaseFeeBps == endingBaseFeeBps) {\n        if (numberOfPeriod != 0 || totalDuration != 0) {\n            throw new Error(\n                'numberOfPeriod and totalDuration must both be zero'\n            )\n        }\n\n        return {\n            cliffFeeNumerator: bpsToFeeNumerator(startingBaseFeeBps),\n            firstFactor: 0,\n            secondFactor: new BN(0),\n            thirdFactor: new BN(0),\n            baseFeeMode: BaseFeeMode.FeeSchedulerLinear,\n        }\n    }\n\n    if (numberOfPeriod <= 0) {\n        throw new Error('Total periods must be greater than zero')\n    }\n\n    if (startingBaseFeeBps > MAX_FEE_BPS) {\n        throw new Error(\n            `startingBaseFeeBps (${startingBaseFeeBps} bps) exceeds maximum allowed value of ${MAX_FEE_BPS} bps`\n        )\n    }\n\n    if (endingBaseFeeBps > startingBaseFeeBps) {\n        throw new Error(\n            'endingBaseFeeBps bps must be less than or equal to startingBaseFeeBps bps'\n        )\n    }\n\n    if (numberOfPeriod == 0 || totalDuration == 0) {\n        throw new Error(\n            'numberOfPeriod and totalDuration must both greater than zero'\n        )\n    }\n\n    const maxBaseFeeNumerator = bpsToFeeNumerator(startingBaseFeeBps)\n\n    const minBaseFeeNumerator = bpsToFeeNumerator(endingBaseFeeBps)\n\n    const periodFrequency = new BN(totalDuration / numberOfPeriod)\n\n    let reductionFactor: BN\n    if (baseFeeMode == BaseFeeMode.FeeSchedulerLinear) {\n        const totalReduction = maxBaseFeeNumerator.sub(minBaseFeeNumerator)\n        reductionFactor = totalReduction.divn(numberOfPeriod)\n    } else {\n        const ratio =\n            minBaseFeeNumerator.toNumber() / maxBaseFeeNumerator.toNumber()\n        const decayBase = Math.pow(ratio, 1 / numberOfPeriod)\n        reductionFactor = new BN(BASIS_POINT_MAX * (1 - decayBase))\n    }\n\n    return {\n        cliffFeeNumerator: maxBaseFeeNumerator,\n        firstFactor: numberOfPeriod,\n        secondFactor: periodFrequency,\n        thirdFactor: reductionFactor,\n        baseFeeMode,\n    }\n}\n\n/**\n * Calculate the ending base fee of fee scheduler in basis points\n * @param cliffFeeNumerator - The cliff fee numerator\n * @param numberOfPeriod - The number of period\n * @param reductionFactor - The reduction factor\n * @param feeSchedulerMode - The fee scheduler mode\n * @returns The minimum base fee in basis points\n */\nexport function calculateFeeSchedulerEndingBaseFeeBps(\n    cliffFeeNumerator: number,\n    numberOfPeriod: number,\n    reductionFactor: number,\n    baseFeeMode: BaseFeeMode\n): number {\n    let baseFeeNumerator: number\n    if (baseFeeMode == BaseFeeMode.FeeSchedulerLinear) {\n        // linear mode\n        baseFeeNumerator = cliffFeeNumerator - numberOfPeriod * reductionFactor\n    } else {\n        // exponential mode\n        const decayRate = 1 - reductionFactor / BASIS_POINT_MAX\n        baseFeeNumerator =\n            cliffFeeNumerator * Math.pow(decayRate, numberOfPeriod)\n    }\n\n    // ensure base fee is not negative\n    return Math.max(0, (baseFeeNumerator / FEE_DENOMINATOR) * BASIS_POINT_MAX)\n}\n\n/**\n * Get the rate limiter parameters\n * @param baseFeeBps - The base fee in basis points\n * @param feeIncrementBps - The fee increment in basis points\n * @param referenceAmount - The reference amount\n * @param maxLimiterDuration - The max rate limiter duration\n * @param tokenQuoteDecimal - The token quote decimal\n * @param activationType - The activation type\n * @returns The rate limiter parameters\n */\nexport function getRateLimiterParams(\n    baseFeeBps: number,\n    feeIncrementBps: number,\n    referenceAmount: number,\n    maxLimiterDuration: number,\n    tokenQuoteDecimal: TokenDecimal,\n    activationType: ActivationType\n): BaseFee {\n    const cliffFeeNumerator = bpsToFeeNumerator(baseFeeBps)\n    const feeIncrementNumerator = bpsToFeeNumerator(feeIncrementBps)\n\n    if (\n        baseFeeBps <= 0 ||\n        feeIncrementBps <= 0 ||\n        referenceAmount <= 0 ||\n        maxLimiterDuration <= 0\n    ) {\n        throw new Error('All rate limiter parameters must be greater than zero')\n    }\n\n    if (baseFeeBps > MAX_FEE_BPS) {\n        throw new Error(\n            `Base fee (${baseFeeBps} bps) exceeds maximum allowed value of ${MAX_FEE_BPS} bps`\n        )\n    }\n\n    if (feeIncrementBps > MAX_FEE_BPS) {\n        throw new Error(\n            `Fee increment (${feeIncrementBps} bps) exceeds maximum allowed value of ${MAX_FEE_BPS} bps`\n        )\n    }\n\n    if (feeIncrementNumerator.gte(new BN(FEE_DENOMINATOR))) {\n        throw new Error(\n            'Fee increment numerator must be less than FEE_DENOMINATOR'\n        )\n    }\n\n    const deltaNumerator = new BN(MAX_FEE_NUMERATOR).sub(cliffFeeNumerator)\n    const maxIndex = deltaNumerator.div(feeIncrementNumerator)\n    if (maxIndex.lt(new BN(1))) {\n        throw new Error('Fee increment is too large for the given base fee')\n    }\n\n    if (\n        cliffFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n        cliffFeeNumerator.gt(new BN(MAX_FEE_NUMERATOR))\n    ) {\n        throw new Error('Base fee must be between 0.01% and 99%')\n    }\n\n    const maxDuration =\n        activationType === ActivationType.Slot\n            ? MAX_RATE_LIMITER_DURATION_IN_SLOTS\n            : MAX_RATE_LIMITER_DURATION_IN_SECONDS\n\n    if (maxLimiterDuration > maxDuration) {\n        throw new Error(\n            `Max duration exceeds maximum allowed value of ${maxDuration}`\n        )\n    }\n\n    const referenceAmountInLamports = convertToLamports(\n        referenceAmount,\n        tokenQuoteDecimal\n    )\n\n    return {\n        cliffFeeNumerator,\n        firstFactor: feeIncrementBps,\n        secondFactor: new BN(maxLimiterDuration),\n        thirdFactor: new BN(referenceAmountInLamports),\n        baseFeeMode: BaseFeeMode.RateLimiter,\n    }\n}\n\n/**\n * Get the dynamic fee parameters (20% of base fee)\n * @param baseFeeBps - The base fee in basis points\n * @param maxPriceChangeBps - The max price change in basis points\n * @returns The dynamic fee parameters\n */\nexport function getDynamicFeeParams(\n    baseFeeBps: number,\n    maxPriceChangeBps: number = MAX_PRICE_CHANGE_BPS_DEFAULT // default 15%\n): DynamicFeeParameters {\n    if (maxPriceChangeBps > MAX_PRICE_CHANGE_BPS_DEFAULT) {\n        throw new Error(\n            `maxPriceChangeBps (${maxPriceChangeBps} bps) must be less than or equal to ${MAX_PRICE_CHANGE_BPS_DEFAULT}`\n        )\n    }\n\n    const priceRatio = maxPriceChangeBps / BASIS_POINT_MAX + 1\n    // Q64\n    const sqrtPriceRatioQ64 = new BN(\n        Decimal.sqrt(priceRatio.toString())\n            .mul(Decimal.pow(2, 64))\n            .floor()\n            .toFixed()\n    )\n    const deltaBinId = sqrtPriceRatioQ64\n        .sub(ONE_Q64)\n        .div(BIN_STEP_BPS_U128_DEFAULT)\n        .muln(2)\n\n    const maxVolatilityAccumulator = new BN(deltaBinId.muln(BASIS_POINT_MAX))\n\n    const squareVfaBin = maxVolatilityAccumulator\n        .mul(new BN(BIN_STEP_BPS_DEFAULT))\n        .pow(new BN(2))\n\n    const baseFeeNumerator = new BN(bpsToFeeNumerator(baseFeeBps))\n\n    const maxDynamicFeeNumerator = baseFeeNumerator.muln(20).divn(100) // default max dynamic fee = 20% of min base fee\n    const vFee = maxDynamicFeeNumerator\n        .mul(new BN(100_000_000_000))\n        .sub(new BN(99_999_999_999))\n\n    const variableFeeControl = vFee.div(squareVfaBin)\n\n    return {\n        binStep: BIN_STEP_BPS_DEFAULT,\n        binStepU128: BIN_STEP_BPS_U128_DEFAULT,\n        filterPeriod: DYNAMIC_FEE_FILTER_PERIOD_DEFAULT,\n        decayPeriod: DYNAMIC_FEE_DECAY_PERIOD_DEFAULT,\n        reductionFactor: DYNAMIC_FEE_REDUCTION_FACTOR_DEFAULT,\n        maxVolatilityAccumulator: maxVolatilityAccumulator.toNumber(),\n        variableFeeControl: variableFeeControl.toNumber(),\n    }\n}\n\n/**\n * Calculate the locked vesting parameters\n * @param totalLockedVestingAmount - The total vesting amount\n * @param numberOfVestingPeriod - The number of periods\n * @param cliffUnlockAmount - The amount to unlock at cliff\n * @param totalVestingDuration - The total duration of vesting\n * @param cliffDurationFromMigrationTime - The cliff duration from migration time\n * @param tokenBaseDecimal - The decimal of the base token\n * @returns The locked vesting parameters\n * total_locked_vesting_amount = cliff_unlock_amount + (amount_per_period * number_of_period)\n */\nexport function getLockedVestingParams(\n    totalLockedVestingAmount: number,\n    numberOfVestingPeriod: number,\n    cliffUnlockAmount: number,\n    totalVestingDuration: number,\n    cliffDurationFromMigrationTime: number,\n    tokenBaseDecimal: TokenDecimal\n): {\n    amountPerPeriod: BN\n    cliffDurationFromMigrationTime: BN\n    frequency: BN\n    numberOfPeriod: BN\n    cliffUnlockAmount: BN\n} {\n    if (totalLockedVestingAmount == 0) {\n        return {\n            amountPerPeriod: new BN(0),\n            cliffDurationFromMigrationTime: new BN(0),\n            frequency: new BN(0),\n            numberOfPeriod: new BN(0),\n            cliffUnlockAmount: new BN(0),\n        }\n    }\n\n    if (totalLockedVestingAmount == cliffUnlockAmount) {\n        return {\n            amountPerPeriod: convertToLamports(1, tokenBaseDecimal),\n            cliffDurationFromMigrationTime: new BN(\n                cliffDurationFromMigrationTime\n            ),\n            frequency: new BN(1),\n            numberOfPeriod: new BN(1),\n            cliffUnlockAmount: convertToLamports(\n                totalLockedVestingAmount - 1,\n                tokenBaseDecimal\n            ),\n        }\n    }\n\n    if (numberOfVestingPeriod <= 0) {\n        throw new Error('Total periods must be greater than zero')\n    }\n\n    if (numberOfVestingPeriod == 0 || totalVestingDuration == 0) {\n        throw new Error(\n            'numberOfPeriod and totalVestingDuration must both be greater than zero'\n        )\n    }\n\n    if (cliffUnlockAmount > totalLockedVestingAmount) {\n        throw new Error(\n            'Cliff unlock amount cannot be greater than total locked vesting amount'\n        )\n    }\n\n    // amount_per_period = (total_locked_vesting_amount - cliff_unlock_amount) / number_of_period\n    const amountPerPeriod =\n        (totalLockedVestingAmount - cliffUnlockAmount) / numberOfVestingPeriod\n\n    // round amountPerPeriod down to ensure we don't exceed total amount\n    const roundedAmountPerPeriod = Math.floor(amountPerPeriod)\n\n    // calculate the remainder from rounding down\n    const totalPeriodicAmount = roundedAmountPerPeriod * numberOfVestingPeriod\n    const remainder =\n        totalLockedVestingAmount - (cliffUnlockAmount + totalPeriodicAmount)\n\n    // add the remainder to cliffUnlockAmount to maintain total amount\n    const adjustedCliffUnlockAmount = cliffUnlockAmount + remainder\n\n    const periodFrequency = new BN(totalVestingDuration / numberOfVestingPeriod)\n\n    return {\n        amountPerPeriod: convertToLamports(\n            roundedAmountPerPeriod,\n            tokenBaseDecimal\n        ),\n        cliffDurationFromMigrationTime: new BN(cliffDurationFromMigrationTime),\n        frequency: periodFrequency,\n        numberOfPeriod: new BN(numberOfVestingPeriod),\n        cliffUnlockAmount: convertToLamports(\n            adjustedCliffUnlockAmount,\n            tokenBaseDecimal\n        ),\n    }\n}\n\n/**\n * Get the two curve\n * @param migrationSqrPrice - The migration sqrt price\n * @param initialSqrtPrice - The initial sqrt price\n * @param swapAmount - The swap amount\n * @param migrationQuoteThreshold - The migration quote threshold\n * @returns The two curve\n */\nexport const getTwoCurve = (\n    migrationSqrtPrice: BN,\n    midSqrtPrice: BN,\n    initialSqrtPrice: BN,\n    swapAmount: BN,\n    migrationQuoteThreshold: BN\n) => {\n    let p0 = new Decimal(initialSqrtPrice.toString())\n    let p1 = new Decimal(midSqrtPrice.toString())\n    let p2 = new Decimal(migrationSqrtPrice.toString())\n\n    let a1 = new Decimal(1).div(p0).sub(new Decimal(1).div(p1))\n    let b1 = new Decimal(1).div(p1).sub(new Decimal(1).div(p2))\n    let c1 = new Decimal(swapAmount.toString())\n\n    let a2 = p1.sub(p0)\n    let b2 = p2.sub(p1)\n    let c2 = new Decimal(migrationQuoteThreshold.toString()).mul(\n        Decimal.pow(2, 128)\n    )\n\n    // solve equation to find l0 and l1\n    let l0 = c1\n        .mul(b2)\n        .sub(c2.mul(b1))\n        .div(a1.mul(b2).sub(a2.mul(b1)))\n    let l1 = c1\n        .mul(a2)\n        .sub(c2.mul(a1))\n        .div(b1.mul(a2).sub(b2.mul(a1)))\n\n    if (l0.isNeg() || l1.isNeg()) {\n        return {\n            isOk: false,\n            sqrtStartPrice: new BN(0),\n            curve: [],\n        }\n    }\n\n    return {\n        isOk: true,\n        sqrtStartPrice: initialSqrtPrice,\n        curve: [\n            {\n                sqrtPrice: midSqrtPrice,\n                liquidity: new BN(l0.floor().toFixed()),\n            },\n            {\n                sqrtPrice: migrationSqrtPrice,\n                liquidity: new BN(l1.floor().toFixed()),\n            },\n        ],\n    }\n}\n\n/**\n * Check if rate limiter should be applied based on pool configuration and state\n * @param baseFeeMode - The base fee mode\n * @param swapBaseForQuote - Whether the swap is from base to quote\n * @param currentPoint - The current point\n * @param activationPoint - The activation point\n * @param maxLimiterDuration - The maximum limiter duration\n * @returns Whether rate limiter should be applied\n */\nexport function checkRateLimiterApplied(\n    baseFeeMode: BaseFeeMode,\n    swapBaseForQuote: boolean,\n    currentPoint: BN,\n    activationPoint: BN,\n    maxLimiterDuration: BN\n): boolean {\n    return (\n        baseFeeMode === BaseFeeMode.RateLimiter &&\n        !swapBaseForQuote &&\n        currentPoint.gte(activationPoint) &&\n        currentPoint.lte(activationPoint.add(maxLimiterDuration))\n    )\n}\n\n/**\n * Get base fee parameters based on the base fee mode\n * @param baseFeeParams - The base fee parameters\n * @param tokenQuoteDecimal - The token quote decimal\n * @param activationType - The activation type\n * @returns The base fee parameters\n */\nexport function getBaseFeeParams(\n    baseFeeParams: {\n        baseFeeMode: BaseFeeMode\n        rateLimiterParam?: {\n            baseFeeBps: number\n            feeIncrementBps: number\n            referenceAmount: number\n            maxLimiterDuration: number\n        }\n        feeSchedulerParam?: {\n            startingFeeBps: number\n            endingFeeBps: number\n            numberOfPeriod: number\n            totalDuration: number\n        }\n    },\n    tokenQuoteDecimal: TokenDecimal,\n    activationType: ActivationType\n): BaseFee {\n    if (baseFeeParams.baseFeeMode === BaseFeeMode.RateLimiter) {\n        if (!baseFeeParams.rateLimiterParam) {\n            throw new Error(\n                'Rate limiter parameters are required for RateLimiter mode'\n            )\n        }\n        const {\n            baseFeeBps,\n            feeIncrementBps,\n            referenceAmount,\n            maxLimiterDuration,\n        } = baseFeeParams.rateLimiterParam\n\n        return getRateLimiterParams(\n            baseFeeBps,\n            feeIncrementBps,\n            referenceAmount,\n            maxLimiterDuration,\n            tokenQuoteDecimal,\n            activationType\n        )\n    } else {\n        if (!baseFeeParams.feeSchedulerParam) {\n            throw new Error(\n                'Fee scheduler parameters are required for FeeScheduler mode'\n            )\n        }\n        const { startingFeeBps, endingFeeBps, numberOfPeriod, totalDuration } =\n            baseFeeParams.feeSchedulerParam\n\n        return getFeeSchedulerParams(\n            startingFeeBps,\n            endingFeeBps,\n            baseFeeParams.baseFeeMode,\n            numberOfPeriod,\n            totalDuration\n        )\n    }\n}\n\n/**\n * Get the quote token amount from sqrt price\n * @param nextSqrtPrice - The next sqrt price\n * @param config - The pool configuration\n * @returns The total quote token amount\n */\nexport function getQuoteReserveFromNextSqrtPrice(\n    nextSqrtPrice: BN,\n    config: PoolConfig\n): BN {\n    let totalAmount = new BN(0)\n\n    for (let i = 0; i < config.curve.length; i++) {\n        const lowerSqrtPrice =\n            i === 0 ? config.sqrtStartPrice : config.curve[i - 1].sqrtPrice\n\n        if (nextSqrtPrice.gt(lowerSqrtPrice)) {\n            const upperSqrtPrice = nextSqrtPrice.lt(config.curve[i].sqrtPrice)\n                ? nextSqrtPrice\n                : config.curve[i].sqrtPrice\n\n            const maxAmountIn = getDeltaAmountQuoteUnsigned(\n                lowerSqrtPrice,\n                upperSqrtPrice,\n                config.curve[i].liquidity,\n                Rounding.Up\n            )\n\n            totalAmount = totalAmount.add(maxAmountIn)\n        }\n    }\n\n    return totalAmount\n}\n\n/**\n * Get the tokenomics\n * @param initialMarketCap - The initial market cap\n * @param migrationMarketCap - The migration market cap\n * @param totalLockedVestingAmount - The total locked vesting amount\n * @param totalLeftover - The total leftover\n * @param totalTokenSupply - The total token supply\n * @returns The tokenomics\n */\nexport const getTokenomics = (\n    initialMarketCap: Decimal,\n    migrationMarketCap: Decimal,\n    totalLockedVestingAmount: BN,\n    totalLeftover: BN,\n    totalTokenSupply: BN\n): {\n    bondingCurveSupply: BN\n    migrationSupply: BN\n    leftoverSupply: BN\n    lockedVestingSupply: BN\n} => {\n    // formula: x = sqrt(initialMC / migrationMC) * (100 - lockedVesting - leftover) / (1 + sqrt(initialMC / migrationMC))\n\n    // sqrtRatio = sqrt(initial_MC / migration_MC)\n    const marketCapRatio = initialMarketCap.div(migrationMarketCap)\n    const sqrtRatio = Decimal.sqrt(marketCapRatio)\n\n    // locked vesting percentage\n    const vestingPercentage = new Decimal(totalLockedVestingAmount.toString())\n        .mul(new Decimal(100))\n        .div(new Decimal(totalTokenSupply.toString()))\n\n    // leftover percentage\n    const leftoverPercentage = new Decimal(totalLeftover.toString())\n        .mul(new Decimal(100))\n        .div(new Decimal(totalTokenSupply.toString()))\n\n    // (100 * sqrtRatio - (vestingPercentage + leftoverPercentage) * sqrtRatio) / (1 + sqrtRatio)\n    const percentageSupplyOnMigration = new Decimal(100)\n        .mul(sqrtRatio)\n        .sub(vestingPercentage.add(leftoverPercentage).mul(sqrtRatio))\n    const denominator = new Decimal(1).add(sqrtRatio)\n\n    // Calculate migration supply as BN\n    const migrationSupplyDecimal = percentageSupplyOnMigration\n        .div(denominator)\n        .mul(new Decimal(totalTokenSupply.toString()))\n        .div(new Decimal(100))\n    const migrationSupply = new BN(migrationSupplyDecimal.floor().toFixed())\n\n    // Calculate bonding curve supply (remaining after subtracting known amounts)\n    const bondingCurveSupply = totalTokenSupply\n        .sub(migrationSupply)\n        .sub(totalLeftover)\n        .sub(totalLockedVestingAmount)\n\n    return {\n        bondingCurveSupply: bondingCurveSupply,\n        migrationSupply: migrationSupply,\n        leftoverSupply: totalLeftover,\n        lockedVestingSupply: totalLockedVestingAmount,\n    }\n}\n\n/**\n * Get migrated pool fee parameters based on migration options\n * @param migrationOption - The migration option (DAMM or DAMM_V2)\n * @param migrationFeeOption - The fee option (fixed rates 0-5 or customizable)\n * @param migratedPoolFee - Optional custom migrated pool fee parameters (only used with DAMM_V2 + Customizable)\n * @returns Migrated pool fee parameters with appropriate defaults\n */\nexport function getMigratedPoolFeeParams(\n    migrationOption: MigrationOption,\n    migrationFeeOption: MigrationFeeOption,\n    migratedPoolFee?: MigratedPoolFee\n): {\n    collectFeeMode: CollectFeeMode\n    dynamicFee: DammV2DynamicFeeMode\n    poolFeeBps: number\n} {\n    // Default fee parameters for non-customizable scenarios\n    const defaultFeeParams = {\n        collectFeeMode: 0,\n        dynamicFee: 0,\n        poolFeeBps: 0,\n    } as const\n\n    // For DAMM_V1: always use default parameters\n    if (migrationOption === MigrationOption.MET_DAMM) {\n        return defaultFeeParams\n    }\n\n    // For DAMM_V2: use custom parameters only if Customizable option is selected\n    if (migrationOption === MigrationOption.MET_DAMM_V2) {\n        if (migrationFeeOption === MigrationFeeOption.Customizable) {\n            return migratedPoolFee\n        }\n        // For fixed fee options (0-5), always use defaults\n        return defaultFeeParams\n    }\n\n    return defaultFeeParams\n}\n","import BN from 'bn.js'\nimport { SafeMath } from './safeMath'\nimport { mulDiv } from './utilsMath'\nimport { RESOLUTION } from '../constants'\nimport { Rounding } from '../types'\n\n/**\n * Gets the delta amount_base for given liquidity and price range\n * Formula: Δa = L * (1 / √P_lower - 1 / √P_upper)\n * i.e. L * (√P_upper - √P_lower) / (√P_upper * √P_lower)\n * @param lowerSqrtPrice Lower sqrt price\n * @param upperSqrtPrice Upper sqrt price\n * @param liquidity Liquidity\n * @param round Rounding direction\n * @returns Delta amount base\n */\nexport function getDeltaAmountBaseUnsigned(\n    lowerSqrtPrice: BN,\n    upperSqrtPrice: BN,\n    liquidity: BN,\n    round: Rounding\n): BN {\n    if (liquidity.isZero()) {\n        return new BN(0)\n    }\n\n    if (lowerSqrtPrice.isZero() || upperSqrtPrice.isZero()) {\n        throw new Error('Sqrt price cannot be zero')\n    }\n\n    // numerator: (√P_upper - √P_lower)\n    const numerator = SafeMath.sub(upperSqrtPrice, lowerSqrtPrice)\n\n    // denominator: (√P_upper * √P_lower)\n    const denominator = SafeMath.mul(lowerSqrtPrice, upperSqrtPrice)\n\n    // L * (√P_upper - √P_lower) / (√P_upper * √P_lower)\n    return mulDiv(liquidity, numerator, denominator, round)\n}\n\n/**\n * Gets the delta amount_quote for given liquidity and price range\n * Formula: Δb = L (√P_upper - √P_lower)\n * @param lowerSqrtPrice Lower sqrt price\n * @param upperSqrtPrice Upper sqrt price\n * @param liquidity Liquidity\n * @param round Rounding direction\n * @returns Delta amount quote\n */\nexport function getDeltaAmountQuoteUnsigned(\n    lowerSqrtPrice: BN,\n    upperSqrtPrice: BN,\n    liquidity: BN,\n    round: Rounding\n): BN {\n    if (liquidity.isZero()) {\n        return new BN(0)\n    }\n\n    // delta sqrt price: (√P_upper - √P_lower)\n    const deltaSqrtPrice = SafeMath.sub(upperSqrtPrice, lowerSqrtPrice)\n\n    // L * (√P_upper - √P_lower)\n    const prod = SafeMath.mul(liquidity, deltaSqrtPrice)\n\n    if (round === Rounding.Up) {\n        const denominator = new BN(1).shln(RESOLUTION * 2)\n        // ceiling division: (a + b - 1) / b\n        const numerator = SafeMath.add(\n            prod,\n            SafeMath.sub(denominator, new BN(1))\n        )\n        return SafeMath.div(numerator, denominator)\n    } else {\n        return SafeMath.shr(prod, RESOLUTION * 2)\n    }\n}\n\n/**\n * Gets the next sqrt price given an input amount of token_a or token_b\n * @param sqrtPrice Current sqrt price\n * @param liquidity Liquidity\n * @param amountIn Input amount\n * @param baseForQuote Whether the input is base token for quote token\n * @returns Next sqrt price\n */\nexport function getNextSqrtPriceFromInput(\n    sqrtPrice: BN,\n    liquidity: BN,\n    amountIn: BN,\n    baseForQuote: boolean\n): BN {\n    if (sqrtPrice.isZero() || liquidity.isZero()) {\n        throw new Error('Price or liquidity cannot be zero')\n    }\n\n    if (baseForQuote) {\n        return getNextSqrtPriceFromAmountBaseRoundingUp(\n            sqrtPrice,\n            liquidity,\n            amountIn\n        )\n    } else {\n        return getNextSqrtPriceFromAmountQuoteRoundingDown(\n            sqrtPrice,\n            liquidity,\n            amountIn\n        )\n    }\n}\n\n/**\n * Gets the next sqrt price from amount base rounding up\n * Formula: √P' = √P * L / (L + Δx * √P)\n * @param sqrtPrice Current sqrt price\n * @param liquidity Liquidity\n * @param amount Input amount\n * @returns Next sqrt price\n */\nexport function getNextSqrtPriceFromAmountBaseRoundingUp(\n    sqrtPrice: BN,\n    liquidity: BN,\n    amount: BN\n): BN {\n    if (amount.isZero()) {\n        return sqrtPrice\n    }\n\n    // Δx * √P\n    const product = SafeMath.mul(amount, sqrtPrice)\n\n    // L + Δx * √P\n    const denominator = SafeMath.add(liquidity, product)\n\n    // √P * L / (L + Δx * √P) with rounding up\n    return mulDiv(liquidity, sqrtPrice, denominator, Rounding.Up)\n}\n\n/**\n * Gets the next sqrt price given a delta of token_quote\n * Formula: √P' = √P + Δy / L\n * @param sqrtPrice Current sqrt price\n * @param liquidity Liquidity\n * @param amount Input amount\n * @returns Next sqrt price\n */\nexport function getNextSqrtPriceFromAmountQuoteRoundingDown(\n    sqrtPrice: BN,\n    liquidity: BN,\n    amount: BN\n): BN {\n    if (amount.isZero()) {\n        return sqrtPrice\n    }\n\n    // quotient: Δy << (RESOLUTION * 2) / L\n    const quotient = SafeMath.div(\n        SafeMath.shl(amount, RESOLUTION * 2),\n        liquidity\n    )\n\n    // √P + quotient\n    return SafeMath.add(sqrtPrice, quotient)\n}\n\n/**\n * Gets the initial liquidity from delta quote\n * Formula: L = Δb / (√P_upper - √P_lower)\n * @param quoteAmount Quote amount\n * @param sqrtMinPrice Minimum sqrt price\n * @param sqrtPrice Current sqrt price\n * @returns Initial liquidity\n */\nexport function getInitialLiquidityFromDeltaQuote(\n    quoteAmount: BN,\n    sqrtMinPrice: BN,\n    sqrtPrice: BN\n): BN {\n    const priceDelta = SafeMath.sub(sqrtPrice, sqrtMinPrice)\n    const quoteAmountShifted = SafeMath.shl(quoteAmount, RESOLUTION * 2)\n\n    return SafeMath.div(quoteAmountShifted, priceDelta)\n}\n\n/**\n * Gets the initial liquidity from delta base\n * Formula: L = Δa / (1/√P_lower - 1/√P_upper)\n * @param baseAmount Base amount\n * @param sqrtMaxPrice Maximum sqrt price\n * @param sqrtPrice Current sqrt price\n * @returns Initial liquidity\n */\nexport function getInitialLiquidityFromDeltaBase(\n    baseAmount: BN,\n    sqrtMaxPrice: BN,\n    sqrtPrice: BN\n): BN {\n    const priceDelta = SafeMath.sub(sqrtMaxPrice, sqrtPrice)\n    const prod = SafeMath.mul(SafeMath.mul(baseAmount, sqrtPrice), sqrtMaxPrice)\n\n    return SafeMath.div(prod, priceDelta)\n}\n\n/**\n * Gets the initialize amounts\n * @param sqrtMinPrice Minimum sqrt price\n * @param sqrtMaxPrice Maximum sqrt price\n * @param sqrtPrice Current sqrt price\n * @param liquidity Liquidity\n * @returns [base amount, quote amount]\n */\nexport function getInitializeAmounts(\n    sqrtMinPrice: BN,\n    sqrtMaxPrice: BN,\n    sqrtPrice: BN,\n    liquidity: BN\n): [BN, BN] {\n    const amountBase = getDeltaAmountBaseUnsigned(\n        sqrtPrice,\n        sqrtMaxPrice,\n        liquidity,\n        Rounding.Up\n    )\n\n    const amountQuote = getDeltaAmountQuoteUnsigned(\n        sqrtMinPrice,\n        sqrtPrice,\n        liquidity,\n        Rounding.Up\n    )\n\n    return [amountBase, amountQuote]\n}\n\n/**\n * Gets the next sqrt price from amount quote rounding up\n * Formula: √P' = √P - Δy / L\n * @param sqrtPrice Current sqrt price\n * @param liquidity Liquidity\n * @param amount Output amount\n * @returns Next sqrt price\n */\nexport function getNextSqrtPriceFromAmountQuoteRoundingUp(\n    sqrtPrice: BN,\n    liquidity: BN,\n    amount: BN\n): BN {\n    if (amount.isZero()) {\n        return sqrtPrice\n    }\n\n    // quotient = (amount << 128 + liquidity - 1) / liquidity\n    const amountShifted = SafeMath.shl(amount, 128)\n    const step1 = SafeMath.add(amountShifted, liquidity)\n    const step2 = SafeMath.sub(step1, new BN(1))\n    const quotient = SafeMath.div(step2, liquidity)\n\n    // √P - quotient\n    return SafeMath.sub(sqrtPrice, quotient)\n}\n\n/**\n * Gets the next sqrt price from amount base rounding down\n * Formula: √P' = √P * L / (L - Δx * √P)\n * @param sqrtPrice Current sqrt price\n * @param liquidity Liquidity\n * @param amount Output amount\n * @returns Next sqrt price\n */\nexport function getNextSqrtPriceFromAmountBaseRoundingDown(\n    sqrtPrice: BN,\n    liquidity: BN,\n    amount: BN\n): BN {\n    if (amount.isZero()) {\n        return sqrtPrice\n    }\n\n    // Δx * √P\n    const product = SafeMath.mul(amount, sqrtPrice)\n\n    // L - Δx * √P\n    const denominator = SafeMath.sub(liquidity, product)\n\n    // √P * L / (L - Δx * √P) with rounding down\n    return mulDiv(liquidity, sqrtPrice, denominator, Rounding.Down)\n}\n\n/**\n * Gets the next sqrt price from output amount\n * @param sqrtPrice Current sqrt price\n * @param liquidity Liquidity\n * @param outAmount Output amount\n * @param isQuote Whether the output is quote token\n * @returns Next sqrt price\n */\nexport function getNextSqrtPriceFromOutput(\n    sqrtPrice: BN,\n    liquidity: BN,\n    outAmount: BN,\n    isQuote: boolean\n): BN {\n    if (sqrtPrice.isZero()) {\n        throw new Error('Sqrt price cannot be zero')\n    }\n\n    if (isQuote) {\n        return getNextSqrtPriceFromAmountQuoteRoundingUp(\n            sqrtPrice,\n            liquidity,\n            outAmount\n        )\n    } else {\n        return getNextSqrtPriceFromAmountBaseRoundingDown(\n            sqrtPrice,\n            liquidity,\n            outAmount\n        )\n    }\n}\n","import BN from 'bn.js'\nimport { RESOLUTION } from '../constants'\n\n/**\n * Safe math operations for BN\n */\nexport class SafeMath {\n    /**\n     * Safe addition\n     * @param a First number\n     * @param b Second number\n     * @returns Sum of a and b\n     */\n    static add(a: BN, b: BN): BN {\n        return a.add(b)\n    }\n\n    /**\n     * Safe subtraction\n     * @param a First number\n     * @param b Second number\n     * @returns Difference of a and b\n     * @throws Error if b > a\n     */\n    static sub(a: BN, b: BN): BN {\n        if (b.gt(a)) {\n            throw new Error('SafeMath: subtraction overflow')\n        }\n        return a.sub(b)\n    }\n\n    /**\n     * Safe multiplication\n     * @param a First number\n     * @param b Second number\n     * @returns Product of a and b\n     */\n    static mul(a: BN, b: BN): BN {\n        return a.mul(b)\n    }\n\n    /**\n     * Safe division\n     * @param a First number\n     * @param b Second number\n     * @returns Quotient of a and b\n     * @throws Error if b is zero\n     */\n    static div(a: BN, b: BN): BN {\n        if (b.isZero()) {\n            throw new Error('SafeMath: division by zero')\n        }\n        return a.div(b)\n    }\n\n    /**\n     * Safe modulo\n     * @param a First number\n     * @param b Second number\n     * @returns Remainder of a divided by b\n     * @throws Error if b is zero\n     */\n    static mod(a: BN, b: BN): BN {\n        if (b.isZero()) {\n            throw new Error('SafeMath: modulo by zero')\n        }\n        return a.mod(b)\n    }\n\n    /**\n     * Safe left shift\n     * @param a Number to shift\n     * @param b Number of bits to shift\n     * @returns a << b\n     */\n    static shl(a: BN, b: number): BN {\n        return a.shln(b)\n    }\n\n    /**\n     * Safe right shift\n     * @param a Number to shift\n     * @param b Number of bits to shift\n     * @returns a >> b\n     */\n    static shr(a: BN, b: number): BN {\n        return a.shrn(b)\n    }\n}\n\n/**\n * Safe power function for BN with scaling\n * @param base Base number (scaled by RESOLUTION)\n * @param exponent Exponent (can be negative)\n * @param scaling Whether to apply RESOLUTION scaling to the result\n * @returns base^exponent\n */\nexport function pow(base: BN, exponent: BN, scaling: boolean = true): BN {\n    const ONE = new BN(1).shln(RESOLUTION)\n\n    // special cases\n    if (exponent.isZero()) return ONE\n    if (base.isZero()) return new BN(0)\n    if (base.eq(ONE)) return ONE\n\n    // handle negative exponent\n    const isNegative = exponent.isNeg()\n    const absExponent = isNegative ? exponent.neg() : exponent\n\n    // binary exponentiation\n    let result = ONE\n    let currentBase = base\n    let exp = absExponent\n\n    while (!exp.isZero()) {\n        if (exp.and(new BN(1)).eq(new BN(1))) {\n            result = SafeMath.div(SafeMath.mul(result, currentBase), ONE)\n        }\n        currentBase = SafeMath.div(SafeMath.mul(currentBase, currentBase), ONE)\n        exp = exp.shrn(1)\n    }\n\n    // handle negative exponent\n    if (isNegative) {\n        result = SafeMath.div(ONE.mul(ONE), result)\n    }\n\n    // apply scaling if needed\n    return scaling ? result : SafeMath.div(result, ONE)\n}\n","import BN from 'bn.js'\nimport { SafeMath } from './safeMath'\nimport { Rounding } from '../types'\n\n/**\n * Multiply and divide with rounding using BN\n * @param x First number\n * @param y Second number\n * @param denominator Denominator\n * @param rounding Rounding direction\n * @returns (x * y) / denominator\n * @throws If division by zero or overflow occurs\n */\nexport function mulDiv(x: BN, y: BN, denominator: BN, rounding: Rounding): BN {\n    if (denominator.isZero()) {\n        throw new Error('MulDiv: division by zero')\n    }\n\n    if (denominator.eq(new BN(1)) || x.isZero() || y.isZero()) {\n        return x.mul(y)\n    }\n\n    const prod = x.mul(y)\n\n    if (rounding === Rounding.Up) {\n        // Calculate ceiling division: (prod + denominator - 1) / denominator\n        const numerator = prod.add(denominator.sub(new BN(1)))\n        return numerator.div(denominator)\n    } else {\n        return prod.div(denominator)\n    }\n}\n\n/**\n * Multiply and shift right with BN\n * @param x First number\n * @param y Second number\n * @param offset Number of bits to shift\n * @returns (x * y) >> offset\n */\nexport function mulShr(x: BN, y: BN, offset: number): BN {\n    if (offset === 0 || x.isZero() || y.isZero()) {\n        return x.mul(y)\n    }\n\n    const prod = SafeMath.mul(x, y)\n\n    return SafeMath.shr(prod, offset)\n}\n","import BN from 'bn.js'\nimport { PublicKey, type GetProgramAccountsFilter } from '@solana/web3.js'\nimport { NATIVE_MINT } from '@solana/spl-token'\nimport { BASIS_POINT_MAX, FEE_DENOMINATOR } from '../constants'\nimport Decimal from 'decimal.js'\n\nexport function convertToLamports(\n    amount: number | string,\n    tokenDecimal: number\n): BN {\n    const valueInLamports = new Decimal(amount).mul(\n        Decimal.pow(10, tokenDecimal)\n    )\n    return fromDecimalToBN(valueInLamports)\n}\n/**\n * Get BN value from decimal value after roundown\n * @param value - The decimal value\n * @returns value in BN after roundown\n */\nexport function fromDecimalToBN(value: Decimal): BN {\n    return new BN(value.floor().toFixed())\n}\n\n/**\n * Create a memcmp filter for owner-based filtering\n * @param owner - The owner public key or string\n * @param offset - The offset where the owner field is located in the account data\n * @returns A GetProgramAccountsFilter array with the owner filter\n */\nexport function createProgramAccountFilter(\n    owner: PublicKey | string,\n    offset: number\n): GetProgramAccountsFilter[] {\n    const ownerKey = typeof owner === 'string' ? new PublicKey(owner) : owner\n    return [\n        {\n            memcmp: {\n                offset,\n                bytes: ownerKey.toBase58(),\n                encoding: 'base58',\n            },\n        },\n    ]\n}\n\n/**\n * Check if a mint is the native SOL mint\n * @param mint - The mint to check\n * @returns Whether the mint is the native SOL mint\n */\nexport function isNativeSol(mint: PublicKey): boolean {\n    return mint.toString() === NATIVE_MINT.toString()\n}\n\n/**\n * Check if the locked vesting is the default\n * @param lockedVesting - The locked vesting parameters\n * @returns true if the locked vesting is the default, false otherwise\n */\nexport function isDefaultLockedVesting(lockedVesting: {\n    amountPerPeriod: BN\n    cliffDurationFromMigrationTime: BN\n    frequency: BN\n    numberOfPeriod: BN\n    cliffUnlockAmount: BN\n}): boolean {\n    return (\n        lockedVesting.amountPerPeriod.eqn(0) &&\n        lockedVesting.cliffDurationFromMigrationTime.eqn(0) &&\n        lockedVesting.frequency.eqn(0) &&\n        lockedVesting.numberOfPeriod.eqn(0) &&\n        lockedVesting.cliffUnlockAmount.eqn(0)\n    )\n}\n\n/**\n * Convert decimal to a BN\n * @param value - The value\n * @returns The BN\n */\nexport function convertDecimalToBN(value: Decimal): BN {\n    return new BN(value.floor().toFixed())\n}\n\n/**\n * Converts basis points (bps) to fee numerator\n * 1 bps = 0.01% = 0.0001 in decimal\n *\n * @param bps - The value in basis points [1-10_000]\n * @returns The equivalent fee numerator\n */\nexport function bpsToFeeNumerator(bps: number): BN {\n    return new BN(bps * FEE_DENOMINATOR).divn(BASIS_POINT_MAX)\n}\n\n/**\n * Converts fee numerator back to basis points (bps)\n *\n * @param feeNumerator - The fee numerator to convert\n * @returns The equivalent value in basis points [1-10_000]\n */\nexport function feeNumeratorToBps(feeNumerator: BN): number {\n    return feeNumerator\n        .muln(BASIS_POINT_MAX)\n        .div(new BN(FEE_DENOMINATOR))\n        .toNumber()\n}\n","import { PublicKey } from '@solana/web3.js'\nimport {\n    BASE_ADDRESS,\n    DAMM_V1_PROGRAM_ID,\n    DAMM_V2_PROGRAM_ID,\n    LOCKER_PROGRAM_ID,\n    METAPLEX_PROGRAM_ID,\n    VAULT_PROGRAM_ID,\n    DYNAMIC_BONDING_CURVE_PROGRAM_ID,\n} from '../constants'\nimport { getFirstKey, getSecondKey } from './common'\n\nconst SEED = Object.freeze({\n    POOL_AUTHORITY: 'pool_authority',\n    EVENT_AUTHORITY: '__event_authority',\n    POOL: 'pool',\n    TOKEN_VAULT: 'token_vault',\n    METADATA: 'metadata',\n    PARTNER_METADATA: 'partner_metadata',\n    CLAIM_FEE_OPERATOR: 'cf_operator',\n    DAMM_V1_MIGRATION_METADATA: 'meteora',\n    DAMM_V2_MIGRATION_METADATA: 'damm_v2',\n    LP_MINT: 'lp_mint',\n    FEE: 'fee',\n    POSITION: 'position',\n    POSITION_NFT_ACCOUNT: 'position_nft_account',\n    LOCK_ESCROW: 'lock_escrow',\n    VIRTUAL_POOL_METADATA: 'virtual_pool_metadata',\n    ESCROW: 'escrow',\n    BASE_LOCKER: 'base_locker',\n    VAULT: 'vault',\n})\n\n/**\n * Derive DBC event authority\n * @returns The event authority\n */\nexport function deriveDbcEventAuthority(): PublicKey {\n    const [eventAuthority] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.EVENT_AUTHORITY)],\n        DYNAMIC_BONDING_CURVE_PROGRAM_ID\n    )\n    return eventAuthority\n}\n\n/**\n * Derive DAMM V1 event authority\n * @returns The event authority\n */\nexport function deriveDammV1EventAuthority(): PublicKey {\n    const [eventAuthority] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.EVENT_AUTHORITY)],\n        DAMM_V1_PROGRAM_ID\n    )\n    return eventAuthority\n}\n\n/**\n * Derive DAMM V2 event authority\n * @returns The event authority\n */\nexport function deriveDammV2EventAuthority(): PublicKey {\n    const [eventAuthority] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.EVENT_AUTHORITY)],\n        DAMM_V2_PROGRAM_ID\n    )\n    return eventAuthority\n}\n\n/**\n * Derive Locker event authority\n * @returns The event authority\n */\nexport function deriveLockerEventAuthority(): PublicKey {\n    const [eventAuthority] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.EVENT_AUTHORITY)],\n        LOCKER_PROGRAM_ID\n    )\n    return eventAuthority\n}\n\n/**\n * Derive DBC pool authority\n * @returns The pool authority\n */\nexport function deriveDbcPoolAuthority(): PublicKey {\n    const [poolAuthority] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.POOL_AUTHORITY)],\n        DYNAMIC_BONDING_CURVE_PROGRAM_ID\n    )\n\n    return poolAuthority\n}\n\n/**\n * Derive DAMM V1 pool authority\n * @returns The pool authority\n */\nexport function deriveDammV1PoolAuthority(): PublicKey {\n    const [poolAuthority] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.POOL_AUTHORITY)],\n        DAMM_V1_PROGRAM_ID\n    )\n\n    return poolAuthority\n}\n\n/**\n * Derive DAMM V2 pool authority\n * @returns The pool authority\n */\nexport function deriveDammV2PoolAuthority(): PublicKey {\n    const [poolAuthority] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.POOL_AUTHORITY)],\n        DAMM_V2_PROGRAM_ID\n    )\n\n    return poolAuthority\n}\n\n/**\n * Derive DBC pool address\n * @param quoteMint - The quote mint\n * @param baseMint - The base mint\n * @param config - The config\n * @returns The pool\n */\nexport function deriveDbcPoolAddress(\n    quoteMint: PublicKey,\n    baseMint: PublicKey,\n    config: PublicKey\n): PublicKey {\n    const isQuoteMintBiggerThanBaseMint =\n        new PublicKey(quoteMint)\n            .toBuffer()\n            .compare(new Uint8Array(new PublicKey(baseMint).toBuffer())) > 0\n\n    const [pool] = PublicKey.findProgramAddressSync(\n        [\n            Buffer.from(SEED.POOL),\n            new PublicKey(config).toBuffer(),\n            isQuoteMintBiggerThanBaseMint\n                ? new PublicKey(quoteMint).toBuffer()\n                : new PublicKey(baseMint).toBuffer(),\n            isQuoteMintBiggerThanBaseMint\n                ? new PublicKey(baseMint).toBuffer()\n                : new PublicKey(quoteMint).toBuffer(),\n        ],\n        DYNAMIC_BONDING_CURVE_PROGRAM_ID\n    )\n\n    return pool\n}\n\n/**\n * Derive DAMM V1 pool address\n * @param config - The config\n * @param tokenAMint - The token A mint\n * @param tokenBMint - The token B mint\n * @returns The DAMM V1 pool address\n */\nexport function deriveDammV1PoolAddress(\n    config: PublicKey,\n    tokenAMint: PublicKey,\n    tokenBMint: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [\n            getFirstKey(tokenAMint, tokenBMint),\n            getSecondKey(tokenAMint, tokenBMint),\n            config.toBuffer(),\n        ],\n        DAMM_V1_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DAMM V2 pool address\n * @param config - The config\n * @param tokenAMint - The token A mint\n * @param tokenBMint - The token B mint\n * @returns The DAMM V2 pool address\n */\nexport function deriveDammV2PoolAddress(\n    config: PublicKey,\n    tokenAMint: PublicKey,\n    tokenBMint: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [\n            Buffer.from(SEED.POOL),\n            config.toBuffer(),\n            getFirstKey(tokenAMint, tokenBMint),\n            getSecondKey(tokenAMint, tokenBMint),\n        ],\n        DAMM_V2_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive mint metadata address\n * @param mint - The mint\n * @returns The mint metadata address\n */\nexport function deriveMintMetadata(mint: PublicKey): PublicKey {\n    const [metadata] = PublicKey.findProgramAddressSync(\n        [\n            Buffer.from(SEED.METADATA),\n            METAPLEX_PROGRAM_ID.toBuffer(),\n            mint.toBuffer(),\n        ],\n        METAPLEX_PROGRAM_ID\n    )\n\n    return metadata\n}\n\n/**\n * Derive partner metadata\n * @param feeClaimer - The fee claimer\n * @returns The partner metadata\n */\nexport function derivePartnerMetadata(feeClaimer: PublicKey): PublicKey {\n    const [partnerMetadata] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.PARTNER_METADATA), feeClaimer.toBuffer()],\n        DYNAMIC_BONDING_CURVE_PROGRAM_ID\n    )\n    return partnerMetadata\n}\n\n/**\n * Derive DBC pool metadata\n * @param pool - The pool\n * @returns The DBC pool metadata\n */\nexport function deriveDbcPoolMetadata(pool: PublicKey): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.VIRTUAL_POOL_METADATA), pool.toBuffer()],\n        DYNAMIC_BONDING_CURVE_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DAMM V1 migration metadata address\n * @param virtual_pool - The virtual pool\n * @returns The DAMM migration metadata address\n */\nexport function deriveDammV1MigrationMetadataAddress(\n    virtual_pool: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.DAMM_V1_MIGRATION_METADATA), virtual_pool.toBuffer()],\n        DYNAMIC_BONDING_CURVE_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DAMM V2 migration metadata address\n * @param virtual_pool - The virtual pool\n * @returns The DAMM migration metadata address\n */\nexport function deriveDammV2MigrationMetadataAddress(\n    virtual_pool: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.DAMM_V2_MIGRATION_METADATA), virtual_pool.toBuffer()],\n        DYNAMIC_BONDING_CURVE_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DBC token vault address\n * @param pool - The pool\n * @param mint - The mint\n * @returns The token vault\n */\nexport function deriveDbcTokenVaultAddress(\n    pool: PublicKey,\n    mint: PublicKey\n): PublicKey {\n    const [tokenVault] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.TOKEN_VAULT), mint.toBuffer(), pool.toBuffer()],\n        DYNAMIC_BONDING_CURVE_PROGRAM_ID\n    )\n\n    return tokenVault\n}\n\n/**\n * Derive DAMM V1 vault LP address\n * @param vault - The vault\n * @param pool - The pool\n * @returns The vault LP address\n */\nexport function deriveDammV1VaultLPAddress(\n    vault: PublicKey,\n    pool: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [vault.toBuffer(), pool.toBuffer()],\n        DAMM_V1_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DAMM V2 token vault address\n * @param pool - The pool\n * @param mint - The mint\n * @returns The token vault\n */\nexport function deriveDammV2TokenVaultAddress(\n    pool: PublicKey,\n    mint: PublicKey\n): PublicKey {\n    const [tokenVault] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.TOKEN_VAULT), mint.toBuffer(), pool.toBuffer()],\n        DAMM_V2_PROGRAM_ID\n    )\n\n    return tokenVault\n}\n\n/**\n * Derive vault address\n * @param mint - The mint\n * @param payer - The payer\n * @returns The vault address\n */\nexport function deriveVaultAddress(\n    mint: PublicKey,\n    payer: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.VAULT), mint.toBuffer(), payer.toBuffer()],\n        VAULT_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive vault addresses\n * @param tokenMint - The token mint\n * @param seedBaseKey - The seed base key\n * @returns The vault PDAs\n */\nexport const deriveVaultPdas = (\n    tokenMint: PublicKey,\n    seedBaseKey?: PublicKey\n) => {\n    const [vault] = PublicKey.findProgramAddressSync(\n        [\n            Buffer.from(SEED.VAULT),\n            tokenMint.toBuffer(),\n            (seedBaseKey ?? BASE_ADDRESS).toBuffer(),\n        ],\n        VAULT_PROGRAM_ID\n    )\n\n    const [tokenVault] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.TOKEN_VAULT), vault.toBuffer()],\n        VAULT_PROGRAM_ID\n    )\n    const [lpMint] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.LP_MINT), vault.toBuffer()],\n        VAULT_PROGRAM_ID\n    )\n\n    return {\n        vaultPda: vault,\n        tokenVaultPda: tokenVault,\n        lpMintPda: lpMint,\n    }\n}\n\n/**\n * Derive token vault address\n * @param vaultKey - The vault address\n * @returns The token vault address\n */\nexport function deriveTokenVaultKey(vaultKey: PublicKey): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.TOKEN_VAULT), vaultKey.toBuffer()],\n        VAULT_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive Vault LP mint address\n * @param pool - The pool\n * @returns The Vault LP mint address\n */\nexport function deriveVaultLpMintAddress(pool: PublicKey) {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.LP_MINT), pool.toBuffer()],\n        VAULT_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DAMM V1 LP mint address\n * @param pool - The pool\n * @returns The LP mint address\n */\nexport function deriveDammV1LpMintAddress(pool: PublicKey) {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.LP_MINT), pool.toBuffer()],\n        DAMM_V1_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DAMM V2 position address\n * @param positionNft - The position NFT\n * @returns The DAMM V2 position address\n */\nexport function derivePositionAddress(positionNft: PublicKey): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.POSITION), positionNft.toBuffer()],\n        DAMM_V2_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DAMM V2 position NFT account\n * @param positionNftMint - The position NFT mint\n * @returns The DAMM V2 position NFT account\n */\nexport function derivePositionNftAccount(\n    positionNftMint: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.POSITION_NFT_ACCOUNT), positionNftMint.toBuffer()],\n        DAMM_V2_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DAMM V1 lock escrow address\n * @param dammPool - The DAMM pool\n * @param creator - The creator of the virtual pool\n * @returns The lock escrow address\n */\nexport function deriveDammV1LockEscrowAddress(\n    dammPool: PublicKey,\n    creator: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [\n            Buffer.from(SEED.LOCK_ESCROW),\n            dammPool.toBuffer(),\n            creator.toBuffer(),\n        ],\n        DAMM_V1_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive DAMM V2 lock escrow address\n * @param dammPool - The DAMM pool\n * @param creator - The creator of the virtual pool\n * @returns The lock escrow address\n */\nexport function deriveDammV2LockEscrowAddress(\n    dammPool: PublicKey,\n    creator: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [\n            Buffer.from(SEED.LOCK_ESCROW),\n            dammPool.toBuffer(),\n            creator.toBuffer(),\n        ],\n        DAMM_V2_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive escrow address\n * @param base - The base mint\n * @returns The escrow address\n */\nexport function deriveEscrow(base: PublicKey): PublicKey {\n    const [escrow] = PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.ESCROW), base.toBuffer()],\n        LOCKER_PROGRAM_ID\n    )\n    return escrow\n}\n\n/**\n * Derive DAMM V1 protocol fee address\n * @param mint - The mint\n * @param pool - The pool\n * @returns The protocol fee address\n */\nexport function deriveDammV1ProtocolFeeAddress(\n    mint: PublicKey,\n    pool: PublicKey\n) {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.FEE), mint.toBuffer(), pool.toBuffer()],\n        DAMM_V1_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Derive base key for the locker\n * @param virtualPool - The virtual pool\n * @returns The base key for the locker\n */\nexport function deriveBaseKeyForLocker(virtualPool: PublicKey): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [Buffer.from(SEED.BASE_LOCKER), virtualPool.toBuffer()],\n        DYNAMIC_BONDING_CURVE_PROGRAM_ID\n    )[0]\n}\n","import BN from 'bn.js'\nimport {\n    MAX_CREATOR_MIGRATION_FEE_PERCENTAGE,\n    MAX_CURVE_POINT,\n    MAX_MIGRATED_POOL_FEE_BPS,\n    MAX_MIGRATION_FEE_PERCENTAGE,\n    MAX_SQRT_PRICE,\n    MIN_MIGRATED_POOL_FEE_BPS,\n    MIN_SQRT_PRICE,\n} from '../constants'\nimport {\n    ActivationType,\n    BaseFee,\n    BaseFeeMode,\n    CollectFeeMode,\n    DammV2DynamicFeeMode,\n    LockedVestingParameters,\n    MigratedPoolFee,\n    MigrationFeeOption,\n    MigrationOption,\n    PoolFeeParameters,\n    TokenDecimal,\n    TokenType,\n    TokenUpdateAuthorityOption,\n    type CreateConfigParam,\n    type PoolConfig,\n} from '../types'\nimport { Connection, PublicKey } from '@solana/web3.js'\nimport {\n    getBaseTokenForSwap,\n    getMigrationBaseToken,\n    getMigrationQuoteAmountFromMigrationQuoteThreshold,\n    getMigrationThresholdPrice,\n    getSwapAmountWithBuffer,\n    getTotalTokenSupply,\n} from './common'\nimport {\n    convertDecimalToBN,\n    isDefaultLockedVesting,\n    isNativeSol,\n} from './utils'\nimport Decimal from 'decimal.js'\nimport {\n    FEE_DENOMINATOR,\n    MAX_FEE_NUMERATOR,\n    MAX_RATE_LIMITER_DURATION_IN_SECONDS,\n    MAX_RATE_LIMITER_DURATION_IN_SLOTS,\n    MIN_FEE_NUMERATOR,\n} from '../constants'\nimport { bpsToFeeNumerator } from './utils'\nimport { getFeeNumeratorOnRateLimiter } from '../math/rateLimiter'\n\n/**\n * Validate the pool fees\n * @param poolFees - The pool fees\n * @param collectFeeMode - The collect fee mode\n * @param activationType - The activation type\n * @returns true if the pool fees are valid, false otherwise\n */\nexport function validatePoolFees(\n    poolFees: PoolFeeParameters,\n    collectFeeMode: CollectFeeMode,\n    activationType: ActivationType\n): boolean {\n    if (!poolFees) return false\n\n    // check base fee if it exists\n    if (poolFees.baseFee) {\n        if (poolFees.baseFee.cliffFeeNumerator.lte(new BN(0))) {\n            return false\n        }\n\n        // validate fee scheduler if it exists\n        if (\n            poolFees.baseFee.baseFeeMode === BaseFeeMode.FeeSchedulerLinear ||\n            poolFees.baseFee.baseFeeMode === BaseFeeMode.FeeSchedulerExponential\n        ) {\n            if (!validateFeeScheduler(poolFees.baseFee)) {\n                return false\n            }\n        }\n\n        // validate fee rate limiter if it exists\n        if (poolFees.baseFee.baseFeeMode === BaseFeeMode.RateLimiter) {\n            if (\n                !validateFeeRateLimiter(\n                    poolFees.baseFee,\n                    collectFeeMode,\n                    activationType\n                )\n            ) {\n                return false\n            }\n        }\n    }\n\n    return true\n}\n\n/**\n * Validate the fee scheduler parameters\n * @param feeScheduler - The fee scheduler parameters\n * @returns true if the fee scheduler parameters are valid, false otherwise\n */\nexport function validateFeeScheduler(feeScheduler: BaseFee): boolean {\n    if (!feeScheduler) return true\n\n    // if any parameter is set, all must be set\n    if (\n        feeScheduler.firstFactor !== 0 ||\n        feeScheduler.secondFactor.gt(new BN(0)) ||\n        feeScheduler.thirdFactor.gt(new BN(0))\n    ) {\n        if (\n            feeScheduler.firstFactor === 0 ||\n            feeScheduler.secondFactor.eq(new BN(0)) ||\n            feeScheduler.thirdFactor.eq(new BN(0))\n        ) {\n            return false\n        }\n    }\n\n    // validate cliff fee numerator\n    if (feeScheduler.cliffFeeNumerator.lte(new BN(0))) {\n        return false\n    }\n\n    // validate fee scheduler mode\n    if (\n        feeScheduler.baseFeeMode !== BaseFeeMode.FeeSchedulerLinear &&\n        feeScheduler.baseFeeMode !== BaseFeeMode.FeeSchedulerExponential\n    ) {\n        return false\n    }\n\n    // for linear mode, validate that the final fee won't be negative\n    if (feeScheduler.baseFeeMode === BaseFeeMode.FeeSchedulerLinear) {\n        const finalFee = feeScheduler.cliffFeeNumerator.sub(\n            feeScheduler.secondFactor.mul(new BN(feeScheduler.firstFactor))\n        )\n        if (finalFee.lt(new BN(0))) {\n            return false\n        }\n    }\n\n    // validate min and max fee numerators\n    const minFeeNumerator = feeScheduler.cliffFeeNumerator.sub(\n        feeScheduler.secondFactor.mul(new BN(feeScheduler.firstFactor))\n    )\n    const maxFeeNumerator = feeScheduler.cliffFeeNumerator\n\n    // validate against fee denominator\n    if (\n        minFeeNumerator.gte(new BN(FEE_DENOMINATOR)) ||\n        maxFeeNumerator.gte(new BN(FEE_DENOMINATOR))\n    ) {\n        return false\n    }\n\n    // validate against min and max fee numerators\n    if (\n        minFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n        maxFeeNumerator.gt(new BN(MAX_FEE_NUMERATOR))\n    ) {\n        return false\n    }\n\n    return true\n}\n\n/**\n * Validate the fee rate limiter parameters\n * @param feeRateLimiter - The fee rate limiter parameters\n * @param collectFeeMode - The collect fee mode\n * @param activationType - The activation type\n * @returns true if the fee rate limiter parameters are valid, false otherwise\n */\nexport function validateFeeRateLimiter(\n    feeRateLimiter: BaseFee,\n    collectFeeMode: CollectFeeMode,\n    activationType: ActivationType\n): boolean {\n    if (!feeRateLimiter) return true\n\n    // can only be applied in quote token collect fee mode\n    if (collectFeeMode !== CollectFeeMode.QuoteToken) {\n        return false\n    }\n\n    // check if it's a zero rate limiter\n    if (\n        !feeRateLimiter.firstFactor &&\n        !feeRateLimiter.secondFactor &&\n        !feeRateLimiter.thirdFactor\n    ) {\n        return true\n    }\n\n    // check if it's a non-zero rate limiter\n    if (\n        !feeRateLimiter.firstFactor ||\n        !feeRateLimiter.secondFactor ||\n        !feeRateLimiter.thirdFactor\n    ) {\n        return false\n    }\n\n    // validate max limiter duration based on activation type\n    const maxDuration =\n        activationType === ActivationType.Slot\n            ? MAX_RATE_LIMITER_DURATION_IN_SLOTS\n            : MAX_RATE_LIMITER_DURATION_IN_SECONDS\n\n    if (feeRateLimiter.secondFactor.gt(new BN(maxDuration))) {\n        return false\n    }\n\n    // validate fee increment numerator\n    const feeIncrementNumerator = bpsToFeeNumerator(feeRateLimiter.firstFactor)\n    if (feeIncrementNumerator.gte(new BN(FEE_DENOMINATOR))) {\n        return false\n    }\n\n    // validate cliff fee numerator\n    if (\n        feeRateLimiter.cliffFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n        feeRateLimiter.cliffFeeNumerator.gt(new BN(MAX_FEE_NUMERATOR))\n    ) {\n        return false\n    }\n\n    // validate min and max fee numerators based on amounts\n    const minFeeNumerator = getFeeNumeratorOnRateLimiter(\n        feeRateLimiter.cliffFeeNumerator,\n        feeRateLimiter.thirdFactor,\n        new BN(feeRateLimiter.firstFactor),\n        new BN(0)\n    )\n\n    const maxFeeNumerator = getFeeNumeratorOnRateLimiter(\n        feeRateLimiter.cliffFeeNumerator,\n        feeRateLimiter.thirdFactor,\n        new BN(feeRateLimiter.firstFactor),\n        new BN(Number.MAX_SAFE_INTEGER)\n    )\n\n    if (\n        minFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n        maxFeeNumerator.gt(new BN(MAX_FEE_NUMERATOR))\n    ) {\n        return false\n    }\n\n    return true\n}\n\n/**\n * Validate the collect fee mode\n * @param collectFeeMode - The collect fee mode\n * @returns true if the collect fee mode is valid, false otherwise\n */\nexport function validateCollectFeeMode(\n    collectFeeMode: CollectFeeMode\n): boolean {\n    return [CollectFeeMode.QuoteToken, CollectFeeMode.OutputToken].includes(\n        collectFeeMode\n    )\n}\n\n/**\n * Validate the migration and token type\n * @param migrationOption - The migration option\n * @param tokenType - The token type\n * @returns true if the migration and token type are valid, false otherwise\n */\nexport function validateMigrationAndTokenType(\n    migrationOption: MigrationOption,\n    tokenType: TokenType\n): boolean {\n    if (migrationOption === MigrationOption.MET_DAMM) {\n        return tokenType === TokenType.SPL\n    }\n    return true\n}\n\n/**\n * Validate the activation type\n * @param activationType - The activation type\n * @returns true if the activation type is valid, false otherwise\n */\nexport function validateActivationType(\n    activationType: ActivationType\n): boolean {\n    return [ActivationType.Slot, ActivationType.Timestamp].includes(\n        activationType\n    )\n}\n\n/**\n * Validate the migration fee option\n * @param migrationFeeOption - The migration fee option\n * @param migrationOption - The migration option\n * @returns true if the migration fee option is valid, false otherwise\n */\nexport function validateMigrationFeeOption(\n    migrationFeeOption: MigrationFeeOption,\n    migrationOption?: MigrationOption\n): boolean {\n    const validOptions = [\n        MigrationFeeOption.FixedBps25,\n        MigrationFeeOption.FixedBps30,\n        MigrationFeeOption.FixedBps100,\n        MigrationFeeOption.FixedBps200,\n        MigrationFeeOption.FixedBps400,\n        MigrationFeeOption.FixedBps600,\n    ]\n\n    // Customizable is only allowed for MET_DAMM_V2 migration\n    if (migrationFeeOption === MigrationFeeOption.Customizable) {\n        return migrationOption === MigrationOption.MET_DAMM_V2\n    }\n\n    return validOptions.includes(migrationFeeOption)\n}\n\n/**\n * Validate the token decimals\n * @param tokenDecimal - The token decimal\n * @returns true if the token decimal is valid, false otherwise\n */\nexport function validateTokenDecimals(tokenDecimal: TokenDecimal): boolean {\n    return tokenDecimal >= TokenDecimal.SIX && tokenDecimal <= TokenDecimal.NINE\n}\n\n/**\n * Validate the LP percentages\n * @param partnerLpPercentage - The partner LP percentage\n * @param partnerLockedLpPercentage - The partner locked LP percentage\n * @param creatorLpPercentage - The creator LP percentage\n * @param creatorLockedLpPercentage - The creator locked LP percentage\n * @returns true if the LP percentages are valid, false otherwise\n */\nexport function validateLPPercentages(\n    partnerLpPercentage: number,\n    partnerLockedLpPercentage: number,\n    creatorLpPercentage: number,\n    creatorLockedLpPercentage: number\n): boolean {\n    const totalLPPercentage =\n        partnerLpPercentage +\n        partnerLockedLpPercentage +\n        creatorLpPercentage +\n        creatorLockedLpPercentage\n    return totalLPPercentage === 100\n}\n\n/**\n * Validate the curve\n * @param curve - The curve\n * @param sqrtStartPrice - The sqrt start price\n * @returns true if the curve is valid, false otherwise\n */\nexport function validateCurve(\n    curve: Array<{ sqrtPrice: BN; liquidity: BN }>,\n    sqrtStartPrice: BN\n): boolean {\n    if (!curve || curve.length === 0 || curve.length > MAX_CURVE_POINT) {\n        return false\n    }\n\n    // first curve point validation\n    if (\n        curve[0]?.sqrtPrice.lte(sqrtStartPrice) ||\n        curve[0]?.liquidity.lte(new BN(0)) ||\n        curve[0]?.sqrtPrice.gt(new BN(MAX_SQRT_PRICE))\n    ) {\n        return false\n    }\n\n    // validate curve points are in ascending order and have positive liquidity\n    for (let i = 1; i < curve.length; i++) {\n        const currentPoint = curve[i]\n        const previousPoint = curve[i - 1]\n\n        if (!currentPoint || !previousPoint) {\n            return false\n        }\n\n        if (\n            currentPoint.sqrtPrice.lte(previousPoint.sqrtPrice) ||\n            currentPoint.liquidity.lte(new BN(0))\n        ) {\n            return false\n        }\n    }\n\n    // validate last curve point\n    return !curve[curve.length - 1]?.sqrtPrice.gt(new BN(MAX_SQRT_PRICE))\n}\n\n/**\n * Validate token supply\n * @param tokenSupply - The token supply\n * @param leftoverReceiver - The leftover receiver\n * @param swapBaseAmount - The swap base amount\n * @param migrationBaseAmount - The migration base amount\n * @param lockedVesting - The locked vesting parameters\n * @param swapBaseAmountBuffer - The swap base amount buffer\n * @returns true if the token supply is valid, false otherwise\n */\nexport function validateTokenSupply(\n    tokenSupply: {\n        preMigrationTokenSupply: BN\n        postMigrationTokenSupply: BN\n    },\n    leftoverReceiver: PublicKey,\n    swapBaseAmount: BN,\n    migrationBaseAmount: BN,\n    lockedVesting: LockedVestingParameters,\n    swapBaseAmountBuffer: BN\n): boolean {\n    if (!tokenSupply) return true\n\n    if (!leftoverReceiver) {\n        return false\n    }\n\n    // Check if it's a PublicKey instance\n    if (!(leftoverReceiver instanceof PublicKey)) {\n        return false\n    }\n\n    // Check if it's not the default public key (all zeros)\n    if (leftoverReceiver.equals(PublicKey.default)) {\n        return false\n    }\n\n    const minimumBaseSupplyWithBuffer = getTotalTokenSupply(\n        swapBaseAmountBuffer,\n        migrationBaseAmount,\n        lockedVesting\n    )\n\n    const minimumBaseSupplyWithoutBuffer = getTotalTokenSupply(\n        swapBaseAmount,\n        migrationBaseAmount,\n        lockedVesting\n    )\n\n    return !(\n        minimumBaseSupplyWithoutBuffer.gt(\n            new BN(tokenSupply.postMigrationTokenSupply)\n        ) ||\n        new BN(tokenSupply.postMigrationTokenSupply).gt(\n            new BN(tokenSupply.preMigrationTokenSupply)\n        ) ||\n        minimumBaseSupplyWithBuffer.gt(\n            new BN(tokenSupply.preMigrationTokenSupply)\n        )\n    )\n}\n\n/**\n * Validate the update authority option\n * @param option  - The update authority option\n * @returns true if the token update authority option is valid, false otherwise\n */\nexport function validateTokenUpdateAuthorityOptions(\n    option: TokenUpdateAuthorityOption\n): boolean {\n    return [\n        TokenUpdateAuthorityOption.CreatorUpdateAuthority,\n        TokenUpdateAuthorityOption.Immutable,\n        TokenUpdateAuthorityOption.PartnerUpdateAuthority,\n        TokenUpdateAuthorityOption.CreatorUpdateAndMintAuthority,\n        TokenUpdateAuthorityOption.PartnerUpdateAndMintAuthority,\n    ].includes(option)\n}\n\nexport function validateMigratedPoolFee(\n    migratedPoolFee: MigratedPoolFee,\n    migrationOption?: MigrationOption,\n    migrationFeeOption?: MigrationFeeOption\n): boolean {\n    // check if migratedPoolFee is empty (all fields are 0)\n    const isEmpty = () => {\n        return (\n            migratedPoolFee.collectFeeMode === 0 &&\n            migratedPoolFee.dynamicFee === 0 &&\n            migratedPoolFee.poolFeeBps === 0\n        )\n    }\n\n    // check if migration fee option and migration option is provided\n    if (migrationOption !== undefined && migrationFeeOption !== undefined) {\n        // For MeteoraDamm migration, migratedPoolFee must be empty\n        if (migrationOption === MigrationOption.MET_DAMM) {\n            return isEmpty()\n        }\n\n        // For DammV2 migration\n        if (migrationOption === MigrationOption.MET_DAMM_V2) {\n            // If using fixed fee options (0-5), migratedPoolFee must be empty\n            if (migrationFeeOption !== MigrationFeeOption.Customizable) {\n                return isEmpty()\n            }\n        }\n    }\n\n    // If migratedPoolFee is empty, it's valid (for when it must be empty)\n    if (isEmpty()) {\n        return true\n    }\n\n    // Validate pool fee BPS (between 10 and 1000 basis points)\n    if (\n        migratedPoolFee.poolFeeBps < MIN_MIGRATED_POOL_FEE_BPS ||\n        migratedPoolFee.poolFeeBps > MAX_MIGRATED_POOL_FEE_BPS\n    ) {\n        return false\n    }\n\n    // Validate collect fee mode (0 = QuoteToken, 1 = OutputToken)\n    if (!validateCollectFeeMode(migratedPoolFee.collectFeeMode)) {\n        return false\n    }\n\n    // Validate dynamic fee (0 = Disable, 1 = Enable)\n    if (\n        migratedPoolFee.dynamicFee !== DammV2DynamicFeeMode.Disabled &&\n        migratedPoolFee.dynamicFee !== DammV2DynamicFeeMode.Enabled\n    ) {\n        return false\n    }\n\n    return true\n}\n\n/**\n * Validate the config parameters\n * @param configParam - The config parameters\n */\nexport function validateConfigParameters(\n    configParam: Omit<\n        CreateConfigParam,\n        'config' | 'feeClaimer' | 'quoteMint' | 'payer'\n    >\n) {\n    // Pool fees validation\n    if (!configParam.poolFees) {\n        throw new Error('Pool fees are required')\n    }\n    if (\n        !validatePoolFees(\n            configParam.poolFees,\n            configParam.collectFeeMode,\n            configParam.activationType\n        )\n    ) {\n        throw new Error('Invalid pool fees')\n    }\n\n    // DBC collect fee mode validation\n    if (!validateCollectFeeMode(configParam.collectFeeMode)) {\n        throw new Error('Invalid collect fee mode')\n    }\n\n    // Update token authority option validation\n    if (\n        !validateTokenUpdateAuthorityOptions(configParam.tokenUpdateAuthority)\n    ) {\n        throw new Error('Invalid option for token update authority')\n    }\n\n    // Migration and token type validation\n    if (\n        !validateMigrationAndTokenType(\n            configParam.migrationOption,\n            configParam.tokenType\n        )\n    ) {\n        throw new Error('Token type must be SPL for MeteoraDamm migration')\n    }\n\n    // Activation type validation\n    if (!validateActivationType(configParam.activationType)) {\n        throw new Error('Invalid activation type')\n    }\n\n    // Migration fee validation\n    if (\n        !validateMigrationFeeOption(\n            configParam.migrationFeeOption,\n            configParam.migrationOption\n        )\n    ) {\n        throw new Error('Invalid migration fee option')\n    }\n\n    // Migration fee percentages validation\n    if (\n        configParam.migrationFee.feePercentage < 0 ||\n        configParam.migrationFee.feePercentage > MAX_MIGRATION_FEE_PERCENTAGE\n    ) {\n        throw new Error(\n            `Migration fee percentage must be between 0 and ${MAX_MIGRATION_FEE_PERCENTAGE}`\n        )\n    }\n    if (\n        configParam.migrationFee.creatorFeePercentage < 0 ||\n        configParam.migrationFee.creatorFeePercentage >\n            MAX_CREATOR_MIGRATION_FEE_PERCENTAGE\n    ) {\n        throw new Error(\n            `Creator fee percentage must be between 0 and ${MAX_CREATOR_MIGRATION_FEE_PERCENTAGE}`\n        )\n    }\n\n    // Token decimals validation\n    if (!validateTokenDecimals(configParam.tokenDecimal)) {\n        throw new Error('Token decimal must be between 6 and 9')\n    }\n\n    // LP percentages validation\n    if (\n        !validateLPPercentages(\n            configParam.partnerLpPercentage,\n            configParam.partnerLockedLpPercentage,\n            configParam.creatorLpPercentage,\n            configParam.creatorLockedLpPercentage\n        )\n    ) {\n        throw new Error('Sum of LP percentages must equal 100')\n    }\n\n    // Migration quote threshold validation\n    if (configParam.migrationQuoteThreshold.lte(new BN(0))) {\n        throw new Error('Migration quote threshold must be greater than 0')\n    }\n\n    // Price validation\n    if (\n        new BN(configParam.sqrtStartPrice).lt(new BN(MIN_SQRT_PRICE)) ||\n        new BN(configParam.sqrtStartPrice).gte(new BN(MAX_SQRT_PRICE))\n    ) {\n        throw new Error('Invalid sqrt start price')\n    }\n\n    // Migrated pool fee validation\n    if (configParam.migratedPoolFee) {\n        if (\n            !validateMigratedPoolFee(\n                configParam.migratedPoolFee,\n                configParam.migrationOption,\n                configParam.migrationFeeOption\n            )\n        ) {\n            throw new Error('Invalid migrated pool fee parameters')\n        }\n    }\n\n    // Curve validation\n    if (!validateCurve(configParam.curve, configParam.sqrtStartPrice)) {\n        throw new Error('Invalid curve')\n    }\n\n    // Locked vesting validation\n    if (!isDefaultLockedVesting(configParam.lockedVesting)) {\n        try {\n            const totalAmount = configParam.lockedVesting.cliffUnlockAmount.add(\n                configParam.lockedVesting.amountPerPeriod.mul(\n                    new BN(configParam.lockedVesting.numberOfPeriod)\n                )\n            )\n            if (\n                configParam.lockedVesting.frequency.eq(new BN(0)) ||\n                totalAmount.eq(new BN(0))\n            ) {\n                throw new Error('Invalid vesting parameters')\n            }\n        } catch (error) {\n            throw new Error('Invalid vesting parameters')\n        }\n    }\n\n    // Token supply validation\n    if (configParam.tokenSupply) {\n        const sqrtMigrationPrice = getMigrationThresholdPrice(\n            configParam.migrationQuoteThreshold,\n            configParam.sqrtStartPrice,\n            configParam.curve\n        )\n\n        const swapBaseAmount = getBaseTokenForSwap(\n            configParam.sqrtStartPrice,\n            sqrtMigrationPrice,\n            configParam.curve\n        )\n\n        const migrationBaseAmount = getMigrationBaseToken(\n            convertDecimalToBN(\n                getMigrationQuoteAmountFromMigrationQuoteThreshold(\n                    new Decimal(configParam.migrationQuoteThreshold.toString()),\n                    configParam.migrationFee.feePercentage\n                )\n            ),\n            sqrtMigrationPrice,\n            configParam.migrationOption\n        )\n\n        const swapBaseAmountBuffer = getSwapAmountWithBuffer(\n            swapBaseAmount,\n            configParam.sqrtStartPrice,\n            configParam.curve\n        )\n\n        if (\n            !validateTokenSupply(\n                configParam.tokenSupply,\n                new PublicKey(configParam.leftoverReceiver),\n                swapBaseAmount,\n                migrationBaseAmount,\n                configParam.lockedVesting,\n                swapBaseAmountBuffer\n            )\n        ) {\n            throw new Error('Invalid token supply')\n        }\n    }\n}\n\n/**\n * Validate that the base token type matches the pool config token type\n * @param baseTokenType - The base token type from create pool parameters\n * @param poolConfig - The pool config state\n * @returns true if the token types match, false otherwise\n */\nexport function validateBaseTokenType(\n    baseTokenType: TokenType,\n    poolConfig: PoolConfig\n): boolean {\n    return baseTokenType === poolConfig.tokenType\n}\n\n/**\n * Validate that the user has sufficient balance for the swap\n * @param connection - The Solana connection\n * @param owner - The owner's public key\n * @param inputMint - The mint of the input token\n * @param amountIn - The input amount for the swap\n * @param inputTokenAccount - The token account to check balance for\n * @returns true if the balance is sufficient, throws error if insufficient\n */\nexport async function validateBalance(\n    connection: Connection,\n    owner: PublicKey,\n    inputMint: PublicKey,\n    amountIn: BN,\n    inputTokenAccount: PublicKey\n): Promise<boolean> {\n    const isSOLInput = isNativeSol(inputMint)\n\n    if (isSOLInput) {\n        const balance = await connection.getBalance(owner)\n        const requiredBalance = BigInt(amountIn.toString()) + BigInt(10000000) // Add 0.01 SOL for fees and rent\n\n        if (balance < Number(requiredBalance)) {\n            throw new Error(\n                `Insufficient SOL balance. Required: ${requiredBalance.toString()} lamports, Found: ${balance} lamports`\n            )\n        }\n    } else {\n        try {\n            const tokenBalance =\n                await connection.getTokenAccountBalance(inputTokenAccount)\n            const balance = new BN(tokenBalance.value.amount)\n\n            if (balance.lt(amountIn)) {\n                throw new Error(\n                    `Insufficient token balance. Required: ${amountIn.toString()}, Found: ${balance.toString()}`\n                )\n            }\n        } catch (error) {\n            throw new Error(\n                `Failed to fetch token balance or token account doesn't exist`\n            )\n        }\n    }\n\n    return true\n}\n\n/**\n * Validate that the swap amount is valid\n * @param amountIn - The input amount for the swap\n * @returns true if the amount is valid, throws error if invalid\n */\nexport function validateSwapAmount(amountIn: BN): boolean {\n    if (amountIn.lte(new BN(0))) {\n        throw new Error('Swap amount must be greater than 0')\n    }\n    return true\n}\n","import BN from 'bn.js'\nimport { mulDiv } from './utilsMath'\nimport {\n    BASIS_POINT_MAX,\n    FEE_DENOMINATOR,\n    MAX_FEE_NUMERATOR,\n} from '../constants'\nimport { Rounding } from '../types'\n\n/**\n * Calculate the max index for rate limiter\n * @param cliffFeeNumerator - The cliff fee numerator\n * @param feeIncrementBps - The fee increment bps\n * @returns The max index\n */\nfunction getMaxIndex(cliffFeeNumerator: BN, feeIncrementBps: BN): BN {\n    const deltaNumerator = new BN(MAX_FEE_NUMERATOR).sub(cliffFeeNumerator)\n    const feeIncrementNumerator = mulDiv(\n        new BN(feeIncrementBps),\n        new BN(FEE_DENOMINATOR),\n        new BN(BASIS_POINT_MAX),\n        Rounding.Down\n    )\n    return deltaNumerator.div(feeIncrementNumerator)\n}\n\n/**\n * Calculate the fee numerator on rate limiter\n * @param cliffFeeNumerator - The cliff fee numerator\n * @param referenceAmount - The reference amount\n * @param feeIncrementBps - The fee increment bps\n * @param inputAmount - The input amount\n * @returns The fee numerator\n */\nexport function getFeeNumeratorOnRateLimiter(\n    cliffFeeNumerator: BN,\n    referenceAmount: BN,\n    feeIncrementBps: BN,\n    inputAmount: BN\n): BN {\n    if (inputAmount.lte(referenceAmount)) {\n        return cliffFeeNumerator\n    }\n\n    const c = new BN(cliffFeeNumerator)\n    const diff = inputAmount.sub(referenceAmount)\n    const a = new BN(diff.div(referenceAmount))\n    const b = new BN(diff.mod(referenceAmount))\n    const maxIndex = new BN(getMaxIndex(cliffFeeNumerator, feeIncrementBps))\n    const i = mulDiv(\n        new BN(feeIncrementBps),\n        new BN(FEE_DENOMINATOR),\n        new BN(BASIS_POINT_MAX),\n        Rounding.Down\n    )\n    const x0 = new BN(referenceAmount)\n    const one = new BN(1)\n    const two = new BN(2)\n\n    let tradingFeeNumerator: BN\n    if (a.lt(maxIndex)) {\n        let numerator1 = c.add(c.mul(a)).add(i.mul(a).mul(a.add(one)).div(two))\n        let numerator2 = c.add(i.mul(a.add(one)))\n        let firstFee = x0.mul(numerator1)\n        let secondFee = b.mul(numerator2)\n        tradingFeeNumerator = firstFee.add(secondFee)\n    } else {\n        let numerator1 = c\n            .add(c.mul(maxIndex))\n            .add(i.mul(maxIndex).mul(maxIndex.add(one)).div(two))\n        let numerator2 = new BN(MAX_FEE_NUMERATOR)\n        let firstFee = x0.mul(numerator1)\n        let d = a.sub(maxIndex)\n        let leftAmount = d.mul(x0).add(b)\n        let secondFee = leftAmount.mul(numerator2)\n        tradingFeeNumerator = firstFee.add(secondFee)\n    }\n\n    const denominator = new BN(FEE_DENOMINATOR)\n    const tradingFee = tradingFeeNumerator\n        .add(denominator)\n        .sub(one)\n        .div(denominator)\n\n    // reverse to fee numerator:\n    // input_amount * numerator / FEE_DENOMINATOR = trading_fee\n    // => numerator = trading_fee * FEE_DENOMINATOR / input_amount\n    const feeNumerator = mulDiv(\n        tradingFee,\n        new BN(FEE_DENOMINATOR),\n        inputAmount,\n        Rounding.Up\n    )\n\n    return BN.min(feeNumerator, new BN(MAX_FEE_NUMERATOR))\n}\n","import Decimal from 'decimal.js'\nimport BN from 'bn.js'\nimport {\n    type ConfigParameters,\n    type BuildCurveParam,\n    BuildCurveWithMarketCapParam,\n    BuildCurveWithLiquidityWeightsParam,\n    BuildCurveWithTwoSegmentsParam,\n    BaseFeeMode,\n} from '../types'\nimport { MAX_SQRT_PRICE } from '../constants'\nimport {\n    getSqrtPriceFromPrice,\n    getMigrationBaseToken,\n    getTotalVestingAmount,\n    getFirstCurve,\n    getTotalSupplyFromCurve,\n    getPercentageSupplyOnMigration,\n    getSqrtPriceFromMarketCap,\n    getBaseTokenForSwap,\n    getSwapAmountWithBuffer,\n    getDynamicFeeParams,\n    getTwoCurve,\n    getLockedVestingParams,\n    getMigrationQuoteAmountFromMigrationQuoteThreshold,\n    getMigrationQuoteAmount,\n    getMigrationQuoteThresholdFromMigrationQuoteAmount,\n    getBaseFeeParams,\n    getMigratedPoolFeeParams,\n} from './common'\nimport { getInitialLiquidityFromDeltaBase } from '../math/curve'\nimport { convertDecimalToBN, convertToLamports, fromDecimalToBN } from './utils'\n\n/**\n * Build a custom constant product curve\n * @param buildCurveParam - The parameters for the custom constant product curve\n * @returns The build custom constant product curve\n */\nexport function buildCurve(buildCurveParam: BuildCurveParam): ConfigParameters {\n    let {\n        totalTokenSupply,\n        percentageSupplyOnMigration,\n        migrationQuoteThreshold,\n        migrationOption,\n        tokenBaseDecimal,\n        tokenQuoteDecimal,\n        dynamicFeeEnabled,\n        activationType,\n        collectFeeMode,\n        migrationFeeOption,\n        tokenType,\n        partnerLpPercentage,\n        creatorLpPercentage,\n        partnerLockedLpPercentage,\n        creatorLockedLpPercentage,\n        creatorTradingFeePercentage,\n        leftover,\n        tokenUpdateAuthority,\n        migrationFee,\n        baseFeeParams,\n        migratedPoolFee,\n    } = buildCurveParam\n\n    const baseFee = getBaseFeeParams(\n        baseFeeParams,\n        tokenQuoteDecimal,\n        activationType\n    )\n\n    const {\n        totalLockedVestingAmount,\n        numberOfVestingPeriod,\n        cliffUnlockAmount,\n        totalVestingDuration,\n        cliffDurationFromMigrationTime,\n    } = buildCurveParam.lockedVestingParam\n\n    const lockedVesting = getLockedVestingParams(\n        totalLockedVestingAmount,\n        numberOfVestingPeriod,\n        cliffUnlockAmount,\n        totalVestingDuration,\n        cliffDurationFromMigrationTime,\n        tokenBaseDecimal\n    )\n\n    const migratedPoolFeeParams = getMigratedPoolFeeParams(\n        migrationOption,\n        migrationFeeOption,\n        migratedPoolFee\n    )\n\n    const migrationBaseSupply = new Decimal(totalTokenSupply)\n        .mul(new Decimal(percentageSupplyOnMigration))\n        .div(new Decimal(100))\n\n    const totalSupply = convertToLamports(totalTokenSupply, tokenBaseDecimal)\n\n    const migrationQuoteAmount =\n        getMigrationQuoteAmountFromMigrationQuoteThreshold(\n            new Decimal(migrationQuoteThreshold),\n            migrationFee.feePercentage\n        )\n\n    const migrationPrice = new Decimal(migrationQuoteAmount.toString()).div(\n        new Decimal(migrationBaseSupply.toString())\n    )\n\n    let migrationQuoteThresholdInLamport = convertToLamports(\n        migrationQuoteThreshold,\n        tokenQuoteDecimal\n    )\n\n    const totalLeftover = convertToLamports(leftover, tokenBaseDecimal)\n\n    const migrateSqrtPrice = getSqrtPriceFromPrice(\n        migrationPrice.toString(),\n        tokenBaseDecimal,\n        tokenQuoteDecimal\n    )\n\n    let migrationQuoteAmountInLamport = fromDecimalToBN(\n        migrationQuoteAmount.mul(new Decimal(10 ** tokenQuoteDecimal))\n    )\n\n    const migrationBaseAmount = getMigrationBaseToken(\n        migrationQuoteAmountInLamport,\n        migrateSqrtPrice,\n        migrationOption\n    )\n\n    const totalVestingAmount = getTotalVestingAmount(lockedVesting)\n\n    const swapAmount = totalSupply\n        .sub(migrationBaseAmount)\n        .sub(totalVestingAmount)\n        .sub(totalLeftover)\n\n    const { sqrtStartPrice, curve } = getFirstCurve(\n        migrateSqrtPrice,\n        migrationBaseAmount,\n        swapAmount,\n        migrationQuoteThresholdInLamport,\n        migrationFee.feePercentage\n    )\n\n    const totalDynamicSupply = getTotalSupplyFromCurve(\n        migrationQuoteThresholdInLamport,\n        sqrtStartPrice,\n        curve,\n        lockedVesting,\n        migrationOption,\n        totalLeftover,\n        migrationFee.feePercentage\n    )\n\n    const remainingAmount = totalSupply.sub(totalDynamicSupply)\n\n    const lastLiquidity = getInitialLiquidityFromDeltaBase(\n        remainingAmount,\n        MAX_SQRT_PRICE,\n        migrateSqrtPrice\n    )\n\n    if (!lastLiquidity.isZero()) {\n        curve.push({\n            sqrtPrice: MAX_SQRT_PRICE,\n            liquidity: lastLiquidity,\n        })\n    }\n\n    const instructionParams: ConfigParameters = {\n        poolFees: {\n            baseFee: {\n                ...baseFee,\n            },\n            dynamicFee: dynamicFeeEnabled\n                ? getDynamicFeeParams(\n                      baseFeeParams.baseFeeMode === BaseFeeMode.RateLimiter\n                          ? baseFeeParams.rateLimiterParam.baseFeeBps\n                          : baseFeeParams.feeSchedulerParam.endingFeeBps\n                  )\n                : null,\n        },\n        activationType: activationType,\n        collectFeeMode: collectFeeMode,\n        migrationOption: migrationOption,\n        tokenType: tokenType,\n        tokenDecimal: tokenBaseDecimal,\n        migrationQuoteThreshold: migrationQuoteThresholdInLamport,\n        partnerLpPercentage: partnerLpPercentage,\n        creatorLpPercentage: creatorLpPercentage,\n        partnerLockedLpPercentage: partnerLockedLpPercentage,\n        creatorLockedLpPercentage: creatorLockedLpPercentage,\n        sqrtStartPrice,\n        lockedVesting,\n        migrationFeeOption: migrationFeeOption,\n        tokenSupply: {\n            preMigrationTokenSupply: totalSupply,\n            postMigrationTokenSupply: totalSupply,\n        },\n        creatorTradingFeePercentage,\n        tokenUpdateAuthority,\n        migrationFee,\n        migratedPoolFee: {\n            collectFeeMode: migratedPoolFeeParams.collectFeeMode,\n            dynamicFee: migratedPoolFeeParams.dynamicFee,\n            poolFeeBps: migratedPoolFeeParams.poolFeeBps,\n        },\n        padding: [],\n        curve,\n    }\n    return instructionParams\n}\n\n/**\n * Build a custom constant product curve by market cap\n * @param buildCurveByMarketCapParam - The parameters for the custom constant product curve by market cap\n * @returns The build custom constant product curve by market cap\n */\nexport function buildCurveWithMarketCap(\n    buildCurveWithMarketCapParam: BuildCurveWithMarketCapParam\n): ConfigParameters {\n    const {\n        initialMarketCap,\n        migrationMarketCap,\n        totalTokenSupply,\n        tokenBaseDecimal,\n        migrationFee,\n        leftover,\n    } = buildCurveWithMarketCapParam\n\n    const {\n        totalLockedVestingAmount,\n        numberOfVestingPeriod,\n        cliffUnlockAmount,\n        totalVestingDuration,\n        cliffDurationFromMigrationTime,\n    } = buildCurveWithMarketCapParam.lockedVestingParam\n\n    const lockedVesting = getLockedVestingParams(\n        totalLockedVestingAmount,\n        numberOfVestingPeriod,\n        cliffUnlockAmount,\n        totalVestingDuration,\n        cliffDurationFromMigrationTime,\n        tokenBaseDecimal\n    )\n\n    const totalLeftover = convertToLamports(leftover, tokenBaseDecimal)\n\n    const totalSupply = convertToLamports(totalTokenSupply, tokenBaseDecimal)\n\n    const percentageSupplyOnMigration = getPercentageSupplyOnMigration(\n        new Decimal(initialMarketCap),\n        new Decimal(migrationMarketCap),\n        lockedVesting,\n        totalLeftover,\n        totalSupply\n    )\n\n    const migrationQuoteAmount = getMigrationQuoteAmount(\n        new Decimal(migrationMarketCap),\n        new Decimal(percentageSupplyOnMigration)\n    )\n    const migrationQuoteThreshold =\n        getMigrationQuoteThresholdFromMigrationQuoteAmount(\n            migrationQuoteAmount,\n            new Decimal(migrationFee.feePercentage)\n        ).toNumber()\n\n    return buildCurve({\n        ...buildCurveWithMarketCapParam,\n        percentageSupplyOnMigration,\n        migrationQuoteThreshold,\n    })\n}\n\n/**\n * Build a custom constant product curve by market cap\n * @param buildCurveWithTwoSegmentsParam - The parameters for the custom constant product curve by market cap\n * @returns The build custom constant product curve by market cap\n */\nexport function buildCurveWithTwoSegments(\n    buildCurveWithTwoSegmentsParam: BuildCurveWithTwoSegmentsParam\n): ConfigParameters {\n    const {\n        totalTokenSupply,\n        initialMarketCap,\n        migrationMarketCap,\n        percentageSupplyOnMigration,\n        migrationOption,\n        tokenBaseDecimal,\n        tokenQuoteDecimal,\n        creatorTradingFeePercentage,\n        collectFeeMode,\n        leftover,\n        tokenType,\n        partnerLpPercentage,\n        creatorLpPercentage,\n        partnerLockedLpPercentage,\n        creatorLockedLpPercentage,\n        activationType,\n        dynamicFeeEnabled,\n        migrationFeeOption,\n        migrationFee,\n        tokenUpdateAuthority,\n        baseFeeParams,\n        migratedPoolFee,\n    } = buildCurveWithTwoSegmentsParam\n\n    const baseFee = getBaseFeeParams(\n        baseFeeParams,\n        tokenQuoteDecimal,\n        activationType\n    )\n\n    const {\n        totalLockedVestingAmount,\n        numberOfVestingPeriod,\n        cliffUnlockAmount,\n        totalVestingDuration,\n        cliffDurationFromMigrationTime,\n    } = buildCurveWithTwoSegmentsParam.lockedVestingParam\n\n    const lockedVesting = getLockedVestingParams(\n        totalLockedVestingAmount,\n        numberOfVestingPeriod,\n        cliffUnlockAmount,\n        totalVestingDuration,\n        cliffDurationFromMigrationTime,\n        tokenBaseDecimal\n    )\n\n    const migratedPoolFeeParams = getMigratedPoolFeeParams(\n        migrationOption,\n        migrationFeeOption,\n        migratedPoolFee\n    )\n\n    let migrationBaseSupply = new BN(totalTokenSupply)\n        .mul(new BN(percentageSupplyOnMigration))\n        .div(new BN(100))\n\n    let totalSupply = convertToLamports(totalTokenSupply, tokenBaseDecimal)\n    let migrationQuoteAmount = getMigrationQuoteAmount(\n        new Decimal(migrationMarketCap),\n        new Decimal(percentageSupplyOnMigration)\n    )\n    let migrationQuoteThreshold =\n        getMigrationQuoteThresholdFromMigrationQuoteAmount(\n            migrationQuoteAmount,\n            new Decimal(migrationFee.feePercentage)\n        )\n\n    let migrationPrice = migrationQuoteAmount.div(\n        new Decimal(migrationBaseSupply.toString())\n    )\n\n    let migrationQuoteThresholdInLamport = fromDecimalToBN(\n        migrationQuoteThreshold.mul(new Decimal(10 ** tokenQuoteDecimal))\n    )\n\n    let migrationQuoteAmountInLamport = fromDecimalToBN(\n        migrationQuoteAmount.mul(new Decimal(10 ** tokenQuoteDecimal))\n    )\n\n    let migrateSqrtPrice = getSqrtPriceFromPrice(\n        migrationPrice.toString(),\n        tokenBaseDecimal,\n        tokenQuoteDecimal\n    )\n\n    let migrationBaseAmount = getMigrationBaseToken(\n        migrationQuoteAmountInLamport,\n        migrateSqrtPrice,\n        migrationOption\n    )\n\n    let totalVestingAmount = getTotalVestingAmount(lockedVesting)\n\n    let totalLeftover = convertToLamports(leftover, tokenBaseDecimal)\n\n    let swapAmount = totalSupply\n        .sub(migrationBaseAmount)\n        .sub(totalVestingAmount)\n        .sub(totalLeftover)\n\n    let initialSqrtPrice = getSqrtPriceFromMarketCap(\n        initialMarketCap,\n        totalTokenSupply,\n        tokenBaseDecimal,\n        tokenQuoteDecimal\n    )\n\n    // instantiate midSqrtPriceDecimal1\n    let midSqrtPriceDecimal1 = new Decimal(migrateSqrtPrice.toString())\n        .mul(new Decimal(initialSqrtPrice.toString()))\n        .sqrt()\n    let midSqrtPrice1 = new BN(midSqrtPriceDecimal1.floor().toFixed())\n\n    // mid_price2 = (p1 * p2^3)^(1/4)\n    let numerator1 = new Decimal(initialSqrtPrice.toString())\n    let numerator2 = Decimal.pow(migrateSqrtPrice.toString(), 3)\n    let product1 = numerator1.mul(numerator2)\n    let midSqrtPriceDecimal2 = Decimal.pow(product1, 0.25)\n    let midSqrtPrice2 = new BN(midSqrtPriceDecimal2.floor().toFixed())\n\n    // mid_price3 = (p1^3 * p2)^(1/4)\n    let numerator3 = Decimal.pow(initialSqrtPrice.toString(), 3)\n    let numerator4 = new Decimal(migrateSqrtPrice.toString())\n    let product2 = numerator3.mul(numerator4)\n    let midSqrtPriceDecimal3 = Decimal.pow(product2, 0.25)\n    let midSqrtPrice3 = new BN(midSqrtPriceDecimal3.floor().toFixed())\n\n    let midPrices = [midSqrtPrice1, midSqrtPrice2, midSqrtPrice3]\n    let sqrtStartPrice = new BN(0)\n    let curve: { sqrtPrice: BN; liquidity: BN }[] = []\n\n    for (let i = 0; i < midPrices.length; i++) {\n        const result = getTwoCurve(\n            migrateSqrtPrice,\n            midPrices[i],\n            initialSqrtPrice,\n            swapAmount,\n            migrationQuoteThresholdInLamport\n        )\n        if (result.isOk) {\n            curve = result.curve\n            sqrtStartPrice = result.sqrtStartPrice\n            break\n        }\n    }\n\n    let totalDynamicSupply = getTotalSupplyFromCurve(\n        migrationQuoteThresholdInLamport,\n        sqrtStartPrice,\n        curve,\n        lockedVesting,\n        migrationOption,\n        totalLeftover,\n        migrationFee.feePercentage\n    )\n\n    if (totalDynamicSupply.gt(totalSupply)) {\n        // precision loss is used for leftover\n        let leftOverDelta = totalDynamicSupply.sub(totalSupply)\n        if (!leftOverDelta.lt(totalLeftover)) {\n            throw new Error('leftOverDelta must be less than totalLeftover')\n        }\n    }\n\n    const instructionParams: ConfigParameters = {\n        poolFees: {\n            baseFee: {\n                ...baseFee,\n            },\n            dynamicFee: dynamicFeeEnabled\n                ? getDynamicFeeParams(\n                      baseFeeParams.baseFeeMode === BaseFeeMode.RateLimiter\n                          ? baseFeeParams.rateLimiterParam.baseFeeBps\n                          : baseFeeParams.feeSchedulerParam.endingFeeBps\n                  )\n                : null,\n        },\n        activationType,\n        collectFeeMode,\n        migrationOption,\n        tokenType,\n        tokenDecimal: tokenBaseDecimal,\n        migrationQuoteThreshold: migrationQuoteThresholdInLamport,\n        partnerLpPercentage,\n        creatorLpPercentage,\n        partnerLockedLpPercentage,\n        creatorLockedLpPercentage,\n        sqrtStartPrice,\n        lockedVesting,\n        migrationFeeOption,\n        tokenSupply: {\n            preMigrationTokenSupply: totalSupply,\n            postMigrationTokenSupply: totalSupply,\n        },\n        creatorTradingFeePercentage,\n        migratedPoolFee: {\n            collectFeeMode: migratedPoolFeeParams.collectFeeMode,\n            dynamicFee: migratedPoolFeeParams.dynamicFee,\n            poolFeeBps: migratedPoolFeeParams.poolFeeBps,\n        },\n        padding: [],\n        curve,\n        tokenUpdateAuthority,\n        migrationFee,\n    }\n    return instructionParams\n}\n\n/**\n * Build a custom curve graph with liquidity weights, changing the curve shape based on the liquidity weights\n * @param buildCurveWithLiquidityWeightsParam - The parameters for the custom constant product curve with liquidity weights\n * @returns The build custom constant product curve with liquidity weights\n */\nexport function buildCurveWithLiquidityWeights(\n    buildCurveWithLiquidityWeightsParam: BuildCurveWithLiquidityWeightsParam\n): ConfigParameters {\n    let {\n        totalTokenSupply,\n        migrationOption,\n        tokenBaseDecimal,\n        tokenQuoteDecimal,\n        dynamicFeeEnabled,\n        activationType,\n        collectFeeMode,\n        migrationFeeOption,\n        tokenType,\n        partnerLpPercentage,\n        creatorLpPercentage,\n        partnerLockedLpPercentage,\n        creatorLockedLpPercentage,\n        creatorTradingFeePercentage,\n        leftover,\n        initialMarketCap,\n        migrationMarketCap,\n        liquidityWeights,\n        migrationFee,\n        tokenUpdateAuthority,\n        baseFeeParams,\n        migratedPoolFee,\n    } = buildCurveWithLiquidityWeightsParam\n\n    const baseFee = getBaseFeeParams(\n        baseFeeParams,\n        tokenQuoteDecimal,\n        activationType\n    )\n\n    const {\n        totalLockedVestingAmount,\n        numberOfVestingPeriod,\n        cliffUnlockAmount,\n        totalVestingDuration,\n        cliffDurationFromMigrationTime,\n    } = buildCurveWithLiquidityWeightsParam.lockedVestingParam\n\n    const lockedVesting = getLockedVestingParams(\n        totalLockedVestingAmount,\n        numberOfVestingPeriod,\n        cliffUnlockAmount,\n        totalVestingDuration,\n        cliffDurationFromMigrationTime,\n        tokenBaseDecimal\n    )\n\n    const migratedPoolFeeParams = getMigratedPoolFeeParams(\n        migrationOption,\n        migrationFeeOption,\n        migratedPoolFee\n    )\n\n    // 1. finding Pmax and Pmin\n    let pMin = getSqrtPriceFromMarketCap(\n        initialMarketCap,\n        totalTokenSupply,\n        tokenBaseDecimal,\n        tokenQuoteDecimal\n    )\n    let pMax = getSqrtPriceFromMarketCap(\n        migrationMarketCap,\n        totalTokenSupply,\n        tokenBaseDecimal,\n        tokenQuoteDecimal\n    )\n\n    // find q^16 = pMax / pMin\n    let priceRatio = new Decimal(pMax.toString()).div(\n        new Decimal(pMin.toString())\n    )\n    let qDecimal = priceRatio.pow(new Decimal(1).div(new Decimal(16)))\n\n    // finding all prices\n    let sqrtPrices = []\n    let currentPrice = pMin\n    for (let i = 0; i < 17; i++) {\n        sqrtPrices.push(currentPrice)\n        currentPrice = convertDecimalToBN(\n            qDecimal.mul(new Decimal(currentPrice.toString()))\n        )\n    }\n\n    let totalSupply = convertToLamports(totalTokenSupply, tokenBaseDecimal)\n    let totalLeftover = convertToLamports(leftover, tokenBaseDecimal)\n    let totalVestingAmount = getTotalVestingAmount(lockedVesting)\n\n    let totalSwapAndMigrationAmount = totalSupply\n        .sub(totalVestingAmount)\n        .sub(totalLeftover)\n\n    // Swap_Amount = sum(li * (1/p(i-1) - 1/pi))\n    // Quote_Amount = sum(li * (pi-p(i-1)))\n    // Quote_Amount * (1-migrationFee/100) / Base_Amount = Pmax ^ 2\n\n    // -> Base_Amount = Quote_Amount * (1-migrationFee) / Pmax ^ 2\n    // -> Swap_Amount + Base_Amount = sum(li * (1/p(i-1) - 1/pi)) + sum(li * (pi-p(i-1))) * (1-migrationFee/100) / Pmax ^ 2\n    // l0 * sum_factor = Swap_Amount + Base_Amount\n    // => l0 * sum_factor = sum(li * (1/p(i-1) - 1/pi)) + sum(li * (pi-p(i-1))) * (1-migrationFee/100) / Pmax ^ 2\n    // => l0 = (Swap_Amount + Base_Amount ) / sum_factor\n    let sumFactor = new Decimal(0)\n    let pmaxWeight = new Decimal(pMax.toString())\n    let migrationFeeFactor = new Decimal(100)\n        .sub(new Decimal(migrationFee.feePercentage))\n        .div(new Decimal(100))\n    for (let i = 1; i < 17; i++) {\n        let pi = new Decimal(sqrtPrices[i].toString())\n        let piMinus = new Decimal(sqrtPrices[i - 1].toString())\n        let k = new Decimal(liquidityWeights[i - 1])\n        let w1 = pi.sub(piMinus).div(pi.mul(piMinus))\n        let w2 = pi\n            .sub(piMinus)\n            .mul(migrationFeeFactor)\n            .div(pmaxWeight.mul(pmaxWeight))\n        let weight = k.mul(w1.add(w2))\n        sumFactor = sumFactor.add(weight)\n    }\n    let l1 = new Decimal(totalSwapAndMigrationAmount.toString()).div(sumFactor)\n\n    // construct curve\n    let curve = []\n    for (let i = 0; i < 16; i++) {\n        let k = new Decimal(liquidityWeights[i])\n        let liquidity = convertDecimalToBN(l1.mul(k))\n        let sqrtPrice = i < 15 ? sqrtPrices[i + 1] : pMax\n        curve.push({\n            sqrtPrice,\n            liquidity,\n        })\n    }\n    // reverse to calculate swap amount and migration amount\n    let swapBaseAmount = getBaseTokenForSwap(pMin, pMax, curve)\n    let swapBaseAmountBuffer = getSwapAmountWithBuffer(\n        swapBaseAmount,\n        pMin,\n        curve\n    )\n\n    let migrationAmount = totalSwapAndMigrationAmount.sub(swapBaseAmountBuffer)\n\n    let migrationQuoteAmount = migrationAmount.mul(pMax).mul(pMax).shrn(128)\n    let migrationQuoteThreshold =\n        getMigrationQuoteThresholdFromMigrationQuoteAmount(\n            new Decimal(migrationQuoteAmount.toString()),\n            new Decimal(migrationFee.feePercentage)\n        )\n    let migrationQuoteThresholdInLamport = fromDecimalToBN(\n        migrationQuoteThreshold\n    )\n\n    // sanity check\n    let totalDynamicSupply = getTotalSupplyFromCurve(\n        migrationQuoteThresholdInLamport,\n        pMin,\n        curve,\n        lockedVesting,\n        migrationOption,\n        totalLeftover,\n        migrationFee.feePercentage\n    )\n\n    if (totalDynamicSupply.gt(totalSupply)) {\n        // precision loss is used for leftover\n        let leftOverDelta = totalDynamicSupply.sub(totalSupply)\n        if (!leftOverDelta.lt(totalLeftover)) {\n            throw new Error('leftOverDelta must be less than totalLeftover')\n        }\n    }\n\n    const instructionParams: ConfigParameters = {\n        poolFees: {\n            baseFee: {\n                ...baseFee,\n            },\n            dynamicFee: dynamicFeeEnabled\n                ? getDynamicFeeParams(\n                      baseFeeParams.baseFeeMode === BaseFeeMode.RateLimiter\n                          ? baseFeeParams.rateLimiterParam.baseFeeBps\n                          : baseFeeParams.feeSchedulerParam.endingFeeBps\n                  )\n                : null,\n        },\n        activationType: activationType,\n        collectFeeMode: collectFeeMode,\n        migrationOption: migrationOption,\n        tokenType: tokenType,\n        tokenDecimal: tokenBaseDecimal,\n        migrationQuoteThreshold: migrationQuoteThresholdInLamport,\n        partnerLpPercentage: partnerLpPercentage,\n        creatorLpPercentage: creatorLpPercentage,\n        partnerLockedLpPercentage: partnerLockedLpPercentage,\n        creatorLockedLpPercentage: creatorLockedLpPercentage,\n        sqrtStartPrice: pMin,\n        lockedVesting,\n        migrationFeeOption: migrationFeeOption,\n        tokenSupply: {\n            preMigrationTokenSupply: totalSupply,\n            postMigrationTokenSupply: totalSupply,\n        },\n        creatorTradingFeePercentage,\n        migratedPoolFee: {\n            collectFeeMode: migratedPoolFeeParams.collectFeeMode,\n            dynamicFee: migratedPoolFeeParams.dynamicFee,\n            poolFeeBps: migratedPoolFeeParams.poolFeeBps,\n        },\n        padding: [],\n        curve,\n        migrationFee,\n        tokenUpdateAuthority,\n    }\n    return instructionParams\n}\n","import { AnchorProvider, Program, Wallet } from '@coral-xyz/anchor'\nimport { Commitment, type Connection } from '@solana/web3.js'\nimport DynamicBondingCurveIDL from '../idl/dynamic-bonding-curve/idl.json'\nimport type { DynamicVault } from '../idl/dynamic-vault/idl'\nimport DynamicVaultIDL from '../idl/dynamic-vault/idl.json'\nimport type { DammV1 } from '../idl/damm-v1/idl'\nimport DammV1IDL from '../idl/damm-v1/idl.json'\nimport type { DynamicBondingCurve } from '../idl/dynamic-bonding-curve/idl'\nimport { DammV2 } from '../idl/damm-v2/idl'\nimport DammV2IDL from '../idl/damm-v2/idl.json'\n\n/**\n * Create a DBC program instance\n * @param connection - The connection to the network\n * @returns The program instance\n */\nexport function createDbcProgram(\n    connection: Connection,\n    commitment: Commitment = 'confirmed'\n) {\n    const provider = new AnchorProvider(connection, null as unknown as Wallet, {\n        commitment,\n    })\n    const program = new Program<DynamicBondingCurve>(\n        DynamicBondingCurveIDL,\n        provider\n    )\n\n    return { program }\n}\n\n/**\n * Create a vault program instance\n * @param connection - The connection to the network\n * @returns The vault program instance\n */\nexport function createVaultProgram(\n    connection: Connection,\n    commitment: Commitment = 'confirmed'\n): Program<DynamicVault> {\n    const provider = new AnchorProvider(connection, null as unknown as Wallet, {\n        commitment,\n    })\n\n    const program = new Program<DynamicVault>(DynamicVaultIDL, provider)\n    return program\n}\n\n/**\n * Create a DAMM V1 program instance\n * @param connection - The connection to the network\n * @returns The DAMM V1 program instance\n */\nexport function createDammV1Program(\n    connection: Connection,\n    commitment: Commitment = 'confirmed'\n): Program<DammV1> {\n    const provider = new AnchorProvider(connection, null as unknown as Wallet, {\n        commitment,\n    })\n\n    const program = new Program<DammV1>(DammV1IDL, provider)\n    return program\n}\n\n/**\n * Create a DAMM V2 program instance\n * @param connection - The connection to the network\n * @param commitment - The commitment level\n * @returns The DAMM V2 program instance\n */\nexport function createDammV2Program(\n    connection: Connection,\n    commitment: Commitment = 'confirmed'\n): Program<DammV2> {\n    const provider = new AnchorProvider(connection, null as unknown as Wallet, {\n        commitment,\n    })\n\n    const program = new Program<DammV2>(DammV2IDL, provider)\n    return program\n}\n","{\n  \"address\": \"dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN\",\n  \"metadata\": {\n    \"name\": \"dynamic_bonding_curve\",\n    \"version\": \"0.1.5\",\n    \"spec\": \"0.1.0\",\n    \"description\": \"Created with Anchor\"\n  },\n  \"instructions\": [\n    {\n      \"name\": \"claim_creator_trading_fee\",\n      \"discriminator\": [\n        82,\n        220,\n        250,\n        189,\n        3,\n        85,\n        107,\n        45\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_a_account\",\n          \"docs\": [\n            \"The treasury token a account\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_b_account\",\n          \"docs\": [\n            \"The treasury token b account\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"base_vault\",\n          \"docs\": [\n            \"The vault token account for input token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"The vault token account for output token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"base_mint\",\n          \"docs\": [\n            \"The mint of token a\"\n          ],\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"docs\": [\n            \"The mint of token b\"\n          ]\n        },\n        {\n          \"name\": \"creator\",\n          \"signer\": true,\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"token_base_program\",\n          \"docs\": [\n            \"Token a program\"\n          ]\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Token b program\"\n          ]\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"max_base_amount\",\n          \"type\": \"u64\"\n        },\n        {\n          \"name\": \"max_quote_amount\",\n          \"type\": \"u64\"\n        }\n      ]\n    },\n    {\n      \"name\": \"claim_protocol_fee\",\n      \"discriminator\": [\n        165,\n        228,\n        133,\n        48,\n        99,\n        249,\n        255,\n        33\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"base_vault\",\n          \"docs\": [\n            \"The vault token account for input token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"The vault token account for output token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"base_mint\",\n          \"docs\": [\n            \"The mint of token a\"\n          ],\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"docs\": [\n            \"The mint of token b\"\n          ],\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"token_base_account\",\n          \"docs\": [\n            \"The treasury token a account\"\n          ],\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  48,\n                  9,\n                  89,\n                  123,\n                  106,\n                  114,\n                  131,\n                  251,\n                  50,\n                  173,\n                  254,\n                  250,\n                  10,\n                  80,\n                  160,\n                  84,\n                  143,\n                  100,\n                  81,\n                  249,\n                  134,\n                  112,\n                  30,\n                  213,\n                  50,\n                  166,\n                  239,\n                  78,\n                  53,\n                  175,\n                  188,\n                  85\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"token_base_program\"\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"base_mint\"\n              }\n            ],\n            \"program\": {\n              \"kind\": \"const\",\n              \"value\": [\n                140,\n                151,\n                37,\n                143,\n                78,\n                36,\n                137,\n                241,\n                187,\n                61,\n                16,\n                41,\n                20,\n                142,\n                13,\n                131,\n                11,\n                90,\n                19,\n                153,\n                218,\n                255,\n                16,\n                132,\n                4,\n                142,\n                123,\n                216,\n                219,\n                233,\n                248,\n                89\n              ]\n            }\n          }\n        },\n        {\n          \"name\": \"token_quote_account\",\n          \"docs\": [\n            \"The treasury token b account\"\n          ],\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  48,\n                  9,\n                  89,\n                  123,\n                  106,\n                  114,\n                  131,\n                  251,\n                  50,\n                  173,\n                  254,\n                  250,\n                  10,\n                  80,\n                  160,\n                  84,\n                  143,\n                  100,\n                  81,\n                  249,\n                  134,\n                  112,\n                  30,\n                  213,\n                  50,\n                  166,\n                  239,\n                  78,\n                  53,\n                  175,\n                  188,\n                  85\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"token_quote_program\"\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"quote_mint\"\n              }\n            ],\n            \"program\": {\n              \"kind\": \"const\",\n              \"value\": [\n                140,\n                151,\n                37,\n                143,\n                78,\n                36,\n                137,\n                241,\n                187,\n                61,\n                16,\n                41,\n                20,\n                142,\n                13,\n                131,\n                11,\n                90,\n                19,\n                153,\n                218,\n                255,\n                16,\n                132,\n                4,\n                142,\n                123,\n                216,\n                219,\n                233,\n                248,\n                89\n              ]\n            }\n          }\n        },\n        {\n          \"name\": \"claim_fee_operator\",\n          \"docs\": [\n            \"Claim fee operator\"\n          ]\n        },\n        {\n          \"name\": \"operator\",\n          \"docs\": [\n            \"Operator\"\n          ],\n          \"signer\": true,\n          \"relations\": [\n            \"claim_fee_operator\"\n          ]\n        },\n        {\n          \"name\": \"token_base_program\",\n          \"docs\": [\n            \"Token a program\"\n          ]\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Token b program\"\n          ]\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"claim_trading_fee\",\n      \"discriminator\": [\n        8,\n        236,\n        89,\n        49,\n        152,\n        125,\n        177,\n        81\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_a_account\",\n          \"docs\": [\n            \"The treasury token a account\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_b_account\",\n          \"docs\": [\n            \"The treasury token b account\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"base_vault\",\n          \"docs\": [\n            \"The vault token account for input token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"The vault token account for output token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"base_mint\",\n          \"docs\": [\n            \"The mint of token a\"\n          ],\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"docs\": [\n            \"The mint of token b\"\n          ],\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"fee_claimer\",\n          \"signer\": true,\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"token_base_program\",\n          \"docs\": [\n            \"Token a program\"\n          ]\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Token b program\"\n          ]\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"max_amount_a\",\n          \"type\": \"u64\"\n        },\n        {\n          \"name\": \"max_amount_b\",\n          \"type\": \"u64\"\n        }\n      ]\n    },\n    {\n      \"name\": \"close_claim_fee_operator\",\n      \"discriminator\": [\n        38,\n        134,\n        82,\n        216,\n        95,\n        124,\n        17,\n        99\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"claim_fee_operator\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"rent_receiver\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"admin\",\n          \"signer\": true\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"create_claim_fee_operator\",\n      \"docs\": [\n        \"ADMIN FUNCTIONS ///\"\n      ],\n      \"discriminator\": [\n        169,\n        62,\n        207,\n        107,\n        58,\n        187,\n        162,\n        109\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"claim_fee_operator\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  99,\n                  102,\n                  95,\n                  111,\n                  112,\n                  101,\n                  114,\n                  97,\n                  116,\n                  111,\n                  114\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"operator\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"operator\"\n        },\n        {\n          \"name\": \"admin\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"create_config\",\n      \"discriminator\": [\n        201,\n        207,\n        243,\n        114,\n        75,\n        111,\n        47,\n        189\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"config\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"fee_claimer\"\n        },\n        {\n          \"name\": \"leftover_receiver\"\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"docs\": [\n            \"quote mint\"\n          ]\n        },\n        {\n          \"name\": \"payer\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"config_parameters\",\n          \"type\": {\n            \"defined\": {\n              \"name\": \"ConfigParameters\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"create_locker\",\n      \"docs\": [\n        \"PERMISSIONLESS FUNCTIONS ///\",\n        \"create locker\"\n      ],\n      \"discriminator\": [\n        167,\n        90,\n        137,\n        154,\n        75,\n        47,\n        17,\n        84\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"virtual_pool\",\n          \"docs\": [\n            \"Virtual pool\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"config\",\n          \"docs\": [\n            \"Config\"\n          ],\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"pool_authority\",\n          \"writable\": true,\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"base_vault\",\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"base_mint\",\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"base\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  98,\n                  97,\n                  115,\n                  101,\n                  95,\n                  108,\n                  111,\n                  99,\n                  107,\n                  101,\n                  114\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"virtual_pool\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"creator\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"escrow\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"escrow_token\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"payer\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"token_program\"\n        },\n        {\n          \"name\": \"locker_program\",\n          \"address\": \"LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn\"\n        },\n        {\n          \"name\": \"locker_event_authority\"\n        },\n        {\n          \"name\": \"system_program\",\n          \"docs\": [\n            \"System program.\"\n          ],\n          \"address\": \"11111111111111111111111111111111\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"create_partner_metadata\",\n      \"docs\": [\n        \"PARTNER FUNCTIONS ////\"\n      ],\n      \"discriminator\": [\n        192,\n        168,\n        234,\n        191,\n        188,\n        226,\n        227,\n        255\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"partner_metadata\",\n          \"docs\": [\n            \"Partner metadata\"\n          ],\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  112,\n                  97,\n                  114,\n                  116,\n                  110,\n                  101,\n                  114,\n                  95,\n                  109,\n                  101,\n                  116,\n                  97,\n                  100,\n                  97,\n                  116,\n                  97\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"fee_claimer\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"payer\",\n          \"docs\": [\n            \"Payer of the partner metadata.\"\n          ],\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"fee_claimer\",\n          \"docs\": [\n            \"Fee claimer for partner\"\n          ],\n          \"signer\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"docs\": [\n            \"System program.\"\n          ],\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"metadata\",\n          \"type\": {\n            \"defined\": {\n              \"name\": \"CreatePartnerMetadataParameters\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"create_virtual_pool_metadata\",\n      \"discriminator\": [\n        45,\n        97,\n        187,\n        103,\n        254,\n        109,\n        124,\n        134\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"virtual_pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"virtual_pool_metadata\",\n          \"docs\": [\n            \"Virtual pool metadata\"\n          ],\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  118,\n                  105,\n                  114,\n                  116,\n                  117,\n                  97,\n                  108,\n                  95,\n                  112,\n                  111,\n                  111,\n                  108,\n                  95,\n                  109,\n                  101,\n                  116,\n                  97,\n                  100,\n                  97,\n                  116,\n                  97\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"virtual_pool\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"creator\",\n          \"signer\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"payer\",\n          \"docs\": [\n            \"Payer of the virtual pool metadata.\"\n          ],\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"docs\": [\n            \"System program.\"\n          ],\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"metadata\",\n          \"type\": {\n            \"defined\": {\n              \"name\": \"CreateVirtualPoolMetadataParameters\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"creator_withdraw_surplus\",\n      \"discriminator\": [\n        165,\n        3,\n        137,\n        7,\n        28,\n        134,\n        76,\n        80\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"virtual_pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_quote_account\",\n          \"docs\": [\n            \"The receiver token account\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"The vault token account for output token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"docs\": [\n            \"The mint of quote token\"\n          ],\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"creator\",\n          \"signer\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Token b program\"\n          ]\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"initialize_virtual_pool_with_spl_token\",\n      \"docs\": [\n        \"POOL CREATOR FUNCTIONS ////\"\n      ],\n      \"discriminator\": [\n        140,\n        85,\n        215,\n        176,\n        102,\n        54,\n        104,\n        79\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"config\",\n          \"docs\": [\n            \"Which config the pool belongs to.\"\n          ]\n        },\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"creator\",\n          \"signer\": true\n        },\n        {\n          \"name\": \"base_mint\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"pool\",\n          \"docs\": [\n            \"Initialize an account to store the pool state\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"base_vault\",\n          \"docs\": [\n            \"Token a vault for the pool\"\n          ],\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  116,\n                  111,\n                  107,\n                  101,\n                  110,\n                  95,\n                  118,\n                  97,\n                  117,\n                  108,\n                  116\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"base_mint\"\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"pool\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"Token b vault for the pool\"\n          ],\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  116,\n                  111,\n                  107,\n                  101,\n                  110,\n                  95,\n                  118,\n                  97,\n                  117,\n                  108,\n                  116\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"quote_mint\"\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"pool\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"mint_metadata\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"metadata_program\",\n          \"address\": \"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\"\n        },\n        {\n          \"name\": \"payer\",\n          \"docs\": [\n            \"Address paying to create the pool. Can be anyone\"\n          ],\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Program to create mint account and mint tokens\"\n          ]\n        },\n        {\n          \"name\": \"token_program\",\n          \"address\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"params\",\n          \"type\": {\n            \"defined\": {\n              \"name\": \"InitializePoolParameters\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"initialize_virtual_pool_with_token2022\",\n      \"discriminator\": [\n        169,\n        118,\n        51,\n        78,\n        145,\n        110,\n        220,\n        155\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"config\",\n          \"docs\": [\n            \"Which config the pool belongs to.\"\n          ]\n        },\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"creator\",\n          \"signer\": true\n        },\n        {\n          \"name\": \"base_mint\",\n          \"docs\": [\n            \"Unique token mint address, initialize in contract\"\n          ],\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"pool\",\n          \"docs\": [\n            \"Initialize an account to store the pool state\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"base_vault\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  116,\n                  111,\n                  107,\n                  101,\n                  110,\n                  95,\n                  118,\n                  97,\n                  117,\n                  108,\n                  116\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"base_mint\"\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"pool\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"Token quote vault for the pool\"\n          ],\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  116,\n                  111,\n                  107,\n                  101,\n                  110,\n                  95,\n                  118,\n                  97,\n                  117,\n                  108,\n                  116\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"quote_mint\"\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"pool\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"payer\",\n          \"docs\": [\n            \"Address paying to create the pool. Can be anyone\"\n          ],\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Program to create mint account and mint tokens\"\n          ]\n        },\n        {\n          \"name\": \"token_program\",\n          \"docs\": [\n            \"token program for base mint\"\n          ],\n          \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"params\",\n          \"type\": {\n            \"defined\": {\n              \"name\": \"InitializePoolParameters\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"migrate_meteora_damm\",\n      \"discriminator\": [\n        27,\n        1,\n        48,\n        22,\n        180,\n        63,\n        118,\n        217\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"virtual_pool\",\n          \"docs\": [\n            \"virtual pool\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"migration_metadata\"\n          ]\n        },\n        {\n          \"name\": \"migration_metadata\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"pool_authority\",\n          \"writable\": true,\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"damm_config\",\n          \"docs\": [\n            \"pool config\"\n          ]\n        },\n        {\n          \"name\": \"lp_mint\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_a_mint\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_b_mint\"\n        },\n        {\n          \"name\": \"a_vault\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"b_vault\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"a_token_vault\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"b_token_vault\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"a_vault_lp_mint\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"b_vault_lp_mint\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"a_vault_lp\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"b_vault_lp\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"base_vault\",\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"virtual_pool_lp\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"protocol_token_a_fee\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"protocol_token_b_fee\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"payer\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"rent\"\n        },\n        {\n          \"name\": \"mint_metadata\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"metadata_program\"\n        },\n        {\n          \"name\": \"amm_program\",\n          \"address\": \"Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB\"\n        },\n        {\n          \"name\": \"vault_program\"\n        },\n        {\n          \"name\": \"token_program\",\n          \"docs\": [\n            \"token_program\"\n          ],\n          \"address\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n        },\n        {\n          \"name\": \"associated_token_program\"\n        },\n        {\n          \"name\": \"system_program\",\n          \"docs\": [\n            \"System program.\"\n          ],\n          \"address\": \"11111111111111111111111111111111\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"migrate_meteora_damm_claim_lp_token\",\n      \"discriminator\": [\n        139,\n        133,\n        2,\n        30,\n        91,\n        145,\n        127,\n        154\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"virtual_pool\",\n          \"relations\": [\n            \"migration_metadata\"\n          ]\n        },\n        {\n          \"name\": \"migration_metadata\",\n          \"docs\": [\n            \"migration metadata\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"pool_authority\",\n          \"writable\": true,\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"lp_mint\",\n          \"relations\": [\n            \"migration_metadata\"\n          ]\n        },\n        {\n          \"name\": \"source_token\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"account\",\n                \"path\": \"pool_authority\"\n              },\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  6,\n                  221,\n                  246,\n                  225,\n                  215,\n                  101,\n                  161,\n                  147,\n                  217,\n                  203,\n                  225,\n                  70,\n                  206,\n                  235,\n                  121,\n                  172,\n                  28,\n                  180,\n                  133,\n                  237,\n                  95,\n                  91,\n                  55,\n                  145,\n                  58,\n                  140,\n                  245,\n                  133,\n                  126,\n                  255,\n                  0,\n                  169\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"migration_metadata\"\n              }\n            ],\n            \"program\": {\n              \"kind\": \"const\",\n              \"value\": [\n                140,\n                151,\n                37,\n                143,\n                78,\n                36,\n                137,\n                241,\n                187,\n                61,\n                16,\n                41,\n                20,\n                142,\n                13,\n                131,\n                11,\n                90,\n                19,\n                153,\n                218,\n                255,\n                16,\n                132,\n                4,\n                142,\n                123,\n                216,\n                219,\n                233,\n                248,\n                89\n              ]\n            }\n          }\n        },\n        {\n          \"name\": \"destination_token\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"account\",\n                \"path\": \"owner\"\n              },\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  6,\n                  221,\n                  246,\n                  225,\n                  215,\n                  101,\n                  161,\n                  147,\n                  217,\n                  203,\n                  225,\n                  70,\n                  206,\n                  235,\n                  121,\n                  172,\n                  28,\n                  180,\n                  133,\n                  237,\n                  95,\n                  91,\n                  55,\n                  145,\n                  58,\n                  140,\n                  245,\n                  133,\n                  126,\n                  255,\n                  0,\n                  169\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"migration_metadata\"\n              }\n            ],\n            \"program\": {\n              \"kind\": \"const\",\n              \"value\": [\n                140,\n                151,\n                37,\n                143,\n                78,\n                36,\n                137,\n                241,\n                187,\n                61,\n                16,\n                41,\n                20,\n                142,\n                13,\n                131,\n                11,\n                90,\n                19,\n                153,\n                218,\n                255,\n                16,\n                132,\n                4,\n                142,\n                123,\n                216,\n                219,\n                233,\n                248,\n                89\n              ]\n            }\n          }\n        },\n        {\n          \"name\": \"owner\"\n        },\n        {\n          \"name\": \"sender\",\n          \"signer\": true\n        },\n        {\n          \"name\": \"token_program\",\n          \"docs\": [\n            \"token_program\"\n          ],\n          \"address\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"migrate_meteora_damm_lock_lp_token\",\n      \"discriminator\": [\n        177,\n        55,\n        238,\n        157,\n        251,\n        88,\n        165,\n        42\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"virtual_pool\",\n          \"relations\": [\n            \"migration_metadata\"\n          ]\n        },\n        {\n          \"name\": \"migration_metadata\",\n          \"docs\": [\n            \"migration_metadata\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"pool_authority\",\n          \"writable\": true,\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"pool\",\n          \"writable\": true,\n          \"relations\": [\n            \"lock_escrow\"\n          ]\n        },\n        {\n          \"name\": \"lp_mint\",\n          \"relations\": [\n            \"migration_metadata\"\n          ]\n        },\n        {\n          \"name\": \"lock_escrow\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"owner\",\n          \"relations\": [\n            \"lock_escrow\"\n          ]\n        },\n        {\n          \"name\": \"source_tokens\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"account\",\n                \"path\": \"pool_authority\"\n              },\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  6,\n                  221,\n                  246,\n                  225,\n                  215,\n                  101,\n                  161,\n                  147,\n                  217,\n                  203,\n                  225,\n                  70,\n                  206,\n                  235,\n                  121,\n                  172,\n                  28,\n                  180,\n                  133,\n                  237,\n                  95,\n                  91,\n                  55,\n                  145,\n                  58,\n                  140,\n                  245,\n                  133,\n                  126,\n                  255,\n                  0,\n                  169\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"migration_metadata\"\n              }\n            ],\n            \"program\": {\n              \"kind\": \"const\",\n              \"value\": [\n                140,\n                151,\n                37,\n                143,\n                78,\n                36,\n                137,\n                241,\n                187,\n                61,\n                16,\n                41,\n                20,\n                142,\n                13,\n                131,\n                11,\n                90,\n                19,\n                153,\n                218,\n                255,\n                16,\n                132,\n                4,\n                142,\n                123,\n                216,\n                219,\n                233,\n                248,\n                89\n              ]\n            }\n          }\n        },\n        {\n          \"name\": \"escrow_vault\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"amm_program\",\n          \"address\": \"Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB\"\n        },\n        {\n          \"name\": \"a_vault\"\n        },\n        {\n          \"name\": \"b_vault\"\n        },\n        {\n          \"name\": \"a_vault_lp\"\n        },\n        {\n          \"name\": \"b_vault_lp\"\n        },\n        {\n          \"name\": \"a_vault_lp_mint\"\n        },\n        {\n          \"name\": \"b_vault_lp_mint\"\n        },\n        {\n          \"name\": \"token_program\",\n          \"docs\": [\n            \"token_program\"\n          ],\n          \"address\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"migration_damm_v2\",\n      \"discriminator\": [\n        156,\n        169,\n        230,\n        103,\n        53,\n        228,\n        80,\n        64\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"virtual_pool\",\n          \"docs\": [\n            \"virtual pool\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"migration_metadata\"\n          ]\n        },\n        {\n          \"name\": \"migration_metadata\",\n          \"docs\": [\n            \"migration metadata\"\n          ]\n        },\n        {\n          \"name\": \"config\",\n          \"docs\": [\n            \"virtual pool config key\"\n          ],\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"pool_authority\",\n          \"writable\": true,\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"first_position_nft_mint\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"first_position_nft_account\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"first_position\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"second_position_nft_mint\",\n          \"writable\": true,\n          \"signer\": true,\n          \"optional\": true\n        },\n        {\n          \"name\": \"second_position_nft_account\",\n          \"writable\": true,\n          \"optional\": true\n        },\n        {\n          \"name\": \"second_position\",\n          \"writable\": true,\n          \"optional\": true\n        },\n        {\n          \"name\": \"damm_pool_authority\"\n        },\n        {\n          \"name\": \"amm_program\",\n          \"address\": \"cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG\"\n        },\n        {\n          \"name\": \"base_mint\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_a_vault\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_b_vault\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"base_vault\",\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"payer\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"token_base_program\"\n        },\n        {\n          \"name\": \"token_quote_program\"\n        },\n        {\n          \"name\": \"token_2022_program\"\n        },\n        {\n          \"name\": \"damm_event_authority\"\n        },\n        {\n          \"name\": \"system_program\",\n          \"docs\": [\n            \"System program.\"\n          ],\n          \"address\": \"11111111111111111111111111111111\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"migration_damm_v2_create_metadata\",\n      \"discriminator\": [\n        109,\n        189,\n        19,\n        36,\n        195,\n        183,\n        222,\n        82\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"virtual_pool\"\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"migration_metadata\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  100,\n                  97,\n                  109,\n                  109,\n                  95,\n                  118,\n                  50\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"virtual_pool\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"payer\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"migration_meteora_damm_create_metadata\",\n      \"docs\": [\n        \"migrate damm v1\"\n      ],\n      \"discriminator\": [\n        47,\n        94,\n        126,\n        115,\n        221,\n        226,\n        194,\n        133\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"virtual_pool\"\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"migration_metadata\",\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  109,\n                  101,\n                  116,\n                  101,\n                  111,\n                  114,\n                  97\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"virtual_pool\"\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"payer\",\n          \"writable\": true,\n          \"signer\": true\n        },\n        {\n          \"name\": \"system_program\",\n          \"address\": \"11111111111111111111111111111111\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"partner_withdraw_surplus\",\n      \"discriminator\": [\n        168,\n        173,\n        72,\n        100,\n        201,\n        98,\n        38,\n        92\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"virtual_pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_quote_account\",\n          \"docs\": [\n            \"The receiver token account\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"The vault token account for output token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"docs\": [\n            \"The mint of quote token\"\n          ],\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"fee_claimer\",\n          \"signer\": true,\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Token b program\"\n          ]\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"protocol_withdraw_surplus\",\n      \"discriminator\": [\n        54,\n        136,\n        225,\n        138,\n        172,\n        182,\n        214,\n        167\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"virtual_pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_quote_account\",\n          \"docs\": [\n            \"The treasury quote token account\"\n          ],\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  48,\n                  9,\n                  89,\n                  123,\n                  106,\n                  114,\n                  131,\n                  251,\n                  50,\n                  173,\n                  254,\n                  250,\n                  10,\n                  80,\n                  160,\n                  84,\n                  143,\n                  100,\n                  81,\n                  249,\n                  134,\n                  112,\n                  30,\n                  213,\n                  50,\n                  166,\n                  239,\n                  78,\n                  53,\n                  175,\n                  188,\n                  85\n                ]\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"token_quote_program\"\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"quote_mint\"\n              }\n            ],\n            \"program\": {\n              \"kind\": \"const\",\n              \"value\": [\n                140,\n                151,\n                37,\n                143,\n                78,\n                36,\n                137,\n                241,\n                187,\n                61,\n                16,\n                41,\n                20,\n                142,\n                13,\n                131,\n                11,\n                90,\n                19,\n                153,\n                218,\n                255,\n                16,\n                132,\n                4,\n                142,\n                123,\n                216,\n                219,\n                233,\n                248,\n                89\n              ]\n            }\n          }\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"The vault token account for quote token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"docs\": [\n            \"The mint of token\"\n          ],\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Token b program\"\n          ]\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"swap\",\n      \"docs\": [\n        \"TRADING BOTS FUNCTIONS ////\"\n      ],\n      \"discriminator\": [\n        248,\n        198,\n        158,\n        145,\n        225,\n        117,\n        135,\n        200\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"config\",\n          \"docs\": [\n            \"config key\"\n          ],\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"pool\",\n          \"docs\": [\n            \"Pool account\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"input_token_account\",\n          \"docs\": [\n            \"The user token account for input token\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"output_token_account\",\n          \"docs\": [\n            \"The user token account for output token\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"base_vault\",\n          \"docs\": [\n            \"The vault token account for base token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"The vault token account for quote token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"pool\"\n          ]\n        },\n        {\n          \"name\": \"base_mint\",\n          \"docs\": [\n            \"The mint of base token\"\n          ]\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"docs\": [\n            \"The mint of quote token\"\n          ]\n        },\n        {\n          \"name\": \"payer\",\n          \"docs\": [\n            \"The user performing the swap\"\n          ],\n          \"signer\": true\n        },\n        {\n          \"name\": \"token_base_program\",\n          \"docs\": [\n            \"Token base program\"\n          ]\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Token quote program\"\n          ]\n        },\n        {\n          \"name\": \"referral_token_account\",\n          \"docs\": [\n            \"referral token account\"\n          ],\n          \"writable\": true,\n          \"optional\": true\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"params\",\n          \"type\": {\n            \"defined\": {\n              \"name\": \"SwapParameters\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"transfer_pool_creator\",\n      \"discriminator\": [\n        20,\n        7,\n        169,\n        33,\n        58,\n        147,\n        166,\n        33\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"virtual_pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"creator\",\n          \"signer\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"new_creator\"\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"withdraw_leftover\",\n      \"discriminator\": [\n        20,\n        198,\n        202,\n        237,\n        235,\n        243,\n        183,\n        66\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"virtual_pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_base_account\",\n          \"docs\": [\n            \"The receiver token account, withdraw to ATA\"\n          ],\n          \"writable\": true,\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"account\",\n                \"path\": \"leftover_receiver\"\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"token_base_program\"\n              },\n              {\n                \"kind\": \"account\",\n                \"path\": \"base_mint\"\n              }\n            ],\n            \"program\": {\n              \"kind\": \"const\",\n              \"value\": [\n                140,\n                151,\n                37,\n                143,\n                78,\n                36,\n                137,\n                241,\n                187,\n                61,\n                16,\n                41,\n                20,\n                142,\n                13,\n                131,\n                11,\n                90,\n                19,\n                153,\n                218,\n                255,\n                16,\n                132,\n                4,\n                142,\n                123,\n                216,\n                219,\n                233,\n                248,\n                89\n              ]\n            }\n          }\n        },\n        {\n          \"name\": \"base_vault\",\n          \"docs\": [\n            \"The vault token account for output token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"base_mint\",\n          \"docs\": [\n            \"The mint of quote token\"\n          ],\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"leftover_receiver\",\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"token_base_program\",\n          \"docs\": [\n            \"Token base program\"\n          ]\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": []\n    },\n    {\n      \"name\": \"withdraw_migration_fee\",\n      \"docs\": [\n        \"BOTH partner and creator FUNCTIONS ///\"\n      ],\n      \"discriminator\": [\n        237,\n        142,\n        45,\n        23,\n        129,\n        6,\n        222,\n        162\n      ],\n      \"accounts\": [\n        {\n          \"name\": \"pool_authority\",\n          \"address\": \"FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM\"\n        },\n        {\n          \"name\": \"config\",\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"virtual_pool\",\n          \"writable\": true\n        },\n        {\n          \"name\": \"token_quote_account\",\n          \"docs\": [\n            \"The receiver token account\"\n          ],\n          \"writable\": true\n        },\n        {\n          \"name\": \"quote_vault\",\n          \"docs\": [\n            \"The vault token account for output token\"\n          ],\n          \"writable\": true,\n          \"relations\": [\n            \"virtual_pool\"\n          ]\n        },\n        {\n          \"name\": \"quote_mint\",\n          \"docs\": [\n            \"The mint of quote token\"\n          ],\n          \"relations\": [\n            \"config\"\n          ]\n        },\n        {\n          \"name\": \"sender\",\n          \"signer\": true\n        },\n        {\n          \"name\": \"token_quote_program\",\n          \"docs\": [\n            \"Token b program\"\n          ]\n        },\n        {\n          \"name\": \"event_authority\",\n          \"pda\": {\n            \"seeds\": [\n              {\n                \"kind\": \"const\",\n                \"value\": [\n                  95,\n                  95,\n                  101,\n                  118,\n                  101,\n                  110,\n                  116,\n                  95,\n                  97,\n                  117,\n                  116,\n                  104,\n                  111,\n                  114,\n                  105,\n                  116,\n                  121\n                ]\n              }\n            ]\n          }\n        },\n        {\n          \"name\": \"program\"\n        }\n      ],\n      \"args\": [\n        {\n          \"name\": \"flag\",\n          \"type\": \"u8\"\n        }\n      ]\n    }\n  ],\n  \"accounts\": [\n    {\n      \"name\": \"ClaimFeeOperator\",\n      \"discriminator\": [\n        166,\n        48,\n        134,\n        86,\n        34,\n        200,\n        188,\n        150\n      ]\n    },\n    {\n      \"name\": \"Config\",\n      \"discriminator\": [\n        155,\n        12,\n        170,\n        224,\n        30,\n        250,\n        204,\n        130\n      ]\n    },\n    {\n      \"name\": \"LockEscrow\",\n      \"discriminator\": [\n        190,\n        106,\n        121,\n        6,\n        200,\n        182,\n        21,\n        75\n      ]\n    },\n    {\n      \"name\": \"MeteoraDammMigrationMetadata\",\n      \"discriminator\": [\n        17,\n        155,\n        141,\n        215,\n        207,\n        4,\n        133,\n        156\n      ]\n    },\n    {\n      \"name\": \"MeteoraDammV2Metadata\",\n      \"discriminator\": [\n        104,\n        221,\n        219,\n        203,\n        10,\n        142,\n        250,\n        163\n      ]\n    },\n    {\n      \"name\": \"PartnerMetadata\",\n      \"discriminator\": [\n        68,\n        68,\n        130,\n        19,\n        16,\n        209,\n        98,\n        156\n      ]\n    },\n    {\n      \"name\": \"PoolConfig\",\n      \"discriminator\": [\n        26,\n        108,\n        14,\n        123,\n        116,\n        230,\n        129,\n        43\n      ]\n    },\n    {\n      \"name\": \"VirtualPool\",\n      \"discriminator\": [\n        213,\n        224,\n        5,\n        209,\n        98,\n        69,\n        119,\n        92\n      ]\n    },\n    {\n      \"name\": \"VirtualPoolMetadata\",\n      \"discriminator\": [\n        217,\n        37,\n        82,\n        250,\n        43,\n        47,\n        228,\n        254\n      ]\n    }\n  ],\n  \"events\": [\n    {\n      \"name\": \"EvtClaimCreatorTradingFee\",\n      \"discriminator\": [\n        154,\n        228,\n        215,\n        202,\n        133,\n        155,\n        214,\n        138\n      ]\n    },\n    {\n      \"name\": \"EvtClaimProtocolFee\",\n      \"discriminator\": [\n        186,\n        244,\n        75,\n        251,\n        188,\n        13,\n        25,\n        33\n      ]\n    },\n    {\n      \"name\": \"EvtClaimTradingFee\",\n      \"discriminator\": [\n        26,\n        83,\n        117,\n        240,\n        92,\n        202,\n        112,\n        254\n      ]\n    },\n    {\n      \"name\": \"EvtCloseClaimFeeOperator\",\n      \"discriminator\": [\n        111,\n        39,\n        37,\n        55,\n        110,\n        216,\n        194,\n        23\n      ]\n    },\n    {\n      \"name\": \"EvtCreateClaimFeeOperator\",\n      \"discriminator\": [\n        21,\n        6,\n        153,\n        120,\n        68,\n        116,\n        28,\n        177\n      ]\n    },\n    {\n      \"name\": \"EvtCreateConfig\",\n      \"discriminator\": [\n        131,\n        207,\n        180,\n        174,\n        180,\n        73,\n        165,\n        54\n      ]\n    },\n    {\n      \"name\": \"EvtCreateConfigV2\",\n      \"discriminator\": [\n        163,\n        74,\n        66,\n        187,\n        119,\n        195,\n        26,\n        144\n      ]\n    },\n    {\n      \"name\": \"EvtCreateDammV2MigrationMetadata\",\n      \"discriminator\": [\n        103,\n        111,\n        132,\n        168,\n        140,\n        253,\n        150,\n        114\n      ]\n    },\n    {\n      \"name\": \"EvtCreateMeteoraMigrationMetadata\",\n      \"discriminator\": [\n        99,\n        167,\n        133,\n        63,\n        214,\n        143,\n        175,\n        139\n      ]\n    },\n    {\n      \"name\": \"EvtCreatorWithdrawSurplus\",\n      \"discriminator\": [\n        152,\n        73,\n        21,\n        15,\n        66,\n        87,\n        53,\n        157\n      ]\n    },\n    {\n      \"name\": \"EvtCurveComplete\",\n      \"discriminator\": [\n        229,\n        231,\n        86,\n        84,\n        156,\n        134,\n        75,\n        24\n      ]\n    },\n    {\n      \"name\": \"EvtInitializePool\",\n      \"discriminator\": [\n        228,\n        50,\n        246,\n        85,\n        203,\n        66,\n        134,\n        37\n      ]\n    },\n    {\n      \"name\": \"EvtPartnerMetadata\",\n      \"discriminator\": [\n        200,\n        127,\n        6,\n        55,\n        13,\n        32,\n        8,\n        150\n      ]\n    },\n    {\n      \"name\": \"EvtPartnerWithdrawMigrationFee\",\n      \"discriminator\": [\n        181,\n        105,\n        127,\n        67,\n        8,\n        187,\n        120,\n        57\n      ]\n    },\n    {\n      \"name\": \"EvtPartnerWithdrawSurplus\",\n      \"discriminator\": [\n        195,\n        56,\n        152,\n        9,\n        232,\n        72,\n        35,\n        22\n      ]\n    },\n    {\n      \"name\": \"EvtProtocolWithdrawSurplus\",\n      \"discriminator\": [\n        109,\n        111,\n        28,\n        221,\n        134,\n        195,\n        230,\n        203\n      ]\n    },\n    {\n      \"name\": \"EvtSwap\",\n      \"discriminator\": [\n        27,\n        60,\n        21,\n        213,\n        138,\n        170,\n        187,\n        147\n      ]\n    },\n    {\n      \"name\": \"EvtUpdatePoolCreator\",\n      \"discriminator\": [\n        107,\n        225,\n        165,\n        237,\n        91,\n        158,\n        213,\n        220\n      ]\n    },\n    {\n      \"name\": \"EvtVirtualPoolMetadata\",\n      \"discriminator\": [\n        188,\n        18,\n        72,\n        76,\n        195,\n        91,\n        38,\n        74\n      ]\n    },\n    {\n      \"name\": \"EvtWithdrawLeftover\",\n      \"discriminator\": [\n        191,\n        189,\n        104,\n        143,\n        111,\n        156,\n        94,\n        229\n      ]\n    },\n    {\n      \"name\": \"EvtWithdrawMigrationFee\",\n      \"discriminator\": [\n        26,\n        203,\n        84,\n        85,\n        161,\n        23,\n        100,\n        214\n      ]\n    }\n  ],\n  \"errors\": [\n    {\n      \"code\": 6000,\n      \"name\": \"MathOverflow\",\n      \"msg\": \"Math operation overflow\"\n    },\n    {\n      \"code\": 6001,\n      \"name\": \"InvalidFee\",\n      \"msg\": \"Invalid fee setup\"\n    },\n    {\n      \"code\": 6002,\n      \"name\": \"ExceededSlippage\",\n      \"msg\": \"Exceeded slippage tolerance\"\n    },\n    {\n      \"code\": 6003,\n      \"name\": \"ExceedMaxFeeBps\",\n      \"msg\": \"Exceeded max fee bps\"\n    },\n    {\n      \"code\": 6004,\n      \"name\": \"InvalidAdmin\",\n      \"msg\": \"Invalid admin\"\n    },\n    {\n      \"code\": 6005,\n      \"name\": \"AmountIsZero\",\n      \"msg\": \"Amount is zero\"\n    },\n    {\n      \"code\": 6006,\n      \"name\": \"TypeCastFailed\",\n      \"msg\": \"Type cast error\"\n    },\n    {\n      \"code\": 6007,\n      \"name\": \"InvalidActivationType\",\n      \"msg\": \"Invalid activation type\"\n    },\n    {\n      \"code\": 6008,\n      \"name\": \"InvalidQuoteMint\",\n      \"msg\": \"Invalid quote mint\"\n    },\n    {\n      \"code\": 6009,\n      \"name\": \"InvalidCollectFeeMode\",\n      \"msg\": \"Invalid collect fee mode\"\n    },\n    {\n      \"code\": 6010,\n      \"name\": \"InvalidMigrationFeeOption\",\n      \"msg\": \"Invalid migration fee option\"\n    },\n    {\n      \"code\": 6011,\n      \"name\": \"InvalidInput\",\n      \"msg\": \"Invalid input\"\n    },\n    {\n      \"code\": 6012,\n      \"name\": \"NotEnoughLiquidity\",\n      \"msg\": \"Not enough liquidity\"\n    },\n    {\n      \"code\": 6013,\n      \"name\": \"PoolIsCompleted\",\n      \"msg\": \"Pool is completed\"\n    },\n    {\n      \"code\": 6014,\n      \"name\": \"PoolIsIncompleted\",\n      \"msg\": \"Pool is incompleted\"\n    },\n    {\n      \"code\": 6015,\n      \"name\": \"InvalidMigrationOption\",\n      \"msg\": \"Invalid migration option\"\n    },\n    {\n      \"code\": 6016,\n      \"name\": \"InvalidTokenDecimals\",\n      \"msg\": \"Invalid activation type\"\n    },\n    {\n      \"code\": 6017,\n      \"name\": \"InvalidTokenType\",\n      \"msg\": \"Invalid token type\"\n    },\n    {\n      \"code\": 6018,\n      \"name\": \"InvalidFeePercentage\",\n      \"msg\": \"Invalid fee percentage\"\n    },\n    {\n      \"code\": 6019,\n      \"name\": \"InvalidQuoteThreshold\",\n      \"msg\": \"Invalid quote threshold\"\n    },\n    {\n      \"code\": 6020,\n      \"name\": \"InvalidTokenSupply\",\n      \"msg\": \"Invalid token supply\"\n    },\n    {\n      \"code\": 6021,\n      \"name\": \"InvalidCurve\",\n      \"msg\": \"Invalid curve\"\n    },\n    {\n      \"code\": 6022,\n      \"name\": \"NotPermitToDoThisAction\",\n      \"msg\": \"Not permit to do this action\"\n    },\n    {\n      \"code\": 6023,\n      \"name\": \"InvalidOwnerAccount\",\n      \"msg\": \"Invalid owner account\"\n    },\n    {\n      \"code\": 6024,\n      \"name\": \"InvalidConfigAccount\",\n      \"msg\": \"Invalid config account\"\n    },\n    {\n      \"code\": 6025,\n      \"name\": \"SurplusHasBeenWithdraw\",\n      \"msg\": \"Surplus has been withdraw\"\n    },\n    {\n      \"code\": 6026,\n      \"name\": \"LeftoverHasBeenWithdraw\",\n      \"msg\": \"Leftover has been withdraw\"\n    },\n    {\n      \"code\": 6027,\n      \"name\": \"TotalBaseTokenExceedMaxSupply\",\n      \"msg\": \"Total base token is exceeded max supply\"\n    },\n    {\n      \"code\": 6028,\n      \"name\": \"UnsupportNativeMintToken2022\",\n      \"msg\": \"Unsupport native mint token 2022\"\n    },\n    {\n      \"code\": 6029,\n      \"name\": \"InsufficientLiquidityForMigration\",\n      \"msg\": \"Insufficient liquidity for migration\"\n    },\n    {\n      \"code\": 6030,\n      \"name\": \"MissingPoolConfigInRemainingAccount\",\n      \"msg\": \"Missing pool config in remaining account\"\n    },\n    {\n      \"code\": 6031,\n      \"name\": \"InvalidVestingParameters\",\n      \"msg\": \"Invalid vesting parameters\"\n    },\n    {\n      \"code\": 6032,\n      \"name\": \"InvalidLeftoverAddress\",\n      \"msg\": \"Invalid leftover address\"\n    },\n    {\n      \"code\": 6033,\n      \"name\": \"SwapAmountIsOverAThreshold\",\n      \"msg\": \"Swap amount is over a threshold\"\n    },\n    {\n      \"code\": 6034,\n      \"name\": \"InvalidFeeScheduler\",\n      \"msg\": \"Invalid fee scheduler\"\n    },\n    {\n      \"code\": 6035,\n      \"name\": \"InvalidCreatorTradingFeePercentage\",\n      \"msg\": \"Invalid creator trading fee percentage\"\n    },\n    {\n      \"code\": 6036,\n      \"name\": \"InvalidNewCreator\",\n      \"msg\": \"Invalid new creator\"\n    },\n    {\n      \"code\": 6037,\n      \"name\": \"InvalidTokenAuthorityOption\",\n      \"msg\": \"Invalid token authority option\"\n    },\n    {\n      \"code\": 6038,\n      \"name\": \"InvalidAccount\",\n      \"msg\": \"Invalid account for the instruction\"\n    },\n    {\n      \"code\": 6039,\n      \"name\": \"InvalidMigratorFeePercentage\",\n      \"msg\": \"Invalid migrator fee percentage\"\n    },\n    {\n      \"code\": 6040,\n      \"name\": \"MigrationFeeHasBeenWithdraw\",\n      \"msg\": \"Migration fee has been withdraw\"\n    },\n    {\n      \"code\": 6041,\n      \"name\": \"InvalidBaseFeeMode\",\n      \"msg\": \"Invalid base fee mode\"\n    },\n    {\n      \"code\": 6042,\n      \"name\": \"InvalidFeeRateLimiter\",\n      \"msg\": \"Invalid fee rate limiter\"\n    },\n    {\n      \"code\": 6043,\n      \"name\": \"FailToValidateSingleSwapInstruction\",\n      \"msg\": \"Fail to validate single swap instruction in rate limiter\"\n    },\n    {\n      \"code\": 6044,\n      \"name\": \"InvalidMigratedPoolFee\",\n      \"msg\": \"Invalid migrated pool fee params\"\n    }\n  ],\n  \"types\": [\n    {\n      \"name\": \"BaseFeeConfig\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"cliff_fee_numerator\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"second_factor\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"third_factor\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"first_factor\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"base_fee_mode\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"padding_0\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                5\n              ]\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"BaseFeeParameters\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"cliff_fee_numerator\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"first_factor\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"second_factor\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"third_factor\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"base_fee_mode\",\n            \"type\": \"u8\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ClaimFeeOperator\",\n      \"docs\": [\n        \"Parameter that set by the protocol\"\n      ],\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"operator\",\n            \"docs\": [\n              \"operator\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"_padding\",\n            \"docs\": [\n              \"Reserve\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                128\n              ]\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"Config\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool_fees\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"PoolFees\"\n              }\n            }\n          },\n          {\n            \"name\": \"activation_duration\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"vault_config_key\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"pool_creator_authority\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"activation_type\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"partner_fee_numerator\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"padding\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                219\n              ]\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"ConfigParameters\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool_fees\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"PoolFeeParameters\"\n              }\n            }\n          },\n          {\n            \"name\": \"collect_fee_mode\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migration_option\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"activation_type\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"token_type\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"token_decimal\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"partner_lp_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"partner_locked_lp_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_lp_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_locked_lp_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migration_quote_threshold\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"sqrt_start_price\",\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"locked_vesting\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"LockedVestingParams\"\n              }\n            }\n          },\n          {\n            \"name\": \"migration_fee_option\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"token_supply\",\n            \"type\": {\n              \"option\": {\n                \"defined\": {\n                  \"name\": \"TokenSupplyParams\"\n                }\n              }\n            }\n          },\n          {\n            \"name\": \"creator_trading_fee_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"token_update_authority\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migration_fee\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"MigrationFee\"\n              }\n            }\n          },\n          {\n            \"name\": \"migrated_pool_fee\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"MigratedPoolFee\"\n              }\n            }\n          },\n          {\n            \"name\": \"padding\",\n            \"docs\": [\n              \"padding for future use\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u64\",\n                7\n              ]\n            }\n          },\n          {\n            \"name\": \"curve\",\n            \"type\": {\n              \"vec\": {\n                \"defined\": {\n                  \"name\": \"LiquidityDistributionParameters\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"CreatePartnerMetadataParameters\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"padding\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                96\n              ]\n            }\n          },\n          {\n            \"name\": \"name\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"website\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"logo\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"CreateVirtualPoolMetadataParameters\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"padding\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                96\n              ]\n            }\n          },\n          {\n            \"name\": \"name\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"website\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"logo\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DynamicFeeConfig\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"initialized\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"padding\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                7\n              ]\n            }\n          },\n          {\n            \"name\": \"max_volatility_accumulator\",\n            \"type\": \"u32\"\n          },\n          {\n            \"name\": \"variable_fee_control\",\n            \"type\": \"u32\"\n          },\n          {\n            \"name\": \"bin_step\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"filter_period\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"decay_period\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"reduction_factor\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"padding2\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                8\n              ]\n            }\n          },\n          {\n            \"name\": \"bin_step_u128\",\n            \"type\": \"u128\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"DynamicFeeParameters\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"bin_step\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"bin_step_u128\",\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"filter_period\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"decay_period\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"reduction_factor\",\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"max_volatility_accumulator\",\n            \"type\": \"u32\"\n          },\n          {\n            \"name\": \"variable_fee_control\",\n            \"type\": \"u32\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtClaimCreatorTradingFee\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"token_base_amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"token_quote_amount\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtClaimProtocolFee\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"token_base_amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"token_quote_amount\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtClaimTradingFee\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"token_base_amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"token_quote_amount\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtCloseClaimFeeOperator\",\n      \"docs\": [\n        \"Close claim fee operator\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"claim_fee_operator\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"operator\",\n            \"type\": \"pubkey\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtCreateClaimFeeOperator\",\n      \"docs\": [\n        \"Create claim fee operator\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"operator\",\n            \"type\": \"pubkey\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtCreateConfig\",\n      \"docs\": [\n        \"Create config\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"config\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"quote_mint\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"fee_claimer\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"owner\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"pool_fees\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"PoolFeeParameters\"\n              }\n            }\n          },\n          {\n            \"name\": \"collect_fee_mode\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migration_option\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"activation_type\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"token_decimal\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"token_type\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"partner_locked_lp_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"partner_lp_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_locked_lp_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_lp_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"swap_base_amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"migration_quote_threshold\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"migration_base_amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"sqrt_start_price\",\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"locked_vesting\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"LockedVestingParams\"\n              }\n            }\n          },\n          {\n            \"name\": \"migration_fee_option\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"fixed_token_supply_flag\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"pre_migration_token_supply\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"post_migration_token_supply\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"curve\",\n            \"type\": {\n              \"vec\": {\n                \"defined\": {\n                  \"name\": \"LiquidityDistributionParameters\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtCreateConfigV2\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"config\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"quote_mint\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"fee_claimer\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"leftover_receiver\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"config_parameters\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"ConfigParameters\"\n              }\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtCreateDammV2MigrationMetadata\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"virtual_pool\",\n            \"type\": \"pubkey\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtCreateMeteoraMigrationMetadata\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"virtual_pool\",\n            \"type\": \"pubkey\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtCreatorWithdrawSurplus\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"surplus_amount\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtCurveComplete\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"config\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"base_reserve\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"quote_reserve\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtInitializePool\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"config\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"creator\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"base_mint\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"pool_type\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"activation_point\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtPartnerMetadata\",\n      \"docs\": [\n        \"Create partner metadata\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"partner_metadata\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"fee_claimer\",\n            \"type\": \"pubkey\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtPartnerWithdrawMigrationFee\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"fee\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtPartnerWithdrawSurplus\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"surplus_amount\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtProtocolWithdrawSurplus\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"surplus_amount\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtSwap\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"config\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"trade_direction\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"has_referral\",\n            \"type\": \"bool\"\n          },\n          {\n            \"name\": \"params\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"SwapParameters\"\n              }\n            }\n          },\n          {\n            \"name\": \"swap_result\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"SwapResult\"\n              }\n            }\n          },\n          {\n            \"name\": \"amount_in\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"current_timestamp\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtUpdatePoolCreator\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"creator\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"new_creator\",\n            \"type\": \"pubkey\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtVirtualPoolMetadata\",\n      \"docs\": [\n        \"Create virtual pool metadata\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"virtual_pool_metadata\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"virtual_pool\",\n            \"type\": \"pubkey\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtWithdrawLeftover\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"leftover_receiver\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"leftover_amount\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"EvtWithdrawMigrationFee\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"fee\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"flag\",\n            \"type\": \"u8\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"InitializePoolParameters\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"name\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"symbol\",\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"uri\",\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"LiquidityDistributionConfig\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"sqrt_price\",\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"liquidity\",\n            \"type\": \"u128\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"LiquidityDistributionParameters\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"sqrt_price\",\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"liquidity\",\n            \"type\": \"u128\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"LockEscrow\",\n      \"docs\": [\n        \"State of lock escrow account\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pool\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"owner\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"escrow_vault\",\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"bump\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"total_locked_amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"lp_per_token\",\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"unclaimed_fee_pending\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"a_fee\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"b_fee\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"LockedVestingConfig\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"amount_per_period\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"cliff_duration_from_migration_time\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"frequency\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"number_of_period\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"cliff_unlock_amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"_padding\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"LockedVestingParams\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"amount_per_period\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"cliff_duration_from_migration_time\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"frequency\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"number_of_period\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"cliff_unlock_amount\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MeteoraDammMigrationMetadata\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"virtual_pool\",\n            \"docs\": [\n              \"pool\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"padding_0\",\n            \"docs\": [\n              \"!!! BE CAREFUL to use tomestone field, previous is pool creator\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          },\n          {\n            \"name\": \"partner\",\n            \"docs\": [\n              \"partner\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"lp_mint\",\n            \"docs\": [\n              \"lp mint\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"partner_locked_lp\",\n            \"docs\": [\n              \"partner locked lp\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"partner_lp\",\n            \"docs\": [\n              \"partner lp\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"creator_locked_lp\",\n            \"docs\": [\n              \"creator locked lp\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"creator_lp\",\n            \"docs\": [\n              \"creator lp\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"_padding_0\",\n            \"docs\": [\n              \"padding\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_locked_status\",\n            \"docs\": [\n              \"flag to check whether lp is locked for creator\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"partner_locked_status\",\n            \"docs\": [\n              \"flag to check whether lp is locked for partner\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_claim_status\",\n            \"docs\": [\n              \"flag to check whether creator has claimed lp token\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"partner_claim_status\",\n            \"docs\": [\n              \"flag to check whether partner has claimed lp token\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"_padding\",\n            \"docs\": [\n              \"Reserve\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                107\n              ]\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MeteoraDammV2Metadata\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"virtual_pool\",\n            \"docs\": [\n              \"pool\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"padding_0\",\n            \"docs\": [\n              \"!!! BE CAREFUL to use tomestone field, previous is pool creator\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                32\n              ]\n            }\n          },\n          {\n            \"name\": \"partner\",\n            \"docs\": [\n              \"partner\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"_padding\",\n            \"docs\": [\n              \"Reserve\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                126\n              ]\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MigratedPoolFee\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"collect_fee_mode\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"dynamic_fee\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"pool_fee_bps\",\n            \"type\": \"u16\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"MigrationFee\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"fee_percentage\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_fee_percentage\",\n            \"type\": \"u8\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"PartnerMetadata\",\n      \"docs\": [\n        \"Metadata for a partner.\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"fee_claimer\",\n            \"docs\": [\n              \"fee claimer\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"padding\",\n            \"docs\": [\n              \"padding for future use\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u128\",\n                6\n              ]\n            }\n          },\n          {\n            \"name\": \"name\",\n            \"docs\": [\n              \"Name of partner.\"\n            ],\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"website\",\n            \"docs\": [\n              \"Website of partner.\"\n            ],\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"logo\",\n            \"docs\": [\n              \"Logo of partner\"\n            ],\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"PoolConfig\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"quote_mint\",\n            \"docs\": [\n              \"quote mint\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"fee_claimer\",\n            \"docs\": [\n              \"Address to get the fee\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"leftover_receiver\",\n            \"docs\": [\n              \"Address to receive extra base token after migration, in case token is fixed supply\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"pool_fees\",\n            \"docs\": [\n              \"Pool fee\"\n            ],\n            \"type\": {\n              \"defined\": {\n                \"name\": \"PoolFeesConfig\"\n              }\n            }\n          },\n          {\n            \"name\": \"collect_fee_mode\",\n            \"docs\": [\n              \"Collect fee mode\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migration_option\",\n            \"docs\": [\n              \"migration option\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"activation_type\",\n            \"docs\": [\n              \"whether mode slot or timestamp\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"token_decimal\",\n            \"docs\": [\n              \"token decimals\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"version\",\n            \"docs\": [\n              \"version\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"token_type\",\n            \"docs\": [\n              \"token type of base token\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"quote_token_flag\",\n            \"docs\": [\n              \"quote token flag\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"partner_locked_lp_percentage\",\n            \"docs\": [\n              \"partner locked lp percentage\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"partner_lp_percentage\",\n            \"docs\": [\n              \"partner lp percentage\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_locked_lp_percentage\",\n            \"docs\": [\n              \"creator post migration fee percentage\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_lp_percentage\",\n            \"docs\": [\n              \"creator lp percentage\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migration_fee_option\",\n            \"docs\": [\n              \"migration fee option\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"fixed_token_supply_flag\",\n            \"docs\": [\n              \"flag to indicate whether token is dynamic supply (0) or fixed supply (1)\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_trading_fee_percentage\",\n            \"docs\": [\n              \"creator trading fee percentage\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"token_update_authority\",\n            \"docs\": [\n              \"token update authority\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migration_fee_percentage\",\n            \"docs\": [\n              \"migration fee percentage\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"creator_migration_fee_percentage\",\n            \"docs\": [\n              \"creator migration fee percentage\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"_padding_0\",\n            \"docs\": [\n              \"padding 0\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                7\n              ]\n            }\n          },\n          {\n            \"name\": \"swap_base_amount\",\n            \"docs\": [\n              \"swap base amount\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"migration_quote_threshold\",\n            \"docs\": [\n              \"migration quote threshold (in quote token)\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"migration_base_threshold\",\n            \"docs\": [\n              \"migration base threshold (in base token)\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"migration_sqrt_price\",\n            \"docs\": [\n              \"migration sqrt price\"\n            ],\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"locked_vesting_config\",\n            \"docs\": [\n              \"locked vesting config\"\n            ],\n            \"type\": {\n              \"defined\": {\n                \"name\": \"LockedVestingConfig\"\n              }\n            }\n          },\n          {\n            \"name\": \"pre_migration_token_supply\",\n            \"docs\": [\n              \"pre migration token supply\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"post_migration_token_supply\",\n            \"docs\": [\n              \"post migration token supply\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"migrated_collect_fee_mode\",\n            \"docs\": [\n              \"migrated pool collect fee mode\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migrated_dynamic_fee\",\n            \"docs\": [\n              \"migrated dynamic fee option.\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migrated_pool_fee_bps\",\n            \"docs\": [\n              \"migrated pool fee in bps\"\n            ],\n            \"type\": \"u16\"\n          },\n          {\n            \"name\": \"_padding_1\",\n            \"docs\": [\n              \"padding 1\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                12\n              ]\n            }\n          },\n          {\n            \"name\": \"_padding_2\",\n            \"docs\": [\n              \"padding 2\"\n            ],\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"sqrt_start_price\",\n            \"docs\": [\n              \"minimum price\"\n            ],\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"curve\",\n            \"docs\": [\n              \"curve, only use 20 point firstly, we can extend that latter\"\n            ],\n            \"type\": {\n              \"array\": [\n                {\n                  \"defined\": {\n                    \"name\": \"LiquidityDistributionConfig\"\n                  }\n                },\n                20\n              ]\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"PoolFeeParameters\",\n      \"docs\": [\n        \"Information regarding fee charges\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"base_fee\",\n            \"docs\": [\n              \"Base fee\"\n            ],\n            \"type\": {\n              \"defined\": {\n                \"name\": \"BaseFeeParameters\"\n              }\n            }\n          },\n          {\n            \"name\": \"dynamic_fee\",\n            \"docs\": [\n              \"dynamic fee\"\n            ],\n            \"type\": {\n              \"option\": {\n                \"defined\": {\n                  \"name\": \"DynamicFeeParameters\"\n                }\n              }\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"PoolFees\",\n      \"docs\": [\n        \"Information regarding fee charges\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"trade_fee_numerator\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"trade_fee_denominator\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"protocol_trade_fee_numerator\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"protocol_trade_fee_denominator\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"PoolFeesConfig\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"base_fee\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"BaseFeeConfig\"\n              }\n            }\n          },\n          {\n            \"name\": \"dynamic_fee\",\n            \"type\": {\n              \"defined\": {\n                \"name\": \"DynamicFeeConfig\"\n              }\n            }\n          },\n          {\n            \"name\": \"padding_0\",\n            \"type\": {\n              \"array\": [\n                \"u64\",\n                5\n              ]\n            }\n          },\n          {\n            \"name\": \"padding_1\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                6\n              ]\n            }\n          },\n          {\n            \"name\": \"protocol_fee_percent\",\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"referral_fee_percent\",\n            \"type\": \"u8\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"PoolMetrics\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"total_protocol_base_fee\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"total_protocol_quote_fee\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"total_trading_base_fee\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"total_trading_quote_fee\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SwapParameters\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"amount_in\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"minimum_amount_out\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"SwapResult\",\n      \"docs\": [\n        \"Encodes all results of swapping\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"actual_input_amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"output_amount\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"next_sqrt_price\",\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"trading_fee\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"protocol_fee\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"referral_fee\",\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"TokenSupplyParams\",\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"pre_migration_token_supply\",\n            \"docs\": [\n              \"pre migration token supply\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"post_migration_token_supply\",\n            \"docs\": [\n              \"post migration token supply\",\n              \"becase DBC allow user to swap over the migration quote threshold, so in extreme case user may swap more than allowed buffer on curve\",\n              \"that result the total supply in post migration may be increased a bit (between pre_migration_token_supply and post_migration_token_supply)\"\n            ],\n            \"type\": \"u64\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"VirtualPool\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"volatility_tracker\",\n            \"docs\": [\n              \"volatility tracker\"\n            ],\n            \"type\": {\n              \"defined\": {\n                \"name\": \"VolatilityTracker\"\n              }\n            }\n          },\n          {\n            \"name\": \"config\",\n            \"docs\": [\n              \"config key\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"creator\",\n            \"docs\": [\n              \"creator\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"base_mint\",\n            \"docs\": [\n              \"base mint\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"base_vault\",\n            \"docs\": [\n              \"base vault\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"quote_vault\",\n            \"docs\": [\n              \"quote vault\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"base_reserve\",\n            \"docs\": [\n              \"base reserve\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"quote_reserve\",\n            \"docs\": [\n              \"quote reserve\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"protocol_base_fee\",\n            \"docs\": [\n              \"protocol base fee\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"protocol_quote_fee\",\n            \"docs\": [\n              \"protocol quote fee\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"partner_base_fee\",\n            \"docs\": [\n              \"partner base fee\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"partner_quote_fee\",\n            \"docs\": [\n              \"trading quote fee\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"sqrt_price\",\n            \"docs\": [\n              \"current price\"\n            ],\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"activation_point\",\n            \"docs\": [\n              \"Activation point\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"pool_type\",\n            \"docs\": [\n              \"pool type, spl token or token2022\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"is_migrated\",\n            \"docs\": [\n              \"is migrated\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"is_partner_withdraw_surplus\",\n            \"docs\": [\n              \"is partner withdraw surplus\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"is_protocol_withdraw_surplus\",\n            \"docs\": [\n              \"is protocol withdraw surplus\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migration_progress\",\n            \"docs\": [\n              \"migration progress\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"is_withdraw_leftover\",\n            \"docs\": [\n              \"is withdraw leftover\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"is_creator_withdraw_surplus\",\n            \"docs\": [\n              \"is creator withdraw surplus\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"migration_fee_withdraw_status\",\n            \"docs\": [\n              \"migration fee withdraw status, first bit is for partner, second bit is for creator\"\n            ],\n            \"type\": \"u8\"\n          },\n          {\n            \"name\": \"metrics\",\n            \"docs\": [\n              \"pool metrics\"\n            ],\n            \"type\": {\n              \"defined\": {\n                \"name\": \"PoolMetrics\"\n              }\n            }\n          },\n          {\n            \"name\": \"finish_curve_timestamp\",\n            \"docs\": [\n              \"The time curve is finished\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"creator_base_fee\",\n            \"docs\": [\n              \"creator base fee\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"creator_quote_fee\",\n            \"docs\": [\n              \"creator quote fee\"\n            ],\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"_padding_1\",\n            \"docs\": [\n              \"Padding for further use\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u64\",\n                7\n              ]\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"VirtualPoolMetadata\",\n      \"docs\": [\n        \"Metadata for a virtual pool.\"\n      ],\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"virtual_pool\",\n            \"docs\": [\n              \"virtual pool\"\n            ],\n            \"type\": \"pubkey\"\n          },\n          {\n            \"name\": \"padding\",\n            \"docs\": [\n              \"padding for future use\"\n            ],\n            \"type\": {\n              \"array\": [\n                \"u128\",\n                6\n              ]\n            }\n          },\n          {\n            \"name\": \"name\",\n            \"docs\": [\n              \"Name of project.\"\n            ],\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"website\",\n            \"docs\": [\n              \"Website of project.\"\n            ],\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"logo\",\n            \"docs\": [\n              \"Logo of project\"\n            ],\n            \"type\": \"string\"\n          }\n        ]\n      }\n    },\n    {\n      \"name\": \"VolatilityTracker\",\n      \"serialization\": \"bytemuck\",\n      \"repr\": {\n        \"kind\": \"c\"\n      },\n      \"type\": {\n        \"kind\": \"struct\",\n        \"fields\": [\n          {\n            \"name\": \"last_update_timestamp\",\n            \"type\": \"u64\"\n          },\n          {\n            \"name\": \"padding\",\n            \"type\": {\n              \"array\": [\n                \"u8\",\n                8\n              ]\n            }\n          },\n          {\n            \"name\": \"sqrt_price_reference\",\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"volatility_accumulator\",\n            \"type\": \"u128\"\n          },\n          {\n            \"name\": \"volatility_reference\",\n            \"type\": \"u128\"\n          }\n        ]\n      }\n    }\n  ]\n}","{\n    \"address\": \"24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi\",\n    \"metadata\": {\n        \"name\": \"vault\",\n        \"version\": \"0.7.2\",\n        \"spec\": \"0.1.0\"\n    },\n    \"docs\": [\n        \"Program for vault\"\n    ],\n    \"instructions\": [\n        {\n            \"name\": \"initialize\",\n            \"docs\": [\n                \"initialize new vault\"\n            ],\n            \"discriminator\": [\n                175,\n                175,\n                109,\n                31,\n                13,\n                152,\n                155,\n                237\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"This is base account for all vault\",\n                        \"No need base key now because we only allow 1 vault per token now\",\n                        \"Vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Payer can be anyone\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"Token vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_mint\",\n                    \"docs\": [\n                        \"Token mint account\"\n                    ]\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"rent\",\n                    \"docs\": [\n                        \"rent\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"system_program\"\n                    ]\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"enable_vault\",\n            \"docs\": [\n                \"enable vault\"\n            ],\n            \"discriminator\": [\n                145,\n                82,\n                241,\n                156,\n                26,\n                154,\n                233,\n                211\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"Vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"Admin account\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"enabled\",\n                    \"type\": \"u8\"\n                }\n            ]\n        },\n        {\n            \"name\": \"set_operator\",\n            \"docs\": [\n                \"set new operator\"\n            ],\n            \"discriminator\": [\n                238,\n                153,\n                101,\n                169,\n                243,\n                131,\n                36,\n                1\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"Vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"operator\"\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"admin\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"initialize_strategy\",\n            \"docs\": [\n                \"Initialize a strategy and add strategy to vault.strategies index\"\n            ],\n            \"discriminator\": [\n                208,\n                119,\n                144,\n                145,\n                178,\n                57,\n                105,\n                252\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"Vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy_program\"\n                },\n                {\n                    \"name\": \"strategy\",\n                    \"docs\": [\n                        \"Strategy account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reserve\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"collateral_vault\",\n                    \"docs\": [\n                        \"Collateral vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"collateral_mint\",\n                    \"docs\": [\n                        \"Collateral mint account\"\n                    ]\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"Admin account\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"System program account\"\n                    ]\n                },\n                {\n                    \"name\": \"rent\",\n                    \"docs\": [\n                        \"Rent account\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program account\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"bumps\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"StrategyBumps\"\n                        }\n                    }\n                },\n                {\n                    \"name\": \"strategy_type\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"StrategyType\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"remove_strategy\",\n            \"docs\": [\n                \"remove a strategy\"\n            ],\n            \"discriminator\": [\n                185,\n                238,\n                33,\n                91,\n                134,\n                210,\n                97,\n                26\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"Vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy\",\n                    \"docs\": [\n                        \"Strategy account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy_program\"\n                },\n                {\n                    \"name\": \"collateral_vault\",\n                    \"docs\": [\n                        \"Collateral vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reserve\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"token_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"fee_vault\",\n                    \"docs\": [\n                        \"fee_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"lp_mint\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"admin\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"remove_strategy2\",\n            \"docs\": [\n                \"remove a strategy by advance payment\"\n            ],\n            \"discriminator\": [\n                138,\n                104,\n                208,\n                148,\n                126,\n                35,\n                195,\n                14\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"Vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy\",\n                    \"docs\": [\n                        \"Strategy account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy_program\"\n                },\n                {\n                    \"name\": \"collateral_vault\",\n                    \"docs\": [\n                        \"Collateral vault account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reserve\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"token_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_admin_advance_payment\",\n                    \"docs\": [\n                        \"token_advance_payemnt\",\n                        \"the owner of token_advance_payment must be admin\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_vault_advance_payment\",\n                    \"docs\": [\n                        \"token_vault_advance_payment\",\n                        \"the account must be different from token_vault\",\n                        \"the owner of token_advance_payment must be vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"fee_vault\",\n                    \"docs\": [\n                        \"fee_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"lp_mint\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"admin\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"max_admin_pay_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"collect_dust\",\n            \"docs\": [\n                \"collect token, that someone send wrongly\",\n                \"also help in case Mango reimbursement\"\n            ],\n            \"discriminator\": [\n                246,\n                149,\n                21,\n                82,\n                160,\n                74,\n                254,\n                240\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"vault\"\n                    ]\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"Token vault, must be different from vault.token_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_admin\",\n                    \"docs\": [\n                        \"token admin, enforce owner is admin to avoid mistake\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"admin\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"add_strategy\",\n            \"docs\": [\n                \"add a strategy\"\n            ],\n            \"discriminator\": [\n                64,\n                123,\n                127,\n                227,\n                192,\n                234,\n                198,\n                20\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy\",\n                    \"docs\": [\n                        \"strategy\"\n                    ]\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"admin\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"deposit_strategy\",\n            \"docs\": [\n                \"deposit liquidity to a strategy\"\n            ],\n            \"discriminator\": [\n                246,\n                82,\n                57,\n                226,\n                131,\n                222,\n                253,\n                249\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy\",\n                    \"docs\": [\n                        \"strategy\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"token_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"fee_vault\",\n                    \"docs\": [\n                        \"fee_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"lp_mint\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy_program\"\n                },\n                {\n                    \"name\": \"collateral_vault\",\n                    \"docs\": [\n                        \"collateral_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reserve\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                },\n                {\n                    \"name\": \"operator\",\n                    \"docs\": [\n                        \"operator\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"withdraw_strategy\",\n            \"docs\": [\n                \"withdraw liquidity from a strategy\"\n            ],\n            \"discriminator\": [\n                31,\n                45,\n                162,\n                5,\n                193,\n                217,\n                134,\n                188\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy\",\n                    \"docs\": [\n                        \"strategy\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"token_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"fee_vault\",\n                    \"docs\": [\n                        \"fee_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"lp_mint\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy_program\"\n                },\n                {\n                    \"name\": \"collateral_vault\",\n                    \"docs\": [\n                        \"collateral_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reserve\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                },\n                {\n                    \"name\": \"operator\",\n                    \"docs\": [\n                        \"operator\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"withdraw2\",\n            \"docs\": [\n                \"Withdraw v2. Withdraw from token vault if no remaining accounts are available. Else, it will attempt to withdraw from strategy and token vault. This method just proxy between 2 methods. Protocol integration should be using withdraw instead of this function.\"\n            ],\n            \"discriminator\": [\n                80,\n                6,\n                111,\n                73,\n                174,\n                211,\n                66,\n                132\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"token_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"lp_mint\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_token\",\n                    \"docs\": [\n                        \"user_token\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_lp\",\n                    \"docs\": [\n                        \"user_lp\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"user\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"unmint_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"min_out_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"deposit\",\n            \"docs\": [\n                \"user deposit liquidity to vault\"\n            ],\n            \"discriminator\": [\n                242,\n                35,\n                198,\n                137,\n                82,\n                225,\n                242,\n                182\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"token_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"lp_mint\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_token\",\n                    \"docs\": [\n                        \"user_token\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_lp\",\n                    \"docs\": [\n                        \"user_lp\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"user\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"token_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"minimum_lp_token_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"withdraw\",\n            \"docs\": [\n                \"user withdraw liquidity from vault\"\n            ],\n            \"discriminator\": [\n                183,\n                18,\n                70,\n                156,\n                148,\n                109,\n                161,\n                34\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"token_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"lp_mint\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_token\",\n                    \"docs\": [\n                        \"user_token\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_lp\",\n                    \"docs\": [\n                        \"user_lp\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"user\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"unmint_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"min_out_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"withdraw_directly_from_strategy\",\n            \"docs\": [\n                \"user withdraw liquidity from vault, if vault reserve doesn't have enough liquidity, it will withdraw from the strategy firstly\"\n            ],\n            \"discriminator\": [\n                201,\n                141,\n                146,\n                46,\n                173,\n                116,\n                198,\n                22\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"vault\",\n                    \"docs\": [\n                        \"vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy\",\n                    \"docs\": [\n                        \"strategy\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reserve\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"strategy_program\"\n                },\n                {\n                    \"name\": \"collateral_vault\",\n                    \"docs\": [\n                        \"collateral_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_vault\",\n                    \"docs\": [\n                        \"token_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"lp_mint\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"fee_vault\",\n                    \"docs\": [\n                        \"fee_vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_token\",\n                    \"docs\": [\n                        \"user_token\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_lp\",\n                    \"docs\": [\n                        \"user_lp\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"user\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"token_program\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"unmint_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"min_out_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        }\n    ],\n    \"accounts\": [\n        {\n            \"name\": \"Vault\",\n            \"discriminator\": [\n                211,\n                8,\n                232,\n                43,\n                2,\n                152,\n                117,\n                119\n            ]\n        },\n        {\n            \"name\": \"Strategy\",\n            \"discriminator\": [\n                174,\n                110,\n                39,\n                119,\n                82,\n                106,\n                169,\n                102\n            ]\n        }\n    ],\n    \"events\": [\n        {\n            \"name\": \"AddLiquidity\",\n            \"discriminator\": [\n                31,\n                94,\n                125,\n                90,\n                227,\n                52,\n                61,\n                186\n            ]\n        },\n        {\n            \"name\": \"RemoveLiquidity\",\n            \"discriminator\": [\n                116,\n                244,\n                97,\n                232,\n                103,\n                31,\n                152,\n                58\n            ]\n        },\n        {\n            \"name\": \"StrategyDeposit\",\n            \"discriminator\": [\n                205,\n                53,\n                91,\n                239,\n                34,\n                136,\n                73,\n                47\n            ]\n        },\n        {\n            \"name\": \"StrategyWithdraw\",\n            \"discriminator\": [\n                120,\n                76,\n                208,\n                95,\n                221,\n                210,\n                229,\n                189\n            ]\n        },\n        {\n            \"name\": \"ClaimReward\",\n            \"discriminator\": [\n                148,\n                116,\n                134,\n                204,\n                22,\n                171,\n                85,\n                95\n            ]\n        },\n        {\n            \"name\": \"PerformanceFee\",\n            \"discriminator\": [\n                28,\n                70,\n                231,\n                223,\n                81,\n                109,\n                239,\n                167\n            ]\n        },\n        {\n            \"name\": \"ReportLoss\",\n            \"discriminator\": [\n                154,\n                36,\n                158,\n                196,\n                32,\n                163,\n                123,\n                126\n            ]\n        },\n        {\n            \"name\": \"TotalAmount\",\n            \"discriminator\": [\n                92,\n                200,\n                122,\n                145,\n                211,\n                203,\n                49,\n                205\n            ]\n        }\n    ],\n    \"errors\": [\n        {\n            \"code\": 6000,\n            \"name\": \"VaultIsDisabled\",\n            \"msg\": \"Vault is disabled\"\n        },\n        {\n            \"code\": 6001,\n            \"name\": \"ExceededSlippage\",\n            \"msg\": \"Exceeded slippage tolerance\"\n        },\n        {\n            \"code\": 6002,\n            \"name\": \"StrategyIsNotExisted\",\n            \"msg\": \"Strategy is not existed\"\n        },\n        {\n            \"code\": 6003,\n            \"name\": \"UnAuthorized\",\n            \"msg\": \"UnAuthorized\"\n        },\n        {\n            \"code\": 6004,\n            \"name\": \"MathOverflow\",\n            \"msg\": \"Math operation overflow\"\n        },\n        {\n            \"code\": 6005,\n            \"name\": \"ProtocolIsNotSupported\",\n            \"msg\": \"Protocol is not supported\"\n        },\n        {\n            \"code\": 6006,\n            \"name\": \"UnMatchReserve\",\n            \"msg\": \"Reserve does not support token mint\"\n        },\n        {\n            \"code\": 6007,\n            \"name\": \"InvalidLockedProfitDegradation\",\n            \"msg\": \"lockedProfitDegradation is invalid\"\n        },\n        {\n            \"code\": 6008,\n            \"name\": \"MaxStrategyReached\",\n            \"msg\": \"Maximum number of strategies have been reached\"\n        },\n        {\n            \"code\": 6009,\n            \"name\": \"StrategyExisted\",\n            \"msg\": \"Strategy existed\"\n        },\n        {\n            \"code\": 6010,\n            \"name\": \"InvalidUnmintAmount\",\n            \"msg\": \"Invalid unmint amount\"\n        },\n        {\n            \"code\": 6011,\n            \"name\": \"InvalidAccountsForStrategy\",\n            \"msg\": \"Invalid accounts for strategy\"\n        },\n        {\n            \"code\": 6012,\n            \"name\": \"InvalidBump\",\n            \"msg\": \"Invalid bump\"\n        },\n        {\n            \"code\": 6013,\n            \"name\": \"AmountMustGreaterThanZero\",\n            \"msg\": \"Amount must be greater than 0\"\n        },\n        {\n            \"code\": 6014,\n            \"name\": \"MangoIsNotSupportedAnymore\",\n            \"msg\": \"Mango is not supported anymore\"\n        },\n        {\n            \"code\": 6015,\n            \"name\": \"StrategyIsNotSupported\",\n            \"msg\": \"Strategy is not supported\"\n        },\n        {\n            \"code\": 6016,\n            \"name\": \"PayAmountIsExeeced\",\n            \"msg\": \"Pay amount is exceeded\"\n        },\n        {\n            \"code\": 6017,\n            \"name\": \"FeeVaultIsNotSet\",\n            \"msg\": \"Fee vault is not set\"\n        },\n        {\n            \"code\": 6018,\n            \"name\": \"LendingAssertionViolation\",\n            \"msg\": \"deposit amount in lending is not matched\"\n        },\n        {\n            \"code\": 6019,\n            \"name\": \"HaveMoneyInLending\",\n            \"msg\": \"Cannot remove strategy becase we have some in lending\"\n        }\n    ],\n    \"types\": [\n        {\n            \"name\": \"VaultBumps\",\n            \"docs\": [\n                \"Vault bumps struct\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"vault_bump\",\n                        \"docs\": [\n                            \"vault_bump\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"token_vault_bump\",\n                        \"docs\": [\n                            \"token_vault_bump\"\n                        ],\n                        \"type\": \"u8\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"StrategyBumps\",\n            \"docs\": [\n                \"Strategy bumps struct\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"strategy_index\",\n                        \"docs\": [\n                            \"strategy_index\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"other_bumps\",\n                        \"docs\": [\n                            \"Bumps of PDAs for the integrated protocol.\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                10\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"LockedProfitTracker\",\n            \"docs\": [\n                \"LockedProfitTracker struct\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"last_updated_locked_profit\",\n                        \"docs\": [\n                            \"The total locked profit from the last report\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"last_report\",\n                        \"docs\": [\n                            \"The last timestamp (in seconds) rebalancing\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"locked_profit_degradation\",\n                        \"docs\": [\n                            \"Rate per second of degradation\"\n                        ],\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"StrategyType\",\n            \"docs\": [\n                \"StrategyType struct\"\n            ],\n            \"type\": {\n                \"kind\": \"enum\",\n                \"variants\": [\n                    {\n                        \"name\": \"PortFinanceWithoutLM\"\n                    },\n                    {\n                        \"name\": \"PortFinanceWithLM\"\n                    },\n                    {\n                        \"name\": \"SolendWithoutLM\"\n                    },\n                    {\n                        \"name\": \"Mango\"\n                    },\n                    {\n                        \"name\": \"SolendWithLM\"\n                    },\n                    {\n                        \"name\": \"ApricotWithoutLM\"\n                    },\n                    {\n                        \"name\": \"Francium\"\n                    },\n                    {\n                        \"name\": \"Tulip\"\n                    },\n                    {\n                        \"name\": \"Vault\"\n                    },\n                    {\n                        \"name\": \"Drift\"\n                    },\n                    {\n                        \"name\": \"Frakt\"\n                    },\n                    {\n                        \"name\": \"Marginfi\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Vault\",\n            \"docs\": [\n                \"Vault struct\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"enabled\",\n                        \"docs\": [\n                            \"The flag, if admin set enable = false, then the user can only withdraw and cannot deposit in the vault.\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"bumps\",\n                        \"docs\": [\n                            \"Vault nonce, to create vault seeds\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"VaultBumps\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"total_amount\",\n                        \"docs\": [\n                            \"The total liquidity of the vault, including remaining tokens in token_vault and the liquidity in all strategies.\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_vault\",\n                        \"docs\": [\n                            \"Token account, hold liquidity in vault reserve\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"fee_vault\",\n                        \"docs\": [\n                            \"Hold lp token of vault, each time rebalance crank is called, vault calculate performance fee and mint corresponding lp token amount to fee_vault. fee_vault is owned by treasury address\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_mint\",\n                        \"docs\": [\n                            \"Token mint that vault supports\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"lp_mint\",\n                        \"docs\": [\n                            \"Lp mint of vault\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"strategies\",\n                        \"docs\": [\n                            \"The list of strategy addresses that vault supports, vault can support up to MAX_STRATEGY strategies at the same time.\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"pubkey\",\n                                30\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"base\",\n                        \"docs\": [\n                            \"The base address to create vault seeds\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"admin\",\n                        \"docs\": [\n                            \"Admin of vault\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"operator\",\n                        \"docs\": [\n                            \"Person who can send the crank. Operator can only send liquidity to strategies that admin defined, and claim reward to account of treasury address\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"locked_profit_tracker\",\n                        \"docs\": [\n                            \"Stores information for locked profit.\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"LockedProfitTracker\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Strategy\",\n            \"docs\": [\n                \"Strategy struct\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"reserve\",\n                        \"docs\": [\n                            \"Lending pool address, that the strategy will deposit/withdraw balance\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"collateral_vault\",\n                        \"docs\": [\n                            \"The token account, that holds the collateral token\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"strategy_type\",\n                        \"docs\": [\n                            \"Specify type of strategy\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"StrategyType\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"current_liquidity\",\n                        \"docs\": [\n                            \"The liquidity in strategy at the time vault deposit/withdraw from a lending protocol\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"bumps\",\n                        \"docs\": [\n                            \"Hold some bumps, in case the strategy needs to use other seeds to sign a CPI call.\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                10\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"vault\",\n                        \"docs\": [\n                            \"Vault address, that the strategy belongs\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"is_disable\",\n                        \"docs\": [\n                            \"If we remove strategy by remove_strategy2 endpoint, this account will be never added again\"\n                        ],\n                        \"type\": \"u8\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"AddLiquidity\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"lp_mint_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"RemoveLiquidity\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"lp_unmint_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"StrategyDeposit\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"strategy_type\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"StrategyType\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"token_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"StrategyWithdraw\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"strategy_type\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"StrategyType\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"collateral_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"estimated_token_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"ClaimReward\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"strategy_type\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"StrategyType\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"token_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"mint_account\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PerformanceFee\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"lp_mint_more\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"ReportLoss\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"strategy\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"loss\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"TotalAmount\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"total_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        }\n    ]\n}","{\n    \"address\": \"Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB\",\n    \"metadata\": {\n        \"name\": \"amm\",\n        \"version\": \"0.5.3\",\n        \"spec\": \"0.1.0\"\n    },\n    \"docs\": [\n        \"Program for AMM\"\n    ],\n    \"instructions\": [\n        {\n            \"name\": \"initialize_permissioned_pool\",\n            \"docs\": [\n                \"Initialize a new permissioned pool.\"\n            ],\n            \"discriminator\": [\n                77,\n                85,\n                178,\n                157,\n                50,\n                48,\n                212,\n                126\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (arbitrary address)\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"Token A mint of the pool. Eg: USDT\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"Token B mint of the pool. Eg: USDC\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin_token_a\",\n                    \"docs\": [\n                        \"Admin token account for pool token A mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin_token_b\",\n                    \"docs\": [\n                        \"Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin_pool_lp\",\n                    \"docs\": [\n                        \"Admin pool LP token account. Used to receive LP during first deposit (initialize pool)\",\n                        \"Admin pool LP token account. Used to receive LP during first deposit (initialize pool)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_a_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token A. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_b_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token B. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"fee_owner\"\n                },\n                {\n                    \"name\": \"rent\",\n                    \"docs\": [\n                        \"Rent account.\"\n                    ]\n                },\n                {\n                    \"name\": \"mint_metadata\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"metadata_program\"\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. The pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"associated_token_program\",\n                    \"docs\": [\n                        \"Associated token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"System program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"curve_type\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"CurveType\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"initialize_permissionless_pool\",\n            \"docs\": [\n                \"Initialize a new permissionless pool.\"\n            ],\n            \"discriminator\": [\n                118,\n                173,\n                41,\n                157,\n                173,\n                72,\n                97,\n                103\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA address)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"Token A mint of the pool. Eg: USDT\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"Token B mint of the pool. Eg: USDC\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_a\",\n                    \"docs\": [\n                        \"Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_b\",\n                    \"docs\": [\n                        \"Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_pool_lp\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_a_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token A. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_b_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token B. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"fee_owner\"\n                },\n                {\n                    \"name\": \"rent\",\n                    \"docs\": [\n                        \"Rent account.\"\n                    ]\n                },\n                {\n                    \"name\": \"mint_metadata\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"metadata_program\"\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. The pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"associated_token_program\",\n                    \"docs\": [\n                        \"Associated token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"System program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"curve_type\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"CurveType\"\n                        }\n                    }\n                },\n                {\n                    \"name\": \"token_a_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_b_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"initialize_permissionless_pool_with_fee_tier\",\n            \"docs\": [\n                \"Initialize a new permissionless pool with customized fee tier\"\n            ],\n            \"discriminator\": [\n                6,\n                135,\n                68,\n                147,\n                229,\n                82,\n                169,\n                113\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA address)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"Token A mint of the pool. Eg: USDT\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"Token B mint of the pool. Eg: USDC\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_a\",\n                    \"docs\": [\n                        \"Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_b\",\n                    \"docs\": [\n                        \"Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_pool_lp\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_a_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token A. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_b_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token B. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"fee_owner\"\n                },\n                {\n                    \"name\": \"rent\",\n                    \"docs\": [\n                        \"Rent account.\"\n                    ]\n                },\n                {\n                    \"name\": \"mint_metadata\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"metadata_program\"\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. The pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"associated_token_program\",\n                    \"docs\": [\n                        \"Associated token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"System program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"curve_type\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"CurveType\"\n                        }\n                    }\n                },\n                {\n                    \"name\": \"trade_fee_bps\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_a_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_b_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"enable_or_disable_pool\",\n            \"docs\": [\n                \"Enable or disable a pool. A disabled pool allow only remove balanced liquidity operation.\"\n            ],\n            \"discriminator\": [\n                128,\n                6,\n                228,\n                131,\n                55,\n                161,\n                52,\n                169\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"Admin account. Must be owner of the pool.\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"enable\",\n                    \"type\": \"bool\"\n                }\n            ]\n        },\n        {\n            \"name\": \"swap\",\n            \"docs\": [\n                \"Swap token A to B, or vice versa. An amount of trading fee will be charged for liquidity provider, and the admin of the pool.\"\n            ],\n            \"discriminator\": [\n                248,\n                198,\n                158,\n                145,\n                225,\n                117,\n                135,\n                200\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_source_token\",\n                    \"docs\": [\n                        \"User token account. Token from this account will be transfer into the vault by the pool in exchange for another token of the pool.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_destination_token\",\n                    \"docs\": [\n                        \"User token account. The exchanged token will be transfer into this account from the pool.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"Lp token mint of vault a\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"Lp token mint of vault b\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account. Used to receive trading fee. It's mint field must matched with user_source_token mint field.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"User account. Must be owner of user_source_token.\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. the pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"in_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"minimum_out_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"remove_liquidity_single_side\",\n            \"docs\": [\n                \"Withdraw only single token from the pool. Only supported by pool with stable swap curve.\"\n            ],\n            \"discriminator\": [\n                84,\n                84,\n                177,\n                66,\n                254,\n                185,\n                10,\n                251\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_pool_lp\",\n                    \"docs\": [\n                        \"User pool lp token account. LP will be burned from this account upon success liquidity removal.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_destination_token\",\n                    \"docs\": [\n                        \"User token account to receive token upon success liquidity removal.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"User account. Must be owner of the user_pool_lp account.\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. The pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"pool_token_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"minimum_out_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"add_imbalance_liquidity\",\n            \"docs\": [\n                \"Deposit tokens to the pool in an imbalance ratio. Only supported by pool with stable swap curve.\"\n            ],\n            \"discriminator\": [\n                79,\n                35,\n                122,\n                84,\n                173,\n                15,\n                93,\n                191\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_pool_lp\",\n                    \"docs\": [\n                        \"user pool lp token account. lp will be burned from this account upon success liquidity removal.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault a\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault b\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_a_token\",\n                    \"docs\": [\n                        \"User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_b_token\",\n                    \"docs\": [\n                        \"User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"User account. Must be owner of user_a_token, and user_b_token.\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. the pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"minimum_pool_token_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_a_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_b_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"remove_balance_liquidity\",\n            \"docs\": [\n                \"Withdraw tokens from the pool in a balanced ratio. User will still able to withdraw from pool even the pool is disabled. This allow user to exit their liquidity when there's some unforeseen event happen.\"\n            ],\n            \"discriminator\": [\n                133,\n                109,\n                44,\n                179,\n                56,\n                238,\n                114,\n                33\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_pool_lp\",\n                    \"docs\": [\n                        \"user pool lp token account. lp will be burned from this account upon success liquidity removal.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault a\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault b\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_a_token\",\n                    \"docs\": [\n                        \"User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_b_token\",\n                    \"docs\": [\n                        \"User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"User account. Must be owner of user_a_token, and user_b_token.\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. the pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"pool_token_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"minimum_a_token_out\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"minimum_b_token_out\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"add_balance_liquidity\",\n            \"docs\": [\n                \"Deposit tokens to the pool in a balanced ratio.\"\n            ],\n            \"discriminator\": [\n                168,\n                227,\n                50,\n                62,\n                189,\n                171,\n                84,\n                176\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_pool_lp\",\n                    \"docs\": [\n                        \"user pool lp token account. lp will be burned from this account upon success liquidity removal.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault a\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault b\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_a_token\",\n                    \"docs\": [\n                        \"User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_b_token\",\n                    \"docs\": [\n                        \"User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"User account. Must be owner of user_a_token, and user_b_token.\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. the pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"pool_token_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"maximum_token_a_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"maximum_token_b_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"set_pool_fees\",\n            \"docs\": [\n                \"Update trading fee charged for liquidity provider, and admin.\"\n            ],\n            \"discriminator\": [\n                102,\n                44,\n                158,\n                54,\n                205,\n                37,\n                126,\n                78\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"fee_operator\",\n                    \"docs\": [\n                        \"Fee operator account\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"fees\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"PoolFees\"\n                        }\n                    }\n                },\n                {\n                    \"name\": \"new_partner_fee_numerator\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"override_curve_param\",\n            \"docs\": [\n                \"Update swap curve parameters. This function do not allow update of curve type. For example: stable swap curve to constant product curve. Only supported by pool with stable swap curve.\",\n                \"Only amp is allowed to be override. The other attributes of stable swap curve will be ignored.\"\n            ],\n            \"discriminator\": [\n                98,\n                86,\n                204,\n                51,\n                94,\n                71,\n                69,\n                187\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"Admin account.\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"curve_type\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"CurveType\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"get_pool_info\",\n            \"docs\": [\n                \"Get the general information of the pool.\"\n            ],\n            \"discriminator\": [\n                9,\n                48,\n                220,\n                101,\n                22,\n                240,\n                78,\n                200\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ]\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.\"\n                    ]\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault a\"\n                    ]\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault b\"\n                    ]\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"bootstrap_liquidity\",\n            \"docs\": [\n                \"Bootstrap the pool when liquidity is depleted.\"\n            ],\n            \"discriminator\": [\n                4,\n                228,\n                215,\n                71,\n                225,\n                253,\n                119,\n                206\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_pool_lp\",\n                    \"docs\": [\n                        \"user pool lp token account. lp will be burned from this account upon success liquidity removal.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault a\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault b\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_a_token\",\n                    \"docs\": [\n                        \"User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_b_token\",\n                    \"docs\": [\n                        \"User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user\",\n                    \"docs\": [\n                        \"User account. Must be owner of user_a_token, and user_b_token.\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. the pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"token_a_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_b_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"create_mint_metadata\",\n            \"docs\": [\n                \"Create mint metadata account for old pools\"\n            ],\n            \"discriminator\": [\n                13,\n                70,\n                168,\n                41,\n                250,\n                100,\n                148,\n                90\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account\"\n                    ]\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP mint account of the pool\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"Vault A LP account of the pool\"\n                    ]\n                },\n                {\n                    \"name\": \"mint_metadata\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"metadata_program\"\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"System program.\"\n                    ]\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Payer\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"create_lock_escrow\",\n            \"docs\": [\n                \"Create lock account\"\n            ],\n            \"discriminator\": [\n                54,\n                87,\n                165,\n                19,\n                69,\n                227,\n                218,\n                224\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account\"\n                    ]\n                },\n                {\n                    \"name\": \"lock_escrow\",\n                    \"docs\": [\n                        \"Lock account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"owner\"\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ]\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Payer account\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"System program.\"\n                    ]\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"lock\",\n            \"docs\": [\n                \"Lock Lp token\"\n            ],\n            \"discriminator\": [\n                21,\n                19,\n                208,\n                43,\n                237,\n                62,\n                255,\n                87\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ]\n                },\n                {\n                    \"name\": \"lock_escrow\",\n                    \"docs\": [\n                        \"Lock account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"Can be anyone\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"source_tokens\",\n                    \"docs\": [\n                        \"owner lp token account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"escrow_vault\",\n                    \"docs\": [\n                        \"Escrow vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.\"\n                    ]\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault a\"\n                    ]\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault b\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"max_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"claim_fee\",\n            \"docs\": [\n                \"Claim fee\"\n            ],\n            \"discriminator\": [\n                169,\n                32,\n                79,\n                137,\n                136,\n                232,\n                70,\n                137\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lock_escrow\",\n                    \"docs\": [\n                        \"Lock account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"Owner of lock account\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"source_tokens\",\n                    \"docs\": [\n                        \"owner lp token account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"escrow_vault\",\n                    \"docs\": [\n                        \"Escrow vault\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token a. token a of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token b. token b of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault a\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault b\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_a_token\",\n                    \"docs\": [\n                        \"User token A account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"user_b_token\",\n                    \"docs\": [\n                        \"User token B account. Token will be transfer from this account if it is add liquidity operation. Else, token will be transfer into this account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. the pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"max_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"create_config\",\n            \"docs\": [\n                \"Create config\"\n            ],\n            \"discriminator\": [\n                201,\n                207,\n                243,\n                114,\n                75,\n                111,\n                47,\n                189\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"config\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"system_program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"config_parameters\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"ConfigParameters\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"close_config\",\n            \"docs\": [\n                \"Close config\"\n            ],\n            \"discriminator\": [\n                145,\n                9,\n                72,\n                157,\n                95,\n                125,\n                61,\n                85\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"config\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"rent_receiver\",\n                    \"writable\": true\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"initialize_permissionless_constant_product_pool_with_config\",\n            \"docs\": [\n                \"Initialize permissionless pool with config\"\n            ],\n            \"discriminator\": [\n                7,\n                166,\n                138,\n                171,\n                206,\n                171,\n                236,\n                244\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA address)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"config\"\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"Token A mint of the pool. Eg: USDT\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"Token B mint of the pool. Eg: USDC\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_a\",\n                    \"docs\": [\n                        \"Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_b\",\n                    \"docs\": [\n                        \"Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_pool_lp\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_a_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token A. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_b_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token B. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"rent\",\n                    \"docs\": [\n                        \"Rent account.\"\n                    ]\n                },\n                {\n                    \"name\": \"mint_metadata\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"metadata_program\"\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. The pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"associated_token_program\",\n                    \"docs\": [\n                        \"Associated token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"System program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"token_a_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_b_amount\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"initialize_permissionless_constant_product_pool_with_config2\",\n            \"docs\": [\n                \"Initialize permissionless pool with config 2\"\n            ],\n            \"discriminator\": [\n                48,\n                149,\n                220,\n                130,\n                61,\n                11,\n                9,\n                178\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA address)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"config\"\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"Token A mint of the pool. Eg: USDT\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"Token B mint of the pool. Eg: USDC\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_a\",\n                    \"docs\": [\n                        \"Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_b\",\n                    \"docs\": [\n                        \"Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_pool_lp\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_a_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token A. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_b_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token B. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"rent\",\n                    \"docs\": [\n                        \"Rent account.\"\n                    ]\n                },\n                {\n                    \"name\": \"mint_metadata\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"metadata_program\"\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. The pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"associated_token_program\",\n                    \"docs\": [\n                        \"Associated token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"System program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"token_a_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_b_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"activation_point\",\n                    \"type\": {\n                        \"option\": \"u64\"\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"initialize_customizable_permissionless_constant_product_pool\",\n            \"docs\": [\n                \"Initialize permissionless pool with customizable params\"\n            ],\n            \"discriminator\": [\n                145,\n                24,\n                172,\n                194,\n                219,\n                125,\n                3,\n                190\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA address)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of the pool\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"Token A mint of the pool. Eg: USDT\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"Token B mint of the pool. Eg: USDC\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault\",\n                    \"docs\": [\n                        \"Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault\",\n                    \"docs\": [\n                        \"Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_token_vault\",\n                    \"docs\": [\n                        \"Token vault account of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault A\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp_mint\",\n                    \"docs\": [\n                        \"LP token mint of vault B\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"b_vault_lp\",\n                    \"docs\": [\n                        \"LP token account of vault B. Used to receive/burn vault LP upon deposit/withdraw from the vault.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_a\",\n                    \"docs\": [\n                        \"Payer token account for pool token A mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_b\",\n                    \"docs\": [\n                        \"Admin token account for pool token B mint. Used to bootstrap the pool with initial liquidity.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_pool_lp\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_a_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token A. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_b_fee\",\n                    \"docs\": [\n                        \"Protocol fee token account for token B. Used to receive trading fee.\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Admin account. This account will be the admin of the pool, and the payer for PDA during initialize pool.\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"rent\",\n                    \"docs\": [\n                        \"Rent account.\"\n                    ]\n                },\n                {\n                    \"name\": \"mint_metadata\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"metadata_program\"\n                },\n                {\n                    \"name\": \"vault_program\",\n                    \"docs\": [\n                        \"Vault program. The pool will deposit/withdraw liquidity from the vault.\"\n                    ]\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"associated_token_program\",\n                    \"docs\": [\n                        \"Associated token program.\"\n                    ]\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"docs\": [\n                        \"System program.\"\n                    ]\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"token_a_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_b_amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"params\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"CustomizableParams\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"update_activation_point\",\n            \"docs\": [\n                \"Update activation slot\"\n            ],\n            \"discriminator\": [\n                150,\n                62,\n                125,\n                219,\n                171,\n                220,\n                26,\n                237\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"docs\": [\n                        \"Admin account.\"\n                    ],\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"new_activation_point\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"withdraw_protocol_fees\",\n            \"docs\": [\n                \"Withdraw protocol fee\"\n            ],\n            \"discriminator\": [\n                11,\n                68,\n                165,\n                98,\n                18,\n                208,\n                134,\n                73\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ]\n                },\n                {\n                    \"name\": \"a_vault_lp\"\n                },\n                {\n                    \"name\": \"protocol_token_a_fee\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_b_fee\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"treasury_token_a\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"treasury_token_b\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_program\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"set_whitelisted_vault\",\n            \"docs\": [\n                \"Set whitelisted vault\"\n            ],\n            \"discriminator\": [\n                12,\n                148,\n                94,\n                42,\n                55,\n                57,\n                83,\n                247\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"whitelisted_vault\",\n                    \"type\": \"pubkey\"\n                }\n            ]\n        },\n        {\n            \"name\": \"partner_claim_fee\",\n            \"docs\": [\n                \"Partner claim fee\"\n            ],\n            \"discriminator\": [\n                57,\n                53,\n                176,\n                30,\n                123,\n                70,\n                52,\n                64\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account (PDA)\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"a_vault_lp\"\n                },\n                {\n                    \"name\": \"protocol_token_a_fee\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"protocol_token_b_fee\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"partner_token_a\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"partner_token_b\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_program\"\n                },\n                {\n                    \"name\": \"partner_authority\",\n                    \"signer\": true\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"max_amount_a\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"max_amount_b\",\n                    \"type\": \"u64\"\n                }\n            ]\n        }\n    ],\n    \"accounts\": [\n        {\n            \"name\": \"Config\",\n            \"discriminator\": [\n                155,\n                12,\n                170,\n                224,\n                30,\n                250,\n                204,\n                130\n            ]\n        },\n        {\n            \"name\": \"LockEscrow\",\n            \"discriminator\": [\n                190,\n                106,\n                121,\n                6,\n                200,\n                182,\n                21,\n                75\n            ]\n        },\n        {\n            \"name\": \"Pool\",\n            \"discriminator\": [\n                241,\n                154,\n                109,\n                4,\n                17,\n                177,\n                109,\n                188\n            ]\n        }\n    ],\n    \"events\": [\n        {\n            \"name\": \"AddLiquidity\",\n            \"discriminator\": [\n                31,\n                94,\n                125,\n                90,\n                227,\n                52,\n                61,\n                186\n            ]\n        },\n        {\n            \"name\": \"RemoveLiquidity\",\n            \"discriminator\": [\n                116,\n                244,\n                97,\n                232,\n                103,\n                31,\n                152,\n                58\n            ]\n        },\n        {\n            \"name\": \"BootstrapLiquidity\",\n            \"discriminator\": [\n                121,\n                127,\n                38,\n                136,\n                92,\n                55,\n                14,\n                247\n            ]\n        },\n        {\n            \"name\": \"Swap\",\n            \"discriminator\": [\n                81,\n                108,\n                227,\n                190,\n                205,\n                208,\n                10,\n                196\n            ]\n        },\n        {\n            \"name\": \"SetPoolFees\",\n            \"discriminator\": [\n                245,\n                26,\n                198,\n                164,\n                88,\n                18,\n                75,\n                9\n            ]\n        },\n        {\n            \"name\": \"PoolInfo\",\n            \"discriminator\": [\n                207,\n                20,\n                87,\n                97,\n                251,\n                212,\n                234,\n                45\n            ]\n        },\n        {\n            \"name\": \"TransferAdmin\",\n            \"discriminator\": [\n                228,\n                169,\n                131,\n                244,\n                61,\n                56,\n                65,\n                254\n            ]\n        },\n        {\n            \"name\": \"OverrideCurveParam\",\n            \"discriminator\": [\n                247,\n                20,\n                165,\n                248,\n                75,\n                5,\n                54,\n                246\n            ]\n        },\n        {\n            \"name\": \"PoolCreated\",\n            \"discriminator\": [\n                202,\n                44,\n                41,\n                88,\n                104,\n                220,\n                157,\n                82\n            ]\n        },\n        {\n            \"name\": \"PoolEnabled\",\n            \"discriminator\": [\n                2,\n                151,\n                18,\n                83,\n                204,\n                134,\n                92,\n                191\n            ]\n        },\n        {\n            \"name\": \"MigrateFeeAccount\",\n            \"discriminator\": [\n                223,\n                234,\n                232,\n                26,\n                252,\n                105,\n                180,\n                125\n            ]\n        },\n        {\n            \"name\": \"CreateLockEscrow\",\n            \"discriminator\": [\n                74,\n                94,\n                106,\n                141,\n                49,\n                17,\n                98,\n                109\n            ]\n        },\n        {\n            \"name\": \"Lock\",\n            \"discriminator\": [\n                220,\n                183,\n                67,\n                215,\n                153,\n                207,\n                56,\n                234\n            ]\n        },\n        {\n            \"name\": \"ClaimFee\",\n            \"discriminator\": [\n                75,\n                122,\n                154,\n                48,\n                140,\n                74,\n                123,\n                163\n            ]\n        },\n        {\n            \"name\": \"CreateConfig\",\n            \"discriminator\": [\n                199,\n                152,\n                10,\n                19,\n                39,\n                39,\n                157,\n                104\n            ]\n        },\n        {\n            \"name\": \"CloseConfig\",\n            \"discriminator\": [\n                249,\n                181,\n                108,\n                89,\n                4,\n                150,\n                90,\n                174\n            ]\n        },\n        {\n            \"name\": \"WithdrawProtocolFees\",\n            \"discriminator\": [\n                30,\n                240,\n                207,\n                196,\n                139,\n                239,\n                79,\n                28\n            ]\n        },\n        {\n            \"name\": \"PartnerClaimFees\",\n            \"discriminator\": [\n                135,\n                131,\n                10,\n                94,\n                119,\n                209,\n                202,\n                48\n            ]\n        }\n    ],\n    \"errors\": [\n        {\n            \"code\": 6000,\n            \"name\": \"MathOverflow\",\n            \"msg\": \"Math operation overflow\"\n        },\n        {\n            \"code\": 6001,\n            \"name\": \"InvalidFee\",\n            \"msg\": \"Invalid fee setup\"\n        },\n        {\n            \"code\": 6002,\n            \"name\": \"InvalidInvariant\",\n            \"msg\": \"Invalid invariant d\"\n        },\n        {\n            \"code\": 6003,\n            \"name\": \"FeeCalculationFailure\",\n            \"msg\": \"Fee calculation failure\"\n        },\n        {\n            \"code\": 6004,\n            \"name\": \"ExceededSlippage\",\n            \"msg\": \"Exceeded slippage tolerance\"\n        },\n        {\n            \"code\": 6005,\n            \"name\": \"InvalidCalculation\",\n            \"msg\": \"Invalid curve calculation\"\n        },\n        {\n            \"code\": 6006,\n            \"name\": \"ZeroTradingTokens\",\n            \"msg\": \"Given pool token amount results in zero trading tokens\"\n        },\n        {\n            \"code\": 6007,\n            \"name\": \"ConversionError\",\n            \"msg\": \"Math conversion overflow\"\n        },\n        {\n            \"code\": 6008,\n            \"name\": \"FaultyLpMint\",\n            \"msg\": \"LP mint authority must be 'A' vault lp, without freeze authority, and 0 supply\"\n        },\n        {\n            \"code\": 6009,\n            \"name\": \"MismatchedTokenMint\",\n            \"msg\": \"Token mint mismatched\"\n        },\n        {\n            \"code\": 6010,\n            \"name\": \"MismatchedLpMint\",\n            \"msg\": \"LP mint mismatched\"\n        },\n        {\n            \"code\": 6011,\n            \"name\": \"MismatchedOwner\",\n            \"msg\": \"Invalid lp token owner\"\n        },\n        {\n            \"code\": 6012,\n            \"name\": \"InvalidVaultAccount\",\n            \"msg\": \"Invalid vault account\"\n        },\n        {\n            \"code\": 6013,\n            \"name\": \"InvalidVaultLpAccount\",\n            \"msg\": \"Invalid vault lp account\"\n        },\n        {\n            \"code\": 6014,\n            \"name\": \"InvalidPoolLpMintAccount\",\n            \"msg\": \"Invalid pool lp mint account\"\n        },\n        {\n            \"code\": 6015,\n            \"name\": \"PoolDisabled\",\n            \"msg\": \"Pool disabled\"\n        },\n        {\n            \"code\": 6016,\n            \"name\": \"InvalidAdminAccount\",\n            \"msg\": \"Invalid admin account\"\n        },\n        {\n            \"code\": 6017,\n            \"name\": \"InvalidProtocolFeeAccount\",\n            \"msg\": \"Invalid protocol fee account\"\n        },\n        {\n            \"code\": 6018,\n            \"name\": \"SameAdminAccount\",\n            \"msg\": \"Same admin account\"\n        },\n        {\n            \"code\": 6019,\n            \"name\": \"IdenticalSourceDestination\",\n            \"msg\": \"Identical user source and destination token account\"\n        },\n        {\n            \"code\": 6020,\n            \"name\": \"ApyCalculationError\",\n            \"msg\": \"Apy calculation error\"\n        },\n        {\n            \"code\": 6021,\n            \"name\": \"InsufficientSnapshot\",\n            \"msg\": \"Insufficient virtual price snapshot\"\n        },\n        {\n            \"code\": 6022,\n            \"name\": \"NonUpdatableCurve\",\n            \"msg\": \"Current curve is non-updatable\"\n        },\n        {\n            \"code\": 6023,\n            \"name\": \"MisMatchedCurve\",\n            \"msg\": \"New curve is mismatched with old curve\"\n        },\n        {\n            \"code\": 6024,\n            \"name\": \"InvalidAmplification\",\n            \"msg\": \"Amplification is invalid\"\n        },\n        {\n            \"code\": 6025,\n            \"name\": \"UnsupportedOperation\",\n            \"msg\": \"Operation is not supported\"\n        },\n        {\n            \"code\": 6026,\n            \"name\": \"ExceedMaxAChanges\",\n            \"msg\": \"Exceed max amplification changes\"\n        },\n        {\n            \"code\": 6027,\n            \"name\": \"InvalidRemainingAccountsLen\",\n            \"msg\": \"Invalid remaining accounts length\"\n        },\n        {\n            \"code\": 6028,\n            \"name\": \"InvalidRemainingAccounts\",\n            \"msg\": \"Invalid remaining account\"\n        },\n        {\n            \"code\": 6029,\n            \"name\": \"MismatchedDepegMint\",\n            \"msg\": \"Token mint B doesn't matches depeg type token mint\"\n        },\n        {\n            \"code\": 6030,\n            \"name\": \"InvalidApyAccount\",\n            \"msg\": \"Invalid APY account\"\n        },\n        {\n            \"code\": 6031,\n            \"name\": \"InvalidTokenMultiplier\",\n            \"msg\": \"Invalid token multiplier\"\n        },\n        {\n            \"code\": 6032,\n            \"name\": \"InvalidDepegInformation\",\n            \"msg\": \"Invalid depeg information\"\n        },\n        {\n            \"code\": 6033,\n            \"name\": \"UpdateTimeConstraint\",\n            \"msg\": \"Update time constraint violated\"\n        },\n        {\n            \"code\": 6034,\n            \"name\": \"ExceedMaxFeeBps\",\n            \"msg\": \"Exceeded max fee bps\"\n        },\n        {\n            \"code\": 6035,\n            \"name\": \"InvalidAdmin\",\n            \"msg\": \"Invalid admin\"\n        },\n        {\n            \"code\": 6036,\n            \"name\": \"PoolIsNotPermissioned\",\n            \"msg\": \"Pool is not permissioned\"\n        },\n        {\n            \"code\": 6037,\n            \"name\": \"InvalidDepositAmount\",\n            \"msg\": \"Invalid deposit amount\"\n        },\n        {\n            \"code\": 6038,\n            \"name\": \"InvalidFeeOwner\",\n            \"msg\": \"Invalid fee owner\"\n        },\n        {\n            \"code\": 6039,\n            \"name\": \"NonDepletedPool\",\n            \"msg\": \"Pool is not depleted\"\n        },\n        {\n            \"code\": 6040,\n            \"name\": \"AmountNotPeg\",\n            \"msg\": \"Token amount is not 1:1\"\n        },\n        {\n            \"code\": 6041,\n            \"name\": \"AmountIsZero\",\n            \"msg\": \"Amount is zero\"\n        },\n        {\n            \"code\": 6042,\n            \"name\": \"TypeCastFailed\",\n            \"msg\": \"Type cast error\"\n        },\n        {\n            \"code\": 6043,\n            \"name\": \"AmountIsNotEnough\",\n            \"msg\": \"Amount is not enough\"\n        },\n        {\n            \"code\": 6044,\n            \"name\": \"InvalidActivationDuration\",\n            \"msg\": \"Invalid activation duration\"\n        },\n        {\n            \"code\": 6045,\n            \"name\": \"PoolIsNotLaunchPool\",\n            \"msg\": \"Pool is not launch pool\"\n        },\n        {\n            \"code\": 6046,\n            \"name\": \"UnableToModifyActivationPoint\",\n            \"msg\": \"Unable to modify activation point\"\n        },\n        {\n            \"code\": 6047,\n            \"name\": \"InvalidAuthorityToCreateThePool\",\n            \"msg\": \"Invalid authority to create the pool\"\n        },\n        {\n            \"code\": 6048,\n            \"name\": \"InvalidActivationType\",\n            \"msg\": \"Invalid activation type\"\n        },\n        {\n            \"code\": 6049,\n            \"name\": \"InvalidActivationPoint\",\n            \"msg\": \"Invalid activation point\"\n        },\n        {\n            \"code\": 6050,\n            \"name\": \"PreActivationSwapStarted\",\n            \"msg\": \"Pre activation swap window started\"\n        },\n        {\n            \"code\": 6051,\n            \"name\": \"InvalidPoolType\",\n            \"msg\": \"Invalid pool type\"\n        },\n        {\n            \"code\": 6052,\n            \"name\": \"InvalidQuoteMint\",\n            \"msg\": \"Quote token must be SOL,USDC\"\n        }\n    ],\n    \"types\": [\n        {\n            \"name\": \"TokenMultiplier\",\n            \"docs\": [\n                \"Multiplier for the pool token. Used to normalized token with different decimal into the same precision.\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"token_a_multiplier\",\n                        \"docs\": [\n                            \"Multiplier for token A of the pool.\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_multiplier\",\n                        \"docs\": [\n                            \"Multiplier for token B of the pool.\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"precision_factor\",\n                        \"docs\": [\n                            \"Record the highest token decimal in the pool. For example, Token A is 6 decimal, token B is 9 decimal. This will save value of 9.\"\n                        ],\n                        \"type\": \"u8\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PoolFees\",\n            \"docs\": [\n                \"Information regarding fee charges\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"trade_fee_numerator\",\n                        \"docs\": [\n                            \"Trade fees are extra token amounts that are held inside the token\",\n                            \"accounts during a trade, making the value of liquidity tokens rise.\",\n                            \"Trade fee numerator\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"trade_fee_denominator\",\n                        \"docs\": [\n                            \"Trade fee denominator\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_trade_fee_numerator\",\n                        \"docs\": [\n                            \"Protocol trading fees are extra token amounts that are held inside the token\",\n                            \"accounts during a trade, with the equivalent in pool tokens minted to\",\n                            \"the protocol of the program.\",\n                            \"Protocol trade fee numerator\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_trade_fee_denominator\",\n                        \"docs\": [\n                            \"Protocol trade fee denominator\"\n                        ],\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Depeg\",\n            \"docs\": [\n                \"Contains information for depeg pool\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"base_virtual_price\",\n                        \"docs\": [\n                            \"The virtual price of staking / interest bearing token\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"base_cache_updated\",\n                        \"docs\": [\n                            \"The last time base_virtual_price is updated\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"depeg_type\",\n                        \"docs\": [\n                            \"Type of the depeg pool\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"DepegType\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"ConfigParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"trade_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_trade_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"activation_duration\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"vault_config_key\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool_creator_authority\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"index\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"partner_fee_numerator\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"CustomizableParams\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"trade_fee_numerator\",\n                        \"docs\": [\n                            \"Trading fee.\"\n                        ],\n                        \"type\": \"u32\"\n                    },\n                    {\n                        \"name\": \"activation_point\",\n                        \"docs\": [\n                            \"The pool start trading.\"\n                        ],\n                        \"type\": {\n                            \"option\": \"u64\"\n                        }\n                    },\n                    {\n                        \"name\": \"has_alpha_vault\",\n                        \"docs\": [\n                            \"Whether the pool support alpha vault\"\n                        ],\n                        \"type\": \"bool\"\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"docs\": [\n                            \"Activation type\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"padding\",\n                        \"docs\": [\n                            \"Padding\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                90\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Padding\",\n            \"docs\": [\n                \"Padding for future pool fields\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"padding0\",\n                        \"docs\": [\n                            \"Padding 0\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                6\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"padding1\",\n                        \"docs\": [\n                            \"Padding 1\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u64\",\n                                21\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"padding2\",\n                        \"docs\": [\n                            \"Padding 2\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u64\",\n                                21\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PartnerInfo\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"partner_authority\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pending_fee_a\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"pending_fee_b\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Bootstrapping\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"activation_point\",\n                        \"docs\": [\n                            \"Activation point, can be slot or timestamp\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"whitelisted_vault\",\n                        \"docs\": [\n                            \"Whitelisted vault to be able to buy pool before activation_point\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool_creator\",\n                        \"docs\": [\n                            \"Need to store pool creator in lauch pool, so they can modify liquidity before activation_point\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"docs\": [\n                            \"Activation type, 0 means by slot, 1 means by timestamp\"\n                        ],\n                        \"type\": \"u8\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"ActivationType\",\n            \"docs\": [\n                \"Type of the activation\"\n            ],\n            \"type\": {\n                \"kind\": \"enum\",\n                \"variants\": [\n                    {\n                        \"name\": \"Slot\"\n                    },\n                    {\n                        \"name\": \"Timestamp\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"RoundDirection\",\n            \"docs\": [\n                \"Rounding direction\"\n            ],\n            \"type\": {\n                \"kind\": \"enum\",\n                \"variants\": [\n                    {\n                        \"name\": \"Floor\"\n                    },\n                    {\n                        \"name\": \"Ceiling\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"TradeDirection\",\n            \"docs\": [\n                \"Trade (swap) direction\"\n            ],\n            \"type\": {\n                \"kind\": \"enum\",\n                \"variants\": [\n                    {\n                        \"name\": \"AtoB\"\n                    },\n                    {\n                        \"name\": \"BtoA\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"NewCurveType\",\n            \"docs\": [\n                \"Type of the swap curve\"\n            ],\n            \"type\": {\n                \"kind\": \"enum\",\n                \"variants\": [\n                    {\n                        \"name\": \"ConstantProduct\"\n                    },\n                    {\n                        \"name\": \"Stable\",\n                        \"fields\": [\n                            {\n                                \"name\": \"amp\",\n                                \"docs\": [\n                                    \"Amplification coefficient\"\n                                ],\n                                \"type\": \"u64\"\n                            },\n                            {\n                                \"name\": \"token_multiplier\",\n                                \"docs\": [\n                                    \"Multiplier for the pool token. Used to normalized token with different decimal into the same precision.\"\n                                ],\n                                \"type\": {\n                                    \"defined\": {\n                                        \"name\": \"TokenMultiplier\"\n                                    }\n                                }\n                            },\n                            {\n                                \"name\": \"depeg\",\n                                \"docs\": [\n                                    \"Depeg pool information. Contains functions to allow token amount to be repeg using stake / interest bearing token virtual price\"\n                                ],\n                                \"type\": {\n                                    \"defined\": {\n                                        \"name\": \"Depeg\"\n                                    }\n                                }\n                            },\n                            {\n                                \"name\": \"last_amp_updated_timestamp\",\n                                \"docs\": [\n                                    \"The last amp updated timestamp. Used to prevent update_curve_info called infinitely many times within a short period\"\n                                ],\n                                \"type\": \"u64\"\n                            }\n                        ]\n                    },\n                    {\n                        \"name\": \"NewCurve\",\n                        \"fields\": [\n                            {\n                                \"name\": \"field_one\",\n                                \"type\": \"u64\"\n                            },\n                            {\n                                \"name\": \"field_two\",\n                                \"type\": \"u64\"\n                            }\n                        ]\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"CurveType\",\n            \"docs\": [\n                \"Type of the swap curve\"\n            ],\n            \"type\": {\n                \"kind\": \"enum\",\n                \"variants\": [\n                    {\n                        \"name\": \"ConstantProduct\"\n                    },\n                    {\n                        \"name\": \"Stable\",\n                        \"fields\": [\n                            {\n                                \"name\": \"amp\",\n                                \"docs\": [\n                                    \"Amplification coefficient\"\n                                ],\n                                \"type\": \"u64\"\n                            },\n                            {\n                                \"name\": \"token_multiplier\",\n                                \"docs\": [\n                                    \"Multiplier for the pool token. Used to normalized token with different decimal into the same precision.\"\n                                ],\n                                \"type\": {\n                                    \"defined\": {\n                                        \"name\": \"TokenMultiplier\"\n                                    }\n                                }\n                            },\n                            {\n                                \"name\": \"depeg\",\n                                \"docs\": [\n                                    \"Depeg pool information. Contains functions to allow token amount to be repeg using stake / interest bearing token virtual price\"\n                                ],\n                                \"type\": {\n                                    \"defined\": {\n                                        \"name\": \"Depeg\"\n                                    }\n                                }\n                            },\n                            {\n                                \"name\": \"last_amp_updated_timestamp\",\n                                \"docs\": [\n                                    \"The last amp updated timestamp. Used to prevent update_curve_info called infinitely many times within a short period\"\n                                ],\n                                \"type\": \"u64\"\n                            }\n                        ]\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"DepegType\",\n            \"docs\": [\n                \"Type of depeg pool\"\n            ],\n            \"type\": {\n                \"kind\": \"enum\",\n                \"variants\": [\n                    {\n                        \"name\": \"None\"\n                    },\n                    {\n                        \"name\": \"Marinade\"\n                    },\n                    {\n                        \"name\": \"Lido\"\n                    },\n                    {\n                        \"name\": \"SplStake\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Rounding\",\n            \"docs\": [\n                \"Round up, down\"\n            ],\n            \"type\": {\n                \"kind\": \"enum\",\n                \"variants\": [\n                    {\n                        \"name\": \"Up\"\n                    },\n                    {\n                        \"name\": \"Down\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PoolType\",\n            \"docs\": [\n                \"Pool type\"\n            ],\n            \"type\": {\n                \"kind\": \"enum\",\n                \"variants\": [\n                    {\n                        \"name\": \"Permissioned\"\n                    },\n                    {\n                        \"name\": \"Permissionless\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Config\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool_fees\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolFees\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"activation_duration\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"vault_config_key\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool_creator_authority\",\n                        \"docs\": [\n                            \"Only pool_creator_authority can use the current config to initialize new pool. When it's Pubkey::default, it's a public config.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"docs\": [\n                            \"Activation type\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"partner_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"padding\",\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                219\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"LockEscrow\",\n            \"docs\": [\n                \"State of lock escrow account\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"docs\": [\n                            \"Pool address\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"docs\": [\n                            \"Owner address\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"escrow_vault\",\n                        \"docs\": [\n                            \"Vault address, store the lock user lock\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"bump\",\n                        \"docs\": [\n                            \"bump, used to sign\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"total_locked_amount\",\n                        \"docs\": [\n                            \"Total locked amount\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"lp_per_token\",\n                        \"docs\": [\n                            \"Lp per token, virtual price of lp token\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"unclaimed_fee_pending\",\n                        \"docs\": [\n                            \"Unclaimed fee pending\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"a_fee\",\n                        \"docs\": [\n                            \"Total a fee claimed so far\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"b_fee\",\n                        \"docs\": [\n                            \"Total b fee claimed so far\"\n                        ],\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Pool\",\n            \"docs\": [\n                \"State of pool account\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"lp_mint\",\n                        \"docs\": [\n                            \"LP token mint of the pool\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_a_mint\",\n                        \"docs\": [\n                            \"Token A mint of the pool. Eg: USDT\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_b_mint\",\n                        \"docs\": [\n                            \"Token B mint of the pool. Eg: USDC\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"a_vault\",\n                        \"docs\": [\n                            \"Vault account for token A. Token A of the pool will be deposit / withdraw from this vault account.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"b_vault\",\n                        \"docs\": [\n                            \"Vault account for token B. Token B of the pool will be deposit / withdraw from this vault account.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"a_vault_lp\",\n                        \"docs\": [\n                            \"LP token account of vault A. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"b_vault_lp\",\n                        \"docs\": [\n                            \"LP token account of vault B. Used to receive/burn the vault LP upon deposit/withdraw from the vault.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"a_vault_lp_bump\",\n                        \"docs\": [\n                            \"\\\"A\\\" vault lp bump. Used to create signer seeds.\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"enabled\",\n                        \"docs\": [\n                            \"Flag to determine whether the pool is enabled, or disabled.\"\n                        ],\n                        \"type\": \"bool\"\n                    },\n                    {\n                        \"name\": \"protocol_token_a_fee\",\n                        \"docs\": [\n                            \"Protocol fee token account for token A. Used to receive trading fee.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"protocol_token_b_fee\",\n                        \"docs\": [\n                            \"Protocol fee token account for token B. Used to receive trading fee.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"fee_last_updated_at\",\n                        \"docs\": [\n                            \"Fee last updated timestamp\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"padding0\",\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                24\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"fees\",\n                        \"docs\": [\n                            \"Store the fee charges setting.\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolFees\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"pool_type\",\n                        \"docs\": [\n                            \"Pool type\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolType\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"stake\",\n                        \"docs\": [\n                            \"Stake pubkey of SPL stake pool\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"total_locked_lp\",\n                        \"docs\": [\n                            \"Total locked lp token\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"bootstrapping\",\n                        \"docs\": [\n                            \"bootstrapping config\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"Bootstrapping\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"partner_info\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PartnerInfo\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"padding\",\n                        \"docs\": [\n                            \"Padding for future pool field\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"Padding\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"curve_type\",\n                        \"docs\": [\n                            \"The type of the swap curve supported by the pool.\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"CurveType\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"AddLiquidity\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"lp_mint_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_a_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"RemoveLiquidity\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"lp_unmint_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_a_out_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_out_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"BootstrapLiquidity\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"lp_mint_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_a_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Swap\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"in_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"out_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"trade_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"host_fee\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"SetPoolFees\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"trade_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"trade_fee_denominator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_trade_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_trade_fee_denominator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PoolInfo\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"token_a_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"virtual_price\",\n                        \"type\": \"f64\"\n                    },\n                    {\n                        \"name\": \"current_timestamp\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"TransferAdmin\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"admin\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"new_admin\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"OverrideCurveParam\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"new_amp\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"updated_timestamp\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PoolCreated\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"lp_mint\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_a_mint\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_b_mint\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool_type\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolType\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PoolEnabled\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"enabled\",\n                        \"type\": \"bool\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"MigrateFeeAccount\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"new_admin_token_a_fee\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"new_admin_token_b_fee\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_a_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"CreateLockEscrow\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Lock\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"ClaimFee\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"a_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"b_fee\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"CreateConfig\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"trade_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_trade_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"config\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"CloseConfig\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"config\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"WithdrawProtocolFees\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"protocol_a_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_b_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_a_fee_owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"protocol_b_fee_owner\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PartnerClaimFees\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"fee_a\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"fee_b\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"partner\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        }\n    ]\n}","{\n    \"address\": \"cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG\",\n    \"metadata\": {\n        \"name\": \"cp_amm\",\n        \"version\": \"0.1.0\",\n        \"spec\": \"0.1.0\",\n        \"description\": \"Created with Anchor\"\n    },\n    \"instructions\": [\n        {\n            \"name\": \"add_liquidity\",\n            \"discriminator\": [\n                181,\n                157,\n                89,\n                67,\n                143,\n                182,\n                52,\n                72\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true,\n                    \"relations\": [\n                        \"position\"\n                    ]\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_account\",\n                    \"docs\": [\n                        \"The user token a account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_b_account\",\n                    \"docs\": [\n                        \"The user token b account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_vault\",\n                    \"docs\": [\n                        \"The vault token account for input token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_vault\",\n                    \"docs\": [\n                        \"The vault token account for output token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"The mint of token a\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"The mint of token b\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"The token account for nft\"\n                    ]\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"owner of position\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_a_program\",\n                    \"docs\": [\n                        \"Token a program\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_program\",\n                    \"docs\": [\n                        \"Token b program\"\n                    ]\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"params\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"AddLiquidityParameters\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"claim_partner_fee\",\n            \"discriminator\": [\n                97,\n                206,\n                39,\n                105,\n                94,\n                94,\n                126,\n                148\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_account\",\n                    \"docs\": [\n                        \"The treasury token a account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_b_account\",\n                    \"docs\": [\n                        \"The treasury token b account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_vault\",\n                    \"docs\": [\n                        \"The vault token account for input token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_vault\",\n                    \"docs\": [\n                        \"The vault token account for output token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"The mint of token a\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"The mint of token b\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"partner\",\n                    \"signer\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_program\",\n                    \"docs\": [\n                        \"Token a program\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_program\",\n                    \"docs\": [\n                        \"Token b program\"\n                    ]\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"max_amount_a\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"max_amount_b\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"claim_position_fee\",\n            \"discriminator\": [\n                180,\n                38,\n                154,\n                17,\n                133,\n                33,\n                162,\n                211\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"relations\": [\n                        \"position\"\n                    ]\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_account\",\n                    \"docs\": [\n                        \"The user token a account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_b_account\",\n                    \"docs\": [\n                        \"The user token b account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_vault\",\n                    \"docs\": [\n                        \"The vault token account for input token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_vault\",\n                    \"docs\": [\n                        \"The vault token account for output token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"The mint of token a\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"The mint of token b\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"The token account for nft\"\n                    ]\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"owner of position\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_a_program\",\n                    \"docs\": [\n                        \"Token a program\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_program\",\n                    \"docs\": [\n                        \"Token b program\"\n                    ]\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"claim_protocol_fee\",\n            \"discriminator\": [\n                165,\n                228,\n                133,\n                48,\n                99,\n                249,\n                255,\n                33\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_vault\",\n                    \"docs\": [\n                        \"The vault token account for input token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_vault\",\n                    \"docs\": [\n                        \"The vault token account for output token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"The mint of token a\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"The mint of token b\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_account\",\n                    \"docs\": [\n                        \"The treasury token a account\"\n                    ],\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    153,\n                                    10,\n                                    107,\n                                    154,\n                                    255,\n                                    249,\n                                    210,\n                                    173,\n                                    176,\n                                    67,\n                                    220,\n                                    214,\n                                    152,\n                                    71,\n                                    46,\n                                    146,\n                                    161,\n                                    33,\n                                    81,\n                                    148,\n                                    166,\n                                    119,\n                                    5,\n                                    189,\n                                    142,\n                                    11,\n                                    57,\n                                    68,\n                                    162,\n                                    70,\n                                    126,\n                                    100\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"token_a_program\"\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"token_a_mint\"\n                            }\n                        ],\n                        \"program\": {\n                            \"kind\": \"const\",\n                            \"value\": [\n                                140,\n                                151,\n                                37,\n                                143,\n                                78,\n                                36,\n                                137,\n                                241,\n                                187,\n                                61,\n                                16,\n                                41,\n                                20,\n                                142,\n                                13,\n                                131,\n                                11,\n                                90,\n                                19,\n                                153,\n                                218,\n                                255,\n                                16,\n                                132,\n                                4,\n                                142,\n                                123,\n                                216,\n                                219,\n                                233,\n                                248,\n                                89\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"name\": \"token_b_account\",\n                    \"docs\": [\n                        \"The treasury token b account\"\n                    ],\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    153,\n                                    10,\n                                    107,\n                                    154,\n                                    255,\n                                    249,\n                                    210,\n                                    173,\n                                    176,\n                                    67,\n                                    220,\n                                    214,\n                                    152,\n                                    71,\n                                    46,\n                                    146,\n                                    161,\n                                    33,\n                                    81,\n                                    148,\n                                    166,\n                                    119,\n                                    5,\n                                    189,\n                                    142,\n                                    11,\n                                    57,\n                                    68,\n                                    162,\n                                    70,\n                                    126,\n                                    100\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"token_b_program\"\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"token_b_mint\"\n                            }\n                        ],\n                        \"program\": {\n                            \"kind\": \"const\",\n                            \"value\": [\n                                140,\n                                151,\n                                37,\n                                143,\n                                78,\n                                36,\n                                137,\n                                241,\n                                187,\n                                61,\n                                16,\n                                41,\n                                20,\n                                142,\n                                13,\n                                131,\n                                11,\n                                90,\n                                19,\n                                153,\n                                218,\n                                255,\n                                16,\n                                132,\n                                4,\n                                142,\n                                123,\n                                216,\n                                219,\n                                233,\n                                248,\n                                89\n                            ]\n                        }\n                    }\n                },\n                {\n                    \"name\": \"claim_fee_operator\",\n                    \"docs\": [\n                        \"Claim fee operator\"\n                    ]\n                },\n                {\n                    \"name\": \"operator\",\n                    \"docs\": [\n                        \"Operator\"\n                    ],\n                    \"signer\": true,\n                    \"relations\": [\n                        \"claim_fee_operator\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_program\",\n                    \"docs\": [\n                        \"Token a program\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_program\",\n                    \"docs\": [\n                        \"Token b program\"\n                    ]\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"claim_reward\",\n            \"discriminator\": [\n                149,\n                95,\n                181,\n                242,\n                94,\n                90,\n                158,\n                162\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true,\n                    \"relations\": [\n                        \"position\"\n                    ]\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reward_vault\",\n                    \"docs\": [\n                        \"The vault token account for reward token\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reward_mint\"\n                },\n                {\n                    \"name\": \"user_token_account\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"The token account for nft\"\n                    ]\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"owner of position\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"reward_index\",\n                    \"type\": \"u8\"\n                }\n            ]\n        },\n        {\n            \"name\": \"close_claim_fee_operator\",\n            \"discriminator\": [\n                38,\n                134,\n                82,\n                216,\n                95,\n                124,\n                17,\n                99\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"claim_fee_operator\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"rent_receiver\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"close_config\",\n            \"discriminator\": [\n                145,\n                9,\n                72,\n                157,\n                95,\n                125,\n                61,\n                85\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"config\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"rent_receiver\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"close_position\",\n            \"discriminator\": [\n                123,\n                134,\n                81,\n                0,\n                49,\n                68,\n                98,\n                98\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"position_nft_mint\",\n                    \"docs\": [\n                        \"position_nft_mint\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"The token account for nft\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true,\n                    \"relations\": [\n                        \"position\"\n                    ]\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"rent_receiver\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"Owner of position\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Program to create NFT mint/token account and transfer for token22 account\"\n                    ],\n                    \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"create_claim_fee_operator\",\n            \"discriminator\": [\n                169,\n                62,\n                207,\n                107,\n                58,\n                187,\n                162,\n                109\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"claim_fee_operator\",\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    99,\n                                    102,\n                                    95,\n                                    111,\n                                    112,\n                                    101,\n                                    114,\n                                    97,\n                                    116,\n                                    111,\n                                    114\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"operator\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"operator\"\n                },\n                {\n                    \"name\": \"admin\",\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"address\": \"11111111111111111111111111111111\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"create_config\",\n            \"docs\": [\n                \"ADMIN FUNCTIONS /////\"\n            ],\n            \"discriminator\": [\n                201,\n                207,\n                243,\n                114,\n                75,\n                111,\n                47,\n                189\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"config\",\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    99,\n                                    111,\n                                    110,\n                                    102,\n                                    105,\n                                    103\n                                ]\n                            },\n                            {\n                                \"kind\": \"arg\",\n                                \"path\": \"config_parameters.index\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"admin\",\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"address\": \"11111111111111111111111111111111\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"config_parameters\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"ConfigParameters\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"create_position\",\n            \"discriminator\": [\n                48,\n                215,\n                197,\n                153,\n                96,\n                203,\n                180,\n                133\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"owner\"\n                },\n                {\n                    \"name\": \"position_nft_mint\",\n                    \"docs\": [\n                        \"position_nft_mint\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"position nft account\"\n                    ],\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    115,\n                                    105,\n                                    116,\n                                    105,\n                                    111,\n                                    110,\n                                    95,\n                                    110,\n                                    102,\n                                    116,\n                                    95,\n                                    97,\n                                    99,\n                                    99,\n                                    111,\n                                    117,\n                                    110,\n                                    116\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"position_nft_mint\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    115,\n                                    105,\n                                    116,\n                                    105,\n                                    111,\n                                    110\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"position_nft_mint\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Address paying to create the position. Can be anyone\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\",\n                    \"docs\": [\n                        \"Program to create NFT mint/token account and transfer for token22 account\"\n                    ],\n                    \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"address\": \"11111111111111111111111111111111\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"create_token_badge\",\n            \"discriminator\": [\n                88,\n                206,\n                0,\n                91,\n                60,\n                175,\n                151,\n                118\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"token_badge\",\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    116,\n                                    111,\n                                    107,\n                                    101,\n                                    110,\n                                    95,\n                                    98,\n                                    97,\n                                    100,\n                                    103,\n                                    101\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"token_mint\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"token_mint\"\n                },\n                {\n                    \"name\": \"admin\",\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"address\": \"11111111111111111111111111111111\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"fund_reward\",\n            \"discriminator\": [\n                188,\n                50,\n                249,\n                165,\n                93,\n                151,\n                38,\n                63\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reward_vault\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reward_mint\"\n                },\n                {\n                    \"name\": \"funder_token_account\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"funder\",\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"reward_index\",\n                    \"type\": \"u8\"\n                },\n                {\n                    \"name\": \"amount\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"carry_forward\",\n                    \"type\": \"bool\"\n                }\n            ]\n        },\n        {\n            \"name\": \"initialize_customizable_pool\",\n            \"discriminator\": [\n                20,\n                161,\n                241,\n                24,\n                189,\n                221,\n                180,\n                2\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"creator\"\n                },\n                {\n                    \"name\": \"position_nft_mint\",\n                    \"docs\": [\n                        \"position_nft_mint\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"position nft account\"\n                    ],\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    115,\n                                    105,\n                                    116,\n                                    105,\n                                    111,\n                                    110,\n                                    95,\n                                    110,\n                                    102,\n                                    116,\n                                    95,\n                                    97,\n                                    99,\n                                    99,\n                                    111,\n                                    117,\n                                    110,\n                                    116\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"position_nft_mint\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Address paying to create the pool. Can be anyone\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Initialize an account to store the pool state\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    115,\n                                    105,\n                                    116,\n                                    105,\n                                    111,\n                                    110\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"position_nft_mint\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"Token a mint\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"Token b mint\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_vault\",\n                    \"docs\": [\n                        \"Token a vault for the pool\"\n                    ],\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    116,\n                                    111,\n                                    107,\n                                    101,\n                                    110,\n                                    95,\n                                    118,\n                                    97,\n                                    117,\n                                    108,\n                                    116\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"token_a_mint\"\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"pool\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"token_b_vault\",\n                    \"docs\": [\n                        \"Token b vault for the pool\"\n                    ],\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    116,\n                                    111,\n                                    107,\n                                    101,\n                                    110,\n                                    95,\n                                    118,\n                                    97,\n                                    117,\n                                    108,\n                                    116\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"token_b_mint\"\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"pool\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"payer_token_a\",\n                    \"docs\": [\n                        \"payer token a account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_b\",\n                    \"docs\": [\n                        \"creator token b account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_program\",\n                    \"docs\": [\n                        \"Program to create mint account and mint tokens\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_program\",\n                    \"docs\": [\n                        \"Program to create mint account and mint tokens\"\n                    ]\n                },\n                {\n                    \"name\": \"token_2022_program\",\n                    \"docs\": [\n                        \"Program to create NFT mint/token account and transfer for token22 account\"\n                    ],\n                    \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"address\": \"11111111111111111111111111111111\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"params\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"InitializeCustomizablePoolParameters\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"initialize_pool\",\n            \"docs\": [\n                \"USER FUNCTIONS ////\"\n            ],\n            \"discriminator\": [\n                95,\n                180,\n                10,\n                172,\n                84,\n                174,\n                232,\n                40\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"creator\"\n                },\n                {\n                    \"name\": \"position_nft_mint\",\n                    \"docs\": [\n                        \"position_nft_mint\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"position nft account\"\n                    ],\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    115,\n                                    105,\n                                    116,\n                                    105,\n                                    111,\n                                    110,\n                                    95,\n                                    110,\n                                    102,\n                                    116,\n                                    95,\n                                    97,\n                                    99,\n                                    99,\n                                    111,\n                                    117,\n                                    110,\n                                    116\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"position_nft_mint\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"Address paying to create the pool. Can be anyone\"\n                    ],\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"config\",\n                    \"docs\": [\n                        \"Which config the pool belongs to.\"\n                    ]\n                },\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Initialize an account to store the pool state\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    115,\n                                    105,\n                                    116,\n                                    105,\n                                    111,\n                                    110\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"position_nft_mint\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"Token a mint\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"Token b mint\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_vault\",\n                    \"docs\": [\n                        \"Token a vault for the pool\"\n                    ],\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    116,\n                                    111,\n                                    107,\n                                    101,\n                                    110,\n                                    95,\n                                    118,\n                                    97,\n                                    117,\n                                    108,\n                                    116\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"token_a_mint\"\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"pool\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"token_b_vault\",\n                    \"docs\": [\n                        \"Token b vault for the pool\"\n                    ],\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    116,\n                                    111,\n                                    107,\n                                    101,\n                                    110,\n                                    95,\n                                    118,\n                                    97,\n                                    117,\n                                    108,\n                                    116\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"token_b_mint\"\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"pool\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"payer_token_a\",\n                    \"docs\": [\n                        \"payer token a account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"payer_token_b\",\n                    \"docs\": [\n                        \"creator token b account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_program\",\n                    \"docs\": [\n                        \"Program to create mint account and mint tokens\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_program\",\n                    \"docs\": [\n                        \"Program to create mint account and mint tokens\"\n                    ]\n                },\n                {\n                    \"name\": \"token_2022_program\",\n                    \"docs\": [\n                        \"Program to create NFT mint/token account and transfer for token22 account\"\n                    ],\n                    \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"address\": \"11111111111111111111111111111111\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"params\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"InitializePoolParameters\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"initialize_reward\",\n            \"discriminator\": [\n                95,\n                135,\n                192,\n                196,\n                242,\n                129,\n                230,\n                68\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reward_vault\",\n                    \"writable\": true,\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    114,\n                                    101,\n                                    119,\n                                    97,\n                                    114,\n                                    100,\n                                    95,\n                                    118,\n                                    97,\n                                    117,\n                                    108,\n                                    116\n                                ]\n                            },\n                            {\n                                \"kind\": \"account\",\n                                \"path\": \"pool\"\n                            },\n                            {\n                                \"kind\": \"arg\",\n                                \"path\": \"reward_index\"\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"reward_mint\"\n                },\n                {\n                    \"name\": \"admin\",\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\"\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"address\": \"11111111111111111111111111111111\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"reward_index\",\n                    \"type\": \"u8\"\n                },\n                {\n                    \"name\": \"reward_duration\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"funder\",\n                    \"type\": \"pubkey\"\n                }\n            ]\n        },\n        {\n            \"name\": \"lock_position\",\n            \"discriminator\": [\n                227,\n                62,\n                2,\n                252,\n                247,\n                10,\n                171,\n                185\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"relations\": [\n                        \"position\"\n                    ]\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"vesting\",\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"The token account for nft\"\n                    ]\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"owner of position\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"payer\",\n                    \"writable\": true,\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"system_program\",\n                    \"address\": \"11111111111111111111111111111111\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"params\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"VestingParameters\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"permanent_lock_position\",\n            \"discriminator\": [\n                165,\n                176,\n                125,\n                6,\n                231,\n                171,\n                186,\n                213\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true,\n                    \"relations\": [\n                        \"position\"\n                    ]\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"The token account for nft\"\n                    ]\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"owner of position\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"permanent_lock_liquidity\",\n                    \"type\": \"u128\"\n                }\n            ]\n        },\n        {\n            \"name\": \"refresh_vesting\",\n            \"discriminator\": [\n                9,\n                94,\n                216,\n                14,\n                116,\n                204,\n                247,\n                0\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"relations\": [\n                        \"position\"\n                    ]\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"The token account for nft\"\n                    ]\n                },\n                {\n                    \"name\": \"owner\"\n                }\n            ],\n            \"args\": []\n        },\n        {\n            \"name\": \"remove_all_liquidity\",\n            \"discriminator\": [\n                10,\n                51,\n                61,\n                35,\n                112,\n                105,\n                24,\n                85\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true,\n                    \"relations\": [\n                        \"position\"\n                    ]\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_account\",\n                    \"docs\": [\n                        \"The user token a account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_b_account\",\n                    \"docs\": [\n                        \"The user token b account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_vault\",\n                    \"docs\": [\n                        \"The vault token account for input token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_vault\",\n                    \"docs\": [\n                        \"The vault token account for output token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"The mint of token a\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"The mint of token b\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"The token account for nft\"\n                    ]\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"owner of position\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_a_program\",\n                    \"docs\": [\n                        \"Token a program\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_program\",\n                    \"docs\": [\n                        \"Token b program\"\n                    ]\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"token_a_amount_threshold\",\n                    \"type\": \"u64\"\n                },\n                {\n                    \"name\": \"token_b_amount_threshold\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"remove_liquidity\",\n            \"discriminator\": [\n                80,\n                85,\n                209,\n                72,\n                24,\n                206,\n                177,\n                108\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true,\n                    \"relations\": [\n                        \"position\"\n                    ]\n                },\n                {\n                    \"name\": \"position\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_account\",\n                    \"docs\": [\n                        \"The user token a account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_b_account\",\n                    \"docs\": [\n                        \"The user token b account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_vault\",\n                    \"docs\": [\n                        \"The vault token account for input token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_vault\",\n                    \"docs\": [\n                        \"The vault token account for output token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"The mint of token a\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"The mint of token b\"\n                    ],\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"position_nft_account\",\n                    \"docs\": [\n                        \"The token account for nft\"\n                    ]\n                },\n                {\n                    \"name\": \"owner\",\n                    \"docs\": [\n                        \"owner of position\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_a_program\",\n                    \"docs\": [\n                        \"Token a program\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_program\",\n                    \"docs\": [\n                        \"Token b program\"\n                    ]\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"params\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"RemoveLiquidityParameters\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"set_pool_status\",\n            \"discriminator\": [\n                112,\n                87,\n                135,\n                223,\n                83,\n                204,\n                132,\n                53\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"status\",\n                    \"type\": \"u8\"\n                }\n            ]\n        },\n        {\n            \"name\": \"swap\",\n            \"discriminator\": [\n                248,\n                198,\n                158,\n                145,\n                225,\n                117,\n                135,\n                200\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"docs\": [\n                        \"Pool account\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"input_token_account\",\n                    \"docs\": [\n                        \"The user token account for input token\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"output_token_account\",\n                    \"docs\": [\n                        \"The user token account for output token\"\n                    ],\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"token_a_vault\",\n                    \"docs\": [\n                        \"The vault token account for input token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_vault\",\n                    \"docs\": [\n                        \"The vault token account for output token\"\n                    ],\n                    \"writable\": true,\n                    \"relations\": [\n                        \"pool\"\n                    ]\n                },\n                {\n                    \"name\": \"token_a_mint\",\n                    \"docs\": [\n                        \"The mint of token a\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_mint\",\n                    \"docs\": [\n                        \"The mint of token b\"\n                    ]\n                },\n                {\n                    \"name\": \"payer\",\n                    \"docs\": [\n                        \"The user performing the swap\"\n                    ],\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_a_program\",\n                    \"docs\": [\n                        \"Token a program\"\n                    ]\n                },\n                {\n                    \"name\": \"token_b_program\",\n                    \"docs\": [\n                        \"Token b program\"\n                    ]\n                },\n                {\n                    \"name\": \"referral_token_account\",\n                    \"docs\": [\n                        \"referral token account\"\n                    ],\n                    \"writable\": true,\n                    \"optional\": true\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"params\",\n                    \"type\": {\n                        \"defined\": {\n                            \"name\": \"SwapParameters\"\n                        }\n                    }\n                }\n            ]\n        },\n        {\n            \"name\": \"update_reward_duration\",\n            \"discriminator\": [\n                138,\n                174,\n                196,\n                169,\n                213,\n                235,\n                254,\n                107\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"reward_index\",\n                    \"type\": \"u8\"\n                },\n                {\n                    \"name\": \"new_duration\",\n                    \"type\": \"u64\"\n                }\n            ]\n        },\n        {\n            \"name\": \"update_reward_funder\",\n            \"discriminator\": [\n                211,\n                28,\n                48,\n                32,\n                215,\n                160,\n                35,\n                23\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"admin\",\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"reward_index\",\n                    \"type\": \"u8\"\n                },\n                {\n                    \"name\": \"new_funder\",\n                    \"type\": \"pubkey\"\n                }\n            ]\n        },\n        {\n            \"name\": \"withdraw_ineligible_reward\",\n            \"discriminator\": [\n                148,\n                206,\n                42,\n                195,\n                247,\n                49,\n                103,\n                8\n            ],\n            \"accounts\": [\n                {\n                    \"name\": \"pool_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    112,\n                                    111,\n                                    111,\n                                    108,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"pool\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reward_vault\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"reward_mint\"\n                },\n                {\n                    \"name\": \"funder_token_account\",\n                    \"writable\": true\n                },\n                {\n                    \"name\": \"funder\",\n                    \"signer\": true\n                },\n                {\n                    \"name\": \"token_program\"\n                },\n                {\n                    \"name\": \"event_authority\",\n                    \"pda\": {\n                        \"seeds\": [\n                            {\n                                \"kind\": \"const\",\n                                \"value\": [\n                                    95,\n                                    95,\n                                    101,\n                                    118,\n                                    101,\n                                    110,\n                                    116,\n                                    95,\n                                    97,\n                                    117,\n                                    116,\n                                    104,\n                                    111,\n                                    114,\n                                    105,\n                                    116,\n                                    121\n                                ]\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"program\"\n                }\n            ],\n            \"args\": [\n                {\n                    \"name\": \"reward_index\",\n                    \"type\": \"u8\"\n                }\n            ]\n        }\n    ],\n    \"accounts\": [\n        {\n            \"name\": \"ClaimFeeOperator\",\n            \"discriminator\": [\n                166,\n                48,\n                134,\n                86,\n                34,\n                200,\n                188,\n                150\n            ]\n        },\n        {\n            \"name\": \"Config\",\n            \"discriminator\": [\n                155,\n                12,\n                170,\n                224,\n                30,\n                250,\n                204,\n                130\n            ]\n        },\n        {\n            \"name\": \"Pool\",\n            \"discriminator\": [\n                241,\n                154,\n                109,\n                4,\n                17,\n                177,\n                109,\n                188\n            ]\n        },\n        {\n            \"name\": \"Position\",\n            \"discriminator\": [\n                170,\n                188,\n                143,\n                228,\n                122,\n                64,\n                247,\n                208\n            ]\n        },\n        {\n            \"name\": \"TokenBadge\",\n            \"discriminator\": [\n                116,\n                219,\n                204,\n                229,\n                249,\n                116,\n                255,\n                150\n            ]\n        },\n        {\n            \"name\": \"Vesting\",\n            \"discriminator\": [\n                100,\n                149,\n                66,\n                138,\n                95,\n                200,\n                128,\n                241\n            ]\n        }\n    ],\n    \"events\": [\n        {\n            \"name\": \"EvtAddLiquidity\",\n            \"discriminator\": [\n                175,\n                242,\n                8,\n                157,\n                30,\n                247,\n                185,\n                169\n            ]\n        },\n        {\n            \"name\": \"EvtClaimPartnerFee\",\n            \"discriminator\": [\n                118,\n                99,\n                77,\n                10,\n                226,\n                1,\n                1,\n                87\n            ]\n        },\n        {\n            \"name\": \"EvtClaimPositionFee\",\n            \"discriminator\": [\n                198,\n                182,\n                183,\n                52,\n                97,\n                12,\n                49,\n                56\n            ]\n        },\n        {\n            \"name\": \"EvtClaimProtocolFee\",\n            \"discriminator\": [\n                186,\n                244,\n                75,\n                251,\n                188,\n                13,\n                25,\n                33\n            ]\n        },\n        {\n            \"name\": \"EvtClaimReward\",\n            \"discriminator\": [\n                218,\n                86,\n                147,\n                200,\n                235,\n                188,\n                215,\n                231\n            ]\n        },\n        {\n            \"name\": \"EvtCloseClaimFeeOperator\",\n            \"discriminator\": [\n                111,\n                39,\n                37,\n                55,\n                110,\n                216,\n                194,\n                23\n            ]\n        },\n        {\n            \"name\": \"EvtCloseConfig\",\n            \"discriminator\": [\n                36,\n                30,\n                239,\n                45,\n                58,\n                132,\n                14,\n                5\n            ]\n        },\n        {\n            \"name\": \"EvtClosePosition\",\n            \"discriminator\": [\n                20,\n                145,\n                144,\n                68,\n                143,\n                142,\n                214,\n                178\n            ]\n        },\n        {\n            \"name\": \"EvtCreateClaimFeeOperator\",\n            \"discriminator\": [\n                21,\n                6,\n                153,\n                120,\n                68,\n                116,\n                28,\n                177\n            ]\n        },\n        {\n            \"name\": \"EvtCreateConfig\",\n            \"discriminator\": [\n                131,\n                207,\n                180,\n                174,\n                180,\n                73,\n                165,\n                54\n            ]\n        },\n        {\n            \"name\": \"EvtCreatePosition\",\n            \"discriminator\": [\n                156,\n                15,\n                119,\n                198,\n                29,\n                181,\n                221,\n                55\n            ]\n        },\n        {\n            \"name\": \"EvtCreateTokenBadge\",\n            \"discriminator\": [\n                141,\n                120,\n                134,\n                116,\n                34,\n                28,\n                114,\n                160\n            ]\n        },\n        {\n            \"name\": \"EvtFundReward\",\n            \"discriminator\": [\n                104,\n                233,\n                237,\n                122,\n                199,\n                191,\n                121,\n                85\n            ]\n        },\n        {\n            \"name\": \"EvtInitializePool\",\n            \"discriminator\": [\n                228,\n                50,\n                246,\n                85,\n                203,\n                66,\n                134,\n                37\n            ]\n        },\n        {\n            \"name\": \"EvtInitializeReward\",\n            \"discriminator\": [\n                129,\n                91,\n                188,\n                3,\n                246,\n                52,\n                185,\n                249\n            ]\n        },\n        {\n            \"name\": \"EvtLockPosition\",\n            \"discriminator\": [\n                168,\n                63,\n                108,\n                83,\n                219,\n                82,\n                2,\n                200\n            ]\n        },\n        {\n            \"name\": \"EvtPermanentLockPosition\",\n            \"discriminator\": [\n                145,\n                143,\n                162,\n                218,\n                218,\n                80,\n                67,\n                11\n            ]\n        },\n        {\n            \"name\": \"EvtRemoveLiquidity\",\n            \"discriminator\": [\n                87,\n                46,\n                88,\n                98,\n                175,\n                96,\n                34,\n                91\n            ]\n        },\n        {\n            \"name\": \"EvtSetPoolStatus\",\n            \"discriminator\": [\n                100,\n                213,\n                74,\n                3,\n                95,\n                91,\n                228,\n                146\n            ]\n        },\n        {\n            \"name\": \"EvtSwap\",\n            \"discriminator\": [\n                27,\n                60,\n                21,\n                213,\n                138,\n                170,\n                187,\n                147\n            ]\n        },\n        {\n            \"name\": \"EvtUpdateRewardDuration\",\n            \"discriminator\": [\n                149,\n                135,\n                65,\n                231,\n                129,\n                153,\n                65,\n                57\n            ]\n        },\n        {\n            \"name\": \"EvtUpdateRewardFunder\",\n            \"discriminator\": [\n                76,\n                154,\n                208,\n                13,\n                40,\n                115,\n                246,\n                146\n            ]\n        },\n        {\n            \"name\": \"EvtWithdrawIneligibleReward\",\n            \"discriminator\": [\n                248,\n                215,\n                184,\n                78,\n                31,\n                180,\n                179,\n                168\n            ]\n        }\n    ],\n    \"errors\": [\n        {\n            \"code\": 6000,\n            \"name\": \"MathOverflow\",\n            \"msg\": \"Math operation overflow\"\n        },\n        {\n            \"code\": 6001,\n            \"name\": \"InvalidFee\",\n            \"msg\": \"Invalid fee setup\"\n        },\n        {\n            \"code\": 6002,\n            \"name\": \"ExceededSlippage\",\n            \"msg\": \"Exceeded slippage tolerance\"\n        },\n        {\n            \"code\": 6003,\n            \"name\": \"PoolDisabled\",\n            \"msg\": \"Pool disabled\"\n        },\n        {\n            \"code\": 6004,\n            \"name\": \"ExceedMaxFeeBps\",\n            \"msg\": \"Exceeded max fee bps\"\n        },\n        {\n            \"code\": 6005,\n            \"name\": \"InvalidAdmin\",\n            \"msg\": \"Invalid admin\"\n        },\n        {\n            \"code\": 6006,\n            \"name\": \"AmountIsZero\",\n            \"msg\": \"Amount is zero\"\n        },\n        {\n            \"code\": 6007,\n            \"name\": \"TypeCastFailed\",\n            \"msg\": \"Type cast error\"\n        },\n        {\n            \"code\": 6008,\n            \"name\": \"UnableToModifyActivationPoint\",\n            \"msg\": \"Unable to modify activation point\"\n        },\n        {\n            \"code\": 6009,\n            \"name\": \"InvalidAuthorityToCreateThePool\",\n            \"msg\": \"Invalid authority to create the pool\"\n        },\n        {\n            \"code\": 6010,\n            \"name\": \"InvalidActivationType\",\n            \"msg\": \"Invalid activation type\"\n        },\n        {\n            \"code\": 6011,\n            \"name\": \"InvalidActivationPoint\",\n            \"msg\": \"Invalid activation point\"\n        },\n        {\n            \"code\": 6012,\n            \"name\": \"InvalidQuoteMint\",\n            \"msg\": \"Quote token must be SOL,USDC\"\n        },\n        {\n            \"code\": 6013,\n            \"name\": \"InvalidFeeCurve\",\n            \"msg\": \"Invalid fee curve\"\n        },\n        {\n            \"code\": 6014,\n            \"name\": \"InvalidPriceRange\",\n            \"msg\": \"Invalid Price Range\"\n        },\n        {\n            \"code\": 6015,\n            \"name\": \"PriceRangeViolation\",\n            \"msg\": \"Trade is over price range\"\n        },\n        {\n            \"code\": 6016,\n            \"name\": \"InvalidParameters\",\n            \"msg\": \"Invalid parameters\"\n        },\n        {\n            \"code\": 6017,\n            \"name\": \"InvalidCollectFeeMode\",\n            \"msg\": \"Invalid collect fee mode\"\n        },\n        {\n            \"code\": 6018,\n            \"name\": \"InvalidInput\",\n            \"msg\": \"Invalid input\"\n        },\n        {\n            \"code\": 6019,\n            \"name\": \"CannotCreateTokenBadgeOnSupportedMint\",\n            \"msg\": \"Cannot create token badge on supported mint\"\n        },\n        {\n            \"code\": 6020,\n            \"name\": \"InvalidTokenBadge\",\n            \"msg\": \"Invalid token badge\"\n        },\n        {\n            \"code\": 6021,\n            \"name\": \"InvalidMinimumLiquidity\",\n            \"msg\": \"Invalid minimum liquidity\"\n        },\n        {\n            \"code\": 6022,\n            \"name\": \"InvalidVestingInfo\",\n            \"msg\": \"Invalid vesting information\"\n        },\n        {\n            \"code\": 6023,\n            \"name\": \"InsufficientLiquidity\",\n            \"msg\": \"Insufficient liquidity\"\n        },\n        {\n            \"code\": 6024,\n            \"name\": \"InvalidVestingAccount\",\n            \"msg\": \"Invalid vesting account\"\n        },\n        {\n            \"code\": 6025,\n            \"name\": \"InvalidPoolStatus\",\n            \"msg\": \"Invalid pool status\"\n        },\n        {\n            \"code\": 6026,\n            \"name\": \"UnsupportNativeMintToken2022\",\n            \"msg\": \"Unsupported native mint token2022\"\n        },\n        {\n            \"code\": 6027,\n            \"name\": \"InvalidRewardIndex\",\n            \"msg\": \"Invalid reward index\"\n        },\n        {\n            \"code\": 6028,\n            \"name\": \"InvalidRewardDuration\",\n            \"msg\": \"Invalid reward duration\"\n        },\n        {\n            \"code\": 6029,\n            \"name\": \"RewardInitialized\",\n            \"msg\": \"Reward already initialized\"\n        },\n        {\n            \"code\": 6030,\n            \"name\": \"RewardUninitialized\",\n            \"msg\": \"Reward not initialized\"\n        },\n        {\n            \"code\": 6031,\n            \"name\": \"InvalidRewardVault\",\n            \"msg\": \"Invalid reward vault\"\n        },\n        {\n            \"code\": 6032,\n            \"name\": \"MustWithdrawnIneligibleReward\",\n            \"msg\": \"Must withdraw ineligible reward\"\n        },\n        {\n            \"code\": 6033,\n            \"name\": \"IdenticalRewardDuration\",\n            \"msg\": \"Reward duration is the same\"\n        },\n        {\n            \"code\": 6034,\n            \"name\": \"RewardCampaignInProgress\",\n            \"msg\": \"Reward campaign in progress\"\n        },\n        {\n            \"code\": 6035,\n            \"name\": \"IdenticalFunder\",\n            \"msg\": \"Identical funder\"\n        },\n        {\n            \"code\": 6036,\n            \"name\": \"InvalidFunder\",\n            \"msg\": \"Invalid funder\"\n        },\n        {\n            \"code\": 6037,\n            \"name\": \"RewardNotEnded\",\n            \"msg\": \"Reward not ended\"\n        },\n        {\n            \"code\": 6038,\n            \"name\": \"FeeInverseIsIncorrect\",\n            \"msg\": \"Fee inverse is incorrect\"\n        },\n        {\n            \"code\": 6039,\n            \"name\": \"PositionIsNotEmpty\",\n            \"msg\": \"Position is not empty\"\n        }\n    ],\n    \"types\": [\n        {\n            \"name\": \"AddLiquidityParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"liquidity_delta\",\n                        \"docs\": [\n                            \"delta liquidity\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"token_a_amount_threshold\",\n                        \"docs\": [\n                            \"maximum token a amount\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount_threshold\",\n                        \"docs\": [\n                            \"maximum token b amount\"\n                        ],\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"BaseFeeConfig\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"cliff_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"fee_scheduler_mode\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"padding\",\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                5\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"number_of_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"period_frequency\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"reduction_factor\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"BaseFeeParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"cliff_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"number_of_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"period_frequency\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"reduction_factor\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"fee_scheduler_mode\",\n                        \"type\": \"u8\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"BaseFeeStruct\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"cliff_fee_numerator\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"fee_scheduler_mode\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"padding_0\",\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                5\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"number_of_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"period_frequency\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"reduction_factor\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"padding_1\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"ClaimFeeOperator\",\n            \"docs\": [\n                \"Parameter that set by the protocol\"\n            ],\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"operator\",\n                        \"docs\": [\n                            \"operator\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"_padding\",\n                        \"docs\": [\n                            \"Reserve\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                128\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Config\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"vault_config_key\",\n                        \"docs\": [\n                            \"Vault config key\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool_creator_authority\",\n                        \"docs\": [\n                            \"Only pool_creator_authority can use the current config to initialize new pool. When it's Pubkey::default, it's a public config.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool_fees\",\n                        \"docs\": [\n                            \"Pool fee\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolFeesConfig\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"docs\": [\n                            \"Activation type\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"collect_fee_mode\",\n                        \"docs\": [\n                            \"Collect fee mode\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"_padding_0\",\n                        \"docs\": [\n                            \"padding 0\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                6\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"index\",\n                        \"docs\": [\n                            \"config index\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"sqrt_min_price\",\n                        \"docs\": [\n                            \"sqrt min price\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_max_price\",\n                        \"docs\": [\n                            \"sqrt max price\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"_padding_1\",\n                        \"docs\": [\n                            \"Fee curve point\",\n                            \"Padding for further use\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u64\",\n                                10\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"ConfigParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool_fees\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolFeeParameters\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"sqrt_min_price\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_max_price\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"vault_config_key\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool_creator_authority\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"collect_fee_mode\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"index\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"DynamicFeeConfig\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"initialized\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"padding\",\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                7\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"max_volatility_accumulator\",\n                        \"type\": \"u32\"\n                    },\n                    {\n                        \"name\": \"variable_fee_control\",\n                        \"type\": \"u32\"\n                    },\n                    {\n                        \"name\": \"bin_step\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"filter_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"decay_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"reduction_factor\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"padding_1\",\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                8\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"bin_step_u128\",\n                        \"type\": \"u128\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"DynamicFeeParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"bin_step\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"bin_step_u128\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"filter_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"decay_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"reduction_factor\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"max_volatility_accumulator\",\n                        \"type\": \"u32\"\n                    },\n                    {\n                        \"name\": \"variable_fee_control\",\n                        \"type\": \"u32\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"DynamicFeeStruct\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"initialized\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"padding\",\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                7\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"max_volatility_accumulator\",\n                        \"type\": \"u32\"\n                    },\n                    {\n                        \"name\": \"variable_fee_control\",\n                        \"type\": \"u32\"\n                    },\n                    {\n                        \"name\": \"bin_step\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"filter_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"decay_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"reduction_factor\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"last_update_timestamp\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"bin_step_u128\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_price_reference\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"volatility_accumulator\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"volatility_reference\",\n                        \"type\": \"u128\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtAddLiquidity\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"params\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"AddLiquidityParameters\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"token_a_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_amount_a\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_amount_b\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtClaimPartnerFee\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_a_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtClaimPositionFee\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"fee_a_claimed\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"fee_b_claimed\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtClaimProtocolFee\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_a_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtClaimReward\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"mint_reward\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"reward_index\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"total_reward\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtCloseClaimFeeOperator\",\n            \"docs\": [\n                \"Close claim fee operator\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"claim_fee_operator\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"operator\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtCloseConfig\",\n            \"docs\": [\n                \"Close config\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"config\",\n                        \"docs\": [\n                            \"Config pubkey\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"admin\",\n                        \"docs\": [\n                            \"admin pk\"\n                        ],\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtClosePosition\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position_nft_mint\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtCreateClaimFeeOperator\",\n            \"docs\": [\n                \"Create claim fee operator\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"operator\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtCreateConfig\",\n            \"docs\": [\n                \"Create config\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool_fees\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolFeeParameters\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"vault_config_key\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool_creator_authority\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"sqrt_min_price\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_max_price\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"collect_fee_mode\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"index\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"config\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtCreatePosition\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position_nft_mint\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtCreateTokenBadge\",\n            \"docs\": [\n                \"Create token badge\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"token_mint\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtFundReward\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"funder\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"mint_reward\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"reward_index\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"transfer_fee_excluded_amount_in\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtInitializePool\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_a_mint\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_b_mint\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"creator\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"payer\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"alpha_vault\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"pool_fees\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolFeeParameters\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"sqrt_min_price\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_max_price\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"collect_fee_mode\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"liquidity\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_price\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"activation_point\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_a_flag\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"token_b_flag\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"token_a_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_amount_a\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_amount_b\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"pool_type\",\n                        \"type\": \"u8\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtInitializeReward\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"reward_mint\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"funder\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"reward_index\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"reward_duration\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtLockPosition\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"vesting\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"cliff_point\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"period_frequency\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"cliff_unlock_liquidity\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"liquidity_per_period\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"number_of_period\",\n                        \"type\": \"u16\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtPermanentLockPosition\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"lock_liquidity_amount\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"total_permanent_locked_liquidity\",\n                        \"type\": \"u128\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtRemoveLiquidity\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"position\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"owner\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"params\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"RemoveLiquidityParameters\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"token_a_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtSetPoolStatus\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"status\",\n                        \"type\": \"u8\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtSwap\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"trade_direction\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"has_referral\",\n                        \"type\": \"bool\"\n                    },\n                    {\n                        \"name\": \"params\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"SwapParameters\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"swap_result\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"SwapResult\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"actual_amount_in\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"current_timestamp\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtUpdateRewardDuration\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"reward_index\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"old_reward_duration\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"new_reward_duration\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtUpdateRewardFunder\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"reward_index\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"old_funder\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"new_funder\",\n                        \"type\": \"pubkey\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"EvtWithdrawIneligibleReward\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"reward_mint\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"amount\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"InitializeCustomizablePoolParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool_fees\",\n                        \"docs\": [\n                            \"pool fees\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolFeeParameters\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"sqrt_min_price\",\n                        \"docs\": [\n                            \"sqrt min price\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_max_price\",\n                        \"docs\": [\n                            \"sqrt max price\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"has_alpha_vault\",\n                        \"docs\": [\n                            \"has alpha vault\"\n                        ],\n                        \"type\": \"bool\"\n                    },\n                    {\n                        \"name\": \"liquidity\",\n                        \"docs\": [\n                            \"initialize liquidity\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_price\",\n                        \"docs\": [\n                            \"The init price of the pool as a sqrt(token_b/token_a) Q64.64 value\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"docs\": [\n                            \"activation type\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"collect_fee_mode\",\n                        \"docs\": [\n                            \"collect fee mode\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"activation_point\",\n                        \"docs\": [\n                            \"activation point\"\n                        ],\n                        \"type\": {\n                            \"option\": \"u64\"\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"InitializePoolParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"liquidity\",\n                        \"docs\": [\n                            \"initialize liquidity\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_price\",\n                        \"docs\": [\n                            \"The init price of the pool as a sqrt(token_b/token_a) Q64.64 value\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"activation_point\",\n                        \"docs\": [\n                            \"activation point\"\n                        ],\n                        \"type\": {\n                            \"option\": \"u64\"\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Pool\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool_fees\",\n                        \"docs\": [\n                            \"Pool fee\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolFeesStruct\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"token_a_mint\",\n                        \"docs\": [\n                            \"token a mint\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_b_mint\",\n                        \"docs\": [\n                            \"token b mint\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_a_vault\",\n                        \"docs\": [\n                            \"token a vault\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"token_b_vault\",\n                        \"docs\": [\n                            \"token b vault\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"whitelisted_vault\",\n                        \"docs\": [\n                            \"Whitelisted vault to be able to buy pool before activation_point\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"partner\",\n                        \"docs\": [\n                            \"partner\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"liquidity\",\n                        \"docs\": [\n                            \"liquidity share\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"token_a_reserve\",\n                        \"docs\": [\n                            \"token a reserve\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_reserve\",\n                        \"docs\": [\n                            \"token b reserve\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_a_fee\",\n                        \"docs\": [\n                            \"protocol a fee\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_b_fee\",\n                        \"docs\": [\n                            \"protocol b fee\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"partner_a_fee\",\n                        \"docs\": [\n                            \"partner a fee\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"partner_b_fee\",\n                        \"docs\": [\n                            \"partner b fee\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"sqrt_min_price\",\n                        \"docs\": [\n                            \"min price\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_max_price\",\n                        \"docs\": [\n                            \"max price\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"sqrt_price\",\n                        \"docs\": [\n                            \"current price\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"activation_point\",\n                        \"docs\": [\n                            \"Activation point, can be slot or timestamp\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"activation_type\",\n                        \"docs\": [\n                            \"Activation type, 0 means by slot, 1 means by timestamp\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"pool_status\",\n                        \"docs\": [\n                            \"pool status, 0: enable, 1 disable\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"token_a_flag\",\n                        \"docs\": [\n                            \"token a flag\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"token_b_flag\",\n                        \"docs\": [\n                            \"token b flag\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"collect_fee_mode\",\n                        \"docs\": [\n                            \"0 is collect fee in both token, 1 only collect fee in token a, 2 only collect fee in token b\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"pool_type\",\n                        \"docs\": [\n                            \"pool type\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"_padding_0\",\n                        \"docs\": [\n                            \"padding\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                2\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"fee_a_per_liquidity\",\n                        \"docs\": [\n                            \"cumulative\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                32\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"fee_b_per_liquidity\",\n                        \"docs\": [\n                            \"cumulative\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                32\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"permanent_lock_liquidity\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"metrics\",\n                        \"docs\": [\n                            \"metrics\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PoolMetrics\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"_padding_1\",\n                        \"docs\": [\n                            \"Padding for further use\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u64\",\n                                10\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"reward_infos\",\n                        \"docs\": [\n                            \"Farming reward information\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                {\n                                    \"defined\": {\n                                        \"name\": \"RewardInfo\"\n                                    }\n                                },\n                                2\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PoolFeeParameters\",\n            \"docs\": [\n                \"Information regarding fee charges\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"base_fee\",\n                        \"docs\": [\n                            \"Base fee\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"BaseFeeParameters\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"protocol_fee_percent\",\n                        \"docs\": [\n                            \"Protocol trade fee percent\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"partner_fee_percent\",\n                        \"docs\": [\n                            \"partner fee percent\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"referral_fee_percent\",\n                        \"docs\": [\n                            \"referral fee percent\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"dynamic_fee\",\n                        \"docs\": [\n                            \"dynamic fee\"\n                        ],\n                        \"type\": {\n                            \"option\": {\n                                \"defined\": {\n                                    \"name\": \"DynamicFeeParameters\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PoolFeesConfig\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"base_fee\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"BaseFeeConfig\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"dynamic_fee\",\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"DynamicFeeConfig\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"protocol_fee_percent\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"partner_fee_percent\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"referral_fee_percent\",\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"padding_0\",\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                5\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"padding_1\",\n                        \"type\": {\n                            \"array\": [\n                                \"u64\",\n                                5\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PoolFeesStruct\",\n            \"docs\": [\n                \"Information regarding fee charges\",\n                \"trading_fee = amount * trade_fee_numerator / denominator\",\n                \"protocol_fee = trading_fee * protocol_fee_percentage / 100\",\n                \"referral_fee = protocol_fee * referral_percentage / 100\",\n                \"partner_fee = (protocol_fee - referral_fee) * partner_fee_percentage / denominator\"\n            ],\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"base_fee\",\n                        \"docs\": [\n                            \"Trade fees are extra token amounts that are held inside the token\",\n                            \"accounts during a trade, making the value of liquidity tokens rise.\",\n                            \"Trade fee numerator\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"BaseFeeStruct\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"protocol_fee_percent\",\n                        \"docs\": [\n                            \"Protocol trading fees are extra token amounts that are held inside the token\",\n                            \"accounts during a trade, with the equivalent in pool tokens minted to\",\n                            \"the protocol of the program.\",\n                            \"Protocol trade fee numerator\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"partner_fee_percent\",\n                        \"docs\": [\n                            \"partner fee\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"referral_fee_percent\",\n                        \"docs\": [\n                            \"referral fee\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"padding_0\",\n                        \"docs\": [\n                            \"padding\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                5\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"dynamic_fee\",\n                        \"docs\": [\n                            \"dynamic fee\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"DynamicFeeStruct\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"padding_1\",\n                        \"docs\": [\n                            \"padding\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u64\",\n                                2\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PoolMetrics\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"total_lp_a_fee\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"total_lp_b_fee\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"total_protocol_a_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_protocol_b_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_partner_a_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_partner_b_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_position\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"padding\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Position\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"pool\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"nft_mint\",\n                        \"docs\": [\n                            \"nft mint\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"fee_a_per_token_checkpoint\",\n                        \"docs\": [\n                            \"fee a checkpoint\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                32\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"fee_b_per_token_checkpoint\",\n                        \"docs\": [\n                            \"fee b checkpoint\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                32\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"fee_a_pending\",\n                        \"docs\": [\n                            \"fee a pending\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"fee_b_pending\",\n                        \"docs\": [\n                            \"fee b pending\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"unlocked_liquidity\",\n                        \"docs\": [\n                            \"unlock liquidity\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"vested_liquidity\",\n                        \"docs\": [\n                            \"vesting liquidity\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"permanent_locked_liquidity\",\n                        \"docs\": [\n                            \"permanent locked liquidity\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"metrics\",\n                        \"docs\": [\n                            \"metrics\"\n                        ],\n                        \"type\": {\n                            \"defined\": {\n                                \"name\": \"PositionMetrics\"\n                            }\n                        }\n                    },\n                    {\n                        \"name\": \"reward_infos\",\n                        \"docs\": [\n                            \"Farming reward information\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                {\n                                    \"defined\": {\n                                        \"name\": \"UserRewardInfo\"\n                                    }\n                                },\n                                2\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"padding\",\n                        \"docs\": [\n                            \"padding for future usage\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u128\",\n                                6\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"PositionMetrics\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"total_claimed_a_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_claimed_b_fee\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"RemoveLiquidityParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"liquidity_delta\",\n                        \"docs\": [\n                            \"delta liquidity\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"token_a_amount_threshold\",\n                        \"docs\": [\n                            \"minimum token a amount\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"token_b_amount_threshold\",\n                        \"docs\": [\n                            \"minimum token b amount\"\n                        ],\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"RewardInfo\",\n            \"docs\": [\n                \"Stores the state relevant for tracking liquidity mining rewards\"\n            ],\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"initialized\",\n                        \"docs\": [\n                            \"Indicates if the reward has been initialized\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"reward_token_flag\",\n                        \"docs\": [\n                            \"reward token flag\"\n                        ],\n                        \"type\": \"u8\"\n                    },\n                    {\n                        \"name\": \"_padding_0\",\n                        \"docs\": [\n                            \"padding\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                6\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"_padding_1\",\n                        \"docs\": [\n                            \"Padding to ensure `reward_rate: u128` is 16-byte aligned\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                8\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"mint\",\n                        \"docs\": [\n                            \"Reward token mint.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"vault\",\n                        \"docs\": [\n                            \"Reward vault token account.\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"funder\",\n                        \"docs\": [\n                            \"Authority account that allows to fund rewards\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"reward_duration\",\n                        \"docs\": [\n                            \"reward duration\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"reward_duration_end\",\n                        \"docs\": [\n                            \"reward duration end\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"reward_rate\",\n                        \"docs\": [\n                            \"reward rate\"\n                        ],\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"reward_per_token_stored\",\n                        \"docs\": [\n                            \"Reward per token stored\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                32\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"last_update_time\",\n                        \"docs\": [\n                            \"The last time reward states were updated.\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"cumulative_seconds_with_empty_liquidity_reward\",\n                        \"docs\": [\n                            \"Accumulated seconds when the farm distributed rewards but the bin was empty.\",\n                            \"These rewards will be carried over to the next reward time window.\"\n                        ],\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"SwapParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"amount_in\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"minimum_amount_out\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"SwapResult\",\n            \"docs\": [\n                \"Encodes all results of swapping\"\n            ],\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"output_amount\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"next_sqrt_price\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"lp_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"protocol_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"partner_fee\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"referral_fee\",\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"TokenBadge\",\n            \"docs\": [\n                \"Parameter that set by the protocol\"\n            ],\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"token_mint\",\n                        \"docs\": [\n                            \"token mint\"\n                        ],\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"_padding\",\n                        \"docs\": [\n                            \"Reserve\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                128\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"UserRewardInfo\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"reward_per_token_checkpoint\",\n                        \"docs\": [\n                            \"The latest update reward checkpoint\"\n                        ],\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                32\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"reward_pendings\",\n                        \"docs\": [\n                            \"Current pending rewards\"\n                        ],\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"total_claimed_rewards\",\n                        \"docs\": [\n                            \"Total claimed rewards\"\n                        ],\n                        \"type\": \"u64\"\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"Vesting\",\n            \"serialization\": \"bytemuck\",\n            \"repr\": {\n                \"kind\": \"c\"\n            },\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"position\",\n                        \"type\": \"pubkey\"\n                    },\n                    {\n                        \"name\": \"cliff_point\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"period_frequency\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"cliff_unlock_liquidity\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"liquidity_per_period\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"total_released_liquidity\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"number_of_period\",\n                        \"type\": \"u16\"\n                    },\n                    {\n                        \"name\": \"padding\",\n                        \"type\": {\n                            \"array\": [\n                                \"u8\",\n                                14\n                            ]\n                        }\n                    },\n                    {\n                        \"name\": \"padding2\",\n                        \"type\": {\n                            \"array\": [\n                                \"u128\",\n                                4\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        {\n            \"name\": \"VestingParameters\",\n            \"type\": {\n                \"kind\": \"struct\",\n                \"fields\": [\n                    {\n                        \"name\": \"cliff_point\",\n                        \"type\": {\n                            \"option\": \"u64\"\n                        }\n                    },\n                    {\n                        \"name\": \"period_frequency\",\n                        \"type\": \"u64\"\n                    },\n                    {\n                        \"name\": \"cliff_unlock_liquidity\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"liquidity_per_period\",\n                        \"type\": \"u128\"\n                    },\n                    {\n                        \"name\": \"number_of_period\",\n                        \"type\": \"u16\"\n                    }\n                ]\n            }\n        }\n    ]\n}","import {\n    Connection,\n    PublicKey,\n    SystemProgram,\n    Transaction,\n    TransactionInstruction,\n} from '@solana/web3.js'\n\nimport {\n    ASSOCIATED_TOKEN_PROGRAM_ID,\n    createAssociatedTokenAccountIdempotentInstruction,\n    createCloseAccountInstruction,\n    getAccount,\n    getAssociatedTokenAddressSync,\n    getMint,\n    NATIVE_MINT,\n    TOKEN_2022_PROGRAM_ID,\n    TOKEN_PROGRAM_ID,\n    TokenAccountNotFoundError,\n    TokenInvalidAccountOwnerError,\n} from '@solana/spl-token'\nimport { TokenType } from '../types'\n\n/**\n * Get or create an ATA instruction\n * @param connection - The connection\n * @param tokenMint - The token mint\n * @param owner - The owner\n * @param payer - The payer\n * @param allowOwnerOffCurve - Whether to allow the owner to be off curve\n * @param tokenProgram - The token program\n * @returns The ATA instruction\n */\nexport const getOrCreateATAInstruction = async (\n    connection: Connection,\n    tokenMint: PublicKey,\n    owner: PublicKey,\n    payer: PublicKey,\n    allowOwnerOffCurve = true,\n    tokenProgram: PublicKey\n): Promise<{ ataPubkey: PublicKey; ix?: TransactionInstruction }> => {\n    const toAccount = getAssociatedTokenAddressSync(\n        tokenMint,\n        owner,\n        allowOwnerOffCurve,\n        tokenProgram\n    )\n\n    try {\n        await getAccount(connection, toAccount)\n        return { ataPubkey: toAccount, ix: undefined }\n    } catch (e) {\n        if (\n            e instanceof TokenAccountNotFoundError ||\n            e instanceof TokenInvalidAccountOwnerError\n        ) {\n            const ix = createAssociatedTokenAccountIdempotentInstruction(\n                payer,\n                toAccount,\n                owner,\n                tokenMint,\n                tokenProgram\n            )\n\n            return { ataPubkey: toAccount, ix }\n        } else {\n            /* handle error */\n            console.error('Error::getOrCreateATAInstruction', e)\n            throw e\n        }\n    }\n}\n\n/**\n * Unwrap SOL instruction\n * @param owner - The owner of the SOL\n * @param receiver - The receiver of the SOL\n * @param allowOwnerOffCurve - Whether to allow the owner to be off curve\n * @returns The unwrap SOL instruction\n */\nexport function unwrapSOLInstruction(\n    owner: PublicKey,\n    receiver: PublicKey,\n    allowOwnerOffCurve = true\n): TransactionInstruction | null {\n    const wSolATAAccount = getAssociatedTokenAddressSync(\n        NATIVE_MINT,\n        owner,\n        allowOwnerOffCurve\n    )\n    if (wSolATAAccount) {\n        const closedWrappedSolInstruction = createCloseAccountInstruction(\n            wSolATAAccount,\n            receiver,\n            owner,\n            [],\n            TOKEN_PROGRAM_ID\n        )\n        return closedWrappedSolInstruction\n    }\n    return null\n}\n\n/**\n * Wrap SOL instruction\n * @param from - The from address\n * @param to - The to address\n * @param amount - The amount to wrap\n * @returns The wrap SOL instruction\n */\nexport function wrapSOLInstruction(\n    from: PublicKey,\n    to: PublicKey,\n    amount: bigint\n): TransactionInstruction[] {\n    return [\n        SystemProgram.transfer({\n            fromPubkey: from,\n            toPubkey: to,\n            lamports: amount,\n        }),\n        new TransactionInstruction({\n            keys: [\n                {\n                    pubkey: to,\n                    isSigner: false,\n                    isWritable: true,\n                },\n            ],\n            data: Buffer.from(new Uint8Array([17])),\n            programId: TOKEN_PROGRAM_ID,\n        }),\n    ]\n}\n\n/**\n * Find the associated token address for a wallet and token mint\n * @param walletAddress - The wallet address\n * @param tokenMintAddress - The token mint address\n * @param tokenProgramId - The token program ID\n * @returns The associated token address\n */\nexport function findAssociatedTokenAddress(\n    walletAddress: PublicKey,\n    tokenMintAddress: PublicKey,\n    tokenProgramId: PublicKey\n): PublicKey {\n    return PublicKey.findProgramAddressSync(\n        [\n            walletAddress.toBuffer(),\n            tokenProgramId.toBuffer(),\n            tokenMintAddress.toBuffer(),\n        ],\n        ASSOCIATED_TOKEN_PROGRAM_ID\n    )[0]\n}\n\n/**\n * Get token decimals for a particular mint\n * @param connection - The connection\n * @param mintAddress - The mint address to get decimals for\n * @returns The number of decimals for the token\n */\nexport async function getTokenDecimals(\n    connection: Connection,\n    mintAddress: PublicKey | string\n): Promise<number> {\n    const mintPubkey =\n        mintAddress instanceof PublicKey\n            ? mintAddress\n            : new PublicKey(mintAddress)\n\n    const tokenProgram = (await connection.getAccountInfo(mintPubkey)).owner\n\n    const mintInfo = await getMint(\n        connection,\n        mintPubkey,\n        'confirmed',\n        tokenProgram\n    )\n    return mintInfo.decimals\n}\n\n/**\n * Get the token program for a given token type\n * @param tokenType - The token type\n * @returns The token program\n */\nexport function getTokenProgram(tokenType: TokenType): PublicKey {\n    return tokenType === TokenType.SPL\n        ? TOKEN_PROGRAM_ID\n        : TOKEN_2022_PROGRAM_ID\n}\n\n/**\n * Get the token type based on the token mint's program owner\n * @param connection - The connection\n * @param tokenMint - The token mint\n * @returns The token type (SPL [0] or Token2022 [1])\n */\nexport async function getTokenType(\n    connection: Connection,\n    tokenMint: PublicKey\n): Promise<TokenType | null> {\n    const accountInfo = await connection.getAccountInfo(tokenMint)\n    if (!accountInfo) {\n        return null\n    }\n\n    return accountInfo.owner.equals(TOKEN_PROGRAM_ID)\n        ? TokenType.SPL\n        : TokenType.Token2022\n}\n\n/**\n * Prepare token accounts instruction\n * @param connection - The connection\n * @param owner - The owner of the token account\n * @param payer - The payer of the token account\n * @param tokenMint - The mint of the token account\n * @param amount - The amount of the token account\n * @param tokenProgram - The token program ID.\n * @returns The transaction and token account public key\n */\nexport async function prepareTokenAccountTx(\n    connection: Connection,\n    owner: PublicKey,\n    payer: PublicKey,\n    tokenMint: PublicKey,\n    amount: bigint,\n    tokenProgram: PublicKey\n): Promise<{\n    tokenAccount: PublicKey\n    transaction: Transaction\n}> {\n    const instructions: TransactionInstruction[] = []\n    const { ataPubkey: tokenAccount, ix: createAtaIx } =\n        await getOrCreateATAInstruction(\n            connection,\n            tokenMint,\n            owner,\n            payer,\n            true,\n            tokenProgram\n        )\n\n    createAtaIx && instructions.push(createAtaIx)\n\n    if (tokenMint.equals(NATIVE_MINT)) {\n        const wrapIx = wrapSOLInstruction(owner, tokenAccount, amount)\n        instructions.push(...wrapIx)\n    }\n\n    const transaction = new Transaction()\n    if (instructions.length > 0) {\n        transaction.add(...instructions)\n    }\n\n    return { tokenAccount, transaction }\n}\n\n/**\n * Clean up token account instruction\n * @param owner - The owner of the token account\n * @param receiver - The receiver of the token account\n * @param tokenMint - The mint of the token account\n * @returns The transaction\n */\nexport async function cleanUpTokenAccountTx(\n    owner: PublicKey,\n    receiver: PublicKey,\n    tokenMint: PublicKey\n): Promise<{\n    transaction: Transaction\n}> {\n    if (tokenMint.equals(NATIVE_MINT)) {\n        const unwrapIx = unwrapSOLInstruction(owner, receiver)\n        if (unwrapIx) {\n            return { transaction: new Transaction().add(unwrapIx) }\n        }\n    }\n\n    return null\n}\n","import {\n    PublicKey,\n    SystemProgram,\n    SYSVAR_RENT_PUBKEY,\n    TransactionInstruction,\n} from '@solana/web3.js'\nimport { DynamicVault } from '../idl/dynamic-vault/idl'\nimport { Program } from '@coral-xyz/anchor'\nimport {\n    deriveTokenVaultKey,\n    deriveVaultAddress,\n    deriveVaultLpMintAddress,\n} from './accounts'\nimport { BASE_ADDRESS } from '../constants'\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token'\nimport { DammV1 } from '../idl/damm-v1/idl'\n\n/**\n * Create a permissionless dynamic vault instruction\n * @param mint - The mint of the vault\n * @param payer - The payer of the vault\n * @param vaultProgram - The vault program\n * @returns The vault key, token vault key, and lp mint key\n */\nexport async function createInitializePermissionlessDynamicVaultIx(\n    mint: PublicKey,\n    payer: PublicKey,\n    vaultProgram: Program<DynamicVault>\n): Promise<{\n    vaultKey: PublicKey\n    tokenVaultKey: PublicKey\n    lpMintKey: PublicKey\n    instruction: TransactionInstruction\n}> {\n    const vaultKey = deriveVaultAddress(mint, BASE_ADDRESS)\n\n    const tokenVaultKey = deriveTokenVaultKey(vaultKey)\n\n    const lpMintKey = deriveVaultLpMintAddress(vaultKey)\n\n    const ix = await vaultProgram.methods\n        .initialize()\n        .accountsPartial({\n            vault: vaultKey,\n            tokenVault: tokenVaultKey,\n            tokenMint: mint,\n            lpMint: lpMintKey,\n            payer,\n            rent: SYSVAR_RENT_PUBKEY,\n            tokenProgram: TOKEN_PROGRAM_ID,\n            systemProgram: SystemProgram.programId,\n        })\n        .instruction()\n\n    return {\n        instruction: ix,\n        vaultKey,\n        tokenVaultKey,\n        lpMintKey,\n    }\n}\n\n/**\n * Create a lock escrow instruction\n * @param connection - The connection to the Solana network\n * @param payer - The payer of the lock escrow\n * @param pool - The pool address\n * @param lpMint - The lp mint address\n * @param escrowOwner - The owner of the escrow\n * @param lockEscrowKey - The lock escrow key\n * @param dammV1Program - The DAMM V1 program\n * @returns The lock escrow instruction\n */\nexport async function createLockEscrowIx(\n    payer: PublicKey,\n    pool: PublicKey,\n    lpMint: PublicKey,\n    escrowOwner: PublicKey,\n    lockEscrowKey: PublicKey,\n    dammV1Program: Program<DammV1>\n): Promise<TransactionInstruction> {\n    const ix = await dammV1Program.methods\n        .createLockEscrow()\n        .accountsPartial({\n            pool,\n            lpMint,\n            owner: escrowOwner,\n            lockEscrow: lockEscrowKey,\n            payer: payer,\n            systemProgram: SystemProgram.programId,\n        })\n        .instruction()\n\n    return ix\n}\n","import {\n    Commitment,\n    Connection,\n    PublicKey,\n    TransactionInstruction,\n} from '@solana/web3.js'\nimport {\n    createDbcProgram,\n    deriveDbcPoolAuthority,\n    getOrCreateATAInstruction,\n} from '../helpers'\nimport type { Program } from '@coral-xyz/anchor'\nimport type { DynamicBondingCurve as DynamicBondingCurveIDL } from '../idl/dynamic-bonding-curve/idl'\n\nexport class DynamicBondingCurveProgram {\n    program: Program<DynamicBondingCurveIDL>\n    protected connection: Connection\n    protected poolAuthority: PublicKey\n    protected commitment: Commitment\n\n    constructor(connection: Connection, commitment: Commitment) {\n        const { program } = createDbcProgram(connection, commitment)\n        this.program = program\n        this.connection = connection\n        this.poolAuthority = deriveDbcPoolAuthority()\n        this.commitment = commitment\n    }\n\n    protected async prepareTokenAccounts(\n        owner: PublicKey,\n        payer: PublicKey,\n        tokenAMint: PublicKey,\n        tokenBMint: PublicKey,\n        tokenAProgram: PublicKey,\n        tokenBProgram: PublicKey\n    ): Promise<{\n        ataTokenA: PublicKey\n        ataTokenB: PublicKey\n        instructions: TransactionInstruction[]\n    }> {\n        const instructions: TransactionInstruction[] = []\n        const [\n            { ataPubkey: ataTokenA, ix: createAtaTokenAIx },\n            { ataPubkey: ataTokenB, ix: createAtaTokenBIx },\n        ] = await Promise.all([\n            getOrCreateATAInstruction(\n                this.connection,\n                tokenAMint,\n                owner,\n                payer,\n                true,\n                tokenAProgram\n            ),\n            getOrCreateATAInstruction(\n                this.connection,\n                tokenBMint,\n                owner,\n                payer,\n                true,\n                tokenBProgram\n            ),\n        ])\n        createAtaTokenAIx && instructions.push(createAtaTokenAIx)\n        createAtaTokenBIx && instructions.push(createAtaTokenBIx)\n\n        return { ataTokenA, ataTokenB, instructions }\n    }\n\n    /**\n     * Get the underlying program instance\n     * @returns The program instance\n     */\n    getProgram(): Program<DynamicBondingCurveIDL> {\n        return this.program\n    }\n}\n","import BN from 'bn.js'\nimport { SafeMath } from './safeMath'\nimport { mulDiv } from './utilsMath'\nimport {\n    getDeltaAmountBaseUnsigned,\n    getDeltaAmountQuoteUnsigned,\n    getNextSqrtPriceFromInput,\n    getNextSqrtPriceFromOutput,\n} from './curve'\nimport { getBaseFeeNumerator, getFeeOnAmount, getVariableFee } from './feeMath'\nimport {\n    CollectFeeMode,\n    Rounding,\n    TradeDirection,\n    type FeeMode,\n    type FeeOnAmountResult,\n    type PoolConfig,\n    type QuoteResult,\n    type SwapAmount,\n    type VirtualPool,\n} from '../types'\nimport { FEE_DENOMINATOR, MAX_FEE_NUMERATOR } from '../constants'\n\n/**\n * Get swap result\n * @param poolState Pool state\n * @param configState Config state\n * @param amountIn Input amount\n * @param feeMode Fee mode\n * @param tradeDirection Trade direction\n * @param currentPoint Current point\n * @returns Swap result\n */\nexport function getSwapResult(\n    poolState: VirtualPool,\n    configState: PoolConfig,\n    amountIn: BN,\n    feeMode: FeeMode,\n    tradeDirection: TradeDirection,\n    currentPoint: BN\n): QuoteResult {\n    let actualProtocolFee = new BN(0)\n    let actualTradingFee = new BN(0)\n    let actualReferralFee = new BN(0)\n\n    // apply fees on input if needed\n    let actualAmountIn: BN\n    if (feeMode.feesOnInput) {\n        const feeResult: FeeOnAmountResult = getFeeOnAmount(\n            amountIn,\n            configState.poolFees,\n            feeMode.hasReferral,\n            currentPoint,\n            poolState.activationPoint,\n            poolState.volatilityTracker,\n            tradeDirection\n        )\n\n        actualProtocolFee = feeResult.protocolFee\n        actualTradingFee = feeResult.tradingFee\n        actualReferralFee = feeResult.referralFee\n        actualAmountIn = feeResult.amount\n    } else {\n        actualAmountIn = amountIn\n    }\n\n    // calculate swap amount\n    const swapAmount: SwapAmount =\n        tradeDirection === TradeDirection.BaseToQuote\n            ? getSwapAmountFromBaseToQuote(\n                  configState,\n                  poolState.sqrtPrice,\n                  actualAmountIn\n              )\n            : getSwapAmountFromQuoteToBase(\n                  configState,\n                  poolState.sqrtPrice,\n                  actualAmountIn\n              )\n\n    // apply fees on output if needed\n    let actualAmountOut: BN\n    if (feeMode.feesOnInput) {\n        actualAmountOut = swapAmount.outputAmount\n    } else {\n        const feeResult: FeeOnAmountResult = getFeeOnAmount(\n            swapAmount.outputAmount,\n            configState.poolFees,\n            feeMode.hasReferral,\n            currentPoint,\n            poolState.activationPoint,\n            poolState.volatilityTracker,\n            tradeDirection\n        )\n\n        actualProtocolFee = feeResult.protocolFee\n        actualTradingFee = feeResult.tradingFee\n        actualReferralFee = feeResult.referralFee\n        actualAmountOut = feeResult.amount\n    }\n\n    return {\n        amountOut: actualAmountOut,\n        minimumAmountOut: actualAmountOut,\n        nextSqrtPrice: swapAmount.nextSqrtPrice,\n        fee: {\n            trading: actualTradingFee,\n            protocol: actualProtocolFee,\n            referral: actualReferralFee,\n        },\n        price: {\n            beforeSwap: poolState.sqrtPrice,\n            afterSwap: swapAmount.nextSqrtPrice,\n        },\n    }\n}\n\n/**\n * Get swap amount from base to quote\n * @param configState Config state\n * @param currentSqrtPrice Current sqrt price\n * @param amountIn Input amount\n * @returns Swap amount\n */\nexport function getSwapAmountFromBaseToQuote(\n    configState: {\n        curve: Array<{\n            sqrtPrice: BN\n            liquidity: BN\n        }>\n    },\n    currentSqrtPrice: BN,\n    amountIn: BN\n): SwapAmount {\n    if (amountIn.isZero()) {\n        return {\n            outputAmount: new BN(0),\n            nextSqrtPrice: currentSqrtPrice,\n        }\n    }\n\n    // track total output with BN\n    let totalOutputAmount = new BN(0)\n    let sqrtPrice = currentSqrtPrice\n    let amountLeft = amountIn\n\n    // iterate through the curve points in reverse order\n    for (let i = configState.curve.length - 1; i >= 0; i--) {\n        if (\n            configState.curve[i].sqrtPrice.isZero() ||\n            configState.curve[i].liquidity.isZero()\n        ) {\n            continue\n        }\n\n        if (configState.curve[i].sqrtPrice.lt(sqrtPrice)) {\n            // get the current liquidity\n            const currentLiquidity =\n                i + 1 < configState.curve.length\n                    ? configState.curve[i + 1].liquidity\n                    : configState.curve[i].liquidity\n\n            // skip if liquidity is zero\n            if (currentLiquidity.isZero()) continue\n\n            const maxAmountIn = getDeltaAmountBaseUnsigned(\n                configState.curve[i].sqrtPrice,\n                sqrtPrice,\n                currentLiquidity,\n                Rounding.Up\n            )\n\n            if (amountLeft.lt(maxAmountIn)) {\n                const nextSqrtPrice = getNextSqrtPriceFromInput(\n                    sqrtPrice,\n                    currentLiquidity,\n                    amountLeft,\n                    true\n                )\n\n                const outputAmount = getDeltaAmountQuoteUnsigned(\n                    nextSqrtPrice,\n                    sqrtPrice,\n                    currentLiquidity,\n                    Rounding.Down\n                )\n\n                // add to total\n                totalOutputAmount = SafeMath.add(\n                    totalOutputAmount,\n                    outputAmount\n                )\n                sqrtPrice = nextSqrtPrice\n                amountLeft = new BN(0)\n                break\n            } else {\n                const nextSqrtPrice = configState.curve[i].sqrtPrice\n                const outputAmount = getDeltaAmountQuoteUnsigned(\n                    nextSqrtPrice,\n                    sqrtPrice,\n                    currentLiquidity,\n                    Rounding.Down\n                )\n\n                // add to total\n                totalOutputAmount = SafeMath.add(\n                    totalOutputAmount,\n                    outputAmount\n                )\n                sqrtPrice = nextSqrtPrice\n                amountLeft = SafeMath.sub(amountLeft, maxAmountIn)\n            }\n        }\n    }\n\n    if (!amountLeft.isZero() && !configState.curve[0].liquidity.isZero()) {\n        const nextSqrtPrice = getNextSqrtPriceFromInput(\n            sqrtPrice,\n            configState.curve[0].liquidity,\n            amountLeft,\n            true\n        )\n\n        const outputAmount = getDeltaAmountQuoteUnsigned(\n            nextSqrtPrice,\n            sqrtPrice,\n            configState.curve[0].liquidity,\n            Rounding.Down\n        )\n\n        // add to total\n        totalOutputAmount = SafeMath.add(totalOutputAmount, outputAmount)\n        sqrtPrice = nextSqrtPrice\n    }\n\n    return {\n        outputAmount: totalOutputAmount,\n        nextSqrtPrice: sqrtPrice,\n    }\n}\n\n/**\n * Get swap amount from quote to base\n * @param configState Config state\n * @param currentSqrtPrice Current sqrt price\n * @param amountIn Input amount\n * @returns Swap amount\n * @throws Error if not enough liquidity\n */\nexport function getSwapAmountFromQuoteToBase(\n    configState: {\n        curve: Array<{\n            sqrtPrice: BN\n            liquidity: BN\n        }>\n    },\n    currentSqrtPrice: BN,\n    amountIn: BN\n): SwapAmount {\n    if (amountIn.isZero()) {\n        return {\n            outputAmount: new BN(0),\n            nextSqrtPrice: currentSqrtPrice,\n        }\n    }\n\n    let totalOutputAmount = new BN(0)\n    let sqrtPrice = currentSqrtPrice\n    let amountLeft = amountIn\n\n    // iterate through the curve points\n    for (let i = 0; i < configState.curve.length; i++) {\n        if (\n            configState.curve[i].sqrtPrice.isZero() ||\n            configState.curve[i].liquidity.isZero()\n        ) {\n            break\n        }\n\n        // skip if liquidity is zero\n        if (configState.curve[i].liquidity.isZero()) continue\n\n        if (configState.curve[i].sqrtPrice.gt(sqrtPrice)) {\n            const maxAmountIn = getDeltaAmountQuoteUnsigned(\n                sqrtPrice,\n                configState.curve[i].sqrtPrice,\n                configState.curve[i].liquidity,\n                Rounding.Up\n            )\n\n            if (amountLeft.lt(maxAmountIn)) {\n                const nextSqrtPrice = getNextSqrtPriceFromInput(\n                    sqrtPrice,\n                    configState.curve[i].liquidity,\n                    amountLeft,\n                    false\n                )\n\n                const outputAmount = getDeltaAmountBaseUnsigned(\n                    sqrtPrice,\n                    nextSqrtPrice,\n                    configState.curve[i].liquidity,\n                    Rounding.Down\n                )\n\n                totalOutputAmount = SafeMath.add(\n                    totalOutputAmount,\n                    outputAmount\n                )\n                sqrtPrice = nextSqrtPrice\n                amountLeft = new BN(0)\n                break\n            } else {\n                const nextSqrtPrice = configState.curve[i].sqrtPrice\n                const outputAmount = getDeltaAmountBaseUnsigned(\n                    sqrtPrice,\n                    nextSqrtPrice,\n                    configState.curve[i].liquidity,\n                    Rounding.Down\n                )\n\n                totalOutputAmount = SafeMath.add(\n                    totalOutputAmount,\n                    outputAmount\n                )\n                sqrtPrice = nextSqrtPrice\n                amountLeft = SafeMath.sub(amountLeft, maxAmountIn)\n            }\n        }\n    }\n\n    // check if all amount was processed\n    if (!amountLeft.isZero()) {\n        throw new Error('Not enough liquidity to process the entire amount')\n    }\n\n    return {\n        outputAmount: totalOutputAmount,\n        nextSqrtPrice: sqrtPrice,\n    }\n}\n\n/**\n * Get fee mode\n * @param collectFeeMode Collect fee mode\n * @param tradeDirection Trade direction\n * @param hasReferral Whether referral is used\n * @returns Fee mode\n */\nexport function getFeeMode(\n    collectFeeMode: CollectFeeMode,\n    tradeDirection: TradeDirection,\n    hasReferral: boolean\n): FeeMode {\n    const quoteToBase = tradeDirection === TradeDirection.QuoteToBase\n    const feesOnInput =\n        quoteToBase && collectFeeMode === CollectFeeMode.QuoteToken\n    const feesOnBaseToken =\n        quoteToBase && collectFeeMode === CollectFeeMode.OutputToken\n\n    return {\n        feesOnInput,\n        feesOnBaseToken,\n        hasReferral,\n    }\n}\n\n/**\n * Calculate quote for a swap with exact input amount\n * @param virtualPool Virtual pool state\n * @param config Pool config state\n * @param swapBaseForQuote Whether to swap base for quote\n * @param amountIn Input amount\n * @param slippageBps Slippage tolerance in basis points (100 = 1%)\n * @param hasReferral Whether referral is used\n * @param currentPoint Current point\n * @returns Swap quote result\n */\nexport async function swapQuote(\n    virtualPool: VirtualPool,\n    config: PoolConfig,\n    swapBaseForQuote: boolean,\n    amountIn: BN,\n    slippageBps: number = 0,\n    hasReferral: boolean,\n    currentPoint: BN\n): Promise<QuoteResult> {\n    if (virtualPool.quoteReserve.gte(config.migrationQuoteThreshold)) {\n        throw new Error('Virtual pool is completed')\n    }\n\n    if (amountIn.isZero()) {\n        throw new Error('Amount is zero')\n    }\n\n    const tradeDirection = swapBaseForQuote\n        ? TradeDirection.BaseToQuote\n        : TradeDirection.QuoteToBase\n\n    const feeMode = getFeeMode(\n        config.collectFeeMode,\n        tradeDirection,\n        hasReferral\n    )\n\n    const result = getSwapResult(\n        virtualPool,\n        config,\n        amountIn,\n        feeMode,\n        tradeDirection,\n        currentPoint\n    )\n\n    // calculate minimum amount out if slippage is provided\n    if (slippageBps > 0) {\n        // slippage factor: (10000 - slippageBps) / 10000\n        const slippageFactor = new BN(10000 - slippageBps)\n        const denominator = new BN(10000)\n\n        // minimum amount out: amountOut * (10000 - slippageBps) / 10000\n        const minimumAmountOut = result.amountOut\n            .mul(slippageFactor)\n            .div(denominator)\n\n        return {\n            ...result,\n            minimumAmountOut,\n        }\n    }\n\n    return result\n}\n\n/**\n * Calculate the required quote amount for exact input\n * @param migrationQuoteThreshold Migration quote threshold\n * @param quoteReserve Current quote reserve\n * @param collectFeeMode Fee collection mode\n * @param config Pool config state\n * @param currentPoint Current point\n * @returns Required quote amount\n */\nexport function calculateQuoteExactInAmount(\n    config: PoolConfig,\n    virtualPool: VirtualPool,\n    currentPoint: BN\n): BN {\n    if (virtualPool.quoteReserve.gte(config.migrationQuoteThreshold)) {\n        return new BN(0)\n    }\n\n    const amountInAfterFee = config.migrationQuoteThreshold.sub(\n        virtualPool.quoteReserve\n    )\n\n    if (config.collectFeeMode === CollectFeeMode.QuoteToken) {\n        const baseFeeNumerator = getBaseFeeNumerator(\n            config.poolFees.baseFee,\n            TradeDirection.QuoteToBase,\n            currentPoint,\n            virtualPool.activationPoint\n        )\n\n        let totalFeeNumerator = baseFeeNumerator\n        if (config.poolFees.dynamicFee.initialized !== 0) {\n            const variableFee = getVariableFee(\n                config.poolFees.dynamicFee,\n                virtualPool.volatilityTracker\n            )\n            totalFeeNumerator = SafeMath.add(totalFeeNumerator, variableFee)\n        }\n\n        // cap at MAX_FEE_NUMERATOR\n        totalFeeNumerator = BN.min(totalFeeNumerator, new BN(MAX_FEE_NUMERATOR))\n\n        // amountIn = amountInAfterFee * FEE_DENOMINATOR / (FEE_DENOMINATOR - effectiveFeeNumerator)\n        const denominator = new BN(FEE_DENOMINATOR).sub(totalFeeNumerator)\n        return mulDiv(\n            amountInAfterFee,\n            new BN(FEE_DENOMINATOR),\n            denominator,\n            Rounding.Up\n        )\n    } else {\n        return amountInAfterFee\n    }\n}\n\n/**\n * Get excluded fee amount from included fee amount\n * @param tradeFeeNumerator Trade fee numerator\n * @param includedFeeAmount Included fee amount\n * @returns [excluded fee amount, trading fee]\n */\nexport function getExcludedFeeAmount(\n    tradeFeeNumerator: BN,\n    includedFeeAmount: BN\n): [BN, BN] {\n    const tradingFee = mulDiv(\n        includedFeeAmount,\n        tradeFeeNumerator,\n        new BN(FEE_DENOMINATOR),\n        Rounding.Up\n    )\n\n    const excludedFeeAmount = SafeMath.sub(includedFeeAmount, tradingFee)\n    return [excludedFeeAmount, tradingFee]\n}\n\n/**\n * Get included fee amount from excluded fee amount\n * @param tradeFeeNumerator Trade fee numerator\n * @param excludedFeeAmount Excluded fee amount\n * @returns Included fee amount\n */\nexport function getIncludedFeeAmount(\n    tradeFeeNumerator: BN,\n    excludedFeeAmount: BN\n): BN {\n    const includedFeeAmount = mulDiv(\n        excludedFeeAmount,\n        new BN(FEE_DENOMINATOR),\n        new BN(FEE_DENOMINATOR).sub(tradeFeeNumerator),\n        Rounding.Up\n    )\n\n    // sanity check - verify the inverse calculation\n    const [inverseAmount] = getExcludedFeeAmount(\n        tradeFeeNumerator,\n        includedFeeAmount\n    )\n    if (inverseAmount.lt(excludedFeeAmount)) {\n        throw new Error('Inverse amount is less than excluded_fee_amount')\n    }\n\n    return includedFeeAmount\n}\n\n/**\n * Get swap result from output amount (reverse calculation)\n * @param poolState Pool state\n * @param configState Config state\n * @param outAmount Output amount\n * @param feeMode Fee mode\n * @param tradeDirection Trade direction\n * @param currentPoint Current point\n * @returns Swap result with input amount calculated\n */\nexport function getSwapResultFromOutAmount(\n    poolState: VirtualPool,\n    configState: PoolConfig,\n    outAmount: BN,\n    feeMode: FeeMode,\n    tradeDirection: TradeDirection,\n    currentPoint: BN\n): QuoteResult {\n    let actualProtocolFee = new BN(0)\n    let actualTradingFee = new BN(0)\n    let actualReferralFee = new BN(0)\n\n    // get total trading fee numerator\n    const baseFeeNumerator = getBaseFeeNumerator(\n        configState.poolFees.baseFee,\n        tradeDirection,\n        currentPoint,\n        poolState.activationPoint\n    )\n\n    let tradeFeeNumerator = baseFeeNumerator\n    if (configState.poolFees.dynamicFee.initialized !== 0) {\n        const variableFee = getVariableFee(\n            configState.poolFees.dynamicFee,\n            poolState.volatilityTracker\n        )\n        tradeFeeNumerator = SafeMath.add(tradeFeeNumerator, variableFee)\n    }\n\n    // cap at MAX_FEE_NUMERATOR\n    tradeFeeNumerator = BN.min(tradeFeeNumerator, new BN(MAX_FEE_NUMERATOR))\n\n    // calculate included fee amount based on fee mode\n    const includedFeeOutAmount = feeMode.feesOnInput\n        ? outAmount\n        : getIncludedFeeAmount(tradeFeeNumerator, outAmount)\n\n    // apply fees on output if not on input\n    if (!feeMode.feesOnInput) {\n        const feeResult: FeeOnAmountResult = getFeeOnAmount(\n            includedFeeOutAmount,\n            configState.poolFees,\n            feeMode.hasReferral,\n            currentPoint,\n            poolState.activationPoint,\n            poolState.volatilityTracker,\n            tradeDirection\n        )\n\n        actualProtocolFee = feeResult.protocolFee\n        actualTradingFee = feeResult.tradingFee\n        actualReferralFee = feeResult.referralFee\n    }\n\n    // calculate swap amount (reverse calculation)\n    const swapAmount: SwapAmount =\n        tradeDirection === TradeDirection.BaseToQuote\n            ? getInAmountFromBaseToQuote(\n                  configState,\n                  poolState.sqrtPrice,\n                  includedFeeOutAmount\n              )\n            : getInAmountFromQuoteToBase(\n                  configState,\n                  poolState.sqrtPrice,\n                  includedFeeOutAmount\n              )\n\n    // calculate included fee input amount if fees are on input\n    const includedFeeInAmount = feeMode.feesOnInput\n        ? getIncludedFeeAmount(tradeFeeNumerator, swapAmount.outputAmount)\n        : swapAmount.outputAmount\n\n    // apply fees on input if needed\n    if (feeMode.feesOnInput) {\n        const feeResult: FeeOnAmountResult = getFeeOnAmount(\n            includedFeeInAmount,\n            configState.poolFees,\n            feeMode.hasReferral,\n            currentPoint,\n            poolState.activationPoint,\n            poolState.volatilityTracker,\n            tradeDirection\n        )\n\n        actualProtocolFee = feeResult.protocolFee\n        actualTradingFee = feeResult.tradingFee\n        actualReferralFee = feeResult.referralFee\n    }\n\n    return {\n        amountOut: includedFeeInAmount,\n        minimumAmountOut: outAmount,\n        nextSqrtPrice: swapAmount.nextSqrtPrice,\n        fee: {\n            trading: actualTradingFee,\n            protocol: actualProtocolFee,\n            referral: actualReferralFee,\n        },\n        price: {\n            beforeSwap: poolState.sqrtPrice,\n            afterSwap: swapAmount.nextSqrtPrice,\n        },\n    }\n}\n\n/**\n * Get input amount from base to quote (selling)\n * @param configState Config state\n * @param currentSqrtPrice Current sqrt price\n * @param outAmount Quote output amount\n * @returns Swap amount with input calculated\n */\nexport function getInAmountFromBaseToQuote(\n    configState: PoolConfig,\n    currentSqrtPrice: BN,\n    outAmount: BN\n): SwapAmount {\n    let currentSqrtPriceLocal = currentSqrtPrice\n    let amountLeft = outAmount\n    let totalAmountIn = new BN(0)\n\n    // iterate through curve points in reverse order\n    for (let i = configState.curve.length - 1; i >= 0; i--) {\n        if (\n            configState.curve[i].sqrtPrice.isZero() ||\n            configState.curve[i].liquidity.isZero()\n        ) {\n            continue\n        }\n\n        if (configState.curve[i].sqrtPrice.lt(currentSqrtPriceLocal)) {\n            const currentLiquidity =\n                i + 1 < configState.curve.length\n                    ? configState.curve[i + 1].liquidity\n                    : configState.curve[i].liquidity\n\n            if (currentLiquidity.isZero()) continue\n\n            const maxAmountOut = getDeltaAmountQuoteUnsigned(\n                configState.curve[i].sqrtPrice,\n                currentSqrtPriceLocal,\n                currentLiquidity,\n                Rounding.Down\n            )\n\n            if (amountLeft.lt(maxAmountOut)) {\n                const nextSqrtPrice = getNextSqrtPriceFromOutput(\n                    currentSqrtPriceLocal,\n                    currentLiquidity,\n                    amountLeft,\n                    true\n                )\n\n                const inAmount = getDeltaAmountBaseUnsigned(\n                    nextSqrtPrice,\n                    currentSqrtPriceLocal,\n                    currentLiquidity,\n                    Rounding.Up\n                )\n\n                totalAmountIn = SafeMath.add(totalAmountIn, inAmount)\n                currentSqrtPriceLocal = nextSqrtPrice\n                amountLeft = new BN(0)\n                break\n            } else {\n                const nextSqrtPrice = configState.curve[i].sqrtPrice\n                const inAmount = getDeltaAmountBaseUnsigned(\n                    nextSqrtPrice,\n                    currentSqrtPriceLocal,\n                    currentLiquidity,\n                    Rounding.Up\n                )\n\n                totalAmountIn = SafeMath.add(totalAmountIn, inAmount)\n                currentSqrtPriceLocal = nextSqrtPrice\n                amountLeft = SafeMath.sub(amountLeft, maxAmountOut)\n            }\n        }\n    }\n\n    if (!amountLeft.isZero()) {\n        const nextSqrtPrice = getNextSqrtPriceFromOutput(\n            currentSqrtPriceLocal,\n            configState.curve[0].liquidity,\n            amountLeft,\n            true\n        )\n\n        if (nextSqrtPrice.lt(configState.sqrtStartPrice)) {\n            throw new Error('Not enough liquidity')\n        }\n\n        const inAmount = getDeltaAmountBaseUnsigned(\n            nextSqrtPrice,\n            currentSqrtPriceLocal,\n            configState.curve[0].liquidity,\n            Rounding.Up\n        )\n\n        totalAmountIn = SafeMath.add(totalAmountIn, inAmount)\n        currentSqrtPriceLocal = nextSqrtPrice\n    }\n\n    return {\n        outputAmount: totalAmountIn,\n        nextSqrtPrice: currentSqrtPriceLocal,\n    }\n}\n\n/**\n * Get input amount from quote to base (buying)\n * @param configState Config state\n * @param currentSqrtPrice Current sqrt price\n * @param outAmount Base output amount\n * @returns Swap amount with input calculated\n */\nexport function getInAmountFromQuoteToBase(\n    configState: PoolConfig,\n    currentSqrtPrice: BN,\n    outAmount: BN\n): SwapAmount {\n    let totalInAmount = new BN(0)\n    let currentSqrtPriceLocal = currentSqrtPrice\n    let amountLeft = outAmount\n\n    // iterate through curve points\n    for (let i = 0; i < configState.curve.length; i++) {\n        if (\n            configState.curve[i].sqrtPrice.isZero() ||\n            configState.curve[i].liquidity.isZero()\n        ) {\n            break\n        }\n\n        if (configState.curve[i].liquidity.isZero()) continue\n\n        if (configState.curve[i].sqrtPrice.gt(currentSqrtPriceLocal)) {\n            const maxAmountOut = getDeltaAmountBaseUnsigned(\n                currentSqrtPriceLocal,\n                configState.curve[i].sqrtPrice,\n                configState.curve[i].liquidity,\n                Rounding.Down\n            )\n\n            if (amountLeft.lt(maxAmountOut)) {\n                const nextSqrtPrice = getNextSqrtPriceFromOutput(\n                    currentSqrtPriceLocal,\n                    configState.curve[i].liquidity,\n                    amountLeft,\n                    false\n                )\n\n                const inAmount = getDeltaAmountQuoteUnsigned(\n                    currentSqrtPriceLocal,\n                    nextSqrtPrice,\n                    configState.curve[i].liquidity,\n                    Rounding.Up\n                )\n\n                totalInAmount = SafeMath.add(totalInAmount, inAmount)\n                currentSqrtPriceLocal = nextSqrtPrice\n                amountLeft = new BN(0)\n                break\n            } else {\n                const nextSqrtPrice = configState.curve[i].sqrtPrice\n                const inAmount = getDeltaAmountQuoteUnsigned(\n                    currentSqrtPriceLocal,\n                    nextSqrtPrice,\n                    configState.curve[i].liquidity,\n                    Rounding.Up\n                )\n\n                totalInAmount = SafeMath.add(totalInAmount, inAmount)\n                currentSqrtPriceLocal = nextSqrtPrice\n                amountLeft = SafeMath.sub(amountLeft, maxAmountOut)\n            }\n        }\n    }\n\n    if (!amountLeft.isZero()) {\n        throw new Error('Not enough liquidity')\n    }\n\n    return {\n        outputAmount: totalInAmount,\n        nextSqrtPrice: currentSqrtPriceLocal,\n    }\n}\n\n/**\n * Calculate quote for a swap with exact output amount\n * @param virtualPool Virtual pool state\n * @param config Pool config state\n * @param swapBaseForQuote Whether to swap base for quote\n * @param outAmount Output amount\n * @param slippageBps Slippage tolerance in basis points (100 = 1%)\n * @param hasReferral Whether referral is used\n * @param currentPoint Current point\n * @returns Swap quote result with input amount calculated\n */\nexport function swapQuoteExactOut(\n    virtualPool: VirtualPool,\n    config: PoolConfig,\n    swapBaseForQuote: boolean,\n    outAmount: BN,\n    slippageBps: number = 0,\n    hasReferral: boolean,\n    currentPoint: BN\n): QuoteResult {\n    if (virtualPool.quoteReserve.gte(config.migrationQuoteThreshold)) {\n        throw new Error('Virtual pool is completed')\n    }\n\n    if (outAmount.isZero()) {\n        throw new Error('Amount is zero')\n    }\n\n    const tradeDirection = swapBaseForQuote\n        ? TradeDirection.BaseToQuote\n        : TradeDirection.QuoteToBase\n\n    const feeMode = getFeeMode(\n        config.collectFeeMode,\n        tradeDirection,\n        hasReferral\n    )\n\n    const result = getSwapResultFromOutAmount(\n        virtualPool,\n        config,\n        outAmount,\n        feeMode,\n        tradeDirection,\n        currentPoint\n    )\n\n    // calculate maximum amount in if slippage is provided\n    if (slippageBps > 0) {\n        // slippage factor: (10000 + slippageBps) / 10000\n        const slippageFactor = new BN(10000 + slippageBps)\n        const denominator = new BN(10000)\n\n        // maximum amount in: amountIn * (10000 + slippageBps) / 10000\n        const maximumAmountIn = result.amountOut\n            .mul(slippageFactor)\n            .div(denominator)\n\n        return {\n            ...result,\n            amountOut: maximumAmountIn,\n            minimumAmountOut: outAmount,\n        }\n    }\n\n    return {\n        ...result,\n        minimumAmountOut: outAmount,\n    }\n}\n","import BN from 'bn.js'\nimport { SafeMath } from './safeMath'\nimport { mulDiv } from './utilsMath'\nimport { FEE_DENOMINATOR, MAX_FEE_NUMERATOR } from '../constants'\nimport {\n    BaseFeeMode,\n    Rounding,\n    TradeDirection,\n    type DynamicFeeConfig,\n    type FeeOnAmountResult,\n    type PoolFeesConfig,\n    type VolatilityTracker,\n} from '../types'\nimport {\n    getFeeNumeratorOnExponentialFeeScheduler,\n    getFeeNumeratorOnLinearFeeScheduler,\n} from './feeScheduler'\nimport { getFeeNumeratorOnRateLimiter } from './rateLimiter'\nimport { checkRateLimiterApplied } from '../helpers'\n\n/**\n * Get current base fee numerator\n * @param baseFee Base fee parameters\n * @param tradeDirection Trade direction\n * @param currentPoint Current point\n * @param activationPoint Activation point\n * @param inputAmount Input amount (optional, used for rate limiter)\n * @returns Current base fee numerator\n */\nexport function getBaseFeeNumerator(\n    baseFee: {\n        cliffFeeNumerator: BN\n        firstFactor: number\n        secondFactor: BN\n        thirdFactor: BN\n        baseFeeMode: BaseFeeMode\n    },\n    tradeDirection: TradeDirection,\n    currentPoint: BN,\n    activationPoint: BN,\n    inputAmount?: BN\n): BN {\n    const baseFeeMode = baseFee.baseFeeMode\n\n    if (baseFeeMode === BaseFeeMode.RateLimiter) {\n        const feeIncrementBps = baseFee.firstFactor\n        const maxLimiterDuration = baseFee.secondFactor\n        const referenceAmount = baseFee.thirdFactor\n\n        const isBaseToQuote = tradeDirection === TradeDirection.BaseToQuote\n\n        // check if rate limiter is applied\n        const isRateLimiterApplied = checkRateLimiterApplied(\n            baseFeeMode,\n            isBaseToQuote,\n            currentPoint,\n            activationPoint,\n            baseFee.secondFactor\n        )\n\n        // if current point is less than activation point, return base fee\n        if (currentPoint.lt(activationPoint)) {\n            return baseFee.cliffFeeNumerator\n        }\n\n        // if lastEffectivePoint is less than currentPoint, return base fee\n        const lastEffectivePoint = activationPoint.add(maxLimiterDuration)\n        if (currentPoint.gt(lastEffectivePoint)) {\n            return baseFee.cliffFeeNumerator\n        }\n\n        // if no input amount provided, return base fee\n        if (!inputAmount) {\n            return baseFee.cliffFeeNumerator\n        }\n\n        if (isRateLimiterApplied) {\n            return getFeeNumeratorOnRateLimiter(\n                baseFee.cliffFeeNumerator,\n                referenceAmount,\n                new BN(feeIncrementBps),\n                inputAmount\n            )\n        } else {\n            return baseFee.cliffFeeNumerator\n        }\n    } else {\n        const numberOfPeriod = baseFee.firstFactor\n        const periodFrequency = baseFee.secondFactor\n        const reductionFactor = baseFee.thirdFactor\n\n        if (periodFrequency.isZero()) {\n            return baseFee.cliffFeeNumerator\n        }\n\n        let period: number\n        if (currentPoint.lt(activationPoint)) {\n            // before activation point, use max period (min fee)\n            period = numberOfPeriod\n        } else {\n            const elapsedPoints = SafeMath.sub(currentPoint, activationPoint)\n            const periodCount = SafeMath.div(elapsedPoints, periodFrequency)\n\n            period = Math.min(parseInt(periodCount.toString()), numberOfPeriod)\n        }\n\n        if (baseFeeMode === BaseFeeMode.FeeSchedulerLinear) {\n            // linear fee calculation: cliffFeeNumerator - period * reductionFactor\n            return getFeeNumeratorOnLinearFeeScheduler(\n                baseFee.cliffFeeNumerator,\n                reductionFactor,\n                period\n            )\n        } else {\n            // exponential fee calculation: cliff_fee_numerator * (1 - reduction_factor/10_000)^period\n            return getFeeNumeratorOnExponentialFeeScheduler(\n                baseFee.cliffFeeNumerator,\n                reductionFactor,\n                period\n            )\n        }\n    }\n}\n\n/**\n * Get variable fee from dynamic fee\n * @param dynamicFee Dynamic fee parameters\n * @param volatilityTracker Volatility tracker\n * @returns Variable fee\n */\nexport function getVariableFee(\n    dynamicFee: DynamicFeeConfig,\n    volatilityTracker: VolatilityTracker\n): BN {\n    if (dynamicFee.initialized === 0) {\n        return new BN(0)\n    }\n\n    if (volatilityTracker.volatilityAccumulator.isZero()) {\n        return new BN(0)\n    }\n\n    // (volatilityAccumulator * binStep)\n    const volatilityTimesBinStep = SafeMath.mul(\n        volatilityTracker.volatilityAccumulator,\n        new BN(dynamicFee.binStep)\n    )\n\n    // (volatilityAccumulator * binStep)^2\n    const squared = SafeMath.mul(volatilityTimesBinStep, volatilityTimesBinStep)\n\n    // (volatilityAccumulator * binStep)^2 * variableFeeControl\n    const vFee = SafeMath.mul(squared, new BN(dynamicFee.variableFeeControl))\n\n    const scaleFactor = new BN(100_000_000_000)\n    const numerator = SafeMath.add(vFee, SafeMath.sub(scaleFactor, new BN(1)))\n    return SafeMath.div(numerator, scaleFactor)\n}\n\n/**\n * Get fee on amount for rate limiter\n * @param amount Amount\n * @param poolFees Pool fees\n * @param isReferral Whether referral is used\n * @param currentPoint Current point\n * @param activationPoint Activation point\n * @param volatilityTracker Volatility tracker\n * @returns Fee on amount result\n */\nexport function getFeeOnAmount(\n    amount: BN,\n    poolFees: PoolFeesConfig,\n    isReferral: boolean,\n    currentPoint: BN,\n    activationPoint: BN,\n    volatilityTracker: VolatilityTracker,\n    tradeDirection: TradeDirection\n): FeeOnAmountResult {\n    // get total trading fee\n    const baseFeeNumerator = getBaseFeeNumerator(\n        poolFees.baseFee,\n        tradeDirection,\n        currentPoint,\n        activationPoint,\n        poolFees.baseFee.baseFeeMode === BaseFeeMode.RateLimiter\n            ? amount\n            : undefined\n    )\n\n    // add dynamic fee if enabled\n    let totalFeeNumerator = baseFeeNumerator\n    if (poolFees.dynamicFee.initialized !== 0) {\n        const variableFee = getVariableFee(\n            poolFees.dynamicFee,\n            volatilityTracker\n        )\n        totalFeeNumerator = SafeMath.add(totalFeeNumerator, variableFee)\n    }\n\n    // cap at MAX_FEE_NUMERATOR\n    if (totalFeeNumerator.gt(new BN(MAX_FEE_NUMERATOR))) {\n        totalFeeNumerator = new BN(MAX_FEE_NUMERATOR)\n    }\n\n    const tradingFee = mulDiv(\n        amount,\n        totalFeeNumerator,\n        new BN(FEE_DENOMINATOR),\n        Rounding.Up\n    )\n\n    const amountAfterFee = SafeMath.sub(amount, tradingFee)\n\n    const protocolFee = mulDiv(\n        tradingFee,\n        new BN(poolFees.protocolFeePercent),\n        new BN(100),\n        Rounding.Down\n    )\n\n    const tradingFeeAfterProtocol = SafeMath.sub(tradingFee, protocolFee)\n\n    // referral fee\n    let referralFee = new BN(0)\n    if (isReferral) {\n        referralFee = mulDiv(\n            protocolFee,\n            new BN(poolFees.referralFeePercent),\n            new BN(100),\n            Rounding.Down\n        )\n    }\n\n    // update protocol fee\n    const protocolFeeAfterReferral = SafeMath.sub(protocolFee, referralFee)\n\n    return {\n        amount: amountAfterFee,\n        tradingFee: tradingFeeAfterProtocol,\n        protocolFee: protocolFeeAfterReferral,\n        referralFee,\n    }\n}\n","import BN from 'bn.js'\nimport { BASIS_POINT_MAX } from '../constants'\nimport { mulDiv } from './utilsMath'\nimport { Rounding } from '../types'\nimport { pow, SafeMath } from './safeMath'\n\n/**\n * Get fee in period for linear fee scheduler\n * @param cliffFeeNumerator Cliff fee numerator\n * @param reductionFactor Reduction factor\n * @param period Period\n * @returns Fee numerator\n */\nexport function getFeeNumeratorOnLinearFeeScheduler(\n    cliffFeeNumerator: BN,\n    reductionFactor: BN,\n    period: number\n): BN {\n    const reduction = SafeMath.mul(new BN(period), reductionFactor)\n\n    if (reduction.gt(cliffFeeNumerator)) {\n        return new BN(0)\n    }\n\n    return SafeMath.sub(cliffFeeNumerator, reduction)\n}\n\n/**\n * Get fee in period for exponential fee scheduler\n * @param cliffFeeNumerator Cliff fee numerator\n * @param reductionFactor Reduction factor\n * @param period Period\n * @returns Fee numerator\n */\nexport function getFeeNumeratorOnExponentialFeeScheduler(\n    cliffFeeNumerator: BN,\n    reductionFactor: BN,\n    period: number\n): BN {\n    if (period === 0) {\n        return cliffFeeNumerator\n    }\n\n    if (period === 1) {\n        const basisPointMax = new BN(BASIS_POINT_MAX)\n        return mulDiv(\n            cliffFeeNumerator,\n            basisPointMax.sub(reductionFactor),\n            basisPointMax,\n            Rounding.Down\n        )\n    }\n\n    // calculate (1-reduction_factor/10_000)^period\n    const basisPointMax = new BN(BASIS_POINT_MAX)\n\n    // base = ONE_Q64 - (reductionFactor << RESOLUTION) / BASIS_POINT_MAX\n    const ONE_Q64 = new BN(1).shln(64)\n    const reductionFactorScaled = SafeMath.div(\n        SafeMath.shl(reductionFactor, 64),\n        basisPointMax\n    )\n    let base = SafeMath.sub(ONE_Q64, reductionFactorScaled)\n\n    const result = pow(base, new BN(period))\n\n    // final fee: cliffFeeNumerator * result >> 64\n    return SafeMath.div(SafeMath.mul(cliffFeeNumerator, result), ONE_Q64)\n}\n","import { Commitment, Connection, PublicKey } from '@solana/web3.js'\nimport { DynamicBondingCurveProgram } from './program'\nimport {\n    createProgramAccountFilter,\n    deriveDammV1MigrationMetadataAddress,\n    getAccountData,\n} from '../helpers'\nimport {\n    LockEscrow,\n    MeteoraDammMigrationMetadata,\n    PartnerMetadata,\n    PoolConfig,\n    VirtualPool,\n    VirtualPoolMetadata,\n} from '../types'\nimport { ProgramAccount } from '@coral-xyz/anchor'\nimport BN from 'bn.js'\nimport Decimal from 'decimal.js'\n\nexport class StateService extends DynamicBondingCurveProgram {\n    constructor(connection: Connection, commitment: Commitment) {\n        super(connection, commitment)\n    }\n\n    /**\n     * Get pool config data (partner config)\n     * @param configAddress - The address of the pool config key\n     * @returns A pool config\n     */\n    async getPoolConfig(\n        configAddress: PublicKey | string\n    ): Promise<PoolConfig> {\n        return getAccountData<PoolConfig>(\n            configAddress,\n            'poolConfig',\n            this.program\n        )\n    }\n\n    /**\n     * Get all config keys\n     * @returns An array of config key accounts\n     */\n    async getPoolConfigs(): Promise<ProgramAccount<PoolConfig>[]> {\n        return this.program.account.poolConfig.all()\n    }\n\n    /**\n     * Get all config keys of an owner wallet address\n     * @param owner - The owner of the config keys\n     * @returns An array of config key accounts\n     */\n    async getPoolConfigsByOwner(\n        owner: PublicKey | string\n    ): Promise<ProgramAccount<PoolConfig>[]> {\n        const filters = createProgramAccountFilter(owner, 72)\n        return this.program.account.poolConfig.all(filters)\n    }\n\n    /**\n     * Get virtual pool data\n     * @param poolAddress - The address of the pool\n     * @returns A virtual pool or null if not found\n     */\n    async getPool(poolAddress: PublicKey | string): Promise<VirtualPool> {\n        return getAccountData<VirtualPool>(\n            poolAddress,\n            'virtualPool',\n            this.program\n        )\n    }\n\n    /**\n     * Get all dynamic bonding curve pools\n     * @returns Array of pool accounts with their addresses\n     */\n    async getPools(): Promise<ProgramAccount<VirtualPool>[]> {\n        return this.program.account.virtualPool.all()\n    }\n\n    /**\n     * Get all dynamic bonding curve pools by config key address\n     * @param configAddress - The address of the config key\n     * @returns Array of pool accounts with their addresses\n     */\n    async getPoolsByConfig(\n        configAddress: PublicKey | string\n    ): Promise<ProgramAccount<VirtualPool>[]> {\n        const filters = createProgramAccountFilter(configAddress, 72)\n        return this.program.account.virtualPool.all(filters)\n    }\n\n    /**\n     * Get all dynamic bonding curve pools by creator address\n     * @param creatorAddress - The address of the creator\n     * @returns Array of pool accounts with their addresses\n     */\n    async getPoolsByCreator(\n        creatorAddress: PublicKey | string\n    ): Promise<ProgramAccount<VirtualPool>[]> {\n        const filters = createProgramAccountFilter(creatorAddress, 104)\n        return this.program.account.virtualPool.all(filters)\n    }\n\n    /**\n     * Get pool by base mint\n     * @param baseMint - The base mint address\n     * @returns A virtual pool account\n     */\n    async getPoolByBaseMint(\n        baseMint: PublicKey | string\n    ): Promise<ProgramAccount<VirtualPool> | null> {\n        const filters = createProgramAccountFilter(baseMint, 136)\n        const pools = await this.program.account.virtualPool.all(filters)\n        return pools.length > 0 ? pools[0] : null\n    }\n\n    /**\n     * Get pool migration quote threshold\n     * @param poolAddress - The address of the pool\n     * @returns The migration quote threshold\n     */\n    async getPoolMigrationQuoteThreshold(\n        poolAddress: PublicKey | string\n    ): Promise<BN> {\n        const pool = await this.getPool(poolAddress)\n        if (!pool) {\n            throw new Error(`Pool not found: ${poolAddress.toString()}`)\n        }\n        const configAddress = pool.config\n        const config = await this.getPoolConfig(configAddress)\n        return config.migrationQuoteThreshold\n    }\n\n    /**\n     * Get the progress of the curve by comparing current quote reserve to migration threshold\n     * @param poolAddress - The address of the pool\n     * @returns The progress as a ratio between 0 and 1\n     */\n    async getPoolCurveProgress(\n        poolAddress: PublicKey | string\n    ): Promise<number> {\n        const pool = await this.getPool(poolAddress)\n        if (!pool) {\n            throw new Error(`Pool not found: ${poolAddress.toString()}`)\n        }\n\n        const config = await this.getPoolConfig(pool.config)\n        const quoteReserve = pool.quoteReserve\n        const migrationThreshold = config.migrationQuoteThreshold\n\n        const quoteReserveDecimal = new Decimal(quoteReserve.toString())\n        const thresholdDecimal = new Decimal(migrationThreshold.toString())\n\n        const progress = quoteReserveDecimal.div(thresholdDecimal).toNumber()\n\n        return Math.min(Math.max(progress, 0), 1)\n    }\n\n    /**\n     * Get pool metadata\n     * @param poolAddress - The address of the pool\n     * @returns A pool metadata\n     */\n    async getPoolMetadata(\n        poolAddress: PublicKey | string\n    ): Promise<VirtualPoolMetadata[]> {\n        const filters = createProgramAccountFilter(poolAddress, 8)\n        const accounts =\n            await this.program.account.virtualPoolMetadata.all(filters)\n        return accounts.map((account) => account.account)\n    }\n\n    /**\n     * Get partner metadata\n     * @param partnerAddress - The address of the partner\n     * @returns A partner metadata\n     */\n    async getPartnerMetadata(\n        walletAddress: PublicKey | string\n    ): Promise<PartnerMetadata[]> {\n        const filters = createProgramAccountFilter(walletAddress, 8)\n        const accounts = await this.program.account.partnerMetadata.all(filters)\n        return accounts.map((account) => account.account)\n    }\n\n    /**\n     * Get DAMM V1 lock escrow details\n     * @param lockEscrowAddress - The address of the lock escrow\n     * @returns A lock escrow account\n     */\n    async getDammV1LockEscrow(\n        lockEscrowAddress: PublicKey | string\n    ): Promise<LockEscrow | null> {\n        const metadata = await this.program.account.lockEscrow.fetchNullable(\n            lockEscrowAddress instanceof PublicKey\n                ? lockEscrowAddress\n                : new PublicKey(lockEscrowAddress)\n        )\n\n        return metadata\n    }\n\n    /**\n     * Get fee metrics for a specific pool\n     * @param poolAddress - The address of the pool\n     * @returns Object containing current and total fee metrics\n     */\n    async getPoolFeeMetrics(poolAddress: PublicKey | string): Promise<{\n        current: {\n            partnerBaseFee: BN\n            partnerQuoteFee: BN\n            creatorBaseFee: BN\n            creatorQuoteFee: BN\n        }\n        total: {\n            totalTradingBaseFee: BN\n            totalTradingQuoteFee: BN\n        }\n    }> {\n        const pool = await this.getPool(poolAddress)\n        if (!pool) {\n            throw new Error(`Pool not found: ${poolAddress.toString()}`)\n        }\n\n        return {\n            current: {\n                partnerBaseFee: pool.partnerBaseFee,\n                partnerQuoteFee: pool.partnerQuoteFee,\n                creatorBaseFee: pool.creatorBaseFee,\n                creatorQuoteFee: pool.creatorQuoteFee,\n            },\n            total: {\n                totalTradingBaseFee: pool.metrics.totalTradingBaseFee,\n                totalTradingQuoteFee: pool.metrics.totalTradingQuoteFee,\n            },\n        }\n    }\n\n    /**\n     * Get all fees for pools linked to a specific config key\n     * @param configAddress - The address of the pool config\n     * @returns Array of pools with their quote fees\n     */\n    async getPoolsFeesByConfig(configAddress: PublicKey | string): Promise<\n        Array<{\n            poolAddress: PublicKey\n            partnerBaseFee: BN\n            partnerQuoteFee: BN\n            creatorBaseFee: BN\n            creatorQuoteFee: BN\n            totalTradingBaseFee: BN\n            totalTradingQuoteFee: BN\n        }>\n    > {\n        const filteredPools = await this.getPoolsByConfig(configAddress)\n\n        return filteredPools.map((pool) => ({\n            poolAddress: pool.publicKey,\n            partnerBaseFee: pool.account.partnerBaseFee,\n            partnerQuoteFee: pool.account.partnerQuoteFee,\n            creatorBaseFee: pool.account.creatorBaseFee,\n            creatorQuoteFee: pool.account.creatorQuoteFee,\n            totalTradingBaseFee: pool.account.metrics.totalTradingBaseFee,\n            totalTradingQuoteFee: pool.account.metrics.totalTradingQuoteFee,\n        }))\n    }\n\n    /**\n     * Get all fees for pools linked to a specific creator\n     * @param creatorAddress - The address of the creator\n     * @returns Array of pools with their base fees\n     */\n    async getPoolsFeesByCreator(creatorAddress: PublicKey | string): Promise<\n        Array<{\n            poolAddress: PublicKey\n            partnerBaseFee: BN\n            partnerQuoteFee: BN\n            creatorBaseFee: BN\n            creatorQuoteFee: BN\n            totalTradingBaseFee: BN\n            totalTradingQuoteFee: BN\n        }>\n    > {\n        const filteredPools = await this.getPoolsByCreator(creatorAddress)\n\n        return filteredPools.map((pool) => ({\n            poolAddress: pool.publicKey,\n            partnerBaseFee: pool.account.partnerBaseFee,\n            partnerQuoteFee: pool.account.partnerQuoteFee,\n            creatorBaseFee: pool.account.creatorBaseFee,\n            creatorQuoteFee: pool.account.creatorQuoteFee,\n            totalTradingBaseFee: pool.account.metrics.totalTradingBaseFee,\n            totalTradingQuoteFee: pool.account.metrics.totalTradingQuoteFee,\n        }))\n    }\n\n    /**\n     * Get DAMM V1 migration metadata\n     * @param poolAddress - The address of the pool\n     * @returns A DAMM V1 migration metadata\n     */\n    async getDammV1MigrationMetadata(\n        poolAddress: PublicKey\n    ): Promise<MeteoraDammMigrationMetadata> {\n        const migrationMetadataAddress =\n            deriveDammV1MigrationMetadataAddress(poolAddress)\n        const metadata =\n            await this.program.account.meteoraDammMigrationMetadata.fetch(\n                migrationMetadataAddress\n            )\n\n        return metadata\n    }\n}\n","import {\n    Commitment,\n    ComputeBudgetProgram,\n    Keypair,\n    PublicKey,\n    SystemProgram,\n    SYSVAR_RENT_PUBKEY,\n    TransactionInstruction,\n    type Connection,\n    type Transaction,\n} from '@solana/web3.js'\nimport { DynamicBondingCurveProgram } from './program'\nimport type { DynamicVault } from '../idl/dynamic-vault/idl'\nimport type { Program } from '@coral-xyz/anchor'\nimport {\n    createDammV1Program,\n    createVaultProgram,\n    findAssociatedTokenAddress,\n    deriveBaseKeyForLocker,\n    deriveDammV1MigrationMetadataAddress,\n    deriveDammV2MigrationMetadataAddress,\n    deriveDammV1PoolAddress,\n    deriveDammV2EventAuthority,\n    deriveDammV2PoolAddress,\n    deriveEscrow,\n    deriveMintMetadata,\n    derivePositionAddress,\n    derivePositionNftAccount,\n    deriveVaultPdas,\n    createInitializePermissionlessDynamicVaultIx,\n    createLockEscrowIx,\n    getTokenProgram,\n    getOrCreateATAInstruction,\n    deriveDammV2PoolAuthority,\n    deriveDammV2TokenVaultAddress,\n    deriveDammV1VaultLPAddress,\n    deriveDammV1LpMintAddress,\n    deriveDammV1LockEscrowAddress,\n    deriveDammV1ProtocolFeeAddress,\n    deriveDbcPoolAuthority,\n    deriveLockerEventAuthority,\n} from '../helpers'\nimport type { DammV1 } from '../idl/damm-v1/idl'\nimport type {\n    CreateDammV1MigrationMetadataParam,\n    CreateDammV2MigrationMetadataParam,\n    CreateLockerParam,\n    DammLpTokenParam,\n    MigrateToDammV1Param,\n    MigrateToDammV2Param,\n    MigrateToDammV2Response,\n    WithdrawLeftoverParam,\n} from '../types'\nimport {\n    ASSOCIATED_TOKEN_PROGRAM_ID,\n    createAssociatedTokenAccountIdempotentInstruction,\n    getAssociatedTokenAddressSync,\n    TOKEN_2022_PROGRAM_ID,\n    TOKEN_PROGRAM_ID,\n} from '@solana/spl-token'\nimport {\n    DAMM_V1_PROGRAM_ID,\n    DAMM_V2_PROGRAM_ID,\n    LOCKER_PROGRAM_ID,\n    METAPLEX_PROGRAM_ID,\n    VAULT_PROGRAM_ID,\n} from '../constants'\nimport { StateService } from './state'\n\nexport class MigrationService extends DynamicBondingCurveProgram {\n    private state: StateService\n\n    constructor(connection: Connection, commitment: Commitment) {\n        super(connection, commitment)\n        this.state = new StateService(connection, commitment)\n    }\n\n    /**\n     * Get vault program instance\n     * @returns The vault program instance\n     */\n    private getVaultProgram(): Program<DynamicVault> {\n        return createVaultProgram(this.connection)\n    }\n\n    /**\n     * Get DAMM V1 program instance\n     * @returns The DAMM V1 program instance\n     */\n    private getDammV1Program(): Program<DammV1> {\n        return createDammV1Program(this.connection)\n    }\n\n    /**\n     * Create Locker (if there is lockedVesting)\n     * @param createLockerParam - The parameters for the locker\n     * @returns A create locker transaction\n     */\n    async createLocker(\n        createLockerParam: CreateLockerParam\n    ): Promise<Transaction> {\n        const poolAuthority = deriveDbcPoolAuthority()\n        const lockerEventAuthority = deriveLockerEventAuthority()\n\n        const virtualPoolState = await this.state.getPool(\n            createLockerParam.virtualPool\n        )\n\n        if (!virtualPoolState) {\n            throw new Error(\n                `Pool not found: ${createLockerParam.virtualPool.toString()}`\n            )\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(\n            virtualPoolState.config\n        )\n\n        const base = deriveBaseKeyForLocker(createLockerParam.virtualPool)\n\n        const escrow = deriveEscrow(base)\n\n        const tokenProgram =\n            poolConfigState.tokenType === 0\n                ? TOKEN_PROGRAM_ID\n                : TOKEN_2022_PROGRAM_ID\n\n        const escrowToken = findAssociatedTokenAddress(\n            escrow,\n            virtualPoolState.baseMint,\n            tokenProgram\n        )\n\n        const preInstructions: TransactionInstruction[] = []\n\n        const createOwnerEscrowVaultTokenXIx =\n            createAssociatedTokenAccountIdempotentInstruction(\n                createLockerParam.payer,\n                escrowToken,\n                escrow,\n                virtualPoolState.baseMint,\n                tokenProgram\n            )\n\n        preInstructions.push(createOwnerEscrowVaultTokenXIx)\n\n        const accounts = {\n            virtualPool: createLockerParam.virtualPool,\n            config: virtualPoolState.config,\n            poolAuthority,\n            baseVault: virtualPoolState.baseVault,\n            baseMint: virtualPoolState.baseMint,\n            base,\n            creator: virtualPoolState.creator,\n            escrow,\n            escrowToken,\n            payer: createLockerParam.payer,\n            tokenProgram,\n            lockerProgram: LOCKER_PROGRAM_ID,\n            lockerEventAuthority,\n            systemProgram: SystemProgram.programId,\n        }\n\n        return this.program.methods\n            .createLocker()\n            .accountsPartial(accounts)\n            .preInstructions(preInstructions)\n            .transaction()\n    }\n\n    /**\n     * Withdraw leftover\n     * @param withdrawLeftoverParam - The parameters for the withdraw leftover\n     * @returns A withdraw leftover transaction\n     */\n    async withdrawLeftover(\n        withdrawLeftoverParam: WithdrawLeftoverParam\n    ): Promise<Transaction> {\n        const poolState = await this.state.getPool(\n            withdrawLeftoverParam.virtualPool\n        )\n\n        if (!poolState) {\n            throw new Error(\n                `Pool not found: ${withdrawLeftoverParam.virtualPool.toString()}`\n            )\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        const tokenBaseProgram = getTokenProgram(poolConfigState.tokenType)\n\n        const preInstructions: TransactionInstruction[] = []\n        const { ataPubkey: tokenBaseAccount, ix: createBaseTokenAccountIx } =\n            await getOrCreateATAInstruction(\n                this.connection,\n                poolState.baseMint,\n                poolConfigState.leftoverReceiver,\n                withdrawLeftoverParam.payer,\n                true,\n                tokenBaseProgram\n            )\n\n        createBaseTokenAccountIx &&\n            preInstructions.push(createBaseTokenAccountIx)\n\n        return this.program.methods\n            .withdrawLeftover()\n            .accountsPartial({\n                poolAuthority: this.poolAuthority,\n                config: poolState.config,\n                virtualPool: withdrawLeftoverParam.virtualPool,\n                tokenBaseAccount,\n                baseVault: poolState.baseVault,\n                baseMint: poolState.baseMint,\n                leftoverReceiver: poolConfigState.leftoverReceiver,\n                tokenBaseProgram,\n            })\n            .preInstructions(preInstructions)\n            .transaction()\n    }\n\n    ///////////////////////\n    // DAMM V1 FUNCTIONS //\n    ///////////////////////\n\n    /**\n     * Create metadata for the migration of Meteora DAMM V1\n     * @param createDammV1MigrationMetadataParam - The parameters for the migration\n     * @returns A migration transaction\n     */\n    async createDammV1MigrationMetadata(\n        createDammV1MigrationMetadataParam: CreateDammV1MigrationMetadataParam\n    ): Promise<Transaction> {\n        const migrationMetadata = deriveDammV1MigrationMetadataAddress(\n            createDammV1MigrationMetadataParam.virtualPool\n        )\n\n        const accounts = {\n            virtualPool: createDammV1MigrationMetadataParam.virtualPool,\n            config: createDammV1MigrationMetadataParam.config,\n            migrationMetadata: migrationMetadata,\n            payer: createDammV1MigrationMetadataParam.payer,\n            systemProgram: SystemProgram.programId,\n        }\n\n        return this.program.methods\n            .migrationMeteoraDammCreateMetadata()\n            .accountsPartial(accounts)\n            .transaction()\n    }\n\n    /**\n     * Migrate to DAMM V1\n     * @param migrateToDammV1Param - The parameters for the migration\n     * @returns A migrate transaction\n     */\n    async migrateToDammV1(\n        migrateToDammV1Param: MigrateToDammV1Param\n    ): Promise<Transaction> {\n        const poolState = await this.state.getPool(\n            migrateToDammV1Param.virtualPool\n        )\n        if (!poolState) {\n            throw new Error(\n                `Pool not found: ${migrateToDammV1Param.virtualPool.toString()}`\n            )\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        const migrationMetadata = deriveDammV1MigrationMetadataAddress(\n            migrateToDammV1Param.virtualPool\n        )\n\n        const dammPool = deriveDammV1PoolAddress(\n            migrateToDammV1Param.dammConfig,\n            poolState.baseMint,\n            poolConfigState.quoteMint\n        )\n\n        const lpMint = deriveDammV1LpMintAddress(dammPool)\n\n        const mintMetadata = deriveMintMetadata(lpMint)\n\n        const [protocolTokenAFee, protocolTokenBFee] = [\n            deriveDammV1ProtocolFeeAddress(poolState.baseMint, dammPool),\n            deriveDammV1ProtocolFeeAddress(poolConfigState.quoteMint, dammPool),\n        ]\n\n        const vaultProgram = this.getVaultProgram()\n\n        const [\n            {\n                vaultPda: aVault,\n                tokenVaultPda: aTokenVault,\n                lpMintPda: aLpMintPda,\n            },\n            {\n                vaultPda: bVault,\n                tokenVaultPda: bTokenVault,\n                lpMintPda: bLpMintPda,\n            },\n        ] = [\n            deriveVaultPdas(poolState.baseMint),\n            deriveVaultPdas(poolConfigState.quoteMint),\n        ]\n\n        const [aVaultAccount, bVaultAccount] = await Promise.all([\n            vaultProgram.account.vault.fetchNullable(aVault),\n            vaultProgram.account.vault.fetchNullable(bVault),\n        ])\n\n        let aVaultLpMint = aLpMintPda\n        let bVaultLpMint = bLpMintPda\n        const preInstructions: TransactionInstruction[] = []\n\n        if (!aVaultAccount) {\n            const createVaultAIx =\n                await createInitializePermissionlessDynamicVaultIx(\n                    poolState.baseMint,\n                    migrateToDammV1Param.payer,\n                    vaultProgram\n                )\n            if (createVaultAIx) {\n                preInstructions.push(createVaultAIx.instruction)\n            }\n        } else {\n            aVaultLpMint = aVaultAccount.lpMint\n        }\n        if (!bVaultAccount) {\n            const createVaultBIx =\n                await createInitializePermissionlessDynamicVaultIx(\n                    poolConfigState.quoteMint,\n                    migrateToDammV1Param.payer,\n                    vaultProgram\n                )\n            if (createVaultBIx) {\n                preInstructions.push(createVaultBIx.instruction)\n            }\n        } else {\n            bVaultLpMint = bVaultAccount.lpMint\n        }\n\n        const [aVaultLp, bVaultLp] = [\n            deriveDammV1VaultLPAddress(aVault, dammPool),\n            deriveDammV1VaultLPAddress(bVault, dammPool),\n        ]\n\n        const virtualPoolLp = getAssociatedTokenAddressSync(\n            lpMint,\n            this.poolAuthority,\n            true,\n            TOKEN_PROGRAM_ID,\n            ASSOCIATED_TOKEN_PROGRAM_ID\n        )\n\n        const transaction = await this.program.methods\n            .migrateMeteoraDamm()\n            .accountsPartial({\n                virtualPool: migrateToDammV1Param.virtualPool,\n                migrationMetadata,\n                config: poolState.config,\n                poolAuthority: this.poolAuthority,\n                pool: dammPool,\n                dammConfig: migrateToDammV1Param.dammConfig,\n                lpMint,\n                tokenAMint: poolState.baseMint,\n                tokenBMint: poolConfigState.quoteMint,\n                aVault,\n                bVault,\n                aTokenVault,\n                bTokenVault,\n                aVaultLpMint,\n                bVaultLpMint,\n                aVaultLp,\n                bVaultLp,\n                baseVault: poolState.baseVault,\n                quoteVault: poolState.quoteVault,\n                virtualPoolLp,\n                protocolTokenAFee,\n                protocolTokenBFee,\n                payer: migrateToDammV1Param.payer,\n                rent: SYSVAR_RENT_PUBKEY,\n                mintMetadata,\n                metadataProgram: METAPLEX_PROGRAM_ID,\n                ammProgram: DAMM_V1_PROGRAM_ID,\n                vaultProgram: VAULT_PROGRAM_ID,\n                tokenProgram: TOKEN_PROGRAM_ID,\n                associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n            })\n            .preInstructions(preInstructions)\n            .transaction()\n\n        const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({\n            units: 500000,\n        })\n\n        transaction.add(modifyComputeUnits)\n\n        return transaction\n    }\n\n    /**\n     * Lock DAMM V1 LP token for creator or partner\n     * @param lockDammV1LpTokenParam - The parameters for the lock\n     * @returns A lock transaction\n     */\n    async lockDammV1LpToken(\n        lockDammV1LpTokenParam: DammLpTokenParam\n    ): Promise<Transaction> {\n        const poolState = await this.state.getPool(\n            lockDammV1LpTokenParam.virtualPool\n        )\n\n        if (!poolState) {\n            throw new Error(\n                `Pool not found: ${lockDammV1LpTokenParam.virtualPool.toString()}`\n            )\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        const dammPool = deriveDammV1PoolAddress(\n            lockDammV1LpTokenParam.dammConfig,\n            poolState.baseMint,\n            poolConfigState.quoteMint\n        )\n\n        const migrationMetadata = deriveDammV1MigrationMetadataAddress(\n            lockDammV1LpTokenParam.virtualPool\n        )\n\n        const vaultProgram = this.getVaultProgram()\n\n        const [\n            { vaultPda: aVault, lpMintPda: aLpMintPda },\n            { vaultPda: bVault, lpMintPda: bLpMintPda },\n        ] = [\n            deriveVaultPdas(poolState.baseMint),\n            deriveVaultPdas(poolConfigState.quoteMint),\n        ]\n\n        const [aVaultAccount, bVaultAccount] = await Promise.all([\n            vaultProgram.account.vault.fetchNullable(aVault),\n            vaultProgram.account.vault.fetchNullable(bVault),\n        ])\n\n        let aVaultLpMint = aLpMintPda\n        let bVaultLpMint = bLpMintPda\n        const preInstructions: TransactionInstruction[] = []\n\n        if (!aVaultAccount) {\n            const createVaultAIx =\n                await createInitializePermissionlessDynamicVaultIx(\n                    poolState.baseMint,\n                    lockDammV1LpTokenParam.payer,\n                    vaultProgram\n                )\n            if (createVaultAIx) {\n                preInstructions.push(createVaultAIx.instruction)\n            }\n        } else {\n            aVaultLpMint = aVaultAccount.lpMint\n        }\n        if (!bVaultAccount) {\n            const createVaultBIx =\n                await createInitializePermissionlessDynamicVaultIx(\n                    poolConfigState.quoteMint,\n                    lockDammV1LpTokenParam.payer,\n                    vaultProgram\n                )\n            if (createVaultBIx) {\n                preInstructions.push(createVaultBIx.instruction)\n            }\n        } else {\n            bVaultLpMint = bVaultAccount.lpMint\n        }\n\n        const [aVaultLp, bVaultLp] = [\n            deriveDammV1VaultLPAddress(aVault, dammPool),\n            deriveDammV1VaultLPAddress(bVault, dammPool),\n        ]\n\n        const lpMint = deriveDammV1LpMintAddress(dammPool)\n\n        const dammV1Program = this.getDammV1Program()\n\n        let lockEscrowKey: PublicKey\n\n        if (lockDammV1LpTokenParam.isPartner) {\n            lockEscrowKey = deriveDammV1LockEscrowAddress(\n                dammPool,\n                poolConfigState.feeClaimer\n            )\n\n            const lockEscrowData =\n                await this.connection.getAccountInfo(lockEscrowKey)\n\n            if (!lockEscrowData) {\n                const ix = await createLockEscrowIx(\n                    lockDammV1LpTokenParam.payer,\n                    dammPool,\n                    lpMint,\n                    poolConfigState.feeClaimer,\n                    lockEscrowKey,\n                    dammV1Program\n                )\n                preInstructions.push(ix)\n            }\n        } else {\n            lockEscrowKey = deriveDammV1LockEscrowAddress(\n                dammPool,\n                poolState.creator\n            )\n\n            const lockEscrowData =\n                await this.connection.getAccountInfo(lockEscrowKey)\n\n            if (!lockEscrowData) {\n                const ix = await createLockEscrowIx(\n                    lockDammV1LpTokenParam.payer,\n                    dammPool,\n                    lpMint,\n                    poolState.creator,\n                    lockEscrowKey,\n                    dammV1Program\n                )\n                preInstructions.push(ix)\n            }\n        }\n\n        const escrowVault = getAssociatedTokenAddressSync(\n            lpMint,\n            lockEscrowKey,\n            true,\n            TOKEN_PROGRAM_ID,\n            ASSOCIATED_TOKEN_PROGRAM_ID\n        )\n\n        const createEscrowVaultIx =\n            createAssociatedTokenAccountIdempotentInstruction(\n                lockDammV1LpTokenParam.payer,\n                escrowVault,\n                lockEscrowKey,\n                lpMint,\n                TOKEN_PROGRAM_ID,\n                ASSOCIATED_TOKEN_PROGRAM_ID\n            )\n\n        preInstructions.push(createEscrowVaultIx)\n\n        const sourceTokens = getAssociatedTokenAddressSync(\n            lpMint,\n            this.poolAuthority,\n            true\n        )\n\n        return this.program.methods\n            .migrateMeteoraDammLockLpToken()\n            .accountsPartial({\n                virtualPool: lockDammV1LpTokenParam.virtualPool,\n                migrationMetadata,\n                poolAuthority: this.poolAuthority,\n                pool: dammPool,\n                lpMint,\n                lockEscrow: lockEscrowKey,\n                owner: lockDammV1LpTokenParam.isPartner\n                    ? poolConfigState.feeClaimer\n                    : poolState.creator,\n                sourceTokens,\n                escrowVault,\n                aVault,\n                bVault,\n                aVaultLp,\n                bVaultLp,\n                aVaultLpMint,\n                bVaultLpMint,\n                ammProgram: DAMM_V1_PROGRAM_ID,\n                tokenProgram: TOKEN_PROGRAM_ID,\n            })\n            .preInstructions(preInstructions)\n            .transaction()\n    }\n\n    /**\n     * Claim DAMM V1 LP token for creator or partner\n     * @param claimDammV1LpTokenParam - The parameters for the claim\n     * @returns A claim transaction\n     */\n    async claimDammV1LpToken(\n        claimDammV1LpTokenParam: DammLpTokenParam\n    ): Promise<Transaction> {\n        const poolAuthority = deriveDbcPoolAuthority()\n\n        const virtualPoolState = await this.state.getPool(\n            claimDammV1LpTokenParam.virtualPool\n        )\n\n        if (!virtualPoolState) {\n            throw new Error(\n                `Pool not found: ${claimDammV1LpTokenParam.virtualPool.toString()}`\n            )\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(\n            virtualPoolState.config\n        )\n\n        const dammPool = deriveDammV1PoolAddress(\n            claimDammV1LpTokenParam.dammConfig,\n            virtualPoolState.baseMint,\n            poolConfigState.quoteMint\n        )\n\n        const migrationMetadata = deriveDammV1MigrationMetadataAddress(\n            claimDammV1LpTokenParam.virtualPool\n        )\n\n        const lpMint = deriveDammV1LpMintAddress(dammPool)\n\n        let destinationToken: PublicKey\n        if (claimDammV1LpTokenParam.isPartner) {\n            destinationToken = findAssociatedTokenAddress(\n                poolConfigState.feeClaimer,\n                lpMint,\n                TOKEN_PROGRAM_ID\n            )\n        } else {\n            destinationToken = findAssociatedTokenAddress(\n                virtualPoolState.creator,\n                lpMint,\n                TOKEN_PROGRAM_ID\n            )\n        }\n\n        const preInstructions: TransactionInstruction[] = []\n\n        const createDestinationTokenIx =\n            createAssociatedTokenAccountIdempotentInstruction(\n                claimDammV1LpTokenParam.payer,\n                destinationToken,\n                claimDammV1LpTokenParam.isPartner\n                    ? poolConfigState.feeClaimer\n                    : virtualPoolState.creator,\n                lpMint,\n                TOKEN_PROGRAM_ID\n            )\n\n        preInstructions.push(createDestinationTokenIx)\n\n        const sourceToken = getAssociatedTokenAddressSync(\n            lpMint,\n            poolAuthority,\n            true\n        )\n\n        const accounts = {\n            virtualPool: claimDammV1LpTokenParam.virtualPool,\n            migrationMetadata,\n            poolAuthority,\n            lpMint,\n            sourceToken,\n            destinationToken,\n            owner: claimDammV1LpTokenParam.isPartner\n                ? poolConfigState.feeClaimer\n                : virtualPoolState.creator,\n            sender: claimDammV1LpTokenParam.payer,\n            tokenProgram: TOKEN_PROGRAM_ID,\n        }\n\n        return this.program.methods\n            .migrateMeteoraDammClaimLpToken()\n            .accountsPartial(accounts)\n            .preInstructions(preInstructions)\n            .transaction()\n    }\n\n    ///////////////////////\n    // DAMM V2 FUNCTIONS //\n    ///////////////////////\n\n    /**\n     * Create metadata for the migration of Meteora DAMM V2\n     * @param createDammV2MigrationMetadataParam - The parameters for the migration\n     * @returns A migration transaction\n     */\n    async createDammV2MigrationMetadata(\n        createDammV2MigrationMetadataParam: CreateDammV2MigrationMetadataParam\n    ): Promise<Transaction> {\n        const migrationMetadata = deriveDammV2MigrationMetadataAddress(\n            createDammV2MigrationMetadataParam.virtualPool\n        )\n\n        const accounts = {\n            virtualPool: createDammV2MigrationMetadataParam.virtualPool,\n            config: createDammV2MigrationMetadataParam.config,\n            migrationMetadata: migrationMetadata,\n            payer: createDammV2MigrationMetadataParam.payer,\n            systemProgram: SystemProgram.programId,\n        }\n\n        return this.program.methods\n            .migrationDammV2CreateMetadata()\n            .accountsPartial(accounts)\n            .transaction()\n    }\n\n    /**\n     * Migrate to DAMM V2\n     * @param migrateToDammV2Param - The parameters for the migration\n     * @returns A migrate transaction\n     */\n    async migrateToDammV2(\n        migrateToDammV2Param: MigrateToDammV2Param\n    ): Promise<MigrateToDammV2Response> {\n        const poolAuthority = deriveDbcPoolAuthority()\n        const dammPoolAuthority = deriveDammV2PoolAuthority()\n        const dammEventAuthority = deriveDammV2EventAuthority()\n\n        const virtualPoolState = await this.state.getPool(\n            migrateToDammV2Param.virtualPool\n        )\n\n        if (!virtualPoolState) {\n            throw new Error(\n                `Pool not found: ${migrateToDammV2Param.virtualPool.toString()}`\n            )\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(\n            virtualPoolState.config\n        )\n\n        const migrationMetadata = deriveDammV2MigrationMetadataAddress(\n            migrateToDammV2Param.virtualPool\n        )\n\n        const dammPool = deriveDammV2PoolAddress(\n            migrateToDammV2Param.dammConfig,\n            virtualPoolState.baseMint,\n            poolConfigState.quoteMint\n        )\n\n        const firstPositionNftKP = Keypair.generate()\n        const firstPosition = derivePositionAddress(\n            firstPositionNftKP.publicKey\n        )\n        const firstPositionNftAccount = derivePositionNftAccount(\n            firstPositionNftKP.publicKey\n        )\n\n        const secondPositionNftKP = Keypair.generate()\n        const secondPosition = derivePositionAddress(\n            secondPositionNftKP.publicKey\n        )\n        const secondPositionNftAccount = derivePositionNftAccount(\n            secondPositionNftKP.publicKey\n        )\n\n        const tokenAVault = deriveDammV2TokenVaultAddress(\n            dammPool,\n            virtualPoolState.baseMint\n        )\n\n        const tokenBVault = deriveDammV2TokenVaultAddress(\n            dammPool,\n            poolConfigState.quoteMint\n        )\n\n        const tokenBaseProgram =\n            poolConfigState.tokenType == 0\n                ? TOKEN_PROGRAM_ID\n                : TOKEN_2022_PROGRAM_ID\n\n        const tokenQuoteProgram =\n            poolConfigState.quoteTokenFlag == 0\n                ? TOKEN_PROGRAM_ID\n                : TOKEN_2022_PROGRAM_ID\n\n        const tx = await this.program.methods\n            .migrationDammV2()\n            .accountsStrict({\n                virtualPool: migrateToDammV2Param.virtualPool,\n                migrationMetadata,\n                config: virtualPoolState.config,\n                poolAuthority,\n                pool: dammPool,\n                firstPositionNftMint: firstPositionNftKP.publicKey,\n                firstPosition,\n                firstPositionNftAccount,\n                secondPositionNftMint: secondPositionNftKP.publicKey,\n                secondPosition,\n                secondPositionNftAccount,\n                dammPoolAuthority,\n                ammProgram: DAMM_V2_PROGRAM_ID,\n                baseMint: virtualPoolState.baseMint,\n                quoteMint: poolConfigState.quoteMint,\n                tokenAVault,\n                tokenBVault,\n                baseVault: virtualPoolState.baseVault,\n                quoteVault: virtualPoolState.quoteVault,\n                payer: migrateToDammV2Param.payer,\n                tokenBaseProgram,\n                tokenQuoteProgram,\n                token2022Program: TOKEN_2022_PROGRAM_ID,\n                systemProgram: SystemProgram.programId,\n                dammEventAuthority,\n            })\n            .remainingAccounts([\n                {\n                    isSigner: false,\n                    isWritable: false,\n                    pubkey: migrateToDammV2Param.dammConfig,\n                },\n            ])\n            .transaction()\n\n        const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({\n            units: 500000,\n        })\n\n        tx.add(modifyComputeUnits)\n\n        return {\n            transaction: tx,\n            firstPositionNftKeypair: firstPositionNftKP,\n            secondPositionNftKeypair: secondPositionNftKP,\n        }\n    }\n}\n","import {\n    Commitment,\n    PublicKey,\n    SystemProgram,\n    TransactionInstruction,\n    type Connection,\n    type Transaction,\n} from '@solana/web3.js'\nimport { DynamicBondingCurveProgram } from './program'\nimport {\n    type ClaimTradingFeeParam,\n    type CreateConfigParam,\n    type CreatePartnerMetadataParam,\n    type CreatePartnerMetadataParameters,\n    type PartnerWithdrawSurplusParam,\n    ClaimPartnerTradingFeeWithQuoteMintNotSolParam,\n    ClaimPartnerTradingFeeWithQuoteMintSolParam,\n    ClaimTradingFee2Param,\n    WithdrawMigrationFeeParam,\n} from '../types'\nimport {\n    derivePartnerMetadata,\n    unwrapSOLInstruction,\n    validateConfigParameters,\n    getTokenProgram,\n    getOrCreateATAInstruction,\n    isNativeSol,\n    findAssociatedTokenAddress,\n} from '../helpers'\nimport {\n    createAssociatedTokenAccountIdempotentInstruction,\n    NATIVE_MINT,\n} from '@solana/spl-token'\nimport { StateService } from './state'\n\nexport class PartnerService extends DynamicBondingCurveProgram {\n    private state: StateService\n\n    constructor(connection: Connection, commitment: Commitment) {\n        super(connection, commitment)\n        this.state = new StateService(connection, commitment)\n    }\n\n    /**\n     * Create a new config\n     * @param createConfigParam - The parameters for the config\n     * @returns A new config\n     */\n    async createConfig(\n        createConfigParam: CreateConfigParam\n    ): Promise<Transaction> {\n        const {\n            config,\n            feeClaimer,\n            leftoverReceiver,\n            quoteMint,\n            payer,\n            ...configParam\n        } = createConfigParam\n\n        // error checks\n        validateConfigParameters({ ...configParam, leftoverReceiver })\n\n        return this.program.methods\n            .createConfig(configParam)\n            .accountsPartial({\n                config,\n                feeClaimer,\n                leftoverReceiver,\n                quoteMint,\n                payer,\n            })\n            .transaction()\n    }\n\n    /**\n     * Create partner metadata\n     * @param createPartnerMetadataParam - The parameters for the partner metadata\n     * @returns A create partner metadata transaction\n     */\n    async createPartnerMetadata(\n        createPartnerMetadataParam: CreatePartnerMetadataParam\n    ): Promise<Transaction> {\n        const partnerMetadata = derivePartnerMetadata(\n            createPartnerMetadataParam.feeClaimer\n        )\n\n        const partnerMetadataParam: CreatePartnerMetadataParameters = {\n            padding: new Array(96).fill(0),\n            name: createPartnerMetadataParam.name,\n            website: createPartnerMetadataParam.website,\n            logo: createPartnerMetadataParam.logo,\n        }\n\n        return this.program.methods\n            .createPartnerMetadata(partnerMetadataParam)\n            .accountsPartial({\n                partnerMetadata,\n                payer: createPartnerMetadataParam.payer,\n                feeClaimer: createPartnerMetadataParam.feeClaimer,\n                systemProgram: SystemProgram.programId,\n            })\n            .transaction()\n    }\n\n    /**\n     * Private method to claim trading fee with quote mint SOL\n     * @param claimWithQuoteMintSolParam - The parameters for the claim with quote mint SOL\n     * @returns A claim trading fee with quote mint SOL accounts, pre instructions and post instructions\n     */\n    private async claimWithQuoteMintSol(\n        claimWithQuoteMintSolParam: ClaimPartnerTradingFeeWithQuoteMintSolParam\n    ): Promise<{\n        accounts: {\n            poolAuthority: PublicKey\n            config: PublicKey\n            pool: PublicKey\n            tokenAAccount: PublicKey\n            tokenBAccount: PublicKey\n            baseVault: PublicKey\n            quoteVault: PublicKey\n            baseMint: PublicKey\n            quoteMint: PublicKey\n            feeClaimer: PublicKey\n            tokenBaseProgram: PublicKey\n            tokenQuoteProgram: PublicKey\n        }\n        preInstructions: TransactionInstruction[]\n        postInstructions: TransactionInstruction[]\n    }> {\n        const {\n            feeClaimer,\n            payer,\n            feeReceiver,\n            config,\n            tempWSolAcc,\n            pool,\n            poolState,\n            poolConfigState,\n            tokenBaseProgram,\n            tokenQuoteProgram,\n        } = claimWithQuoteMintSolParam\n\n        const preInstructions: TransactionInstruction[] = []\n        const postInstructions: TransactionInstruction[] = []\n\n        const tokenBaseAccount = findAssociatedTokenAddress(\n            feeReceiver,\n            poolState.baseMint,\n            tokenBaseProgram\n        )\n\n        const tokenQuoteAccount = findAssociatedTokenAddress(\n            tempWSolAcc,\n            poolConfigState.quoteMint,\n            tokenQuoteProgram\n        )\n\n        const createTokenBaseAccountIx =\n            createAssociatedTokenAccountIdempotentInstruction(\n                payer,\n                tokenBaseAccount,\n                feeReceiver,\n                poolState.baseMint,\n                tokenBaseProgram\n            )\n        createTokenBaseAccountIx &&\n            preInstructions.push(createTokenBaseAccountIx)\n\n        const createTokenQuoteAccountIx =\n            createAssociatedTokenAccountIdempotentInstruction(\n                payer,\n                tokenQuoteAccount,\n                tempWSolAcc,\n                poolConfigState.quoteMint,\n                tokenQuoteProgram\n            )\n        createTokenQuoteAccountIx &&\n            preInstructions.push(createTokenQuoteAccountIx)\n\n        const unwrapSolIx = unwrapSOLInstruction(tempWSolAcc, feeReceiver)\n        unwrapSolIx && postInstructions.push(unwrapSolIx)\n\n        const accounts = {\n            poolAuthority: this.poolAuthority,\n            config,\n            pool,\n            tokenAAccount: tokenBaseAccount,\n            tokenBAccount: tokenQuoteAccount,\n            baseVault: poolState.baseVault,\n            quoteVault: poolState.quoteVault,\n            baseMint: poolState.baseMint,\n            quoteMint: poolConfigState.quoteMint,\n            feeClaimer,\n            tokenBaseProgram,\n            tokenQuoteProgram,\n        }\n\n        return { accounts, preInstructions, postInstructions }\n    }\n\n    /**\n     * Private method to claim trading fee with quote mint not SOL\n     * @param claimWithQuoteMintNotSolParam - The parameters for the claim with quote mint not SOL\n     * @returns A claim trading fee with quote mint not SOL accounts and pre instructions\n     */\n    private async claimWithQuoteMintNotSol(\n        claimWithQuoteMintNotSolParam: ClaimPartnerTradingFeeWithQuoteMintNotSolParam\n    ): Promise<{\n        accounts: {\n            poolAuthority: PublicKey\n            config: PublicKey\n            pool: PublicKey\n            tokenAAccount: PublicKey\n            tokenBAccount: PublicKey\n            baseVault: PublicKey\n            quoteVault: PublicKey\n            baseMint: PublicKey\n            quoteMint: PublicKey\n            feeClaimer: PublicKey\n            tokenBaseProgram: PublicKey\n            tokenQuoteProgram: PublicKey\n        }\n        preInstructions: TransactionInstruction[]\n    }> {\n        const {\n            feeClaimer,\n            payer,\n            feeReceiver,\n            config,\n            pool,\n            poolState,\n            poolConfigState,\n            tokenBaseProgram,\n            tokenQuoteProgram,\n        } = claimWithQuoteMintNotSolParam\n\n        const {\n            ataTokenA: tokenBaseAccount,\n            ataTokenB: tokenQuoteAccount,\n            instructions: preInstructions,\n        } = await this.prepareTokenAccounts(\n            feeReceiver,\n            payer,\n            poolState.baseMint,\n            poolConfigState.quoteMint,\n            tokenBaseProgram,\n            tokenQuoteProgram\n        )\n\n        const accounts = {\n            poolAuthority: this.poolAuthority,\n            config,\n            pool,\n            tokenAAccount: tokenBaseAccount,\n            tokenBAccount: tokenQuoteAccount,\n            baseVault: poolState.baseVault,\n            quoteVault: poolState.quoteVault,\n            baseMint: poolState.baseMint,\n            quoteMint: poolConfigState.quoteMint,\n            feeClaimer,\n            tokenBaseProgram,\n            tokenQuoteProgram,\n        }\n\n        return { accounts, preInstructions }\n    }\n\n    /**\n     * Claim partner trading fee\n     * @param claimTradingFeeParam - The parameters for the claim trading fee\n     * @returns A claim trading fee transaction\n     */\n    async claimPartnerTradingFee(\n        claimTradingFeeParam: ClaimTradingFeeParam\n    ): Promise<Transaction> {\n        const {\n            feeClaimer,\n            payer,\n            pool,\n            maxBaseAmount,\n            maxQuoteAmount,\n            receiver,\n            tempWSolAcc,\n        } = claimTradingFeeParam\n\n        const poolState = await this.state.getPool(pool)\n\n        if (!poolState) {\n            throw new Error(`Pool not found: ${pool.toString()}`)\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        if (!poolConfigState) {\n            throw new Error(`Pool config not found: ${pool.toString()}`)\n        }\n\n        const tokenBaseProgram = getTokenProgram(poolConfigState.tokenType)\n        const tokenQuoteProgram = getTokenProgram(\n            poolConfigState.quoteTokenFlag\n        )\n\n        const isSOLQuoteMint = isNativeSol(poolConfigState.quoteMint)\n\n        if (isSOLQuoteMint) {\n            // if receiver is present and not equal to feeClaimer, use tempWSolAcc, otherwise use feeClaimer\n            const tempWSol =\n                receiver && !receiver.equals(feeClaimer)\n                    ? tempWSolAcc\n                    : feeClaimer\n            // if receiver is provided, use receiver as the fee receiver, otherwise use feeClaimer\n            const feeReceiver = receiver ? receiver : feeClaimer\n\n            const result = await this.claimWithQuoteMintSol({\n                feeClaimer,\n                payer,\n                feeReceiver,\n                config: poolState.config,\n                tempWSolAcc: tempWSol,\n                pool,\n                poolState,\n                poolConfigState,\n                tokenBaseProgram,\n                tokenQuoteProgram,\n            })\n\n            return this.program.methods\n                .claimTradingFee(maxBaseAmount, maxQuoteAmount)\n                .accountsPartial(result.accounts)\n                .preInstructions(result.preInstructions)\n                .postInstructions(result.postInstructions)\n                .transaction()\n        } else {\n            const feeReceiver = receiver ? receiver : feeClaimer\n\n            const result = await this.claimWithQuoteMintNotSol({\n                feeClaimer,\n                payer,\n                feeReceiver,\n                config: poolState.config,\n                pool,\n                poolState,\n                poolConfigState,\n                tokenBaseProgram,\n                tokenQuoteProgram,\n            })\n\n            return this.program.methods\n                .claimTradingFee(maxBaseAmount, maxQuoteAmount)\n                .accountsPartial(result.accounts)\n                .preInstructions(result.preInstructions)\n                .transaction()\n        }\n    }\n\n    /**\n     * Claim partner trading fee\n     * @param claimTradingFee2Param - The parameters for the claim trading fee\n     * @returns A claim trading fee transaction\n     */\n    async claimPartnerTradingFee2(\n        claimTradingFee2Param: ClaimTradingFee2Param\n    ): Promise<Transaction> {\n        const {\n            feeClaimer,\n            payer,\n            pool,\n            maxBaseAmount,\n            maxQuoteAmount,\n            receiver,\n        } = claimTradingFee2Param\n\n        const poolState = await this.state.getPool(pool)\n\n        if (!poolState) {\n            throw new Error(`Pool not found: ${pool.toString()}`)\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        if (!poolConfigState) {\n            throw new Error(`Pool config not found: ${pool.toString()}`)\n        }\n\n        const tokenBaseProgram = getTokenProgram(poolConfigState.tokenType)\n        const tokenQuoteProgram = getTokenProgram(\n            poolConfigState.quoteTokenFlag\n        )\n\n        const isSOLQuoteMint = isNativeSol(poolConfigState.quoteMint)\n\n        if (isSOLQuoteMint) {\n            const preInstructions: TransactionInstruction[] = []\n            const postInstructions: TransactionInstruction[] = []\n\n            const tokenBaseAccount = findAssociatedTokenAddress(\n                receiver,\n                poolState.baseMint,\n                tokenBaseProgram\n            )\n\n            const tokenQuoteAccount = findAssociatedTokenAddress(\n                feeClaimer,\n                poolConfigState.quoteMint,\n                tokenQuoteProgram\n            )\n\n            const createTokenBaseAccountIx =\n                createAssociatedTokenAccountIdempotentInstruction(\n                    payer,\n                    tokenBaseAccount,\n                    receiver,\n                    poolState.baseMint,\n                    tokenBaseProgram\n                )\n            createTokenBaseAccountIx &&\n                preInstructions.push(createTokenBaseAccountIx)\n\n            const createTokenQuoteAccountIx =\n                createAssociatedTokenAccountIdempotentInstruction(\n                    payer,\n                    tokenQuoteAccount,\n                    feeClaimer,\n                    poolConfigState.quoteMint,\n                    tokenQuoteProgram\n                )\n            createTokenQuoteAccountIx &&\n                preInstructions.push(createTokenQuoteAccountIx)\n\n            const unwrapSolIx = unwrapSOLInstruction(feeClaimer, receiver)\n            unwrapSolIx && postInstructions.push(unwrapSolIx)\n\n            const accounts = {\n                poolAuthority: this.poolAuthority,\n                pool,\n                tokenAAccount: tokenBaseAccount,\n                tokenBAccount: tokenQuoteAccount,\n                baseVault: poolState.baseVault,\n                quoteVault: poolState.quoteVault,\n                baseMint: poolState.baseMint,\n                quoteMint: poolConfigState.quoteMint,\n                feeClaimer,\n                tokenBaseProgram,\n                tokenQuoteProgram,\n            }\n\n            return this.program.methods\n                .claimTradingFee(maxBaseAmount, maxQuoteAmount)\n                .accountsPartial(accounts)\n                .preInstructions(preInstructions)\n                .postInstructions(postInstructions)\n                .transaction()\n        } else {\n            const result = await this.claimWithQuoteMintNotSol({\n                feeClaimer,\n                payer,\n                feeReceiver: receiver,\n                config: poolState.config,\n                pool,\n                poolState,\n                poolConfigState,\n                tokenBaseProgram,\n                tokenQuoteProgram,\n            })\n            return this.program.methods\n                .claimTradingFee(maxBaseAmount, maxQuoteAmount)\n                .accountsPartial(result.accounts)\n                .preInstructions(result.preInstructions)\n                .postInstructions([])\n                .transaction()\n        }\n    }\n\n    /**\n     * Partner withdraw surplus\n     * @param partnerWithdrawSurplusParam - The parameters for the partner withdraw surplus\n     * @returns A partner withdraw surplus transaction\n     */\n    async partnerWithdrawSurplus(\n        partnerWithdrawSurplusParam: PartnerWithdrawSurplusParam\n    ): Promise<Transaction> {\n        const poolState = await this.state.getPool(\n            partnerWithdrawSurplusParam.virtualPool\n        )\n        if (!poolState) {\n            throw new Error(\n                `Pool not found: ${partnerWithdrawSurplusParam.virtualPool.toString()}`\n            )\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        const tokenQuoteProgram = getTokenProgram(\n            poolConfigState.quoteTokenFlag\n        )\n\n        const preInstructions: TransactionInstruction[] = []\n        const postInstructions: TransactionInstruction[] = []\n\n        const { ataPubkey: tokenQuoteAccount, ix: createQuoteTokenAccountIx } =\n            await getOrCreateATAInstruction(\n                this.connection,\n                poolConfigState.quoteMint,\n                partnerWithdrawSurplusParam.feeClaimer,\n                partnerWithdrawSurplusParam.feeClaimer,\n                true,\n                tokenQuoteProgram\n            )\n\n        createQuoteTokenAccountIx &&\n            preInstructions.push(createQuoteTokenAccountIx)\n\n        if (poolConfigState.quoteMint.equals(NATIVE_MINT)) {\n            const unwrapSolIx = unwrapSOLInstruction(\n                partnerWithdrawSurplusParam.feeClaimer,\n                partnerWithdrawSurplusParam.feeClaimer\n            )\n            unwrapSolIx && postInstructions.push(unwrapSolIx)\n        }\n        return this.program.methods\n            .partnerWithdrawSurplus()\n            .accountsPartial({\n                poolAuthority: this.poolAuthority,\n                config: poolState.config,\n                virtualPool: partnerWithdrawSurplusParam.virtualPool,\n                tokenQuoteAccount,\n                quoteVault: poolState.quoteVault,\n                quoteMint: poolConfigState.quoteMint,\n                feeClaimer: partnerWithdrawSurplusParam.feeClaimer,\n                tokenQuoteProgram,\n            })\n            .preInstructions(preInstructions)\n            .postInstructions(postInstructions)\n            .transaction()\n    }\n\n    /**\n     * Partner withdraw migration fee\n     * @param withdrawMigrationFeeParams - The parameters for the partner withdraw migration fee\n     * @returns A partner withdraw migration fee transaction\n     */\n    async partnerWithdrawMigrationFee(\n        withdrawMigrationFeeParams: WithdrawMigrationFeeParam\n    ): Promise<Transaction> {\n        const { virtualPool, sender, feePayer } = withdrawMigrationFeeParams\n        const virtualPoolState = await this.state.getPool(virtualPool)\n        const configState = await this.state.getPoolConfig(\n            virtualPoolState.config\n        )\n        const { ataPubkey: tokenQuoteAccount, ix: preInstruction } =\n            await getOrCreateATAInstruction(\n                this.program.provider.connection,\n                configState.quoteMint,\n                sender,\n                feePayer ?? sender,\n                true,\n                getTokenProgram(configState.quoteTokenFlag)\n            )\n\n        const postInstruction: TransactionInstruction[] = []\n        if (configState.quoteMint.equals(NATIVE_MINT)) {\n            const unwarpSOLIx = unwrapSOLInstruction(sender, sender)\n            unwarpSOLIx && postInstruction.push(unwarpSOLIx)\n        }\n\n        const transaction = await this.program.methods\n            .withdrawMigrationFee(0) // 0 as partner and 1 as creator\n            .accountsPartial({\n                poolAuthority: this.poolAuthority,\n                config: virtualPoolState.config,\n                virtualPool,\n                tokenQuoteAccount,\n                quoteVault: virtualPoolState.quoteVault,\n                quoteMint: configState.quoteMint,\n                sender,\n                tokenQuoteProgram: getTokenProgram(configState.quoteTokenFlag),\n            })\n            .preInstructions([preInstruction])\n            .postInstructions(postInstruction)\n            .transaction()\n\n        return transaction\n    }\n}\n","import {\n    Commitment,\n    PublicKey,\n    SystemProgram,\n    Transaction,\n    TransactionInstruction,\n    type Connection,\n} from '@solana/web3.js'\nimport {\n    ClaimCreatorTradingFee2Param,\n    ClaimCreatorTradingFeeParam,\n    ClaimCreatorTradingFeeWithQuoteMintNotSolParam,\n    ClaimCreatorTradingFeeWithQuoteMintSolParam,\n    CreateVirtualPoolMetadataParam,\n    CreatorWithdrawSurplusParam,\n    TransferPoolCreatorParam,\n    WithdrawMigrationFeeParam,\n} from '../types'\nimport {\n    createAssociatedTokenAccountIdempotentInstruction,\n    NATIVE_MINT,\n    TOKEN_PROGRAM_ID,\n} from '@solana/spl-token'\nimport { DynamicBondingCurveProgram } from './program'\nimport {\n    deriveDammV1MigrationMetadataAddress,\n    deriveDbcPoolMetadata,\n    findAssociatedTokenAddress,\n    getOrCreateATAInstruction,\n    getTokenProgram,\n    isNativeSol,\n    unwrapSOLInstruction,\n} from '../helpers'\nimport { StateService } from './state'\n\nexport class CreatorService extends DynamicBondingCurveProgram {\n    private state: StateService\n\n    constructor(connection: Connection, commitment: Commitment) {\n        super(connection, commitment)\n        this.state = new StateService(connection, commitment)\n    }\n\n    /**\n     * Create virtual pool metadata\n     * @param createVirtualPoolMetadataParam - The parameters for the virtual pool metadata\n     * @returns A create virtual pool metadata transaction\n     */\n    async createPoolMetadata(\n        createVirtualPoolMetadataParam: CreateVirtualPoolMetadataParam\n    ): Promise<Transaction> {\n        const virtualPoolMetadata = deriveDbcPoolMetadata(\n            createVirtualPoolMetadataParam.virtualPool\n        )\n        return this.program.methods\n            .createVirtualPoolMetadata({\n                padding: new Array(96).fill(0),\n                name: createVirtualPoolMetadataParam.name,\n                website: createVirtualPoolMetadataParam.website,\n                logo: createVirtualPoolMetadataParam.logo,\n            })\n            .accountsPartial({\n                virtualPool: createVirtualPoolMetadataParam.virtualPool,\n                virtualPoolMetadata,\n                creator: createVirtualPoolMetadataParam.creator,\n                payer: createVirtualPoolMetadataParam.payer,\n                systemProgram: SystemProgram.programId,\n            })\n            .transaction()\n    }\n\n    /**\n     * Private method to claim trading fee with quote mint SOL\n     * @param claimWithQuoteMintSolParam - The parameters for the claim with quote mint SOL\n     * @returns A claim trading fee with quote mint SOL accounts, pre instructions and post instructions\n     */\n    private async claimWithQuoteMintSol(\n        claimWithQuoteMintSolParam: ClaimCreatorTradingFeeWithQuoteMintSolParam\n    ): Promise<{\n        accounts: {\n            poolAuthority: PublicKey\n            pool: PublicKey\n            tokenAAccount: PublicKey\n            tokenBAccount: PublicKey\n            baseVault: PublicKey\n            quoteVault: PublicKey\n            baseMint: PublicKey\n            quoteMint: PublicKey\n            creator: PublicKey\n            tokenBaseProgram: PublicKey\n            tokenQuoteProgram: PublicKey\n        }\n        preInstructions: TransactionInstruction[]\n        postInstructions: TransactionInstruction[]\n    }> {\n        const {\n            creator,\n            payer,\n            feeReceiver,\n            tempWSolAcc,\n            pool,\n            poolState,\n            poolConfigState,\n            tokenBaseProgram,\n            tokenQuoteProgram,\n        } = claimWithQuoteMintSolParam\n\n        const preInstructions: TransactionInstruction[] = []\n        const postInstructions: TransactionInstruction[] = []\n\n        const tokenBaseAccount = findAssociatedTokenAddress(\n            feeReceiver,\n            poolState.baseMint,\n            tokenBaseProgram\n        )\n\n        const tokenQuoteAccount = findAssociatedTokenAddress(\n            tempWSolAcc,\n            poolConfigState.quoteMint,\n            tokenQuoteProgram\n        )\n\n        const createTokenBaseAccountIx =\n            createAssociatedTokenAccountIdempotentInstruction(\n                payer,\n                tokenBaseAccount,\n                feeReceiver,\n                poolState.baseMint,\n                tokenBaseProgram\n            )\n        createTokenBaseAccountIx &&\n            preInstructions.push(createTokenBaseAccountIx)\n\n        const createTokenQuoteAccountIx =\n            createAssociatedTokenAccountIdempotentInstruction(\n                payer,\n                tokenQuoteAccount,\n                tempWSolAcc,\n                poolConfigState.quoteMint,\n                tokenQuoteProgram\n            )\n        createTokenQuoteAccountIx &&\n            preInstructions.push(createTokenQuoteAccountIx)\n\n        const unwrapSolIx = unwrapSOLInstruction(tempWSolAcc, feeReceiver)\n        unwrapSolIx && postInstructions.push(unwrapSolIx)\n\n        const accounts = {\n            poolAuthority: this.poolAuthority,\n            pool,\n            tokenAAccount: tokenBaseAccount,\n            tokenBAccount: tokenQuoteAccount,\n            baseVault: poolState.baseVault,\n            quoteVault: poolState.quoteVault,\n            baseMint: poolState.baseMint,\n            quoteMint: poolConfigState.quoteMint,\n            creator,\n            tokenBaseProgram,\n            tokenQuoteProgram,\n        }\n\n        return { accounts, preInstructions, postInstructions }\n    }\n\n    /**\n     * Private method to claim trading fee with quote mint not SOL\n     * @param claimWithQuoteMintNotSolParam - The parameters for the claim with quote mint not SOL\n     * @returns A claim trading fee with quote mint not SOL accounts and pre instructions\n     */\n    private async claimWithQuoteMintNotSol(\n        claimWithQuoteMintNotSolParam: ClaimCreatorTradingFeeWithQuoteMintNotSolParam\n    ): Promise<{\n        accounts: {\n            poolAuthority: PublicKey\n            pool: PublicKey\n            tokenAAccount: PublicKey\n            tokenBAccount: PublicKey\n            baseVault: PublicKey\n            quoteVault: PublicKey\n            baseMint: PublicKey\n            quoteMint: PublicKey\n            creator: PublicKey\n            tokenBaseProgram: PublicKey\n            tokenQuoteProgram: PublicKey\n        }\n        preInstructions: TransactionInstruction[]\n    }> {\n        const {\n            creator,\n            payer,\n            feeReceiver,\n            pool,\n            poolState,\n            poolConfigState,\n            tokenBaseProgram,\n            tokenQuoteProgram,\n        } = claimWithQuoteMintNotSolParam\n\n        const {\n            ataTokenA: tokenBaseAccount,\n            ataTokenB: tokenQuoteAccount,\n            instructions: preInstructions,\n        } = await this.prepareTokenAccounts(\n            feeReceiver,\n            payer,\n            poolState.baseMint,\n            poolConfigState.quoteMint,\n            tokenBaseProgram,\n            tokenQuoteProgram\n        )\n\n        const accounts = {\n            poolAuthority: this.poolAuthority,\n            pool,\n            tokenAAccount: tokenBaseAccount,\n            tokenBAccount: tokenQuoteAccount,\n            baseVault: poolState.baseVault,\n            quoteVault: poolState.quoteVault,\n            baseMint: poolState.baseMint,\n            quoteMint: poolConfigState.quoteMint,\n            creator,\n            tokenBaseProgram,\n            tokenQuoteProgram,\n        }\n\n        return { accounts, preInstructions }\n    }\n\n    /**\n     * Claim creator trading fee\n     * @param claimCreatorTradingFeeParam - The parameters for the claim creator trading fee\n     * @returns A claim creator trading fee transaction\n     */\n    async claimCreatorTradingFee(\n        claimCreatorTradingFeeParam: ClaimCreatorTradingFeeParam\n    ): Promise<Transaction> {\n        const {\n            creator,\n            pool,\n            maxBaseAmount,\n            maxQuoteAmount,\n            receiver,\n            payer,\n            tempWSolAcc,\n        } = claimCreatorTradingFeeParam\n\n        const poolState = await this.state.getPool(pool)\n\n        if (!poolState) {\n            throw new Error(`Pool not found: ${pool.toString()}`)\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        if (!poolConfigState) {\n            throw new Error(`Pool config not found: ${pool.toString()}`)\n        }\n\n        const tokenBaseProgram = getTokenProgram(poolConfigState.tokenType)\n        const tokenQuoteProgram = getTokenProgram(\n            poolConfigState.quoteTokenFlag\n        )\n\n        const isSOLQuoteMint = isNativeSol(poolConfigState.quoteMint)\n\n        if (isSOLQuoteMint) {\n            // if receiver is present and not equal to creator, use tempWSolAcc, otherwise use creator\n            const tempWSol =\n                receiver && !receiver.equals(creator) ? tempWSolAcc : creator\n            // if receiver is provided, use receiver, otherwise use creator\n            const feeReceiver = receiver ? receiver : creator\n\n            const result = await this.claimWithQuoteMintSol({\n                creator,\n                payer,\n                feeReceiver,\n                tempWSolAcc: tempWSol,\n                pool,\n                poolState,\n                poolConfigState,\n                tokenBaseProgram,\n                tokenQuoteProgram,\n            })\n\n            return this.program.methods\n                .claimCreatorTradingFee(maxBaseAmount, maxQuoteAmount)\n                .accountsPartial(result.accounts)\n                .preInstructions(result.preInstructions)\n                .postInstructions(result.postInstructions)\n                .transaction()\n        } else {\n            // check if receiver is provided, use receiver, otherwise use creator\n            const feeReceiver = receiver ? receiver : creator\n\n            const result = await this.claimWithQuoteMintNotSol({\n                creator,\n                payer,\n                feeReceiver,\n                pool,\n                poolState,\n                poolConfigState,\n                tokenBaseProgram,\n                tokenQuoteProgram,\n            })\n            return this.program.methods\n                .claimCreatorTradingFee(maxBaseAmount, maxQuoteAmount)\n                .accountsPartial(result.accounts)\n                .preInstructions(result.preInstructions)\n                .postInstructions([])\n                .transaction()\n        }\n    }\n\n    /**\n     * Claim creator trading fee\n     * @param claimCreatorTradingFeeParam - The parameters for the claim creator trading fee\n     * @returns A claim creator trading fee transaction\n     */\n    async claimCreatorTradingFee2(\n        claimCreatorTradingFee2Param: ClaimCreatorTradingFee2Param\n    ): Promise<Transaction> {\n        const {\n            creator,\n            pool,\n            maxBaseAmount,\n            maxQuoteAmount,\n            receiver,\n            payer,\n        } = claimCreatorTradingFee2Param\n\n        const poolState = await this.state.getPool(pool)\n\n        if (!poolState) {\n            throw new Error(`Pool not found: ${pool.toString()}`)\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        if (!poolConfigState) {\n            throw new Error(`Pool config not found: ${pool.toString()}`)\n        }\n\n        const tokenBaseProgram = getTokenProgram(poolConfigState.tokenType)\n        const tokenQuoteProgram = getTokenProgram(\n            poolConfigState.quoteTokenFlag\n        )\n\n        const isSOLQuoteMint = isNativeSol(poolConfigState.quoteMint)\n\n        if (isSOLQuoteMint) {\n            const preInstructions: TransactionInstruction[] = []\n            const postInstructions: TransactionInstruction[] = []\n\n            const tokenBaseAccount = findAssociatedTokenAddress(\n                receiver,\n                poolState.baseMint,\n                tokenBaseProgram\n            )\n\n            const tokenQuoteAccount = findAssociatedTokenAddress(\n                creator,\n                poolConfigState.quoteMint,\n                tokenQuoteProgram\n            )\n\n            const createTokenBaseAccountIx =\n                createAssociatedTokenAccountIdempotentInstruction(\n                    payer,\n                    tokenBaseAccount,\n                    receiver,\n                    poolState.baseMint,\n                    tokenBaseProgram\n                )\n            createTokenBaseAccountIx &&\n                preInstructions.push(createTokenBaseAccountIx)\n\n            const createTokenQuoteAccountIx =\n                createAssociatedTokenAccountIdempotentInstruction(\n                    payer,\n                    tokenQuoteAccount,\n                    creator,\n                    poolConfigState.quoteMint,\n                    tokenQuoteProgram\n                )\n            createTokenQuoteAccountIx &&\n                preInstructions.push(createTokenQuoteAccountIx)\n\n            const unwrapSolIx = unwrapSOLInstruction(creator, receiver)\n            unwrapSolIx && postInstructions.push(unwrapSolIx)\n\n            const accounts = {\n                poolAuthority: this.poolAuthority,\n                pool,\n                tokenAAccount: tokenBaseAccount,\n                tokenBAccount: tokenQuoteAccount,\n                baseVault: poolState.baseVault,\n                quoteVault: poolState.quoteVault,\n                baseMint: poolState.baseMint,\n                quoteMint: poolConfigState.quoteMint,\n                creator,\n                tokenBaseProgram,\n                tokenQuoteProgram,\n            }\n\n            return this.program.methods\n                .claimCreatorTradingFee(maxBaseAmount, maxQuoteAmount)\n                .accountsPartial(accounts)\n                .preInstructions(preInstructions)\n                .postInstructions(postInstructions)\n                .transaction()\n        } else {\n            const result = await this.claimWithQuoteMintNotSol({\n                creator,\n                payer,\n                feeReceiver: receiver,\n                pool,\n                poolState,\n                poolConfigState,\n                tokenBaseProgram,\n                tokenQuoteProgram,\n            })\n            return this.program.methods\n                .claimCreatorTradingFee(maxBaseAmount, maxQuoteAmount)\n                .accountsPartial(result.accounts)\n                .preInstructions(result.preInstructions)\n                .postInstructions([])\n                .transaction()\n        }\n    }\n\n    /**\n     * Withdraw creator surplus\n     * @param creatorWithdrawSurplusParam - The parameters for the creator withdraw surplus\n     * @returns A creator withdraw surplus transaction\n     */\n    async creatorWithdrawSurplus(\n        creatorWithdrawSurplusParam: CreatorWithdrawSurplusParam\n    ): Promise<Transaction> {\n        const { creator, virtualPool } = creatorWithdrawSurplusParam\n\n        const poolState = await this.state.getPool(virtualPool)\n\n        if (!poolState) {\n            throw new Error(`Pool not found: ${virtualPool.toString()}`)\n        }\n\n        const poolConfigState = await this.state.getPoolConfig(poolState.config)\n\n        if (!poolConfigState) {\n            throw new Error(`Pool config not found: ${virtualPool.toString()}`)\n        }\n\n        const preInstructions: TransactionInstruction[] = []\n        const postInstructions: TransactionInstruction[] = []\n\n        const tokenQuoteAccount = findAssociatedTokenAddress(\n            creator,\n            poolConfigState.quoteMint,\n            TOKEN_PROGRAM_ID\n        )\n\n        const createQuoteTokenAccountIx =\n            createAssociatedTokenAccountIdempotentInstruction(\n                creator,\n                tokenQuoteAccount,\n                creator,\n                poolConfigState.quoteMint,\n                TOKEN_PROGRAM_ID\n            )\n\n        if (createQuoteTokenAccountIx) {\n            preInstructions.push(createQuoteTokenAccountIx)\n        }\n\n        const isSOLQuoteMint = isNativeSol(poolConfigState.quoteMint)\n\n        if (isSOLQuoteMint) {\n            const unwrapIx = unwrapSOLInstruction(creator, creator)\n            if (unwrapIx) {\n                postInstructions.push(unwrapIx)\n            }\n        }\n\n        const accounts = {\n            poolAuthority: this.poolAuthority,\n            config: poolState.config,\n            virtualPool,\n            tokenQuoteAccount,\n            quoteVault: poolState.quoteVault,\n            quoteMint: poolConfigState.quoteMint,\n            creator,\n            tokenQuoteProgram: TOKEN_PROGRAM_ID,\n        }\n\n        return this.program.methods\n            .creatorWithdrawSurplus()\n            .accountsPartial(accounts)\n            .preInstructions(preInstructions)\n            .postInstructions(postInstructions)\n            .transaction()\n    }\n\n    /**\n     * Transfer pool creator\n     * @param transferPoolCreatorParams - The parameters for the transfer pool creator\n     * @returns A transfer pool creator transaction\n     */\n    async transferPoolCreator(\n        transferPoolCreatorParams: TransferPoolCreatorParam\n    ): Promise<Transaction> {\n        const { virtualPool, creator, newCreator } = transferPoolCreatorParams\n        const virtualPoolState = await this.state.getPool(virtualPool)\n        const migrationMetadata =\n            deriveDammV1MigrationMetadataAddress(virtualPool)\n        const transaction = await this.program.methods\n            .transferPoolCreator()\n            .accountsPartial({\n                virtualPool,\n                newCreator,\n                config: virtualPoolState.config,\n                creator,\n            })\n            .remainingAccounts([\n                {\n                    isSigner: false,\n                    isWritable: false,\n                    pubkey: migrationMetadata,\n                },\n            ])\n            .transaction()\n\n        return transaction\n    }\n\n    /**\n     * Creator withdraw migration fee\n     * @param withdrawMigrationFeeParams - The parameters for the creator withdraw migration fee\n     * @returns A creator withdraw migration fee transaction\n     */\n    async creatorWithdrawMigrationFee(\n        withdrawMigrationFeeParams: WithdrawMigrationFeeParam\n    ): Promise<Transaction> {\n        const { virtualPool, sender, feePayer } = withdrawMigrationFeeParams\n        const virtualPoolState = await this.state.getPool(virtualPool)\n        const configState = await this.state.getPoolConfig(\n            virtualPoolState.config\n        )\n        const { ataPubkey: tokenQuoteAccount, ix: preInstruction } =\n            await getOrCreateATAInstruction(\n                this.program.provider.connection,\n                configState.quoteMint,\n                sender,\n                feePayer ?? sender,\n                true,\n                getTokenProgram(configState.quoteTokenFlag)\n            )\n        const postInstruction: TransactionInstruction[] = []\n        if (configState.quoteMint.equals(NATIVE_MINT)) {\n            const unwarpSOLIx = unwrapSOLInstruction(sender, sender)\n            unwarpSOLIx && postInstruction.push(unwarpSOLIx)\n        }\n\n        const transaction = await this.program.methods\n            .withdrawMigrationFee(1) // 0 as partner and 1 as creator\n            .accountsPartial({\n                poolAuthority: this.poolAuthority,\n                config: virtualPoolState.config,\n                virtualPool,\n                tokenQuoteAccount,\n                quoteVault: virtualPoolState.quoteVault,\n                quoteMint: configState.quoteMint,\n                sender,\n                tokenQuoteProgram: getTokenProgram(configState.quoteTokenFlag),\n            })\n            .preInstructions([preInstruction])\n            .postInstructions(postInstruction)\n            .transaction()\n\n        return transaction\n    }\n}\n","import { Commitment, Connection } from '@solana/web3.js'\nimport { PoolService } from './services/pool'\nimport { MigrationService } from './services/migration'\nimport { PartnerService } from './services/partner'\nimport { CreatorService } from './services/creator'\nimport { StateService } from './services/state'\n\nexport class DynamicBondingCurveClient {\n    public pool: PoolService\n    public partner: PartnerService\n    public creator: CreatorService\n    public migration: MigrationService\n    public state: StateService\n    public commitment: Commitment\n    public connection: Connection\n\n    constructor(connection: Connection, commitment: Commitment) {\n        this.pool = new PoolService(connection, commitment)\n        this.partner = new PartnerService(connection, commitment)\n        this.creator = new CreatorService(connection, commitment)\n        this.migration = new MigrationService(connection, commitment)\n        this.state = new StateService(connection, commitment)\n        this.commitment = commitment\n        this.connection = connection\n    }\n\n    /**\n     * Static method to create a client instance for a specific pool\n     * @param connection - The connection to the Solana network\n     * @returns A DynamicBondingCurveClient instance\n     */\n    static create(\n        connection: Connection,\n        commitment: Commitment = 'confirmed'\n    ): DynamicBondingCurveClient {\n        return new DynamicBondingCurveClient(connection, commitment)\n    }\n}\n"]}