@whetstone-research/doppler-sdk 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/dist/DopplerSDK.js +13 -13
- package/dist/DopplerSDK.mjs +12 -12
- package/dist/addresses.d.mts +1 -0
- package/dist/addresses.d.ts +1 -0
- package/dist/addresses.js +6 -6
- package/dist/addresses.mjs +1 -1
- package/dist/builders/DynamicAuctionBuilder.js +5 -5
- package/dist/builders/DynamicAuctionBuilder.mjs +4 -4
- package/dist/builders/MulticurveBuilder.js +5 -5
- package/dist/builders/MulticurveBuilder.mjs +4 -4
- package/dist/builders/StaticAuctionBuilder.js +5 -5
- package/dist/builders/StaticAuctionBuilder.mjs +4 -4
- package/dist/builders/index.js +9 -9
- package/dist/builders/index.mjs +6 -6
- package/dist/builders/shared.js +2 -2
- package/dist/builders/shared.mjs +2 -2
- package/dist/{chunk-Y5RAENN5.js → chunk-3L4DLMOK.js} +5 -5
- package/dist/{chunk-Y5RAENN5.js.map → chunk-3L4DLMOK.js.map} +1 -1
- package/dist/{chunk-GLMPU7VL.js → chunk-3XYDN2XB.js} +5 -5
- package/dist/{chunk-GLMPU7VL.js.map → chunk-3XYDN2XB.js.map} +1 -1
- package/dist/{chunk-JHPDKSC4.js → chunk-5VV7STYK.js} +40 -11
- package/dist/chunk-5VV7STYK.js.map +1 -0
- package/dist/{chunk-COUZYFEE.js → chunk-5WYXNWNH.js} +5 -5
- package/dist/{chunk-COUZYFEE.js.map → chunk-5WYXNWNH.js.map} +1 -1
- package/dist/{chunk-NWZGO2CH.mjs → chunk-ADAAU4F5.mjs} +40 -11
- package/dist/chunk-ADAAU4F5.mjs.map +1 -0
- package/dist/{chunk-RKPAL3SU.mjs → chunk-AZH2P4JK.mjs} +3 -3
- package/dist/{chunk-RKPAL3SU.mjs.map → chunk-AZH2P4JK.mjs.map} +1 -1
- package/dist/{chunk-AS5UUJRI.js → chunk-COOVGAOE.js} +13 -11
- package/dist/chunk-COOVGAOE.js.map +1 -0
- package/dist/{chunk-36Y3N257.mjs → chunk-CS6FVODR.mjs} +3 -3
- package/dist/{chunk-36Y3N257.mjs.map → chunk-CS6FVODR.mjs.map} +1 -1
- package/dist/{chunk-TYJZL2XZ.js → chunk-CUB4F546.js} +5 -5
- package/dist/{chunk-TYJZL2XZ.js.map → chunk-CUB4F546.js.map} +1 -1
- package/dist/{chunk-RJE6LWWF.mjs → chunk-D7PCIMWU.mjs} +3 -3
- package/dist/{chunk-RJE6LWWF.mjs.map → chunk-D7PCIMWU.mjs.map} +1 -1
- package/dist/{chunk-CXE33IZN.mjs → chunk-FVTTG72Z.mjs} +3 -3
- package/dist/{chunk-CXE33IZN.mjs.map → chunk-FVTTG72Z.mjs.map} +1 -1
- package/dist/{chunk-SQRQYDB3.mjs → chunk-HJ4AS5DZ.mjs} +11 -11
- package/dist/{chunk-SQRQYDB3.mjs.map → chunk-HJ4AS5DZ.mjs.map} +1 -1
- package/dist/{chunk-4CJS5XLY.js → chunk-INLXNN7P.js} +4 -4
- package/dist/{chunk-4CJS5XLY.js.map → chunk-INLXNN7P.js.map} +1 -1
- package/dist/{chunk-U7CHPFU6.mjs → chunk-KITPRKQ4.mjs} +3 -3
- package/dist/{chunk-U7CHPFU6.mjs.map → chunk-KITPRKQ4.mjs.map} +1 -1
- package/dist/{chunk-BFJGY436.mjs → chunk-M2EMKIP5.mjs} +5 -3
- package/dist/chunk-M2EMKIP5.mjs.map +1 -0
- package/dist/{chunk-5JQDXMDN.js → chunk-MT34O3YL.js} +24 -24
- package/dist/{chunk-5JQDXMDN.js.map → chunk-MT34O3YL.js.map} +1 -1
- package/dist/{chunk-XEWKLVOD.mjs → chunk-O3RH43H3.mjs} +3 -3
- package/dist/{chunk-XEWKLVOD.mjs.map → chunk-O3RH43H3.mjs.map} +1 -1
- package/dist/{chunk-GFOBDFVW.js → chunk-QQEOKYEX.js} +17 -17
- package/dist/{chunk-GFOBDFVW.js.map → chunk-QQEOKYEX.js.map} +1 -1
- package/dist/{chunk-HX3A6ALC.mjs → chunk-RWVNXU7Z.mjs} +3 -3
- package/dist/{chunk-HX3A6ALC.mjs.map → chunk-RWVNXU7Z.mjs.map} +1 -1
- package/dist/{chunk-K27G7LLT.js → chunk-S4IZ5ATO.js} +5 -5
- package/dist/{chunk-K27G7LLT.js.map → chunk-S4IZ5ATO.js.map} +1 -1
- package/dist/{chunk-HHHCRTC7.js → chunk-WKKOBMXR.js} +5 -5
- package/dist/{chunk-HHHCRTC7.js.map → chunk-WKKOBMXR.js.map} +1 -1
- package/dist/{chunk-V7YRKFYK.mjs → chunk-YWK6YH6M.mjs} +3 -3
- package/dist/{chunk-V7YRKFYK.mjs.map → chunk-YWK6YH6M.mjs.map} +1 -1
- package/dist/{chunk-545TB6TH.js → chunk-ZDTJ3BPS.js} +11 -11
- package/dist/{chunk-545TB6TH.js.map → chunk-ZDTJ3BPS.js.map} +1 -1
- package/dist/{chunk-NJYBKWCD.mjs → chunk-ZRNPHFP3.mjs} +3 -3
- package/dist/{chunk-NJYBKWCD.mjs.map → chunk-ZRNPHFP3.mjs.map} +1 -1
- package/dist/entities/DopplerFactory.js +4 -4
- package/dist/entities/DopplerFactory.mjs +3 -3
- package/dist/entities/auction/DynamicAuction.js +3 -3
- package/dist/entities/auction/DynamicAuction.mjs +2 -2
- package/dist/entities/auction/MulticurvePool.js +4 -4
- package/dist/entities/auction/MulticurvePool.mjs +3 -3
- package/dist/entities/auction/StaticAuction.js +3 -3
- package/dist/entities/auction/StaticAuction.mjs +2 -2
- package/dist/entities/auction/index.js +8 -8
- package/dist/entities/auction/index.mjs +5 -5
- package/dist/entities/quoter/Quoter.js +3 -3
- package/dist/entities/quoter/Quoter.mjs +2 -2
- package/dist/entities/quoter/index.js +3 -3
- package/dist/entities/quoter/index.mjs +2 -2
- package/dist/index.js +31 -31
- package/dist/index.mjs +12 -12
- package/dist/types.d.mts +3 -3
- package/dist/types.d.ts +3 -3
- package/dist/types.js +7 -7
- package/dist/types.mjs +2 -2
- package/dist/utils/airlock.js +6 -6
- package/dist/utils/airlock.mjs +2 -2
- package/dist/utils/index.js +6 -6
- package/dist/utils/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-AS5UUJRI.js.map +0 -1
- package/dist/chunk-BFJGY436.mjs.map +0 -1
- package/dist/chunk-JHPDKSC4.js.map +0 -1
- package/dist/chunk-NWZGO2CH.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/entities/DopplerFactory.ts"],"names":["resolved","decoded"],"mappings":";;;;;;;;;;;;AA0EA,IAAM,WAAA,GAAA,CAAe,MAAM,IAAA,IAAQ,EAAA;AAGnC,IAAM,wBAAA,GACJ,4CAAA;AAQK,IAAM,iBAAN,MAAoE;AAAA,EAQzE,WAAA,CACE,YAAA,EACA,YAAA,EACA,OAAA,EACA;AANF,IAAA,IAAA,CAAQ,wBAAA,uBAA+B,GAAA,EAAsB;AAO3D,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,2BAA2B,OAAA,EAAiC;AAC1D,IAAA,IAAA,CAAK,sBAAA,GAAyB,OAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,gCACJ,MAAA,EACuB;AAEvB,IAAA,IAAA,CAAK,4BAA4B,MAAM,CAAA;AAEvC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAG3C,IAAA,MAAM,mBACJ,MAAA,CAAO,IAAA,CAAK,iBAAiB,MAAA,CAAO,IAAA,CAAK,cAAc,MAAA,GAAS,CAAA;AAKlE,IAAA,IAAI,mBAAA;AAEJ,IAAA,IAAI,gBAAA,EAAkB;AAEpB,MAAA,MAAM,mBAAA,GAAsB,OAAO,IAAA,CAChC,aAAA,CAAe,OAAM,CACrB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACd,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY;AACxC,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY;AACxC,QAAA,OAAO,KAAA,GAAQ,KAAA,GAAQ,EAAA,GAAK,KAAA,GAAQ,QAAQ,CAAA,GAAI,CAAA;AAAA,MAClD,CAAC,CAAA;AAGH,MAAA,mBAAA,GAAsB,mBAAA;AAAA,QACpB;AAAA,UACE;AAAA,YACE,IAAA,EAAM,OAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,cAC9B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAY;AAAA,cACnC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAY;AAAA,cACnC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,cAAA,EAAe;AAAA,cACvC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,kBAAA,EAAmB;AAAA,cAC5C;AAAA,gBACE,IAAA,EAAM,SAAA;AAAA,gBACN,IAAA,EAAM,eAAA;AAAA,gBACN,UAAA,EAAY;AAAA,kBACV,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,aAAA,EAAc;AAAA,kBACvC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA;AAAS;AACnC;AACF;AACF;AACF,SACF;AAAA,QACA;AAAA,UACE;AAAA,YACE,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAAA,YACjB,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,YACvB,SAAA,EAAW,OAAO,IAAA,CAAK,OAAA;AAAA,YACvB,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,YAAA,IAAgB,wBAAA;AAAA,YAC1C,gBAAA,EACE,MAAA,CAAO,IAAA,CAAK,gBAAA,IAAoB,+BAAA;AAAA,YAClC,aAAA,EAAe,mBAAA,CAAoB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cAC7C,aAAa,CAAA,CAAE,WAAA;AAAA,cACf,QAAQ,CAAA,CAAE;AAAA,aACZ,CAAE;AAAA;AACJ;AACF,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,mBAAA,GAAsB,mBAAA;AAAA,QACpB;AAAA,UACE;AAAA,YACE,IAAA,EAAM,OAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,cAC9B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAY;AAAA,cACnC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAY;AAAA,cACnC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,cAAA,EAAe;AAAA,cACvC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,kBAAA;AAAmB;AAC9C;AACF,SACF;AAAA,QACA;AAAA,UACE;AAAA,YACE,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAAA,YACjB,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,YACvB,SAAA,EAAW,OAAO,IAAA,CAAK,OAAA;AAAA,YACvB,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,YAAA,IAAgB,wBAAA;AAAA,YAC1C,gBAAA,EACE,MAAA,CAAO,IAAA,CAAK,gBAAA,IAAoB;AAAA;AACpC;AACF,OACF;AAAA,IACF;AAGA,IAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAS,CAAA;AAGvE,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,EAAG;AACxC,MAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AAExB,MAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA,KAAS,SAAY,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,KAAA;AACnE,MAAA,gBAAA,GAAmB,mBAAA;AAAA,QACjB;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA;AAAU,SACpB;AAAA,QACA,CAAC,OAAO,KAAA,CAAM,IAAA,EAAM,OAAO,KAAA,CAAM,MAAA,EAAQ,SAAS,IAAI;AAAA,OACxD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AACxB,MAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,EAAS,QAAA,IAAY,OAAO,CAAC,CAAA;AAC5D,MAAA,MAAM,cAAA,GACJ,SAAS,cAAA,IAAkB,2BAAA;AAG7B,MAAA,IAAI,oBAA+B,EAAC;AACpC,MAAA,IAAI,iBAA2B,EAAC;AAEhC,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,QAAQ,OAAA,EAAS;AAEvD,UAAA,iBAAA,GAAoB,OAAO,OAAA,CAAQ,UAAA;AACnC,UAAA,cAAA,GAAiB,OAAO,OAAA,CAAQ,OAAA;AAAA,QAClC,CAAA,MAAO;AAEL,UAAA,iBAAA,GAAoB,CAAC,OAAO,WAAW,CAAA;AACvC,UAAA,cAAA,GAAiB;AAAA,YACf,MAAA,CAAO,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK;AAAA,WAC1C;AAAA,QACF;AAAA,MACF;AAEA,MAAA,gBAAA,GAAmB,mBAAA;AAAA,QACjB;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,WAAA,EAAY;AAAA,UACpB,EAAE,MAAM,WAAA,EAAY;AAAA,UACpB,EAAE,MAAM,QAAA;AAAS,SACnB;AAAA,QACA;AAAA,UACE,QAAA,CAAS,IAAA;AAAA,UACT,QAAA,CAAS,MAAA;AAAA,UACT,cAAA;AAAA,UACA,OAAO,eAAe,CAAA;AAAA,UACtB,iBAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA,CAAS;AAAA;AACX,OACF;AAAA,IACF;AAGA,IAAA,MAAM,yBAA8B,MAAM;AACxC,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,MAAA,EAAQ;AACrC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,WAAA,EAAa;AAC1C,QAAA,OAAO,mBAAA;AAAA,UACL,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,UACpB,CAAC,MAAA,CAAO,UAAA,CAAW,QAAQ;AAAA,SAC7B;AAAA,MACF;AACA,MAAA,OAAO,mBAAA;AAAA,QACL;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA;AAAU,SACpB;AAAA,QACA;AAAA,UACE,OAAO,KAAA,CAAM,IAAA;AAAA,UACb,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACvB,MAAA,CAAO,WAAW,kBAAA,GAClB,+BAAA;AAAA,UACJ,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACvB,MAAA,CAAO,WAAW,mBAAA,GAClB,gCAAA;AAAA,UACJ,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACvB,MAAA,CAAO,WAAW,wBAAA,GAClB;AAAA;AACN,OACF;AAAA,IACF,CAAA,GAAG;AAGH,IAAA,MAAM,4BAAqC,MAAM;AAC/C,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,MAAA,EAAQ;AACrC,QAAA,MAAMA,SAAAA,GACJ,MAAA,CAAO,OAAA,EAAS,iBAAA,IAChB,UAAU,qBAAA,IACV,YAAA;AACF,QAAA,IAAI,CAACA,SAAAA,IAAYA,SAAAA,KAAa,YAAA,EAAc;AAC1C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAOA,SAAAA;AAAA,MACT;AACA,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,WAAA,EAAa;AAC1C,QAAA,MAAMA,SAAAA,GACJ,MAAA,CAAO,OAAA,EAAS,iBAAA,IAChB,UAAU,0BAAA,IACV,YAAA;AACF,QAAA,IAAI,CAACA,SAAAA,IAAYA,SAAAA,KAAa,YAAA,EAAc;AAC1C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAOA,SAAAA;AAAA,MACT;AACA,MAAA,MAAM,QAAA,GACJ,MAAA,CAAO,OAAA,EAAS,iBAAA,IAAqB,SAAA,CAAU,iBAAA;AACjD,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,KAAa,YAAA,EAAc;AAC1C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,GAAG;AAIH,IAAA,MAAM,oBAAA,GACJ,MAAA,CAAO,OAAA,EAAS,YAAA,KACf,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,GAC/B,SAAA,CAAU,iBAAA,GACX,SAAA,CAAU,YAAA,CAAA;AAEhB,IAAA,IAAI,CAAC,oBAAA,IAAwB,oBAAA,KAAyB,YAAA,EAAc;AAClE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,aAAA,EAAe,OAAO,IAAA,CAAK,aAAA;AAAA,MAC3B,eAAA,EAAiB,OAAO,IAAA,CAAK,eAAA;AAAA,MAC7B,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,YAAA,EAAc,oBAAA;AAAA,MACd,gBAAA;AAAA,MACA,iBAAA,EAAmB,wBAAA;AAAA,MACnB,qBAAA;AAAA,MACA,kBAAkB,MAAM;AACtB,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,MAAM,mBAAA,GACJ,MAAA,CAAO,OAAA,EAAS,qBAAA,IAChB,SAAA,CAAU,qBAAA;AACZ,UAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AACA,UAAA,OAAO,mBAAA;AAAA,QACT;AACA,QAAA,OAAO,MAAA,CAAO,OAAA,EAAS,aAAA,IAAiB,SAAA,CAAU,aAAA;AAAA,MACpD,CAAA,GAAG;AAAA,MACH,mBAAA;AAAA,MACA,mBAAmB,IAAA,CAAK,kBAAA;AAAA,QACtB,MAAA,CAAO,SAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AAAA,MACA,qBAAA;AAAA,MACA,UAAA,EAAY,OAAO,UAAA,IAAc;AAAA,KACnC;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,cAAA,CAAe;AAAA,MAClD,MAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,iBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,4BACJ,MAAA,EAYC;AACD,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,+BAAA,CAAgC,MAAM,CAAA;AACtE,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAE3C,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,SAAA,CAAU,OAAA;AAC5D,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,KAAW,MAC1B,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,IAAA,EAAM,CAAC,EAAE,GAAG,cAAc,CAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,YAAA,EAAc;AAAA,KAC7B,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,MAAA;AAClB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,wBAAA,CAAyB;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,YAAA;AAAA,MACA,OAAA,EAAS,IAAA,CAAK,YAAA,EAAc,OAAA,IAAW,MAAA,CAAO;AAAA,KAC/C,CAAA;AAED,IAAA,IAAI,CAAC,aAAa,CAAC,KAAA,CAAM,QAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO;AAAA,MACL,YAAA;AAAA,MACA,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,MAClB,IAAA,EAAM,UAAU,CAAC,CAAA;AAAA,MACjB,WAAA;AAAA,MACA,OAAA,EAAS,MACP,IAAA,CAAK,mBAAA,CAAoB,QAAQ,EAAE,aAAA,EAAe,cAAc;AAAA,KACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAA,CACJ,MAAA,EACA,OAAA,EAKC;AAED,IAAA,MAAM,eACJ,OAAA,EAAS,aAAA,IAAA,CACR,MAAM,IAAA,CAAK,2BAAA,CAA4B,MAAM,CAAA,EAAG,YAAA;AAEnD,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAG3C,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,SAAA,CAAU,OAAA;AAC5D,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,KAAW,MAC1B,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,IAAA,EAAM,CAAC,EAAE,GAAG,cAAc,CAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,YAAA,CAAa;AAAA,KAC5B,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,MAAA;AAElB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,wBAAA,CAAyB;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,YAAA;AAAA,MACA,OAAA,EAAS,KAAK,YAAA,CAAa;AAAA,KAC5B,CAAA;AACD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,GAAA,IAAO,WAAA,IAAe,wBAAA;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc;AAAA,MACjD,GAAG,OAAA;AAAA,MACH,GAAA,EAAK;AAAA,KACN,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,MACd,IAAA,CAAK,YAAA,CACL,0BAA0B,EAAE,IAAA,EAAM,aAAA,EAAe,CAAA,EAAG,CAAA;AAGtD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,+BAAA,CAAgC,OAAO,CAAA;AAEpE,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,aAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,UAAU,CAAA,EAAG;AAClE,MAAA,MAAM,cAAA,GAAiB,UAAU,CAAC,CAAA;AAClC,MAAA,MAAM,aAAA,GAAgB,UAAU,CAAC,CAAA;AACjC,MAAA,IACE,eAAe,WAAA,EAAY,KAC3B,eAAA,CAAgB,YAAA,CAAa,aAAY,EACzC;AACA,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,wCAAA,EAA2C,cAAc,CAAA,eAAA,EAAkB,eAAA,CAAgB,YAAY,CAAA,sEAAA;AAAA,SAEzG;AAAA,MACF;AACA,MAAA,IACE,cAAc,WAAA,EAAY,KAC1B,eAAA,CAAgB,iBAAA,CAAkB,aAAY,EAC9C;AACA,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,uCAAA,EAA0C,aAAa,CAAA,eAAA,EAAkB,eAAA,CAAgB,iBAAiB,CAAA,sEAAA;AAAA,SAE5G;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,cAAc,eAAA,CAAgB,YAAA;AAAA,MAC9B,aAAa,eAAA,CAAgB,iBAAA;AAAA,MAC7B,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,OAAA,EAAuB;AAEhD,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAG/B,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,eAAA,EAAiB;AAC3D,MAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAAA,IAC9B,CAAA,MAAO;AAEL,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,cAAA,GAAiB,IAAI,UAAA,CAAW,CAAC,CAAA;AACvC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,cAAA,CAAe,CAAC,CAAA,GAAK,SAAA,IAAc,CAAA,GAAI,CAAA,GAAM,GAAA;AAAA,MAC/C;AAGA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,cAAA,CAAe,CAAC,CAAA;AAAA,QAC7B,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,eAAe,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AACtD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,QAAA,MAAM,WAAA,GAAc,QAAA;AAAA,UAClB,aAAa,KAAA,CAAM,CAAA,GAAI,CAAA,EAAA,CAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA,UACrC;AAAA,SACF;AACA,QAAA,KAAA,CAAM,CAAC,CAAA,IAAK,WAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CACzB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gCAAgC,OAAA,EAEyB;AAC/D,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAiB;AACtD,MAAA,IAAI;AACF,QAAA,MAAMC,WAAU,cAAA,CAAe;AAAA,UAC7B,GAAA,EAAK,UAAA;AAAA,UACL,MAAO,GAAA,CAAsB,IAAA;AAAA,UAC7B,QAAS,GAAA,CAA6C;AAAA,SAIvD,CAAA;AACD,QAAA,OAAOA,SAAQ,SAAA,KAAc,QAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AAEzB,IAAA,MAAM,UAAU,cAAA,CAAe;AAAA,MAC7B,GAAA,EAAK,UAAA;AAAA,MACL,MAAO,WAAA,CAA8B,IAAA;AAAA,MACrC,QAAS,WAAA,CAAqD;AAAA,KAI/D,CAAA;AAED,IAAA,IAAI,OAAA,CAAQ,cAAc,QAAA,EAAU;AAClC,MAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,MAAA,OAAO,EAAE,YAAA,EAAc,IAAA,CAAK,KAAA,EAAO,iBAAA,EAAmB,KAAK,UAAA,EAAW;AAAA,IACxE;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,eAAe,IAAA,EAIH;AACxB,IAAA,MAAM,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAA,EAAU,GAAI,IAAA;AAEhD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,SAAA,CAAU,OAAA;AAC5D,IAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,KAAmB,YAAA,EAAc;AACtD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,oBAAA,GACJ,IAAA,CAAK,YAAA,EAAc,OAAA,IAAW,MAAA,CAAO,WAAA;AACvC,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAEpD,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,MAAM,WAAA,GAAc,IAAA;AACpB,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,WAAW,CAAA;AAErD,IAAA,OAAO,UAAU,WAAA,EAAa;AAC5B,MAAA,MAAM,YAAA,GAAe,EAAE,GAAG,gBAAA,EAAkB,IAAA,EAAK;AAEjD,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MACjB,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,QACjB,OAAA,EAAS,cAAA;AAAA,QACT,GAAA,EAAK,UAAA;AAAA,QACL,YAAA,EAAc,QAAA;AAAA,QACd,IAAA,EAAM,CAAC,EAAE,GAAG,cAAc,CAAA;AAAA,QAC1B,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,MAAA;AAClB,MAAA,IAAI,CAAC,aAAa,CAAC,KAAA,CAAM,QAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACnE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,UAAU,CAAC,CAAA;AAChC,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,GAAI,eAAA,EAAiB;AAC1C,QAAA,OAAO,YAAA;AAAA,MACT;AAEA,MAAA,OAAA,IAAW,EAAA;AACX,MAAA,MAAM,kBAAA,GAAqB,KAAA;AAAA,QACzB,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,GAAI;AAAA,OAC/B;AACA,MAAA,IAAA,GAAO,IAAA,CAAK,mBAAmB,kBAAkB,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,iCACJ,MAAA,EAKC;AAED,IAAA,IAAA,CAAK,6BAA6B,MAAM,CAAA;AAExC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAG3C,IAAA,MAAM,KAAA,GACJ,MAAA,CAAO,OAAA,CAAQ,KAAA,IACf,mBAAA;AAAA,MACE,OAAO,OAAA,CAAQ,SAAA;AAAA,MACf,OAAO,OAAA,CAAQ,OAAA;AAAA,MACf,OAAO,OAAA,CAAQ,QAAA;AAAA,MACf,OAAO,OAAA,CAAQ,WAAA;AAAA,MACf,OAAO,IAAA,CAAK;AAAA,KACd;AAIF,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI,MAAA,CAAO,mBAAmB,MAAA,EAAW;AACvC,MAAA,cAAA,GAAiB,MAAA,CAAO,cAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,MAAM,WAAA,GAAc,MAAO,IAAA,CAAK,YAAA,CAA8B,QAAA,CAAS;AAAA,QACrE,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,cAAA,GAAiB,MAAA;AAAA,QACd,WAAA,CAA+C;AAAA,OAClD;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB,OAAO,eAAA,IAAmB,EAAA;AAClD,IAAA,MAAM,YAAY,cAAA,GAAiB,eAAA;AACnC,IAAA,MAAM,OAAA,GAAU,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,QAAA,GAAW,eAAA;AAG3D,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,eAAA,EAAiB,OAAO,OAAA,CAAQ,WAAA;AAAA,MAChC,eAAA,EAAiB,OAAO,OAAA,CAAQ,WAAA;AAAA,MAChC,YAAA,EAAc,OAAO,SAAS,CAAA;AAAA,MAC9B,UAAA,EAAY,OAAO,OAAO,CAAA;AAAA,MAC1B,YAAA,EAAc,OAAO,OAAA,CAAQ,SAAA;AAAA,MAC7B,UAAA,EAAY,OAAO,OAAA,CAAQ,OAAA;AAAA,MAC3B,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAAA,MAC9C,KAAA;AAAA,MACA,QAAA,EAAU,KAAA;AAAA;AAAA,MACV,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,cAAc,gBAAgB,CAAA;AAAA,MAChE,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAAA,MACjB,WAAA,EAAa,OAAO,IAAA,CAAK;AAAA,KAC3B;AAGA,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,EAAG;AACxC,MAAA,IACE,CAAC,SAAA,CAAU,iBAAA,IACX,SAAA,CAAU,sBAAsB,YAAA,EAChC;AACA,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,EAAS,QAAA,IAAY,OAAO,CAAC,CAAA;AAC5D,IAAA,MAAM,mBAAmB,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAK,KACvD,MAAM;AACL,MAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,MAAA,OAAO;AAAA,QACL,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,MAAM,CAAA,CAAE,IAAA,KAAS,SAAY,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,GAAI;AAAA,OAChD;AAAA,IACF,CAAA,OACC,MAAM;AACL,MAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AAGjB,MAAA,IAAI,oBAA+B,EAAC;AACpC,MAAA,IAAI,iBAA2B,EAAC;AAEhC,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,QAAQ,OAAA,EAAS;AAEvD,UAAA,iBAAA,GAAoB,OAAO,OAAA,CAAQ,UAAA;AACnC,UAAA,cAAA,GAAiB,OAAO,OAAA,CAAQ,OAAA;AAAA,QAClC,CAAA,MAAO;AAEL,UAAA,iBAAA,GAAoB,CAAC,OAAO,WAAW,CAAA;AACvC,UAAA,cAAA,GAAiB;AAAA,YACf,MAAA,CAAO,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK;AAAA,WAC1C;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,aAAA,EAAe,OAAO,IAAA,CAAK,aAAA;AAAA,QAC3B,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,cAAA,EAAgB,EAAE,cAAA,IAAkB,2BAAA;AAAA,QACpC,eAAA,EAAiB,OAAO,eAAe,CAAA;AAAA,QACvC,UAAA,EAAY,iBAAA;AAAA,QACZ,OAAA,EAAS,cAAA;AAAA,QACT,UAAU,CAAA,CAAE;AAAA,OACd;AAAA,IACF,CAAA,GAAG;AAIP,IAAA,MAAM,uBAAA,GACJ,MAAA,CAAO,OAAA,EAAS,YAAA,KACf,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,GAC/B,SAAA,CAAU,iBAAA,GACX,SAAA,CAAU,YAAA,CAAA;AAEhB,IAAA,IAAI,CAAC,uBAAA,IAA2B,uBAAA,KAA4B,YAAA,EAAc;AACxE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM;AAAA,MACJ,IAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF,GAAI,KAAK,eAAA,CAAgB;AAAA,MACvB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,SAAA,CAAU,OAAA;AAAA,MAC9C,WAAA,EAAa,MAAA,CAAO,OAAA,EAAS,WAAA,IAAe,SAAA,CAAU,WAAA;AAAA,MACtD,QAAA,EAAU,MAAA,CAAO,OAAA,EAAS,eAAA,IAAmB,SAAA,CAAU,eAAA;AAAA,MACvD,aAAA,EAAe,OAAO,IAAA,CAAK,aAAA;AAAA,MAC3B,eAAA,EAAiB,OAAO,IAAA,CAAK,eAAA;AAAA,MAC7B,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,YAAA,EAAc,uBAAA;AAAA,MACd,gBAAA;AAAA,MACA,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS,aAAA,IAAiB,SAAA,CAAU,aAAA;AAAA,MAC5D,mBAAA,EAAqB,WAAA;AAAA,MACrB,cAAc,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAK,IAC7C,YAAA,GACA;AAAA,KACL,CAAA;AAGD,IAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAS,CAAA;AAGvE,IAAA,MAAM,yBAA8B,MAAM;AACxC,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,MAAA,EAAQ;AACrC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,WAAA,EAAa;AAC1C,QAAA,OAAO,mBAAA;AAAA,UACL,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,UACpB,CAAC,MAAA,CAAO,UAAA,CAAW,QAAQ;AAAA,SAC7B;AAAA,MACF;AACA,MAAA,OAAO,mBAAA;AAAA,QACL;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA;AAAU,SACpB;AAAA,QACA;AAAA,UACE,OAAO,KAAA,CAAM,IAAA;AAAA,UACb,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACvB,MAAA,CAAO,WAAW,kBAAA,GAClB,+BAAA;AAAA,UACJ,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACvB,MAAA,CAAO,WAAW,mBAAA,GAClB,gCAAA;AAAA,UACJ,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACvB,MAAA,CAAO,WAAW,wBAAA,GAClB;AAAA;AACN,OACF;AAAA,IACF,CAAA,GAAG;AAGH,IAAA,MAAM,4BAAqC,MAAM;AAC/C,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,MAAA,EAAQ;AACrC,QAAA,MAAMD,SAAAA,GACJ,MAAA,CAAO,OAAA,EAAS,iBAAA,IAChB,UAAU,qBAAA,IACV,YAAA;AACF,QAAA,IAAI,CAACA,SAAAA,IAAYA,SAAAA,KAAa,YAAA,EAAc;AAC1C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAOA,SAAAA;AAAA,MACT;AACA,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,WAAA,EAAa;AAC1C,QAAA,MAAMA,SAAAA,GACJ,MAAA,CAAO,OAAA,EAAS,iBAAA,IAChB,UAAU,0BAAA,IACV,YAAA;AACF,QAAA,IAAI,CAACA,SAAAA,IAAYA,SAAAA,KAAa,YAAA,EAAc;AAC1C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAOA,SAAAA;AAAA,MACT;AACA,MAAA,MAAM,QAAA,GACJ,MAAA,CAAO,OAAA,EAAS,iBAAA,IAAqB,SAAA,CAAU,iBAAA;AACjD,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,KAAa,YAAA,EAAc;AAC1C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,GAAG;AAGH,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,aAAA,EAAe,OAAO,IAAA,CAAK,aAAA;AAAA,MAC3B,eAAA,EAAiB,OAAO,IAAA,CAAK,eAAA;AAAA,MAC7B,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,YAAA,EAAc,uBAAA;AAAA,MACd,gBAAA,EAAkB,uBAAA;AAAA,MAClB,iBAAA,EAAmB,wBAAA;AAAA,MACnB,qBAAA;AAAA,MACA,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS,aAAA,IAAiB,SAAA,CAAU,aAAA;AAAA,MAC5D,mBAAA;AAAA,MACA,mBAAmB,IAAA,CAAK,kBAAA;AAAA,QACtB,MAAA,CAAO,SAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AAAA,MACA,qBAAA;AAAA,MACA,UAAA,EAAY,OAAO,UAAA,IAAc,YAAA;AAAA,MACjC;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,YAAA,EAAc,WAAA,EAAa,YAAA,EAAa;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAA,CACJ,MAAA,EACA,OAAA,EAMC;AACD,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAG3C,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,MAAA,YAAA,GAAe,OAAA,CAAQ,aAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,4BAAA,CAA6B,MAAM,CAAA;AACjE,MAAA,YAAA,GAAe,UAAA,CAAW,YAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,SAAA,CAAU,OAAA;AAC5D,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,KAAW,MAC1B,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,IAAA,EAAM,CAAC,EAAE,GAAG,cAAc,CAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,YAAA,CAAa;AAAA,KAC5B,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,MAAA;AAElB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,wBAAA,CAAyB;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,YAAA;AAAA,MACA,OAAA,EAAS,KAAK,YAAA,CAAa;AAAA,KAC5B,CAAA;AACD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,GAAA,IAAO,WAAA,IAAe,wBAAA;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc;AAAA,MACjD,GAAG,OAAA;AAAA,MACH,GAAA,EAAK;AAAA,KACN,CAAA;AAGD,IAAA,MAAM,UAAU,MACd,IAAA,CAAK,aACL,yBAAA,CAA0B,EAAE,MAAM,CAAA;AAGpC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,+BAAA,CAAgC,OAAO,CAAA;AAEpE,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,qBAAqB,eAAA,CAAgB,YAAA;AAC3C,IAAA,MAAM,oBAAoB,eAAA,CAAgB,iBAAA;AAG1C,IAAA,IAAI,aAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,UAAU,CAAA,EAAG;AAClE,MAAA,MAAM,cAAA,GAAiB,UAAU,CAAC,CAAA;AAClC,MAAA,MAAM,aAAA,GAAgB,UAAU,CAAC,CAAA;AACjC,MAAA,IAAI,cAAA,CAAe,WAAA,EAAY,KAAM,kBAAA,CAAmB,aAAY,EAAG;AACrE,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,wCAAA,EAA2C,cAAc,CAAA,eAAA,EAAkB,kBAAkB,CAAA,sEAAA;AAAA,SAE/F;AAAA,MACF;AACA,MAAA,IAAI,aAAA,CAAc,WAAA,EAAY,KAAM,iBAAA,CAAkB,aAAY,EAAG;AACnE,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,uCAAA,EAA0C,aAAa,CAAA,eAAA,EAAkB,iBAAiB,CAAA,sEAAA;AAAA,SAE5F;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,KAAK,aAAA,CAAc;AAAA,MAChC,WACE,kBAAA,GAAqB,MAAA,CAAO,KAAK,SAAA,GAC7B,kBAAA,GACA,OAAO,IAAA,CAAK,SAAA;AAAA,MAClB,WACE,kBAAA,GAAqB,MAAA,CAAO,KAAK,SAAA,GAC7B,MAAA,CAAO,KAAK,SAAA,GACZ,kBAAA;AAAA,MACN,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAAA,MACjB,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAAA,MACzB,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,iBAAA;AAAA,MACb,YAAA,EAAc,kBAAA;AAAA,MACd,MAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,6BACJ,MAAA,EAcC;AACD,IAAA,MAAM,EAAE,YAAA,EAAa,GACnB,MAAM,IAAA,CAAK,iCAAiC,MAAM,CAAA;AACpD,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAE3C,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,SAAA,CAAU,OAAA;AAC5D,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,KAAW,MAC1B,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,IAAA,EAAM,CAAC,EAAE,GAAG,cAAc,CAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,YAAA,EAAc;AAAA,KAC7B,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,MAAA;AAClB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,wBAAA,CAAyB;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,YAAA;AAAA,MACA,OAAA,EAAS,IAAA,CAAK,YAAA,EAAc,OAAA,IAAW,MAAA,CAAO;AAAA,KAC/C,CAAA;AAED,IAAA,IAAI,CAAC,aAAa,CAAC,KAAA,CAAM,QAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,YAAA,GAAe,UAAU,CAAC,CAAA;AAChC,IAAA,MAAM,WAAA,GAAc,UAAU,CAAC,CAAA;AAE/B,IAAA,MAAM,MAAA,GAAS,KAAK,aAAA,CAAc;AAAA,MAChC,WACE,YAAA,GAAe,MAAA,CAAO,KAAK,SAAA,GACvB,YAAA,GACA,OAAO,IAAA,CAAK,SAAA;AAAA,MAClB,WACE,YAAA,GAAe,MAAA,CAAO,KAAK,SAAA,GACvB,MAAA,CAAO,KAAK,SAAA,GACZ,YAAA;AAAA,MACN,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAAA,MACjB,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAAA,MACzB,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,OAAO;AAAA,MACL,YAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA,EAAS,MACP,IAAA,CAAK,oBAAA,CAAqB,QAAQ,EAAE,aAAA,EAAe,cAAc;AAAA,KACrE;AAAA,EACF;AAAA,EAEA,MAAc,yBAAyB,IAAA,EAKP;AAC9B,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,YAAA,EAAc,SAAQ,GAAI,IAAA;AACpD,IAAA,MAAM,cAAA,GACJ,WACA,OAAO,OAAA,KAAY,YACnB,KAAA,IAAU,OAAA,GACL,QAA6B,GAAA,GAC9B,MAAA;AAEN,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAChB,IAAA,CAAK,YAAA,CACL,mBAAA,CAAoB;AAAA,QACpB,OAAA;AAAA,QACA,GAAA,EAAK,UAAA;AAAA,QACL,YAAA,EAAc,QAAA;AAAA,QACd,IAAA,EAAM,CAAC,EAAE,GAAG,cAAc,CAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AACD,MAAA,OAAO,SAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,kBACN,KAAA,EACgC;AAChC,IAAA,OAAQ,MAAgC,IAAA,KAAS,YAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,MAAA,EAA8B;AAExD,IAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,MAAA,OAAO,IAAA,CAAK,uBAAuB,MAAM,CAAA;AAAA,IAC3C;AAEA,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,WAAA;AAEH,QAAA,OAAO,IAAA;AAAA,MAET,KAAK,MAAA;AAEH,QAAA,OAAO,IAAA;AAAA,MAET,KAAK,WAAA;AAGH,QAAA,MAAM,iBAAiB,MAAA,CAAO,cAAA;AAC9B,QAAA,IAAI,CAAC,cAAA,EAAgB;AAEnB,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,cAAA,CAAe,aAAa,CAAA,CAAE,IAAA;AAAA,UACxD,CAAC,GAAG,CAAA,KAAM;AACR,YAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY;AACxC,YAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY;AACxC,YAAA,OAAO,KAAA,GAAQ,KAAA,GAAQ,EAAA,GAAK,KAAA,GAAQ,QAAQ,CAAA,GAAI,CAAA;AAAA,UAClD;AAAA,SACF;AAKA,QAAA,OAAO,mBAAA;AAAA,UACL;AAAA,YACE,EAAE,MAAM,QAAA,EAAS;AAAA;AAAA,YACjB,EAAE,MAAM,OAAA,EAAQ;AAAA;AAAA,YAChB,EAAE,MAAM,QAAA,EAAS;AAAA;AAAA,YACjB;AAAA,cACE,IAAA,EAAM,SAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,aAAA,EAAc;AAAA,gBACvC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA;AAAS;AACnC;AACF,WACF;AAAA,UACA;AAAA,YACE,MAAA,CAAO,GAAA;AAAA,YACP,MAAA,CAAO,WAAA;AAAA,YACP,cAAA,CAAe,YAAA;AAAA,YACf;AAAA;AACF,SACF;AAAA,MAEF;AACE,QAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA;AAC5C,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,CACN,OACA,KAAA,EACQ;AACR,IAAA,MAAM,UAAA,GAAa,OAAO,KAAA,KAAU,QAAA,GAAW,OAAO,KAAK,CAAA,GAAI,OAAO,KAAK,CAAA;AAC3E,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,UAAU,KAAK,CAAC,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA,EAAG;AACjE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,GAAG,KAAK,CAAA,sDAAA;AAAA,OACV;AAAA,IACF;AACA,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,UAAA,GAAa,UAAA;AACnB,IAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,GAAG,KAAK,CAAA,kEAAA;AAAA,OACV;AAAA,IACF;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,iCACN,MAAA,EACmC;AACnC,IAAA,MAAM,iBAAiB,MAAA,CAAO,QAAA;AAC9B,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,MAAM,oBAAoB,cAAA,KAAmB,MAAA;AAC7C,IAAA,MAAM,gBAAgB,UAAA,KAAe,MAAA;AAErC,IAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,IAAA,GAAO;AAAA,UACL,IAAA,EAAM,WAAA;AAAA,UACN,WAAW,IAAA,CAAK,eAAA;AAAA,YACd,cAAA,CAAe,SAAA;AAAA,YACf;AAAA;AACF,SACF;AAAA,MACF,WAAW,aAAA,EAAe;AACxB,QAAA,IAAA,GAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,EAAE,MAAM,UAAA,EAAW;AAAA,MAC5B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAQ,YAAY,IAAA;AAAM,QACxB,KAAK,UAAA,EAAY;AACf,UAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AACA,UAAA,IAAA,GAAO,EAAE,MAAM,UAAA,EAAW;AAC1B,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AACA,UAAA,MAAM,kBAAkB,IAAA,CAAK,eAAA;AAAA,YAC3B,WAAA,CAAY,SAAA;AAAA,YACZ;AAAA,WACF;AACA,UAAA,IAAI,iBAAA,EAAmB;AACrB,YAAA,MAAM,cAAc,IAAA,CAAK,eAAA;AAAA,cACvB,cAAA,CAAe,SAAA;AAAA,cACf;AAAA,aACF;AACA,YAAA,IAAI,gBAAgB,eAAA,EAAiB;AACnC,cAAA,MAAM,IAAI,KAAA;AAAA,gBACR;AAAA,eACF;AAAA,YACF;AAAA,UACF;AACA,UAAA,IAAA,GAAO,EAAE,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,eAAA,EAAgB;AACvD,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA,EAAS;AACZ,UAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AACA,UAAA,MAAM,YAAY,IAAA,CAAK,eAAA;AAAA,YACrB,WAAA,CAAY,SAAA;AAAA,YACZ;AAAA,WACF;AACA,UAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA;AAC5C,UAAA,MAAM,kBAAkB,IAAA,CAAK,eAAA;AAAA,YAC3B,WAAA,CAAY,eAAA;AAAA,YACZ;AAAA,WACF;AACA,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AACrC,UAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,EAAG;AAC/B,YAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,UAChE;AACA,UAAA,IAAI,QAAA,GAAW,CAAA,IAAK,QAAA,GAAW,mBAAA,EAAqB;AAClD,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,mDAAmD,mBAAmB,CAAA;AAAA,aACxE;AAAA,UACF;AACA,UAAA,IAAI,CAAC,OAAO,SAAA,CAAU,MAAM,KAAK,MAAA,GAAS,CAAA,IAAK,SAAS,UAAA,EAAY;AAClE,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,6CAA6C,UAAU,CAAA;AAAA,aACzD;AAAA,UACF;AACA,UAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,CAAA,2BAAA,EAA8B,QAAQ,CAAA,sDAAA,EAAyD,MAAM,CAAA,CAAA;AAAA,aACvG;AAAA,UACF;AACA,UAAA,IAAI,QAAA,GAAW,MAAA,IAAU,eAAA,IAAmB,CAAA,EAAG;AAC7C,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AACA,UAAA,IAAA,GAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,SAAA;AAAA,YACA,QAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,QAAA,EAAU;AACb,UAAA,IAAI,iBAAA,EAAmB;AACrB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aACF;AAAA,UACF;AACA,UAAA,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,YAAY,MAAA,EAAO;AACxD,UAAA;AAAA,QACF;AAAA,QACA,SAAS;AACP,UAAA,MAAM,UAAA,GAAoB,WAAA;AAC1B,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,yCAAA,EAA6C,UAAA,EAAkC,IAAA,IAAQ,SAAS,CAAA;AAAA,WAClG;AAAA,QACF;AAAA;AACF,IACF;AAIA,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,sBAAA,KAA2B,MAAA,EAAW;AACxD,MAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,QAAA,IAAA,GAAO,EAAE,MAAM,QAAA,EAAS;AAAA,MAC1B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,6BACE,MAAA,EACc;AAEd,IAAA,IAAA,CAAK,yBAAyB,MAAM,CAAA;AAGpC,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,IAAQ,OAAO,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,mBAAmB,IAAA,CAAK,yBAAA;AAAA,MAC5B,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,OAAO,IAAA,CAAK;AAAA,KACd;AAEA,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAG3C,IAAA,MAAM,uBAAuB,MAAA,CAAO,IAAA,CAAK,iBAAiB,EAAC,EACxD,OAAM,CACN,IAAA;AAAA,MACC,CACE,GACA,CAAA,KACG;AACH,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY;AACxC,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY;AACxC,QAAA,OAAO,KAAA,GAAQ,KAAA,GAAQ,EAAA,GAAK,KAAA,GAAQ,QAAQ,CAAA,GAAI,CAAA;AAAA,MAClD;AAAA,KACF;AAEF,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gCAAA,CAAiC,MAAM,CAAA;AACpE,IAAA,MAAM,uBAAA,GAA0B,gBAAgB,IAAA,KAAS,WAAA;AACzD,IAAA,MAAM,mBAAA,GAAsB,gBAAgB,IAAA,KAAS,OAAA;AACrD,IAAA,MAAM,yBAAA,GAA4B,gBAAgB,IAAA,KAAS,QAAA;AAG3D,IAAA,IAAI,eAAA,CAAgB,IAAA,KAAS,QAAA,IAAY,eAAA,CAAgB,UAAA,EAAY;AACnE,MAAA,MAAM,OAAO,eAAA,CAAgB,UAAA;AAC7B,MAAA,MAAM,oBACJ,IAAA,CAAK,sBAAA,GACL,KAAK,0BAAA,GACL,IAAA,CAAK,wBACL,IAAA,CAAK,YAAA;AACP,MAAA,IAAI,sBAAsB,GAAA,EAAK;AAC7B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,yCAAA,EAA4C,GAAG,CAAA,iBAAA,EAAoB,iBAAiB,CAAA;AAAA,SACtF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAY;AAAA,MACnC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAY;AAAA,MACnC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,cAAA,EAAe;AAAA,MACvC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,QAAA;AAAS,KACpC;AACA,IAAA,MAAM,qBAAA,GAAwB;AAAA,MAC5B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,aAAA,EAAc;AAAA,MACvC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA;AAAS,KACnC;AAGA,IAAA,MAAM,aAAa,gBAAA,CAAiB,GAAA;AAAA,MAClC,CAAC,CAAA,MAA0C;AAAA,QACzC,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,cAAc,CAAA,CAAE,YAAA;AAAA,QAChB,QAAQ,CAAA,CAAE;AAAA,OACZ;AAAA,KACF;AACA,IAAA,MAAM,oBAAoB,mBAAA,CAAoB,GAAA;AAAA,MAC5C,CAAC,CAAA,MAA8D;AAAA,QAC7D,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,QAAQ,CAAA,CAAE;AAAA,OACZ;AAAA,KACF;AAmBA,IAAA,IAAI,mBAAA;AAEJ,IAAA,IAAI,yBAAA,EAA2B;AAC7B,MAAA,MAAM,UAAA,GACJ,eAAA,CAAgB,IAAA,KAAS,QAAA,GACrB,gBAAgB,UAAA,GAChB,MAAA;AAGN,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,UAAA,EAAY,YAAY,MAAA,EAAW;AACrC,QAAA,OAAA,GAAU,UAAA,CAAW,OAAA;AAAA,MACvB,CAAA,MAAO;AAEL,QAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAC/D,QAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAG,aAAa,CAAA;AAAA,MACrC;AAGA,MAAA,IAAI,mCAAA,GAA2C,IAAA;AAC/C,MAAA,IAAI,6BAAA,GAAqC,IAAA;AACzC,MAAA,IAAI,kBAAA,GAA8B,YAAA;AAElC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,kBAAA,GAAqB,UAAA,CAAW,WAAA;AAChC,QAAA,mCAAA,GAAsC,mBAAA;AAAA,UACpC;AAAA,YACE,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,YAClB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,YAClB,EAAE,MAAM,QAAA,EAAS;AAAA;AAAA,YACjB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,YAClB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,YAClB,EAAE,MAAM,SAAA,EAAU;AAAA;AAAA,YAClB,EAAE,MAAM,SAAA;AAAU;AAAA,WACpB;AAAA,UACA;AAAA,YACE,OAAO,IAAA,CAAK,SAAA;AAAA,YACZ,UAAA,CAAW,kBAAA;AAAA,YACX,UAAA,CAAW,SAAA;AAAA,YACX,UAAA,CAAW,sBAAA;AAAA,YACX,UAAA,CAAW,0BAAA;AAAA,YACX,UAAA,CAAW,qBAAA;AAAA,YACX,UAAA,CAAW;AAAA;AACb,SACF;AACA,QAAA,6BAAA,GAAgC,WAAW,kBAAA,IAAsB,IAAA;AAAA,MACnE;AAEA,MAAA,MAAM,0BAAA,GAA6B;AAAA,QACjC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,OAAA,EAAQ;AAAA,QACrC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,OAAA,EAAQ;AAAA,QACjC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,YAAY,eAAA,EAAgB;AAAA,QAC/D;AAAA,UACE,IAAA,EAAM,eAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,QACA,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAU;AAAA,QACvC,EAAE,IAAA,EAAM,qCAAA,EAAuC,IAAA,EAAM,OAAA,EAAQ;AAAA,QAC7D,EAAE,IAAA,EAAM,+BAAA,EAAiC,IAAA,EAAM,OAAA;AAAQ,OACzD;AAEA,MAAA,mBAAA,GAAsB,mBAAA;AAAA,QACpB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,4BAA4B,CAAA;AAAA,QAC1D;AAAA,UACE;AAAA,YACE,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAAA,YACjB,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAAA,YACzB,OAAA;AAAA,YACA,MAAA,EAAQ,UAAA;AAAA,YACR,aAAA,EAAe,iBAAA;AAAA,YACf,WAAA,EAAa,kBAAA;AAAA,YACb,mCAAA;AAAA,YACA;AAAA;AACF;AACF,OACF;AAAA,IACF,WAAW,mBAAA,EAAqB;AAE9B,MAAA,MAAM,oBAAA,GAAuB;AAAA,QAC3B,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAS;AAAA,QACnC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,EAAE,IAAA,EAAM,iBAAA,EAAmB,IAAA,EAAM,QAAA,EAAS;AAAA,QAC1C,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,OAAA,EAAQ;AAAA,QACrC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,YAAY,eAAA,EAAgB;AAAA,QAC/D;AAAA,UACE,IAAA,EAAM,eAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,QACA,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,QAAA;AAAS,OACzC;AAEA,MAAA,IAAI,eAAA,CAAgB,SAAS,OAAA,EAAS;AACpC,QAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,MACvE;AAEA,MAAA,mBAAA,GAAsB,mBAAA;AAAA,QACpB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,sBAAsB,CAAA;AAAA,QACpD;AAAA,UACE;AAAA,YACE,UAAU,eAAA,CAAgB,QAAA;AAAA,YAC1B,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAAA,YACjB,iBAAiB,eAAA,CAAgB,eAAA;AAAA,YACjC,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAAA,YACzB,MAAA,EAAQ,UAAA;AAAA,YACR,aAAA,EAAe,iBAAA;AAAA,YACf,cAAc,eAAA,CAAgB;AAAA;AAChC;AACF,OACF;AAAA,IACF,WAAW,uBAAA,EAAyB;AAElC,MAAA,IAAI,eAAA,CAAgB,SAAS,WAAA,EAAa;AACxC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,wBAAA,GAA2B;AAAA,QAC/B,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,OAAA,EAAQ;AAAA,QACrC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,YAAY,eAAA,EAAgB;AAAA,QAC/D;AAAA,UACE,IAAA,EAAM,eAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,QACA,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,QAAA;AAAS,OACzC;AAEA,MAAA,mBAAA,GAAsB,mBAAA;AAAA,QACpB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,0BAA0B,CAAA;AAAA,QACxD;AAAA,UACE;AAAA,YACE,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAAA,YACjB,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAAA,YACzB,MAAA,EAAQ,UAAA;AAAA,YACR,aAAA,EAAe,iBAAA;AAAA,YACf,cAAc,eAAA,CAAgB;AAAA;AAChC;AACF,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,oBAAA,GAAuB;AAAA,QAC3B,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,OAAA,EAAQ;AAAA,QACrC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,YAAY,eAAA,EAAgB;AAAA,QAC/D;AAAA,UACE,IAAA,EAAM,eAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,UAAA,EAAY;AAAA;AACd,OACF;AAEA,MAAA,mBAAA,GAAsB,mBAAA;AAAA,QACpB,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,sBAAsB,CAAA;AAAA,QACpD;AAAA,UACE;AAAA,YACE,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA;AAAA,YACjB,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAAA,YACzB,MAAA,EAAQ,UAAA;AAAA,YACR,aAAA,EAAe;AAAA;AACjB;AACF,OACF;AAAA,IACF;AAGA,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,EAAG;AACxC,MAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AACxB,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA,KAAS,SAAY,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,KAAA;AACnE,MAAA,gBAAA,GAAmB,mBAAA;AAAA,QACjB;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA;AAAU,SACpB;AAAA,QACA,CAAC,QAAA,CAAS,IAAA,EAAM,SAAS,MAAA,EAAQ,QAAA,CAAS,SAAS,IAAI;AAAA,OACzD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AACxB,MAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,EAAS,QAAA,IAAY,OAAO,CAAC,CAAA;AAC5D,MAAA,MAAM,cAAA,GACJ,SAAS,cAAA,IAAkB,2BAAA;AAG7B,MAAA,IAAI,oBAA+B,EAAC;AACpC,MAAA,IAAI,iBAA2B,EAAC;AAEhC,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,QAAQ,OAAA,EAAS;AAEvD,UAAA,iBAAA,GAAoB,OAAO,OAAA,CAAQ,UAAA;AACnC,UAAA,cAAA,GAAiB,OAAO,OAAA,CAAQ,OAAA;AAAA,QAClC,CAAA,MAAO;AAEL,UAAA,iBAAA,GAAoB,CAAC,OAAO,WAAW,CAAA;AACvC,UAAA,cAAA,GAAiB;AAAA,YACf,MAAA,CAAO,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK;AAAA,WAC1C;AAAA,QACF;AAAA,MACF;AAEA,MAAA,gBAAA,GAAmB,mBAAA;AAAA,QACjB;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,WAAA,EAAY;AAAA,UACpB,EAAE,MAAM,WAAA,EAAY;AAAA,UACpB,EAAE,MAAM,QAAA;AAAS,SACnB;AAAA,QACA;AAAA,UACE,QAAA,CAAS,IAAA;AAAA,UACT,QAAA,CAAS,MAAA;AAAA,UACT,cAAA;AAAA,UACA,OAAO,eAAe,CAAA;AAAA,UACtB,iBAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA,CAAS;AAAA;AACX,OACF;AAAA,IACF;AAGA,IAAA,MAAM,yBAA8B,MAAM;AACxC,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,MAAA,EAAQ;AACrC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,WAAA,EAAa;AAC1C,QAAA,OAAO,mBAAA;AAAA,UACL,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,UACpB,CAAC,MAAA,CAAO,UAAA,CAAW,QAAQ;AAAA,SAC7B;AAAA,MACF;AACA,MAAA,OAAO,mBAAA;AAAA,QACL;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA;AAAU,SACpB;AAAA,QACA;AAAA,UACE,OAAO,KAAA,CAAM,IAAA;AAAA,UACb,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACvB,MAAA,CAAO,WAAW,kBAAA,GAClB,+BAAA;AAAA,UACJ,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACvB,MAAA,CAAO,WAAW,mBAAA,GAClB,gCAAA;AAAA,UACJ,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GACvB,MAAA,CAAO,WAAW,wBAAA,GAClB;AAAA;AACN,OACF;AAAA,IACF,CAAA,GAAG;AAGH,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,WAAW,CAAA;AACvD,IAAA,MAAM,oBAAA,GACJ,MAAA,CAAO,OAAA,EAAS,YAAA,KACf,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,GAC/B,SAAA,CAAU,iBAAA,GACX,SAAA,CAAU,YAAA,CAAA;AAChB,IAAA,IAAI,CAAC,oBAAA,IAAwB,oBAAA,KAAyB,YAAA,EAAc;AAClE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,uBAA4C,MAAM;AACtD,MAAA,IAAI,yBAAA,EAA2B;AAC7B,QAAA,OACE,MAAA,CAAO,OAAA,EAAS,sBAAA,IAChB,SAAA,CAAU,sBAAA;AAAA,MAEd;AACA,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,OACE,MAAA,CAAO,OAAA,EAAS,4BAAA,IAChB,SAAA,CAAU,4BAAA;AAAA,MAEd;AACA,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,OACE,MAAA,CAAO,OAAA,EAAS,gCAAA,IAChB,SAAA,CAAU,gCAAA;AAAA,MAEd;AACA,MAAA,OACE,MAAA,CAAO,OAAA,EAAS,uBAAA,IAChB,SAAA,CAAU,uBAAA;AAAA,IAEd,CAAA,GAAG;AACH,IAAA,IAAI,CAAC,mBAAA,IAAuB,mBAAA,KAAwB,YAAA,EAAc;AAChE,MAAA,IAAI,yBAAA,EAA2B;AAC7B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,0BACI,qHAAA,GACA;AAAA,OACN;AAAA,IACF;AAIA,IAAA,MAAM,mBACJ,MAAA,CAAO,IAAA,CAAK,iBAAiB,MAAA,CAAO,IAAA,CAAK,cAAc,MAAA,GAAS,CAAA;AAElE,IAAA,IAAI,qBAAA;AACJ,IAAA,IAAI,gBAAA;AAEJ,IAAA,IAAI,gBAAA,EAAkB;AAEpB,MAAA,qBAAA,GAAwB,IAAA;AACxB,MAAA,gBAAA,GAAmB,MAAA,CAAO,OAAA,EAAS,YAAA,IAAgB,SAAA,CAAU,YAAA;AAC7D,MAAA,IAAI,CAAC,gBAAA,IAAoB,gBAAA,KAAqB,YAAA,EAAc;AAC1D,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,qBAAA,GAAwB,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,SAAS,CAAA;AACjE,MAAA,gBAAA,GAAmB,IAAA,CAAK,kBAAA;AAAA,QACtB,MAAA,CAAO,SAAA;AAAA,QACP,MAAA,CAAO;AAAA,OACT;AACA,MAAA,IAAI,CAAC,gBAAA,IAAoB,gBAAA,KAAqB,YAAA,EAAc;AAC1D,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,4BAAqC,MAAM;AAC/C,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,MAAA,EAAQ;AACrC,QAAA,MAAMA,SAAAA,GACJ,MAAA,CAAO,OAAA,EAAS,iBAAA,IAChB,UAAU,qBAAA,IACV,YAAA;AACF,QAAA,IAAI,CAACA,SAAAA,IAAYA,SAAAA,KAAa,YAAA,EAAc;AAC1C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAOA,SAAAA;AAAA,MACT;AACA,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAA,KAAS,WAAA,EAAa;AAC1C,QAAA,MAAMA,SAAAA,GACJ,MAAA,CAAO,OAAA,EAAS,iBAAA,IAChB,UAAU,0BAAA,IACV,YAAA;AACF,QAAA,IAAI,CAACA,SAAAA,IAAYA,SAAAA,KAAa,YAAA,EAAc;AAC1C,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAOA,SAAAA;AAAA,MACT;AACA,MAAA,MAAM,QAAA,GACJ,MAAA,CAAO,OAAA,EAAS,iBAAA,IAAqB,SAAA,CAAU,iBAAA;AACjD,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,KAAa,YAAA,EAAc;AAC1C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,GAAG;AAEH,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,aAAA,EAAe,OAAO,IAAA,CAAK,aAAA;AAAA,MAC3B,eAAA,EAAiB,OAAO,IAAA,CAAK,eAAA;AAAA,MAC7B,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,YAAA,EAAc,oBAAA;AAAA,MACd,gBAAA;AAAA,MACA,iBAAA,EAAmB,wBAAA;AAAA,MACnB,qBAAA;AAAA,MACA,eAAA,EAAiB,mBAAA;AAAA,MACjB,mBAAA;AAAA,MACA,iBAAA,EAAmB,gBAAA;AAAA,MACnB,qBAAA;AAAA,MACA,UAAA,EAAY,OAAO,UAAA,IAAc,YAAA;AAAA,MACjC;AAAA,KACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAM,yBAAyB,MAAA,EAW5B;AACD,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,4BAAA,CAA6B,MAAM,CAAA;AAC7D,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,SAAA,CAAU,OAAA;AAC5D,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,KAAW,MAC1B,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,IAAA,EAAM,CAAC,EAAE,GAAG,cAAc,CAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,YAAA,EAAc;AAAA,KAC7B,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,MAAA;AAClB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,wBAAA,CAAyB;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,YAAA;AAAA,MACA,OAAA,EAAS,IAAA,CAAK,YAAA,EAAc,OAAA,IAAW,MAAA,CAAO;AAAA,KAC/C,CAAA;AACD,IAAA,IAAI,CAAC,aAAa,CAAC,KAAA,CAAM,QAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAGA,IAAA,MAAM,YAAA,GAAe,UAAU,CAAC,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,uBAAA,CAAwB,QAAQ,YAAY,CAAA;AAEtE,IAAA,OAAO;AAAA,MACL,YAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA,EAAS,MACP,IAAA,CAAK,gBAAA,CAAiB,QAAQ,EAAE,aAAA,EAAe,cAAc;AAAA,KACjE;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,CACJ,MAAA,EACA,OAAA,EAC0E;AAC1E,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA;AACR,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAG/D,IAAA,MAAM,eACJ,OAAA,EAAS,aAAA,IAAA,CACR,MAAM,IAAA,CAAK,wBAAA,CAAyB,MAAM,CAAA,EAAG,YAAA;AAChD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,EAAS,OAAA,IAAW,SAAA,CAAU,OAAA;AAC5D,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,KAAW,MAC1B,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,cAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,IAAA,EAAM,CAAC,EAAE,GAAG,cAAc,CAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,YAAA,CAAa;AAAA,KAC5B,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,MAAA;AAClB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,wBAAA,CAAyB;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,YAAA;AAAA,MACA,OAAA,EAAS,KAAK,YAAA,CAAa;AAAA,KAC5B,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,IAAO,WAAA,IAAe,wBAAA;AACzC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,cAAc,EAAE,GAAG,OAAA,EAAS,GAAA,EAAK,CAAA;AACtE,IAAA,MAAM,OAAA,GAAU,MACd,IAAA,CAAK,YAAA,CACL,0BAA0B,EAAE,IAAA,EAAM,aAAA,EAAe,CAAA,EAAG,CAAA;AAGtD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,+BAAA,CAAgC,OAAO,CAAA;AAEpE,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,qBAAqB,eAAA,CAAgB,YAAA;AAG3C,IAAA,IAAI,aAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,UAAU,CAAA,EAAG;AAClE,MAAA,MAAM,cAAA,GAAiB,UAAU,CAAC,CAAA;AAClC,MAAA,IAAI,cAAA,CAAe,WAAA,EAAY,KAAM,kBAAA,CAAmB,aAAY,EAAG;AACrE,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,wCAAA,EAA2C,cAAc,CAAA,eAAA,EAAkB,kBAAkB,CAAA,sEAAA;AAAA,SAE/F;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,uBAAA;AAAA,MACxB,MAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,YAAA,EAAc,kBAAA,EAAoB,MAAA,EAAQ,iBAAiB,IAAA,EAAK;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAA,CACN,QACA,WAAA,EAC0C;AAC1C,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AAEA,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI,qBAAA;AAEJ,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AAC5C,MAAA,MAAM,SAAA,GAAY,EAAE,GAAG,KAAA,EAAM;AAE7B,MAAA,IACE,CAAC,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA,IACpC,CAAC,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA,EACpC;AACA,QAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,SAAA,CAAU,SAAA,IAAa,SAAA,CAAU,SAAA,EAAW;AAC9C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IACE,CAAC,OAAO,SAAA,CAAU,SAAA,CAAU,YAAY,CAAA,IACxC,SAAA,CAAU,gBAAgB,CAAA,EAC1B;AACA,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,SAAA,CAAU,UAAU,EAAA,EAAI;AAC1B,QAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,MAC5D;AAEA,MAAA,WAAA,IAAe,SAAA,CAAU,MAAA;AACzB,MAAA,IAAI,cAAc,GAAA,EAAK;AACrB,QAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,MACrE;AAEA,MAAA,IACE,qBAAA,KAA0B,MAAA,IAC1B,SAAA,CAAU,SAAA,GAAY,qBAAA,EACtB;AACA,QAAA,qBAAA,GAAwB,SAAA,CAAU,SAAA;AAAA,MACpC;AAEA,MAAA,OAAO,SAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAI,gBAAgB,GAAA,EAAK;AACvB,MAAA,OAAO,eAAA;AAAA,IACT;AAEA,IAAA,MAAM,eAAe,GAAA,GAAM,WAAA;AAC3B,IAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,MAAA,OAAO,eAAA;AAAA,IACT;AAEA,IAAA,MAAM,iBAAA,GAAoB,qBAAA;AAC1B,IAAA,IAAI,sBAAsB,MAAA,EAAW;AACnC,MAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,gBAAA,CAAiB,WAAW,CAAA;AAE3D,IAAA,MAAM,aAAA,GAAgB;AAAA;AAAA,MAEpB,SAAA,EAAW,iBAAA;AAAA,MACX,SAAA,EAAW,iBAAA;AAAA,MACX,cACE,eAAA,CAAgB,eAAA,CAAgB,MAAA,GAAS,CAAC,GAAG,YAAA,IAAgB,CAAA;AAAA,MAC/D,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,OAAO,CAAC,GAAG,eAAA,EAAiB,aAAa,CAAA;AAAA,EAC3C;AAAA,EAEQ,iBAAiB,WAAA,EAA6B;AACpD,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,WAAW,CAAA,GAAI,WAAA;AACrD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,4BAA4B,MAAA,EAAyC;AAE3E,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC/D,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAA,IAAU,MAAA,CAAO,MAAM,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,MAAA,CAAO,KAAK,OAAA,EAAS;AAChD,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,WAAA,GAAe,aAAA,CACnB,MAAA,CAAO,IAAA,CAAK,GACd,CAAA;AACA,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,qBAAA,EAAwB,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,oBAAA;AAAA,OACzC;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,SAAA,GAAY,YAAY,MAAA,CAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AACtE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wCAAA,EAA2C,QAAQ,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAA;AAAA,OACpE;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,SAAA,GAAY,WAAA,KAAgB,CAAA;AACjE,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,OAAA,GAAU,WAAA,KAAgB,CAAA;AAC7D,IAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,cAAA,EAAgB;AACxC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,6CAAA,EAAgD,WAAW,CAAA,cAAA,EAAiB,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,OAC7F;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAA,IAAiB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,eAAA,IAAmB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,eAAA,GAAkB,MAAA,CAAO,KAAK,aAAA,EAAe;AAC3D,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAGA,IAAA,IAAI,OAAO,OAAA,EAAS;AAElB,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,QAAQ,OAAA,EAAS;AACvD,QAAA,IACE,OAAO,OAAA,CAAQ,UAAA,CAAW,WAAW,MAAA,CAAO,OAAA,CAAQ,QAAQ,MAAA,EAC5D;AACA,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,UAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,QAC5D;AAEA,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA;AAAA,UACzC,CAAC,GAAA,EAAK,GAAA,KAAQ,GAAA,GAAM,GAAA;AAAA,UACpB,OAAO,CAAC;AAAA,SACV;AACA,QAAA,MAAM,mBAAA,GACJ,MAAA,CAAO,IAAA,CAAK,aAAA,GAAgB,OAAO,IAAA,CAAK,eAAA;AAC1C,QAAA,IAAI,cAAc,mBAAA,EAAqB;AACrC,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,sBAAA,EAAyB,WAAW,CAAA,4BAAA,EAA+B,mBAAmB,CAAA,CAAA;AAAA,WACxF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,YAAA,GACJ,MAAA,CAAO,IAAA,CAAK,aAAA,GAAgB,OAAO,IAAA,CAAK,eAAA;AAC1C,QAAA,IAAI,YAAA,IAAgB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC7B,UAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IACE,OAAO,SAAA,CAAU,IAAA,KAAS,WAAA,IAC1B,MAAA,CAAO,UAAU,cAAA,EACjB;AACA,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,aAAA;AACtD,MAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,cAAc,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,EAAE,CAAA;AACvE,MAAA,IAAI,gBAAgB,GAAA,EAAK;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,+BAAA,EAAkC,GAAG,CAAA,iBAAA,EAAoB,WAAW,CAAA;AAAA,SACtE;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,IAAA,CAAK,aAAA,IAAiB,OAAO,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAG;AACrE,MAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,aAAA;AAGlC,MAAA,MAAM,WAAA,GAAc,cAAc,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,EAAE,CAAA;AACvE,MAAA,IAAI,gBAAgB,GAAA,EAAK;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,GAAG,CAAA,iBAAA,EAAoB,WAAW,CAAA;AAAA,SAC3E;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,QAAA,IAAI,CAAA,CAAE,UAAU,EAAA,EAAI;AAClB,UAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,6BACN,MAAA,EACM;AAEN,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC/D,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAA,IAAU,MAAA,CAAO,MAAM,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAGA,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACvD,IAAA,IAAI,YAAY,MAAA,CAAO,OAAA,CAAQ,SAAA,IAAa,MAAA,CAAO,QAAQ,OAAA,EAAS;AAClE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,QAAA,IAAY,MAAA,CAAO,QAAQ,SAAA,IAAa,MAAA,CAAO,QAAQ,OAAA,EAAS;AACnE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAA,IAAiB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,eAAA,IAAmB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,eAAA,GAAkB,MAAA,CAAO,KAAK,aAAA,EAAe;AAC3D,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAGA,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,QAAA,IAAY,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,WAAA,IAAe,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAIA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,wBAAA,EAA0B;AACtD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wCAAA,EAA2C,wBAAwB,CAAA,iDAAA,EAC9C,MAAA,CAAO,KAAK,WAAW,CAAA,4GAAA;AAAA,OAE9C;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,OAAA,CAAQ,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC9D,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAGA,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,KAAA,KAAU,MAAA,EAAW;AACtC,MAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,EAAG;AACxD,QAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,MAC3D;AAAA,IACF;AAGA,IAAA,IACE,OAAO,SAAA,CAAU,IAAA,KAAS,WAAA,IAC1B,MAAA,CAAO,UAAU,cAAA,EACjB;AACA,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,aAAA;AACtD,MAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,cAAc,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,EAAE,CAAA;AACvE,MAAA,IAAI,gBAAgB,GAAA,EAAK;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,+BAAA,EAAkC,GAAG,CAAA,iBAAA,EAAoB,WAAW,CAAA;AAAA,SACtE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,MAAA,EAAyC;AAExE,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC/D,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAA,IAAU,MAAA,CAAO,MAAM,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAA,IAAiB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,eAAA,IAAmB,MAAA,CAAO,CAAC,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,eAAA,GAAkB,MAAA,CAAO,KAAK,aAAA,EAAe;AAC3D,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAGA,IAAA,IAAA,CAAK,iCAAiC,MAAM,CAAA;AAG5C,IAAA,IAAI,OAAO,OAAA,EAAS;AAElB,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,UAAA,IAAc,MAAA,CAAO,QAAQ,OAAA,EAAS;AACvD,QAAA,IACE,OAAO,OAAA,CAAQ,UAAA,CAAW,WAAW,MAAA,CAAO,OAAA,CAAQ,QAAQ,MAAA,EAC5D;AACA,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,UAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,QAC5D;AAEA,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA;AAAA,UACzC,CAAC,GAAA,EAAK,GAAA,KAAQ,GAAA,GAAM,GAAA;AAAA,UACpB,OAAO,CAAC;AAAA,SACV;AACA,QAAA,MAAM,mBAAA,GACJ,MAAA,CAAO,IAAA,CAAK,aAAA,GAAgB,OAAO,IAAA,CAAK,eAAA;AAC1C,QAAA,IAAI,cAAc,mBAAA,EAAqB;AACrC,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,sBAAA,EAAyB,WAAW,CAAA,4BAAA,EAA+B,mBAAmB,CAAA,CAAA;AAAA,WACxF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,IAAA,CAAK,aAAA,IAAiB,OAAO,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAG;AACrE,MAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,aAAA;AAClC,MAAA,MAAM,WAAA,GAAc,cAAc,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,EAAE,CAAA;AACvE,MAAA,IAAI,gBAAgB,GAAA,EAAK;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,GAAG,CAAA,iBAAA,EAAoB,WAAW,CAAA;AAAA,SAC3E;AAAA,MACF;AACA,MAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,QAAA,IAAI,CAAA,CAAE,UAAU,EAAA,EAAI;AAClB,UAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IACE,OAAO,SAAA,CAAU,IAAA,KAAS,WAAA,IAC1B,MAAA,CAAO,UAAU,cAAA,EACjB;AACA,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,aAAA;AACtD,MAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,cAAc,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,EAAE,CAAA;AACvE,MAAA,IAAI,gBAAgB,GAAA,EAAK;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,+BAAA,EAAkC,GAAG,CAAA,iBAAA,EAAoB,WAAW,CAAA;AAAA,SACtE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA6B;AACnC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,OAAO,SAAA,CAAU,OAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,QAAA,EAA4B;AACxD,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,OAAO,QAAA,GAAW,SAAA,CAAU,aAAA,GAAgB,SAAA,CAAU,aAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAA6B;AACnC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,MAAM,OAAO,SAAA,CAAU,OAAA;AACvB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,WAAA,EAAa;AACjC,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAA,CACN,QACA,SAAA,EACS;AACT,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAE3C,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,WAAA;AACH,QAAA,OAAO,SAAA,EAAW,cAAc,SAAA,CAAU,UAAA;AAAA,MAC5C,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,SAAA,GAAY,SAAA,EAAW,UAAA,IAAc,SAAA,CAAU,UAAA;AACrD,QAAA,IAAI,cAAc,4CAAA,EAA8C;AAC9D,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,WAAA,GAAc,SAAA,EAAW,YAAA,IAAgB,SAAA,CAAU,YAAA;AACzD,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,MAEA;AACE,QAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA;AAC5C,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,wBAAA,CACJ,YAAA,EACA,MAAA,EAOiB;AACjB,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MACjB,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,OAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,uBAAA;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,EAAE,GAAG,YAAA,EAAa;AAAA,QAClB;AAAA,UACE,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,mBAAmB,MAAA,CAAO;AAAA;AAC5B;AACF,KACD,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,yBAAA,CACJ,YAAA,EACA,MAAA,EAOiB;AACjB,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MACjB,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,OAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,wBAAA;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,EAAE,GAAG,YAAA,EAAa;AAAA,QAClB;AAAA,UACE,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,KAAK,MAAA,CAAO,GAAA;AAAA,UACZ,mBAAmB,MAAA,CAAO;AAAA;AAC5B;AACF,KACD,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,gCAAA,CACJ,YAAA,EACA,MAAA,EAGyC;AACzC,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,MAAM,IAAA,CAAK,+BAA+B,OAAO,CAAA;AACjD,IAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,EAAA;AACjD,IAAA,IAAA,CAAK,cAAc,cAAA,EAAgB,gBAAA,EAAkB,EAAE,SAAA,EAAW,MAAM,CAAA;AACxE,IAAA,MAAM,QAAA,GAAW,IAAA;AAEjB,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MACjB,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,OAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,kCAAA;AAAA,MACd,MAAM,CAAC,EAAE,GAAG,YAAA,EAAa,EAAG,gBAAgB,QAAQ;AAAA,KACrD,CAAA;AAED,IAAA,MAAM,EAAE,OAAO,OAAA,EAAS,MAAA,EAAQ,aAAY,GAC1C,IAAA,CAAK,4BAA4B,MAAM,CAAA;AAEzC,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA,MACV;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,+BAAA,CACJ,YAAA,EACA,MAAA,EAGwC;AACxC,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,MAAM,IAAA,CAAK,+BAA+B,OAAO,CAAA;AACjD,IAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAW;AACtC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,gBAAgB,MAAA,CAAO,aAAA;AAC7B,IAAA,IAAA,CAAK,aAAA,CAAc,eAAe,eAAe,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,IAAA;AAEjB,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MACjB,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,OAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,iCAAA;AAAA,MACd,MAAM,CAAC,EAAE,GAAG,YAAA,EAAa,EAAG,eAAe,QAAQ;AAAA,KACpD,CAAA;AAED,IAAA,MAAM,EAAE,OAAO,OAAA,EAAS,MAAA,EAAQ,aAAY,GAC1C,IAAA,CAAK,4BAA4B,MAAM,CAAA;AAEzC,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,MAAA;AAAA,MACX;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CACJ,YAAA,EACA,QAAA,EACA,QACA,OAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAClB,IAAA,CAAK,aACL,gBAAA,CAAiB;AAAA,MACjB,OAAA,EAAS,OAAA;AAAA,MACT,GAAA,EAAK,UAAA;AAAA,MACL,YAAA,EAAc,QAAA;AAAA,MACd,MAAM,CAAC,EAAE,GAAG,YAAA,EAAa,EAAG,UAAU,MAAM,CAAA;AAAA,MAC5C,OAAA,EAAS,KAAK,YAAA,CAAa,OAAA;AAAA,MAC3B,KAAA,EAAO,SAAS,KAAA,IAAS;AAAA,KAC1B,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,SAAS,GAAA,IAAO,MAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,aAAA;AAAA,MACjC,GAAA,GAAM,EAAE,GAAG,OAAA,EAAS,KAAI,GAAI;AAAA,KAC9B;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CACN,KAAA,EACA,SAAA,EACA,OAAA,GAAmC,EAAC,EAC9B;AACN,IAAA,MAAM,EAAE,SAAA,GAAY,KAAA,EAAM,GAAI,OAAA;AAC9B,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,CAAC,SAAA,IAAa,KAAA,KAAU,EAAA,EAAI;AAC9B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,sBAAA,CAAwB,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,4BAA4B,MAAA,EAKlC;AACA,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,WAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,MACxE;AACA,MAAA,KAAA,GAAQ,OAAO,CAAC,CAAA;AAChB,MAAA,UAAA,GAAa,OAAO,CAAC,CAAA;AACrB,MAAA,MAAA,GAAS,OAAO,CAAC,CAAA;AACjB,MAAA,WAAA,GAAc,OAAO,CAAC,CAAA;AAAA,IACxB,CAAA,MAAA,IAAW,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AAC/C,MAAA,MAAM,GAAA,GAAM,MAAA;AACZ,MAAA,KAAA,GAAQ,GAAA,CAAI,KAAA;AACZ,MAAA,UAAA,GAAa,GAAA,CAAI,OAAA;AACjB,MAAA,MAAA,GAAU,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,MAAA;AAG/C,MAAA,WAAA,GAAc,GAAA,CAAI,WAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AAEA,IAAA,IACE,UAAU,MAAA,IACV,UAAA,KAAe,UACf,MAAA,KAAW,MAAA,IACX,gBAAgB,MAAA,EAChB;AACA,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAA,EAAS,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA;AAAA,MACzC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,iBAAiB,KAAA,EAAuB;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,MAAM,CAAC,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,cAAA,EAAgB,KAAK,CAAA,GAAI,KAAA;AAO9D,MAAA,MAAM,QAAA,GAAW,OAAO,MAAM,CAAA;AAC9B,MAAA,MAAM,gBAAA,GAAmB,OAAO,cAAc,CAAA;AAC9C,MAAA,IAAI,CAAC,OAAO,QAAA,CAAS,QAAQ,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACpE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAa,gBAAA;AAAA,QACb;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,MAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,GAAA,EAAK,WAAA,EAAa,OAAM,GAAI,KAAA;AAI1D,MAAA,MAAM,QAAA,GAAW,OAAO,GAAG,CAAA;AAC3B,MAAA,MAAM,gBAAA,GAAmB,OAAO,WAAW,CAAA;AAC3C,MAAA,IAAI,CAAC,OAAO,QAAA,CAAS,QAAQ,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACpE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAa,gBAAA;AAAA,QACb;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,gBAAgB,MAAA,EA0Ce;AACrC,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,MAAA,CAAO,SAAS,CAAA;AAElD,IAAA,MAAM;AAAA,MACJ,eAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,QACE,MAAA,CAAO,mBAAA;AAEX,IAAA,MAAM,mBAAA,GAAsB,mBAAA;AAAA,MAC1B;AAAA,QACE,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,EAAE,MAAM,MAAA,EAAO;AAAA,QACf,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,QAAA,EAAS;AAAA,QACjB,EAAE,MAAM,OAAA;AAAQ,OAClB;AAAA,MACA;AAAA,QACE,eAAA;AAAA,QACA,eAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAiB,eAAA,EAAgB,GAAI,MAAA;AAE1D,IAAA,MAAM,gBAAA,GAAmB,mBAAA;AAAA,MACvB;AAAA,QACE,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,EAAE,MAAM,MAAA,EAAO;AAAA,QACf,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,QAAA;AAAS,OACnB;AAAA,MACA;AAAA,QACE,WAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,MAAM,YAAA,GAAe,SAAA;AAAA,MACnB,YAAA;AAAA,QACE,CAAC,SAAS,OAAO,CAAA;AAAA,QACjB,CAAC,iBAAwB,gBAAgB;AAAA;AAC3C,KACF;AAEA,IAAA,MAAM,gBAAA,GACJ,MAAA,CAAO,YAAA,KAAiB,YAAA,GAAA,CACnB,MAAM;AACL,MAAA,MAAM,IAAI,MAAA,CAAO,gBAAA;AAMjB,MAAA,OAAO,mBAAA;AAAA,QACL;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA;AAAU,SACpB;AAAA,QACA,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,IAAA,IAAQ,KAAK;AAAA,OAC/C;AAAA,IACF,CAAA,OACC,MAAM;AACL,MAAA,MAAM;AAAA,QACJ,IAAA;AAAA,QACA,MAAA;AAAA,QACA,cAAA;AAAA,QACA,eAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,UACE,MAAA,CAAO,gBAAA;AAWX,MAAA,OAAO,mBAAA;AAAA,QACL;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,WAAA,EAAY;AAAA,UACpB,EAAE,MAAM,WAAA,EAAY;AAAA,UACpB,EAAE,MAAM,QAAA;AAAS,SACnB;AAAA,QACA;AAAA,UACE,IAAA;AAAA,UACA,MAAA;AAAA,UACA,cAAA;AAAA,UACA,eAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,CAAA,GAAG;AAGT,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,MAAA,CAAO,iBAAiB,YAAA,EAAc;AACxC,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,KAAY,MAAA,CAAO,gBAAA;AAMzC,MAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,MAAA;AAEnC,MAAA,MAAM,YAAA,GAAe,mBAAA;AAAA,QACnB;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,QAAA;AAAS,SACnB;AAAA,QACA,CAAC,IAAA,EAAM,MAAA,EAAQ,aAAA,EAAe,OAAA,EAAS,SAAS,OAAO;AAAA,OACzD;AACA,MAAA,aAAA,GAAgB,SAAA;AAAA,QACd,YAAA;AAAA,UACE,CAAC,SAAS,OAAO,CAAA;AAAA,UACjB,CAAC,sBAA6B,YAAY;AAAA;AAC5C,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM;AAAA,QACJ,IAAA;AAAA,QACA,MAAA;AAAA,QACA,cAAA;AAAA,QACA,eAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,UACE,MAAA,CAAO,gBAAA;AAWX,MAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,MAAA;AACnC,MAAA,MAAM,YAAA,GAAe,mBAAA;AAAA,QACnB;AAAA,UACE,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,EAAE,MAAM,WAAA,EAAY;AAAA,UACpB,EAAE,MAAM,WAAA,EAAY;AAAA,UACpB,EAAE,MAAM,QAAA;AAAS,SACnB;AAAA,QACA;AAAA,UACE,IAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACA,cAAA;AAAA,UACA,eAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,MAAM,gBAAA,GACJ,MAAA,CAAO,YAAA,CAAa,WAAA,EAAY,KAAM,wBAAA;AACxC,MAAA,MAAM,QAAA,GAAW,gBAAA,GACZ,gBAAA,GACC,MAAA,CAAO,oBAAA,IAAiC,cAAA;AAE9C,MAAA,aAAA,GAAgB,SAAA;AAAA,QACd,YAAA,CAAa,CAAC,OAAA,EAAS,OAAO,GAAG,CAAC,QAAA,EAAU,YAAY,CAAC;AAAA,OAC3D;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAA;AAAA,MACX,CAAA,IAAK,EAAA;AAAA,MACH,CAAA,IAAK,EAAA;AAAA,MACL,CAAA,IAAK,EAAA;AAAA,MACL,CAAA,IAAK,CAAA;AAAA,MACL,CAAA,IAAK,CAAA;AAAA,MACL,CAAA,IAAK;AAAA;AAAA,KACV;AAGA,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AAG/C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,UAAU,YAAY,CAAA;AAC1E,IAAA,MAAM,cAAc,aAAA,GAChB,IAAA,CAAK,qBAAqB,MAAA,CAAO,YAAA,EAAc,aAAa,CAAA,GAC5D,IAAA;AAEJ,IAAA,KAAA,IAAS,IAAA,GAAO,EAAA,EAAI,IAAA,GAAO,QAAA,EAAY,IAAA,EAAA,EAAQ;AAE7C,MAAA,IAAA,CAAK,kBAAA,CAAmB,YAAY,IAAI,CAAA;AAGxC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,UAAU,CAAA;AACzD,MAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AAIjC,MAAA,IAAA,CAAK,UAAA,GAAa,eAAe,KAAA,EAAO;AACtC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,WAAA,EAAa;AAEf,QAAA,IAAA,CAAK,kBAAA,CAAmB,aAAa,IAAI,CAAA;AAGzC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,yBAAA,CAA0B,WAAW,CAAA;AAC3D,QAAA,MAAM,WAAA,GAAc,OAAO,QAAQ,CAAA;AAEnC,QAAA,IACG,YAAY,WAAA,GAAc,eAAA,IAC1B,CAAC,QAAA,IAAY,cAAc,eAAA,EAC5B;AAEA,UAAA,MAAM,SAAA,GAAY,KAAK,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAC,CAAA,CAAA;AAC1D,UAAA,MAAM,IAAA,GAAO,WAAW,OAAO,CAAA;AAC/B,UAAA,MAAM,KAAA,GAAQ,WAAW,QAAQ,CAAA;AACjC,UAAA,OAAO;AAAA,YACL,SAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA;AAAA,YACA,mBAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,qBAAA,CACN,IAAA,EACA,YAAA,EACA,QAAA,EACS;AACT,IAAA,MAAM,OAAA,GAAU,YAAA;AAAA,MACd,CAAC,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,SAAS,CAAA;AAAA,MAC1C,CAAC,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,YAAY;AAAA,KACvC;AACA,IAAA,OAAO,UAAA,CAAW,KAAK,SAAA,CAAU,OAAO,EAAE,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAW,GAAA,EAAyB;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,IAAI,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,QAAA,CAAS,SAAS,CAAC,CAAA;AAChD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,KAAA,CAAM,CAAC,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAW,KAAA,EAA2B;AAC5C,IAAA,OACE,OACA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAA,CACN,UACA,YAAA,EACY;AACZ,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,EAAE,CAAA;AAChC,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,GAAA;AACZ,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,CAAI,eAAe,CAAC,CAAA;AAC3B,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AACtD,IAAA,MAAA,CAAO,GAAA,CAAI,mBAAmB,EAAE,CAAA;AAChC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAA,CAAmB,QAAoB,IAAA,EAAoB;AAGjE,IAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAAA,IACd;AAEA,IAAA,IAAI,SAAA,GAAY,IAAA;AAChB,IAAA,KAAA,IAAS,IAAI,EAAA,EAAI,SAAA,GAAY,EAAA,IAAM,CAAA,IAAK,IAAI,CAAA,EAAA,EAAK;AAC/C,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,SAAA,GAAY,KAAK,CAAA;AACpC,MAAA,SAAA,KAAc,EAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,0BAA0B,MAAA,EAA4B;AAC5D,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,UAAA,CAAW,MAAM,CAAQ,CAAA;AAErD,IAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,WAAA,EAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAAA,EAMX;AAET,IAAA,MAAM,OAAA,GAAU,mBAAA;AAAA,MACd;AAAA,QACE,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,SAAA,EAAU;AAAA,QAClB,EAAE,MAAM,QAAA,EAAS;AAAA,QACjB,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,EAAE,MAAM,SAAA;AAAU,OACpB;AAAA,MACA;AAAA,QACE,OAAA,CAAQ,SAAA;AAAA,QACR,OAAA,CAAQ,SAAA;AAAA,QACR,OAAA,CAAQ,GAAA;AAAA,QACR,OAAA,CAAQ,WAAA;AAAA,QACR,OAAA,CAAQ;AAAA;AACV,KACF;AACA,IAAA,OAAO,UAAU,OAAO,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBAAA,CACZ,MAAA,EACA,YAAA,EACc;AACd,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAE3C,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gCAAA,CAAiC,MAAM,CAAA;AACpE,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,eAAA,CAAgB,SAAS,QAAA,EAAU;AAGrC,MAAA,WAAA,GAAc,eAAA,CAAgB,YAAY,WAAA,IAAe,YAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,MAAM,sBAAsB,MAAM;AAChC,QAAA,IAAI,eAAA,CAAgB,SAAS,OAAA,EAAS;AACpC,UAAA,OACE,MAAA,CAAO,OAAA,EAAS,4BAAA,IAChB,SAAA,CAAU,4BAAA;AAAA,QAEd;AACA,QAAA,IAAI,eAAA,CAAgB,SAAS,WAAA,EAAa;AACxC,UAAA,OACE,MAAA,CAAO,OAAA,EAAS,gCAAA,IAChB,SAAA,CAAU,gCAAA;AAAA,QAEd;AACA,QAAA,OACE,MAAA,CAAO,OAAA,EAAS,uBAAA,IAChB,SAAA,CAAU,uBAAA;AAAA,MAEd,CAAA,GAAG;AAEH,MAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,QAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,MACjE;AAGA,MAAA,WAAA,GAAe,MAAO,IAAA,CAAK,YAAA,CAA8B,YAAA,CAAa;AAAA,QACpE,OAAA,EAAS,kBAAA;AAAA,QACT,GAAA,EAAK,0BAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,SAAA;AAC9B,IAAA,MAAM,SAAA,GAAY,YAAA,GAAe,SAAA,GAAY,YAAA,GAAe,SAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,YAAA,GAAe,SAAA,GAAY,SAAA,GAAY,YAAA;AACzD,IAAA,MAAM,MACJ,eAAA,CAAgB,IAAA,KAAS,OAAA,GAAU,gBAAA,GAAmB,OAAO,IAAA,CAAK,GAAA;AAEpE,IAAA,OAAO,KAAK,aAAA,CAAc;AAAA,MACxB,SAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAA;AAAA,MACA,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAAA,MACzB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,+BACZ,OAAA,EACe;AACf,IAAA,IAAI,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA;AACpB,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,CAAO,gBAAgB,UAAA,EAAY;AAEvD,MAAA,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAW,MAAM,MAAA,CAAO,YAAY,EAAE,OAAA,EAAS,SAAS,CAAA;AAC9D,IAAA,MAAM,QAAA,GAAW,OAAA;AAAA,MACf,YACA,4BAAA,CAA6B,KAAA;AAAA,QAAM,CAAC,QAAA,KAClC,QAAA,CAAS,SAAS,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC;AAAA;AACrC,KACF;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,cAAc,OAAO,CAAA,+GAAA;AAAA,OACvB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AAAA,EACjD;AACF;AAEA,IAAM,4BAAA,GAA+B,CAAC,YAAA,EAAc,YAAY,CAAA","file":"chunk-U7CHPFU6.mjs","sourcesContent":["import {\n type Address,\n type Hex,\n type Hash,\n type PublicClient,\n type WalletClient,\n type Account,\n encodeAbiParameters,\n encodePacked,\n keccak256,\n getAddress,\n decodeEventLog,\n toHex,\n} from 'viem';\nimport type {\n CreateStaticAuctionParams,\n CreateDynamicAuctionParams,\n CreateMulticurveParams,\n MigrationConfig,\n SupportedPublicClient,\n TokenConfig,\n Doppler404TokenConfig,\n StandardTokenConfig,\n SupportedChainId,\n CreateParams,\n MulticurveBundleExactInResult,\n MulticurveBundleExactOutResult,\n V4PoolKey,\n RehypeDopplerHookConfig,\n} from '../types';\nimport type { ModuleAddressOverrides } from '../types';\nimport { getAddresses } from '../addresses';\nimport { zeroAddress } from 'viem';\nimport {\n ZERO_ADDRESS,\n WAD,\n DEFAULT_PD_SLUGS,\n FLAG_MASK,\n DEFAULT_V3_NUM_POSITIONS,\n DEFAULT_V3_YEARLY_MINT_RATE,\n DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n DEFAULT_V4_YEARLY_MINT_RATE,\n DEFAULT_V3_INITIAL_VOTING_DELAY,\n DEFAULT_V3_INITIAL_VOTING_PERIOD,\n DEFAULT_V3_INITIAL_PROPOSAL_THRESHOLD,\n DEFAULT_V4_INITIAL_VOTING_DELAY,\n DEFAULT_V4_INITIAL_VOTING_PERIOD,\n DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n DEFAULT_CREATE_GAS_LIMIT,\n TICK_SPACINGS,\n DOPPLER_MAX_TICK_SPACING,\n DYNAMIC_FEE_FLAG,\n DECAY_MAX_START_FEE,\n V4_MAX_FEE,\n} from '../constants';\nimport {\n computeOptimalGamma,\n MIN_TICK,\n MAX_TICK,\n isToken0Expected,\n} from '../utils';\nimport {\n airlockAbi,\n bundlerAbi,\n DERC20Bytecode,\n DERC2080Bytecode,\n DopplerBytecode,\n DopplerDN404Bytecode,\n v4MulticurveInitializerAbi,\n} from '../abis';\n\n// Type definition for the custom migration encoder function\nexport type MigrationEncoder = (config: MigrationConfig) => Hex;\n\nconst MAX_UINT128 = (1n << 128n) - 1n;\n\n// TokenFactory80 has the same deterministic CREATE2 address across all chains\nconst TOKEN_FACTORY_80_ADDRESS =\n '0xf0b5141dd9096254b2ca624dff26024f46087229' as const;\n\ntype ResolvedMulticurveInitializerMode =\n | { type: 'standard' }\n | { type: 'scheduled'; startTime: number }\n | { type: 'decay'; startTime: number; startFee: number; durationSeconds: number }\n | { type: 'rehype'; hookConfig?: RehypeDopplerHookConfig };\n\nexport class DopplerFactory<C extends SupportedChainId = SupportedChainId> {\n private publicClient: SupportedPublicClient;\n private walletClient?: WalletClient;\n private chainId: C;\n private customMigrationEncoder?: MigrationEncoder;\n\n private multicurveBundlerSupport = new Map<Address, boolean>();\n\n constructor(\n publicClient: SupportedPublicClient,\n walletClient: WalletClient | undefined,\n chainId: C,\n ) {\n this.publicClient = publicClient;\n this.walletClient = walletClient;\n this.chainId = chainId;\n }\n\n /**\n * Set a custom migration data encoder function\n * @param encoder Custom function to encode migration data\n * @returns The factory instance for method chaining\n */\n withCustomMigrationEncoder(encoder: MigrationEncoder): this {\n this.customMigrationEncoder = encoder;\n return this;\n }\n\n async encodeCreateStaticAuctionParams(\n params: CreateStaticAuctionParams<C>,\n ): Promise<CreateParams> {\n // Validate parameters\n this.validateStaticAuctionParams(params);\n\n const addresses = getAddresses(this.chainId);\n\n // Check if beneficiaries are provided - this determines which initializer to use\n const hasBeneficiaries =\n params.pool.beneficiaries && params.pool.beneficiaries.length > 0;\n\n // 1. Encode pool initializer data\n // Standard V3 initializer expects InitData struct WITHOUT beneficiaries (5 fields)\n // Lockable V3 initializer expects InitData struct WITH beneficiaries (6 fields)\n let poolInitializerData: Hex;\n\n if (hasBeneficiaries) {\n // Sort beneficiaries by address (ascending) as required by the contract\n const sortedBeneficiaries = params.pool\n .beneficiaries!.slice()\n .sort((a, b) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n });\n\n // Lockable V3 initializer encoding (6 fields including beneficiaries)\n poolInitializerData = encodeAbiParameters(\n [\n {\n type: 'tuple',\n components: [\n { type: 'uint24', name: 'fee' },\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'maxShareToBeSold' },\n {\n type: 'tuple[]',\n name: 'beneficiaries',\n components: [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ],\n },\n ],\n },\n ],\n [\n {\n fee: params.pool.fee,\n tickLower: params.pool.startTick,\n tickUpper: params.pool.endTick,\n numPositions: params.pool.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.pool.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n beneficiaries: sortedBeneficiaries.map((b) => ({\n beneficiary: b.beneficiary,\n shares: b.shares,\n })),\n },\n ],\n );\n } else {\n // Standard V3 initializer encoding (5 fields, no beneficiaries)\n poolInitializerData = encodeAbiParameters(\n [\n {\n type: 'tuple',\n components: [\n { type: 'uint24', name: 'fee' },\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'maxShareToBeSold' },\n ],\n },\n ],\n [\n {\n fee: params.pool.fee,\n tickLower: params.pool.startTick,\n tickUpper: params.pool.endTick,\n numPositions: params.pool.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.pool.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n },\n ],\n );\n }\n\n // 2. Encode migration data based on MigrationConfig\n const liquidityMigratorData = this.encodeMigrationData(params.migration);\n\n // 3. Encode token parameters (standard vs Doppler404)\n let tokenFactoryData: Hex;\n if (this.isDoppler404Token(params.token)) {\n const token404 = params.token;\n // Doppler404 expects: name, symbol, baseURI, unit\n const baseURI = token404.baseURI;\n const unit = token404.unit !== undefined ? BigInt(token404.unit) : 1000n;\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [params.token.name, params.token.symbol, baseURI, unit],\n );\n } else {\n const tokenStd = params.token as StandardTokenConfig;\n const vestingDuration = params.vesting?.duration ?? BigInt(0);\n const yearlyMintRate =\n tokenStd.yearlyMintRate ?? DEFAULT_V4_YEARLY_MINT_RATE;\n\n // Handle vesting recipients and amounts\n let vestingRecipients: Address[] = [];\n let vestingAmounts: bigint[] = [];\n\n if (params.vesting) {\n if (params.vesting.recipients && params.vesting.amounts) {\n // Use provided recipients and amounts\n vestingRecipients = params.vesting.recipients;\n vestingAmounts = params.vesting.amounts;\n } else {\n // Default: vest all non-sold tokens to userAddress\n vestingRecipients = [params.userAddress];\n vestingAmounts = [\n params.sale.initialSupply - params.sale.numTokensToSell,\n ];\n }\n }\n\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n tokenStd.name,\n tokenStd.symbol,\n yearlyMintRate,\n BigInt(vestingDuration),\n vestingRecipients,\n vestingAmounts,\n tokenStd.tokenURI,\n ],\n );\n }\n\n // 4. Encode governance factory data\n const governanceFactoryData: Hex = (() => {\n if (params.governance.type === 'noOp') {\n return '0x' as Hex;\n }\n if (params.governance.type === 'launchpad') {\n return encodeAbiParameters(\n [{ type: 'address' }],\n [params.governance.multisig],\n );\n }\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint48' },\n { type: 'uint32' },\n { type: 'uint256' },\n ],\n [\n params.token.name,\n params.governance.type === 'custom'\n ? params.governance.initialVotingDelay\n : DEFAULT_V3_INITIAL_VOTING_DELAY,\n params.governance.type === 'custom'\n ? params.governance.initialVotingPeriod\n : DEFAULT_V3_INITIAL_VOTING_PERIOD,\n params.governance.type === 'custom'\n ? params.governance.initialProposalThreshold\n : DEFAULT_V3_INITIAL_PROPOSAL_THRESHOLD,\n ],\n );\n })();\n\n // 4.1 Choose governance factory\n const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n // 5. Generate a unique salt\n // Resolve token factory with override priority\n const resolvedTokenFactory: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\n : addresses.tokenFactory);\n\n if (!resolvedTokenFactory || resolvedTokenFactory === ZERO_ADDRESS) {\n throw new Error(\n 'Token factory address not configured. Provide an explicit address via builder.withTokenFactory(...) or ensure chain config includes a valid factory.',\n );\n }\n\n // Build the base CreateParams for the V3-style ABI; salt will be mined below\n const baseCreateParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactory,\n tokenFactoryData: tokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData: governanceFactoryData,\n poolInitializer: (() => {\n if (hasBeneficiaries) {\n const lockableInitializer =\n params.modules?.lockableV3Initializer ??\n addresses.lockableV3Initializer;\n if (!lockableInitializer) {\n throw new Error(\n 'Lockable V3 initializer address not configured on this chain. Required when using beneficiaries.',\n );\n }\n return lockableInitializer;\n }\n return params.modules?.v3Initializer ?? addresses.v3Initializer;\n })(),\n poolInitializerData: poolInitializerData,\n liquidityMigrator: this.getMigratorAddress(\n params.migration,\n params.modules,\n ),\n liquidityMigratorData: liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n };\n\n const minedCreateParams = await this.mineTokenOrder({\n params,\n baseCreateParams,\n addresses,\n });\n\n return minedCreateParams;\n }\n\n /**\n * Simulate a static auction creation and return predicted addresses.\n * Useful for pre-buy flows (bundle) to know the token/pool before sending.\n */\n async simulateCreateStaticAuction(\n params: CreateStaticAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n asset: Address;\n pool: Address;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n poolAddress: Address;\n tokenAddress: Address;\n transactionHash: string;\n }>;\n }> {\n const createParams = await this.encodeCreateStaticAuctionParams(params);\n const addresses = getAddresses(this.chainId);\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate static auction create');\n }\n\n return {\n createParams,\n asset: simResult[0] as Address,\n pool: simResult[1] as Address,\n gasEstimate,\n execute: () =>\n this.createStaticAuction(params, { _createParams: createParams }),\n };\n }\n\n /**\n * Create a new static auction (using Uniswap V3 for initial liquidity)\n * @param params Configuration for the static auction\n * @returns The address of the created pool and token\n */\n async createStaticAuction(\n params: CreateStaticAuctionParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{\n poolAddress: Address;\n tokenAddress: Address;\n transactionHash: string;\n }> {\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n const createParams =\n options?._createParams ??\n (await this.simulateCreateStaticAuction(params)).createParams;\n\n const addresses = getAddresses(this.chainId);\n\n // Call the airlock contract to create the pool\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gasOverride = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({\n ...request,\n gas: gasOverride,\n });\n\n // Wait for transaction and get the receipt\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash, confirmations: 2 });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract addresses from Create event in transaction logs',\n );\n }\n\n // Warn if simulation predicted different addresses (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 2) {\n const simulatedToken = simResult[0] as Address;\n const simulatedPool = simResult[1] as Address;\n if (\n simulatedToken.toLowerCase() !==\n actualAddresses.tokenAddress.toLowerCase()\n ) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualAddresses.tokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n if (\n simulatedPool.toLowerCase() !==\n actualAddresses.poolOrHookAddress.toLowerCase()\n ) {\n console.warn(\n `[DopplerSDK] Simulation predicted pool ${simulatedPool} but actual is ${actualAddresses.poolOrHookAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n return {\n tokenAddress: actualAddresses.tokenAddress,\n poolAddress: actualAddresses.poolOrHookAddress,\n transactionHash: hash,\n };\n }\n\n /**\n * Generate a random salt based on user address\n */\n private generateRandomSalt(account: Address): Hex {\n // Use crypto.getRandomValues for secure random generation\n const array = new Uint8Array(32);\n\n // Try to use crypto API if available (Node.js or browser)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(array);\n } else {\n // Fallback: use timestamp and account for deterministic generation\n const timestamp = Date.now();\n const timestampBytes = new Uint8Array(8);\n for (let i = 0; i < 8; i++) {\n timestampBytes[i] = (timestamp >> (i * 8)) & 0xff;\n }\n\n // Fill array with timestamp and account-based entropy\n for (let i = 0; i < 32; i++) {\n if (i < 8) {\n array[i] = timestampBytes[i];\n } else {\n array[i] = i;\n }\n }\n }\n\n // XOR with address bytes for additional entropy\n if (account) {\n const addressBytes = account.slice(2).padStart(40, '0');\n for (let i = 0; i < 20; i++) {\n const addressByte = parseInt(\n addressBytes.slice(i * 2, (i + 1) * 2),\n 16,\n );\n array[i] ^= addressByte;\n }\n }\n\n return `0x${Array.from(array)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')}` as Hex;\n }\n\n /**\n * Extract actual deployed addresses from Create event logs.\n * This is the source of truth - what actually deployed on-chain.\n * @param receipt Transaction receipt containing logs\n * @returns Token and pool/hook addresses from the Create event, or null if not found\n */\n private extractAddressesFromCreateEvent(receipt: {\n logs: readonly unknown[];\n }): { tokenAddress: Address; poolOrHookAddress: Address } | null {\n const createEvent = receipt.logs.find((log: unknown) => {\n try {\n const decoded = decodeEventLog({\n abi: airlockAbi,\n data: (log as { data: Hex }).data,\n topics: (log as { topics: readonly `0x${string}`[] }).topics as [\n `0x${string}`,\n ...`0x${string}`[],\n ],\n });\n return decoded.eventName === 'Create';\n } catch {\n return false;\n }\n });\n\n if (!createEvent) return null;\n\n const decoded = decodeEventLog({\n abi: airlockAbi,\n data: (createEvent as { data: Hex }).data,\n topics: (createEvent as { topics: readonly `0x${string}`[] }).topics as [\n `0x${string}`,\n ...`0x${string}`[],\n ],\n });\n\n if (decoded.eventName === 'Create') {\n const args = decoded.args as { asset: Address; poolOrHook: Address };\n return { tokenAddress: args.asset, poolOrHookAddress: args.poolOrHook };\n }\n\n return null;\n }\n\n /**\n * Iteratively mine a salt that ensures the newly created token sorts after the numeraire.\n * This mirrors the legacy SDK behaviour so tick configuration can assume the numeraire is token0.\n */\n private async mineTokenOrder(args: {\n params: CreateStaticAuctionParams<C>;\n baseCreateParams: Omit<CreateParams, 'salt'>;\n addresses: ReturnType<typeof getAddresses>;\n }): Promise<CreateParams> {\n const { params, baseCreateParams, addresses } = args;\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n if (!airlockAddress || airlockAddress === ZERO_ADDRESS) {\n throw new Error(\n 'Airlock address not configured. Provide an explicit address via modules.airlock or ensure chain config includes a valid airlock.',\n );\n }\n\n const accountForSimulation =\n this.walletClient?.account ?? params.userAddress;\n const numeraireBigInt = BigInt(params.sale.numeraire);\n\n let attempt = 0n;\n const maxAttempts = 256n;\n let salt = this.generateRandomSalt(params.userAddress);\n\n while (attempt < maxAttempts) {\n const createParams = { ...baseCreateParams, salt } as CreateParams;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: accountForSimulation,\n });\n\n const simResult = result as readonly unknown[] | undefined;\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error(\n 'Failed to simulate static auction create while mining token ordering',\n );\n }\n\n const tokenAddress = simResult[0] as Address;\n if (BigInt(tokenAddress) > numeraireBigInt) {\n return createParams;\n }\n\n attempt += 1n;\n const incrementedAccount = toHex(\n BigInt(params.userAddress) + attempt,\n ) as Address;\n salt = this.generateRandomSalt(incrementedAccount);\n }\n\n throw new Error(\n 'Token mining exceeded iteration limit while trying to force token order. Try again or provide a different user address.',\n );\n }\n\n async encodeCreateDynamicAuctionParams(\n params: CreateDynamicAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n hookAddress: Address;\n tokenAddress: Address;\n }> {\n // Validate parameters\n this.validateDynamicAuctionParams(params);\n\n const addresses = getAddresses(this.chainId);\n\n // 1. Calculate gamma if not provided\n const gamma =\n params.auction.gamma ??\n computeOptimalGamma(\n params.auction.startTick,\n params.auction.endTick,\n params.auction.duration,\n params.auction.epochLength,\n params.pool.tickSpacing,\n );\n\n // 2. Prepare time parameters\n // Use provided block timestamp or fetch the latest\n let blockTimestamp: number;\n if (params.blockTimestamp !== undefined) {\n blockTimestamp = params.blockTimestamp;\n } else {\n const latestBlock = await (this.publicClient as PublicClient).getBlock({\n blockTag: 'latest',\n });\n blockTimestamp = Number(\n (latestBlock as { timestamp: bigint | number }).timestamp,\n );\n }\n\n // Use startTimeOffset if provided, otherwise default to 30 seconds\n const startTimeOffset = params.startTimeOffset ?? 30;\n const startTime = blockTimestamp + startTimeOffset;\n const endTime = blockTimestamp + params.auction.duration + startTimeOffset;\n\n // 3. Prepare hook initialization data\n const dopplerData = {\n minimumProceeds: params.auction.minProceeds,\n maximumProceeds: params.auction.maxProceeds,\n startingTime: BigInt(startTime),\n endingTime: BigInt(endTime),\n startingTick: params.auction.startTick,\n endingTick: params.auction.endTick,\n epochLength: BigInt(params.auction.epochLength),\n gamma,\n isToken0: false, // Will be determined during mining\n numPDSlugs: BigInt(params.auction.numPdSlugs ?? DEFAULT_PD_SLUGS),\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n };\n\n // 4. Prepare token parameters (standard vs Doppler404)\n if (this.isDoppler404Token(params.token)) {\n if (\n !addresses.doppler404Factory ||\n addresses.doppler404Factory === ZERO_ADDRESS\n ) {\n throw new Error(\n 'Doppler404 factory address not configured for this chain',\n );\n }\n }\n\n const vestingDuration = params.vesting?.duration ?? BigInt(0);\n const tokenFactoryData = this.isDoppler404Token(params.token)\n ? (() => {\n const t = params.token as Doppler404TokenConfig;\n return {\n name: t.name,\n symbol: t.symbol,\n baseURI: t.baseURI,\n unit: t.unit !== undefined ? BigInt(t.unit) : 1000n,\n };\n })()\n : (() => {\n const t = params.token as StandardTokenConfig;\n\n // Handle vesting recipients and amounts\n let vestingRecipients: Address[] = [];\n let vestingAmounts: bigint[] = [];\n\n if (params.vesting) {\n if (params.vesting.recipients && params.vesting.amounts) {\n // Use provided recipients and amounts\n vestingRecipients = params.vesting.recipients;\n vestingAmounts = params.vesting.amounts;\n } else {\n // Default: vest all non-sold tokens to userAddress\n vestingRecipients = [params.userAddress];\n vestingAmounts = [\n params.sale.initialSupply - params.sale.numTokensToSell,\n ];\n }\n }\n\n return {\n name: t.name,\n symbol: t.symbol,\n initialSupply: params.sale.initialSupply,\n airlock: addresses.airlock,\n yearlyMintRate: t.yearlyMintRate ?? DEFAULT_V4_YEARLY_MINT_RATE,\n vestingDuration: BigInt(vestingDuration),\n recipients: vestingRecipients,\n amounts: vestingAmounts,\n tokenURI: t.tokenURI,\n };\n })();\n\n // 5. Mine hook address with appropriate flags\n // Resolve token factory with override priority (works for both standard and doppler404 variants)\n const resolvedTokenFactoryDyn: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\n : addresses.tokenFactory);\n\n if (!resolvedTokenFactoryDyn || resolvedTokenFactoryDyn === ZERO_ADDRESS) {\n throw new Error(\n 'Token factory address not configured. Provide an explicit address via builder.withTokenFactory(...) or ensure chain config includes a valid factory.',\n );\n }\n\n const [\n salt,\n hookAddress,\n tokenAddress,\n poolInitializerData,\n encodedTokenFactoryData,\n ] = this.mineHookAddress({\n airlock: params.modules?.airlock ?? addresses.airlock,\n poolManager: params.modules?.poolManager ?? addresses.poolManager,\n deployer: params.modules?.dopplerDeployer ?? addresses.dopplerDeployer,\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactoryDyn,\n tokenFactoryData: tokenFactoryData,\n poolInitializer: params.modules?.v4Initializer ?? addresses.v4Initializer,\n poolInitializerData: dopplerData,\n tokenVariant: this.isDoppler404Token(params.token)\n ? 'doppler404'\n : 'standard',\n });\n\n // 6. Encode migration data\n const liquidityMigratorData = this.encodeMigrationData(params.migration);\n\n // 7. Encode governance factory data\n const governanceFactoryData: Hex = (() => {\n if (params.governance.type === 'noOp') {\n return '0x' as Hex;\n }\n if (params.governance.type === 'launchpad') {\n return encodeAbiParameters(\n [{ type: 'address' }],\n [params.governance.multisig],\n );\n }\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint48' },\n { type: 'uint32' },\n { type: 'uint256' },\n ],\n [\n params.token.name,\n params.governance.type === 'custom'\n ? params.governance.initialVotingDelay\n : DEFAULT_V4_INITIAL_VOTING_DELAY,\n params.governance.type === 'custom'\n ? params.governance.initialVotingPeriod\n : DEFAULT_V4_INITIAL_VOTING_PERIOD,\n params.governance.type === 'custom'\n ? params.governance.initialProposalThreshold\n : DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n ],\n );\n })();\n\n // 7.1 Choose governance factory\n const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n // 8. Build the complete CreateParams for the V4-style ABI\n const createParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactoryDyn,\n tokenFactoryData: encodedTokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData: governanceFactoryData,\n poolInitializer: params.modules?.v4Initializer ?? addresses.v4Initializer,\n poolInitializerData: poolInitializerData,\n liquidityMigrator: this.getMigratorAddress(\n params.migration,\n params.modules,\n ),\n liquidityMigratorData: liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n salt: salt,\n };\n\n return { createParams, hookAddress, tokenAddress };\n }\n\n /**\n * Create a new dynamic auction (using Uniswap V4 hook for gradual Dutch auction)\n * @param params Configuration for the dynamic auction\n * @returns The address of the created hook and token\n */\n async createDynamicAuction(\n params: CreateDynamicAuctionParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n transactionHash: string;\n }> {\n const addresses = getAddresses(this.chainId);\n\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n let createParams: CreateParams;\n\n if (options?._createParams) {\n createParams = options._createParams;\n } else {\n const simulation = await this.simulateCreateDynamicAuction(params);\n createParams = simulation.createParams;\n }\n\n // Call the airlock contract to create the pool\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gasOverride = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({\n ...request,\n gas: gasOverride,\n });\n\n // Wait for transaction and get the receipt\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract addresses from Create event in transaction logs',\n );\n }\n\n const actualTokenAddress = actualAddresses.tokenAddress;\n const actualHookAddress = actualAddresses.poolOrHookAddress;\n\n // Warn if simulation predicted different addresses (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 2) {\n const simulatedToken = simResult[0] as Address;\n const simulatedHook = simResult[1] as Address;\n if (simulatedToken.toLowerCase() !== actualTokenAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualTokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n if (simulatedHook.toLowerCase() !== actualHookAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted hook ${simulatedHook} but actual is ${actualHookAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n // Calculate pool ID for V4 using actual addresses\n const poolId = this.computePoolId({\n currency0:\n actualTokenAddress < params.sale.numeraire\n ? actualTokenAddress\n : params.sale.numeraire,\n currency1:\n actualTokenAddress < params.sale.numeraire\n ? params.sale.numeraire\n : actualTokenAddress,\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: actualHookAddress,\n });\n\n return {\n hookAddress: actualHookAddress,\n tokenAddress: actualTokenAddress,\n poolId,\n transactionHash: hash,\n };\n }\n\n /**\n * Simulate a dynamic auction creation and return predicted addresses and poolId.\n * Useful for clients that need the hook/token/poolId before submitting the tx.\n */\n async simulateCreateDynamicAuction(\n params: CreateDynamicAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n transactionHash: string;\n }>;\n }> {\n const { createParams } =\n await this.encodeCreateDynamicAuctionParams(params);\n const addresses = getAddresses(this.chainId);\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate dynamic auction create');\n }\n\n const tokenAddress = simResult[0] as Address;\n const hookAddress = simResult[1] as Address;\n\n const poolId = this.computePoolId({\n currency0:\n tokenAddress < params.sale.numeraire\n ? tokenAddress\n : params.sale.numeraire,\n currency1:\n tokenAddress < params.sale.numeraire\n ? params.sale.numeraire\n : tokenAddress,\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: hookAddress,\n });\n\n return {\n createParams,\n hookAddress,\n tokenAddress,\n poolId,\n gasEstimate,\n execute: () =>\n this.createDynamicAuction(params, { _createParams: createParams }),\n };\n }\n\n private async resolveCreateGasEstimate(args: {\n request?: unknown;\n address: Address;\n createParams: CreateParams;\n account?: Address | Account;\n }): Promise<bigint | undefined> {\n const { request, address, createParams, account } = args;\n const gasFromRequest =\n request &&\n typeof request === 'object' &&\n 'gas' in (request as Record<string, unknown>)\n ? (request as { gas?: bigint }).gas\n : undefined;\n\n if (gasFromRequest) {\n return gasFromRequest;\n }\n\n try {\n const estimated = await (\n this.publicClient as PublicClient\n ).estimateContractGas({\n address,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account,\n });\n return estimated;\n } catch {\n return undefined;\n }\n }\n\n private isDoppler404Token(\n token: TokenConfig,\n ): token is Doppler404TokenConfig {\n return (token as Doppler404TokenConfig).type === 'doppler404';\n }\n\n /**\n * Encode migration data based on the MigrationConfig\n * This replaces the manual encoding methods from the old SDKs\n */\n private encodeMigrationData(config: MigrationConfig): Hex {\n // Use custom encoder if available\n if (this.customMigrationEncoder) {\n return this.customMigrationEncoder(config);\n }\n\n switch (config.type) {\n case 'uniswapV2':\n // V2 migrator expects empty data\n return '0x' as Hex;\n\n case 'noOp':\n // NoOp migrator expects empty data\n return '0x' as Hex;\n\n case 'uniswapV4':\n // Encode V4 migration data with optional streamable fees config\n // When streamableFees is omitted, mirror legacy SDK behaviour by emitting an empty payload\n const streamableFees = config.streamableFees;\n if (!streamableFees) {\n // Default V4 migrator behaviour: no additional payload required\n return '0x';\n }\n\n // Copy beneficiaries and sort by address in ascending order (required by contract)\n const beneficiaryData = [...streamableFees.beneficiaries].sort(\n (a, b) => {\n const addrA = a.beneficiary.toLowerCase();\n const addrB = b.beneficiary.toLowerCase();\n return addrA < addrB ? -1 : addrA > addrB ? 1 : 0;\n },\n );\n\n // Note: The contract will validate that the airlock owner gets at least 5%\n // If not present, the SDK user should add it manually\n\n return encodeAbiParameters(\n [\n { type: 'uint24' }, // fee\n { type: 'int24' }, // tickSpacing\n { type: 'uint32' }, // lockDuration (0 if no streamableFees)\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ],\n },\n ],\n [\n config.fee,\n config.tickSpacing,\n streamableFees.lockDuration,\n beneficiaryData,\n ],\n );\n\n default:\n throw new Error('Unknown migration type');\n }\n }\n\n /**\n * Encode create params for Uniswap V4 Multicurve initializer/migrator flow\n */\n private normalizeUint32(\n value: number | bigint,\n label: string,\n ): number {\n const normalized = typeof value === 'bigint' ? Number(value) : Number(value);\n if (!Number.isFinite(normalized) || !Number.isInteger(normalized)) {\n throw new Error(\n `${label} must be an integer number of seconds since Unix epoch`,\n );\n }\n if (normalized < 0) {\n throw new Error(`${label} cannot be negative`);\n }\n const UINT32_MAX = 0xffffffff;\n if (normalized > UINT32_MAX) {\n throw new Error(\n `${label} must fit within uint32 (seconds since Unix epoch up to year 2106)`,\n );\n }\n return normalized;\n }\n\n private resolveMulticurveInitializerMode(\n params: CreateMulticurveParams<C>,\n ): ResolvedMulticurveInitializerMode {\n const legacySchedule = params.schedule;\n const legacyHook = params.dopplerHook;\n const hasLegacySchedule = legacySchedule !== undefined;\n const hasLegacyHook = legacyHook !== undefined;\n\n if (hasLegacySchedule && hasLegacyHook) {\n throw new Error(\n 'Cannot combine schedule and dopplerHook legacy multicurve options. Use exactly one initializer mode.',\n );\n }\n\n const initializer = params.initializer;\n let mode: ResolvedMulticurveInitializerMode;\n\n if (!initializer) {\n if (hasLegacySchedule) {\n mode = {\n type: 'scheduled',\n startTime: this.normalizeUint32(\n legacySchedule.startTime,\n 'Scheduled multicurve startTime',\n ),\n };\n } else if (hasLegacyHook) {\n mode = {\n type: 'rehype',\n hookConfig: legacyHook,\n };\n } else {\n mode = { type: 'standard' };\n }\n } else {\n switch (initializer.type) {\n case 'standard': {\n if (hasLegacySchedule || hasLegacyHook) {\n throw new Error(\n \"Initializer type 'standard' cannot be combined with legacy schedule/dopplerHook fields\",\n );\n }\n mode = { type: 'standard' };\n break;\n }\n case 'scheduled': {\n if (hasLegacyHook) {\n throw new Error(\n \"Initializer type 'scheduled' cannot be combined with dopplerHook\",\n );\n }\n const normalizedStart = this.normalizeUint32(\n initializer.startTime,\n 'Scheduled multicurve startTime',\n );\n if (hasLegacySchedule) {\n const legacyStart = this.normalizeUint32(\n legacySchedule.startTime,\n 'Scheduled multicurve startTime',\n );\n if (legacyStart !== normalizedStart) {\n throw new Error(\n 'Conflicting scheduled start times provided via initializer and schedule',\n );\n }\n }\n mode = { type: 'scheduled', startTime: normalizedStart };\n break;\n }\n case 'decay': {\n if (hasLegacySchedule || hasLegacyHook) {\n throw new Error(\n \"Initializer type 'decay' cannot be combined with legacy schedule/dopplerHook fields\",\n );\n }\n const startTime = this.normalizeUint32(\n initializer.startTime,\n 'Decay multicurve startTime',\n );\n const startFee = Number(initializer.startFee);\n const durationSeconds = this.normalizeUint32(\n initializer.durationSeconds,\n 'Decay multicurve durationSeconds',\n );\n const endFee = Number(params.pool.fee);\n if (!Number.isInteger(startFee)) {\n throw new Error('Decay multicurve startFee must be an integer');\n }\n if (startFee < 0 || startFee > DECAY_MAX_START_FEE) {\n throw new Error(\n `Decay multicurve startFee must be between 0 and ${DECAY_MAX_START_FEE}`,\n );\n }\n if (!Number.isInteger(endFee) || endFee < 0 || endFee > V4_MAX_FEE) {\n throw new Error(\n `Multicurve pool fee must be between 0 and ${V4_MAX_FEE}`,\n );\n }\n if (startFee < endFee) {\n throw new Error(\n `Decay multicurve startFee (${startFee}) must be greater than or equal to terminal pool fee (${endFee})`,\n );\n }\n if (startFee > endFee && durationSeconds <= 0) {\n throw new Error(\n 'Decay multicurve durationSeconds must be greater than 0 when startFee is greater than terminal pool fee',\n );\n }\n mode = {\n type: 'decay',\n startTime,\n startFee,\n durationSeconds,\n };\n break;\n }\n case 'rehype': {\n if (hasLegacySchedule) {\n throw new Error(\n \"Initializer type 'rehype' cannot be combined with schedule\",\n );\n }\n mode = { type: 'rehype', hookConfig: initializer.config };\n break;\n }\n default: {\n const exhaustive: never = initializer;\n throw new Error(\n `Unsupported multicurve initializer type: ${(exhaustive as { type?: string })?.type ?? 'unknown'}`,\n );\n }\n }\n }\n\n // Backwards-compatible behavior: an explicit dopplerHookInitializer override\n // selects the DopplerHookInitializer path even without hook config.\n if (params.modules?.dopplerHookInitializer !== undefined) {\n if (mode.type === 'standard') {\n mode = { type: 'rehype' };\n } else if (mode.type !== 'rehype') {\n throw new Error(\n 'modules.dopplerHookInitializer can only be used with the rehype or standard multicurve initializer mode',\n );\n }\n }\n\n return mode;\n }\n\n encodeCreateMulticurveParams(\n params: CreateMulticurveParams<C>,\n ): CreateParams {\n // Validate parameters\n this.validateMulticurveParams(params);\n\n // Basic validation\n if (!params.pool || params.pool.curves.length === 0) {\n throw new Error('Multicurve pool must include at least one curve');\n }\n\n const normalizedCurves = this.normalizeMulticurveCurves(\n params.pool.curves,\n params.pool.tickSpacing,\n );\n\n const addresses = getAddresses(this.chainId);\n\n // Pool initializer data: (fee, tickSpacing, farTick, curves[], beneficiaries[], dopplerHook, onInitializationCalldata, graduationCalldata)\n const sortedBeneficiaries = (params.pool.beneficiaries ?? [])\n .slice()\n .sort(\n (\n a: NonNullable<typeof params.pool.beneficiaries>[number],\n b: NonNullable<typeof params.pool.beneficiaries>[number],\n ) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n },\n );\n\n const initializerMode = this.resolveMulticurveInitializerMode(params);\n const useScheduledInitializer = initializerMode.type === 'scheduled';\n const useDecayInitializer = initializerMode.type === 'decay';\n const useDopplerHookInitializer = initializerMode.type === 'rehype';\n\n // Validate dopplerHook fee distribution if provided\n if (initializerMode.type === 'rehype' && initializerMode.hookConfig) {\n const hook = initializerMode.hookConfig;\n const totalDistribution =\n hook.assetBuybackPercentWad +\n hook.numeraireBuybackPercentWad +\n hook.beneficiaryPercentWad +\n hook.lpPercentWad;\n if (totalDistribution !== WAD) {\n throw new Error(\n `DopplerHook fee distribution must sum to ${WAD} (100%), but got ${totalDistribution}`,\n );\n }\n }\n\n // Shared curve and beneficiary component definitions for ABI encoding\n const curveComponents = [\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'shares' },\n ];\n const beneficiaryComponents = [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ];\n\n // Prepare curve and beneficiary data (shared across all initializer formats)\n const curvesData = normalizedCurves.map(\n (c: (typeof normalizedCurves)[number]) => ({\n tickLower: c.tickLower,\n tickUpper: c.tickUpper,\n numPositions: c.numPositions,\n shares: c.shares,\n }),\n );\n const beneficiariesData = sortedBeneficiaries.map(\n (b: NonNullable<typeof params.pool.beneficiaries>[number]) => ({\n beneficiary: b.beneficiary,\n shares: b.shares,\n }),\n );\n\n // Encode pool initializer data based on which initializer is being used\n // Each initializer expects a different InitData struct format:\n //\n // UniswapV4MulticurveInitializer (basic):\n // struct InitData { uint24 fee; int24 tickSpacing; Curve[] curves; BeneficiaryData[] beneficiaries; }\n //\n // UniswapV4ScheduledMulticurveInitializer:\n // struct InitData { uint24 fee; int24 tickSpacing; Curve[] curves; BeneficiaryData[] beneficiaries; uint32 startingTime; }\n //\n // DecayMulticurveInitializer:\n // struct InitData { uint24 startFee; uint24 fee; uint32 durationSeconds; int24 tickSpacing; Curve[] curves;\n // BeneficiaryData[] beneficiaries; uint32 startingTime; }\n //\n // DopplerHookInitializer:\n // struct InitData { uint24 fee; int24 tickSpacing; int24 farTick; Curve[] curves; BeneficiaryData[] beneficiaries;\n // address dopplerHook; bytes onInitializationDopplerHookCalldata; bytes graduationDopplerHookCalldata; }\n\n let poolInitializerData: Hex;\n\n if (useDopplerHookInitializer) {\n const hookConfig =\n initializerMode.type === 'rehype'\n ? initializerMode.hookConfig\n : undefined;\n // DopplerHookInitializer format (8 fields)\n // Calculate farTick: use provided value from dopplerHook, or auto-calculate from curves\n let farTick: number;\n if (hookConfig?.farTick !== undefined) {\n farTick = hookConfig.farTick;\n } else {\n // Auto-calculate from curves (max tickUpper)\n const allTickUppers = params.pool.curves.map((c) => c.tickUpper);\n farTick = Math.max(...allTickUppers);\n }\n\n // Encode dopplerHook initialization calldata if provided\n let onInitializationDopplerHookCalldata: Hex = '0x';\n let graduationDopplerHookCalldata: Hex = '0x';\n let dopplerHookAddress: Address = ZERO_ADDRESS;\n\n if (hookConfig) {\n dopplerHookAddress = hookConfig.hookAddress;\n onInitializationDopplerHookCalldata = encodeAbiParameters(\n [\n { type: 'address' }, // numeraire\n { type: 'address' }, // buybackDst\n { type: 'uint24' }, // customFee\n { type: 'uint256' }, // assetBuybackPercentWad\n { type: 'uint256' }, // numeraireBuybackPercentWad\n { type: 'uint256' }, // beneficiaryPercentWad\n { type: 'uint256' }, // lpPercentWad\n ],\n [\n params.sale.numeraire,\n hookConfig.buybackDestination,\n hookConfig.customFee,\n hookConfig.assetBuybackPercentWad,\n hookConfig.numeraireBuybackPercentWad,\n hookConfig.beneficiaryPercentWad,\n hookConfig.lpPercentWad,\n ],\n );\n graduationDopplerHookCalldata = hookConfig.graduationCalldata ?? '0x';\n }\n\n const dopplerHookTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'farTick', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'dopplerHook', type: 'address' },\n { name: 'onInitializationDopplerHookCalldata', type: 'bytes' },\n { name: 'graduationDopplerHookCalldata', type: 'bytes' },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: dopplerHookTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n farTick,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n dopplerHook: dopplerHookAddress,\n onInitializationDopplerHookCalldata,\n graduationDopplerHookCalldata,\n },\n ],\n );\n } else if (useDecayInitializer) {\n // DecayMulticurveInitializer format (7 fields)\n const decayTupleComponents = [\n { name: 'startFee', type: 'uint24' },\n { name: 'fee', type: 'uint24' },\n { name: 'durationSeconds', type: 'uint32' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'startingTime', type: 'uint32' },\n ];\n\n if (initializerMode.type !== 'decay') {\n throw new Error('Invalid multicurve initializer state for decay mode');\n }\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: decayTupleComponents }],\n [\n {\n startFee: initializerMode.startFee,\n fee: params.pool.fee,\n durationSeconds: initializerMode.durationSeconds,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n startingTime: initializerMode.startTime,\n },\n ],\n );\n } else if (useScheduledInitializer) {\n // UniswapV4ScheduledMulticurveInitializer format (5 fields)\n if (initializerMode.type !== 'scheduled') {\n throw new Error(\n 'Invalid multicurve initializer state for scheduled mode',\n );\n }\n const scheduledTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'startingTime', type: 'uint32' },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: scheduledTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n startingTime: initializerMode.startTime,\n },\n ],\n );\n } else {\n // UniswapV4MulticurveInitializer format (4 fields - basic)\n const basicTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: basicTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n },\n ],\n );\n }\n\n // Token factory data (standard vs 404)\n let tokenFactoryData: Hex;\n if (this.isDoppler404Token(params.token)) {\n const token404 = params.token;\n const unit = token404.unit !== undefined ? BigInt(token404.unit) : 1000n;\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [token404.name, token404.symbol, token404.baseURI, unit],\n );\n } else {\n const tokenStd = params.token as StandardTokenConfig;\n const vestingDuration = params.vesting?.duration ?? BigInt(0);\n const yearlyMintRate =\n tokenStd.yearlyMintRate ?? DEFAULT_V3_YEARLY_MINT_RATE;\n\n // Handle vesting recipients and amounts\n let vestingRecipients: Address[] = [];\n let vestingAmounts: bigint[] = [];\n\n if (params.vesting) {\n if (params.vesting.recipients && params.vesting.amounts) {\n // Use provided recipients and amounts\n vestingRecipients = params.vesting.recipients;\n vestingAmounts = params.vesting.amounts;\n } else {\n // Default: vest all non-sold tokens to userAddress\n vestingRecipients = [params.userAddress];\n vestingAmounts = [\n params.sale.initialSupply - params.sale.numTokensToSell,\n ];\n }\n }\n\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n tokenStd.name,\n tokenStd.symbol,\n yearlyMintRate,\n BigInt(vestingDuration),\n vestingRecipients,\n vestingAmounts,\n tokenStd.tokenURI,\n ],\n );\n }\n\n // Governance factory data\n const governanceFactoryData: Hex = (() => {\n if (params.governance.type === 'noOp') {\n return '0x' as Hex;\n }\n if (params.governance.type === 'launchpad') {\n return encodeAbiParameters(\n [{ type: 'address' }],\n [params.governance.multisig],\n );\n }\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint48' },\n { type: 'uint32' },\n { type: 'uint256' },\n ],\n [\n params.token.name,\n params.governance.type === 'custom'\n ? params.governance.initialVotingDelay\n : DEFAULT_V4_INITIAL_VOTING_DELAY,\n params.governance.type === 'custom'\n ? params.governance.initialVotingPeriod\n : DEFAULT_V4_INITIAL_VOTING_PERIOD,\n params.governance.type === 'custom'\n ? params.governance.initialProposalThreshold\n : DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n ],\n );\n })();\n\n // Resolve module addresses\n const salt = this.generateRandomSalt(params.userAddress);\n const resolvedTokenFactory: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\n : addresses.tokenFactory);\n if (!resolvedTokenFactory || resolvedTokenFactory === ZERO_ADDRESS) {\n throw new Error(\n 'Token factory address not configured. Provide an explicit address or ensure chain config includes a valid factory.',\n );\n }\n\n const resolvedInitializer: Address | undefined = (() => {\n if (useDopplerHookInitializer) {\n return (\n params.modules?.dopplerHookInitializer ??\n addresses.dopplerHookInitializer\n );\n }\n if (useDecayInitializer) {\n return (\n params.modules?.v4DecayMulticurveInitializer ??\n addresses.v4DecayMulticurveInitializer\n );\n }\n if (useScheduledInitializer) {\n return (\n params.modules?.v4ScheduledMulticurveInitializer ??\n addresses.v4ScheduledMulticurveInitializer\n );\n }\n return (\n params.modules?.v4MulticurveInitializer ??\n addresses.v4MulticurveInitializer\n );\n })();\n if (!resolvedInitializer || resolvedInitializer === ZERO_ADDRESS) {\n if (useDopplerHookInitializer) {\n throw new Error(\n 'DopplerHookInitializer address not configured on this chain. Override via builder.withDopplerHookInitializer() or update chain config.',\n );\n }\n if (useDecayInitializer) {\n throw new Error(\n 'Decay multicurve initializer address not configured on this chain. Override via builder.withV4DecayMulticurveInitializer() or update chain config.',\n );\n }\n throw new Error(\n useScheduledInitializer\n ? 'Scheduled multicurve initializer address not configured on this chain. Override via builder or update chain config.'\n : 'Multicurve initializer address not configured on this chain. Override via builder or update chain config.',\n );\n }\n\n // When beneficiaries are provided, use NoOpMigrator with empty data\n // The beneficiaries will be handled by the multicurve initializer, not the migrator\n const hasBeneficiaries =\n params.pool.beneficiaries && params.pool.beneficiaries.length > 0;\n\n let liquidityMigratorData: Hex;\n let resolvedMigrator: Address | undefined;\n\n if (hasBeneficiaries) {\n // Use NoOpMigrator with empty data when beneficiaries are provided\n liquidityMigratorData = '0x' as Hex;\n resolvedMigrator = params.modules?.noOpMigrator ?? addresses.noOpMigrator;\n if (!resolvedMigrator || resolvedMigrator === ZERO_ADDRESS) {\n throw new Error(\n 'NoOpMigrator address not configured on this chain. Override via modules.noOpMigrator or update chain config.',\n );\n }\n } else {\n // Use standard migration flow when no beneficiaries\n liquidityMigratorData = this.encodeMigrationData(params.migration);\n resolvedMigrator = this.getMigratorAddress(\n params.migration,\n params.modules,\n );\n if (!resolvedMigrator || resolvedMigrator === ZERO_ADDRESS) {\n throw new Error(\n 'Migrator address not configured on this chain. Override via builder or update chain config.',\n );\n }\n }\n\n const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n const createParams: CreateParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactory,\n tokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData,\n poolInitializer: resolvedInitializer,\n poolInitializerData,\n liquidityMigrator: resolvedMigrator,\n liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n salt,\n };\n\n return createParams;\n }\n\n async simulateCreateMulticurve(params: CreateMulticurveParams<C>): Promise<{\n createParams: CreateParams;\n tokenAddress: Address;\n poolId: Hex;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n tokenAddress: Address;\n poolId: Hex;\n transactionHash: string;\n }>;\n }> {\n const addresses = getAddresses(this.chainId);\n const createParams = this.encodeCreateMulticurveParams(params);\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate multicurve create');\n }\n\n // simResult[0] is \"asset\" in contract terminology, we call it tokenAddress for SDK consistency\n const tokenAddress = simResult[0] as Address;\n const poolId = await this.computeMulticurvePoolId(params, tokenAddress);\n\n return {\n createParams,\n tokenAddress,\n poolId,\n gasEstimate,\n execute: () =>\n this.createMulticurve(params, { _createParams: createParams }),\n };\n }\n\n async createMulticurve(\n params: CreateMulticurveParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{ tokenAddress: Address; poolId: Hex; transactionHash: string }> {\n const addresses = getAddresses(this.chainId);\n if (!this.walletClient)\n throw new Error('Wallet client required for write operations');\n\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n const createParams =\n options?._createParams ??\n (await this.simulateCreateMulticurve(params)).createParams;\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gas = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({ ...request, gas });\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash, confirmations: 2 });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract token address from Create event in transaction logs',\n );\n }\n\n const actualTokenAddress = actualAddresses.tokenAddress;\n\n // Warn if simulation predicted different address (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 1) {\n const simulatedToken = simResult[0] as Address;\n if (simulatedToken.toLowerCase() !== actualTokenAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualTokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n // Compute poolId from the PoolKey using actual token address\n const poolId = await this.computeMulticurvePoolId(\n params,\n actualTokenAddress,\n );\n\n return { tokenAddress: actualTokenAddress, poolId, transactionHash: hash };\n }\n\n /**\n * Normalize user-provided multicurve positions and ensure they satisfy SDK constraints\n */\n private normalizeMulticurveCurves(\n curves: CreateMulticurveParams['pool']['curves'],\n tickSpacing: number,\n ): CreateMulticurveParams['pool']['curves'] {\n if (tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n if (!curves.length) {\n throw new Error('Multicurve pool must include at least one curve');\n }\n\n let totalShares = 0n;\n let mostPositiveTickUpper: number | undefined;\n\n const sanitizedCurves = curves.map((curve) => {\n const sanitized = { ...curve };\n\n if (\n !Number.isFinite(sanitized.tickLower) ||\n !Number.isFinite(sanitized.tickUpper)\n ) {\n throw new Error('Multicurve ticks must be finite numbers');\n }\n if (sanitized.tickLower >= sanitized.tickUpper) {\n throw new Error(\n 'Multicurve curve tickLower must be less than tickUpper',\n );\n }\n if (\n !Number.isInteger(sanitized.numPositions) ||\n sanitized.numPositions <= 0\n ) {\n throw new Error(\n 'Multicurve curve numPositions must be a positive integer',\n );\n }\n if (sanitized.shares <= 0n) {\n throw new Error('Multicurve curve shares must be positive');\n }\n\n totalShares += sanitized.shares;\n if (totalShares > WAD) {\n throw new Error('Total multicurve shares cannot exceed 100% (1e18)');\n }\n\n if (\n mostPositiveTickUpper === undefined ||\n sanitized.tickUpper > mostPositiveTickUpper\n ) {\n mostPositiveTickUpper = sanitized.tickUpper;\n }\n\n return sanitized;\n });\n\n if (totalShares === WAD) {\n return sanitizedCurves;\n }\n\n const missingShare = WAD - totalShares;\n if (missingShare <= 0n) {\n return sanitizedCurves;\n }\n\n const fallbackTickLower = mostPositiveTickUpper;\n if (fallbackTickLower === undefined) {\n throw new Error('Unable to determine fallback multicurve tick range');\n }\n\n const fallbackTickUpper = this.roundMaxTickDown(tickSpacing);\n\n const fallbackCurve = {\n // Extend from the most positive user tick out to the maximum supported tick bucket\n tickLower: fallbackTickLower,\n tickUpper: fallbackTickUpper,\n numPositions:\n sanitizedCurves[sanitizedCurves.length - 1]?.numPositions ?? 1,\n shares: missingShare,\n };\n\n return [...sanitizedCurves, fallbackCurve];\n }\n\n private roundMaxTickDown(tickSpacing: number): number {\n if (tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n\n const rounded = Math.floor(MAX_TICK / tickSpacing) * tickSpacing;\n return rounded;\n }\n\n private validateStaticAuctionParams(params: CreateStaticAuctionParams): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate tick range\n if (params.pool.startTick >= params.pool.endTick) {\n throw new Error('Start tick must be less than end tick');\n }\n\n const tickSpacing = (TICK_SPACINGS as Record<number, number>)[\n params.pool.fee\n ];\n if (tickSpacing === undefined) {\n throw new Error(\n `Unsupported fee tier ${params.pool.fee} for static auctions`,\n );\n }\n\n if (params.pool.startTick < MIN_TICK || params.pool.endTick > MAX_TICK) {\n throw new Error(\n `Ticks must be within the allowed range (${MIN_TICK} to ${MAX_TICK})`,\n );\n }\n\n const startTickAligned = params.pool.startTick % tickSpacing === 0;\n const endTickAligned = params.pool.endTick % tickSpacing === 0;\n if (!startTickAligned || !endTickAligned) {\n throw new Error(\n `Pool ticks must be multiples of tick spacing ${tickSpacing} for fee tier ${params.pool.fee}`,\n );\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate vesting if provided\n if (params.vesting) {\n // Validate recipients and amounts arrays match\n if (params.vesting.recipients && params.vesting.amounts) {\n if (\n params.vesting.recipients.length !== params.vesting.amounts.length\n ) {\n throw new Error(\n 'Vesting recipients and amounts arrays must have the same length',\n );\n }\n if (params.vesting.recipients.length === 0) {\n throw new Error('Vesting recipients array cannot be empty');\n }\n // Validate total vested amount doesn't exceed available tokens\n const totalVested = params.vesting.amounts.reduce(\n (sum, amt) => sum + amt,\n BigInt(0),\n );\n const availableForVesting =\n params.sale.initialSupply - params.sale.numTokensToSell;\n if (totalVested > availableForVesting) {\n throw new Error(\n `Total vesting amount (${totalVested}) exceeds available tokens (${availableForVesting})`,\n );\n }\n } else {\n // Default case: validate there are tokens available for vesting\n const vestedAmount =\n params.sale.initialSupply - params.sale.numTokensToSell;\n if (vestedAmount <= BigInt(0)) {\n throw new Error('No tokens available for vesting');\n }\n }\n }\n\n // Validate migration config\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n\n // Validate pool beneficiaries for V3 locked pools\n if (params.pool.beneficiaries && params.pool.beneficiaries.length > 0) {\n const beneficiaries = params.pool.beneficiaries;\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Pool beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n\n // Validate each beneficiary has positive shares\n for (const b of beneficiaries) {\n if (b.shares <= 0n) {\n throw new Error('Each beneficiary must have positive shares');\n }\n }\n }\n }\n\n /**\n * Validate dynamic auction parameters\n */\n private validateDynamicAuctionParams(\n params: CreateDynamicAuctionParams,\n ): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate tick range\n const isToken0 = isToken0Expected(params.sale.numeraire);\n if (isToken0 && params.auction.startTick <= params.auction.endTick) {\n throw new Error(\n 'Start tick must be greater than end tick if base token is currency0',\n );\n }\n if (!isToken0 && params.auction.startTick >= params.auction.endTick) {\n throw new Error(\n 'Start tick must be less than end tick if base token is currency1',\n );\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate auction parameters\n if (params.auction.duration <= 0) {\n throw new Error('Auction duration must be positive');\n }\n if (params.auction.epochLength <= 0) {\n throw new Error('Epoch length must be positive');\n }\n if (params.pool.tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n\n // Validate tick spacing against Doppler contract constraint\n // @see Doppler.sol line 159: `int24 constant MAX_TICK_SPACING = 30`\n if (params.pool.tickSpacing > DOPPLER_MAX_TICK_SPACING) {\n throw new Error(\n `Dynamic auctions require tickSpacing <= ${DOPPLER_MAX_TICK_SPACING} (Doppler.sol MAX_TICK_SPACING). ` +\n `Got tickSpacing=${params.pool.tickSpacing}. ` +\n `Use withMarketCapRange() which handles this automatically, or use a smaller tickSpacing with poolConfig().`,\n );\n }\n\n // Validate that total duration is divisible by epoch length\n if (params.auction.duration % params.auction.epochLength !== 0) {\n throw new Error('Epoch length must divide total duration evenly');\n }\n\n // Validate gamma if provided\n if (params.auction.gamma !== undefined) {\n if (params.auction.gamma % params.pool.tickSpacing !== 0) {\n throw new Error('Gamma must be divisible by tick spacing');\n }\n }\n\n // Validate migration config\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n }\n\n /**\n * Validate multicurve auction parameters\n */\n private validateMulticurveParams(params: CreateMulticurveParams<C>): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate initializer mode / compatibility and mode-specific constraints.\n this.resolveMulticurveInitializerMode(params);\n\n // Validate vesting if provided\n if (params.vesting) {\n // Validate recipients and amounts arrays match\n if (params.vesting.recipients && params.vesting.amounts) {\n if (\n params.vesting.recipients.length !== params.vesting.amounts.length\n ) {\n throw new Error(\n 'Vesting recipients and amounts arrays must have the same length',\n );\n }\n if (params.vesting.recipients.length === 0) {\n throw new Error('Vesting recipients array cannot be empty');\n }\n // Validate total vested amount doesn't exceed available tokens\n const totalVested = params.vesting.amounts.reduce(\n (sum, amt) => sum + amt,\n BigInt(0),\n );\n const availableForVesting =\n params.sale.initialSupply - params.sale.numTokensToSell;\n if (totalVested > availableForVesting) {\n throw new Error(\n `Total vesting amount (${totalVested}) exceeds available tokens (${availableForVesting})`,\n );\n }\n }\n }\n\n // Validate pool beneficiaries if provided\n if (params.pool.beneficiaries && params.pool.beneficiaries.length > 0) {\n const beneficiaries = params.pool.beneficiaries;\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Pool beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n for (const b of beneficiaries) {\n if (b.shares <= 0n) {\n throw new Error('Each beneficiary must have positive shares');\n }\n }\n }\n\n // Validate migration config for V4\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n }\n\n /**\n * Get the airlock contract address for the current chain\n */\n private getAirlockAddress(): Address {\n const addresses = getAddresses(this.chainId);\n return addresses.airlock;\n }\n\n /**\n * Get the appropriate initializer address based on auction type\n */\n private getInitializerAddress(isStatic: boolean): Address {\n const addresses = getAddresses(this.chainId);\n return isStatic ? addresses.v3Initializer : addresses.v4Initializer;\n }\n\n /**\n * Get the Bundler contract address for the current chain\n * Used to perform atomic create + swap (\"bundle\") flows for static auctions\n */\n private getBundlerAddress(): Address {\n const addresses = getAddresses(this.chainId);\n const addr = addresses.bundler;\n if (!addr || addr === zeroAddress) {\n throw new Error('Bundler address not configured for this chain');\n }\n return addr;\n }\n\n /**\n * Get the appropriate migrator address based on migration config\n * Allows override via ModuleAddressOverrides when provided in params.\n */\n private getMigratorAddress(\n config: MigrationConfig,\n overrides?: ModuleAddressOverrides,\n ): Address {\n const addresses = getAddresses(this.chainId);\n\n switch (config.type) {\n case 'uniswapV2':\n return overrides?.v2Migrator ?? addresses.v2Migrator;\n case 'uniswapV4': {\n const v4Address = overrides?.v4Migrator ?? addresses.v4Migrator;\n if (v4Address === '0x0000000000000000000000000000000000000000') {\n throw new Error(\n 'UniswapV4Migrator not deployed on this chain. Use uniswapV2 migration or provide override via modules.v4Migrator.',\n );\n }\n return v4Address;\n }\n case 'noOp': {\n const noOpAddress = overrides?.noOpMigrator ?? addresses.noOpMigrator;\n if (!noOpAddress) {\n throw new Error(\n 'NoOpMigrator not configured on this chain. Provide override via modules.noOpMigrator or update chain config.',\n );\n }\n return noOpAddress;\n }\n\n default:\n throw new Error('Unknown migration type');\n }\n }\n\n // computeTicks moved to builders. No longer needed here.\n // computeOptimalGamma moved to utils.\n\n // -----------------------------\n // Bundler helpers (Static/V3)\n // -----------------------------\n\n /**\n * Simulate a bundle with exact input on Uniswap V3 as part of create\n * Returns the expected output amount for the provided exact input.\n */\n async simulateBundleExactInput(\n createParams: CreateParams,\n params: {\n tokenIn: Address;\n tokenOut: Address;\n amountIn: bigint;\n fee: number;\n sqrtPriceLimitX96: bigint;\n },\n ): Promise<bigint> {\n const bundler = this.getBundlerAddress();\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateBundleExactIn',\n args: [\n { ...createParams },\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n fee: params.fee,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n },\n ],\n });\n return result as unknown as bigint;\n }\n\n /**\n * Simulate a bundle with exact output on Uniswap V3 as part of create\n * Returns the required input amount for the provided exact output.\n */\n async simulateBundleExactOutput(\n createParams: CreateParams,\n params: {\n tokenIn: Address;\n tokenOut: Address;\n amount: bigint;\n fee: number;\n sqrtPriceLimitX96: bigint;\n },\n ): Promise<bigint> {\n const bundler = this.getBundlerAddress();\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateBundleExactOut',\n args: [\n { ...createParams },\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amount: params.amount,\n fee: params.fee,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n },\n ],\n });\n return result as unknown as bigint;\n }\n\n // Bundler helpers (Multicurve/V4)\n async simulateMulticurveBundleExactOut(\n createParams: CreateParams,\n params?: {\n exactAmountOut?: bigint;\n },\n ): Promise<MulticurveBundleExactOutResult> {\n const bundler = this.getBundlerAddress();\n await this.ensureMulticurveBundlerSupport(bundler);\n const exactAmountOut = params?.exactAmountOut ?? 0n;\n this.ensureUint128(exactAmountOut, 'exactAmountOut', { allowZero: true });\n const hookData = '0x' as Hex;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateMulticurveBundleExactOut',\n args: [{ ...createParams }, exactAmountOut, hookData],\n });\n\n const { asset, poolKey, amount, gasEstimate } =\n this.parseMulticurveBundleResult(result);\n\n return {\n asset,\n poolKey,\n amountIn: amount,\n gasEstimate,\n };\n }\n\n async simulateMulticurveBundleExactIn(\n createParams: CreateParams,\n params: {\n exactAmountIn: bigint;\n },\n ): Promise<MulticurveBundleExactInResult> {\n const bundler = this.getBundlerAddress();\n await this.ensureMulticurveBundlerSupport(bundler);\n if (params.exactAmountIn === undefined) {\n throw new Error(\n 'exactAmountIn is required for multicurve bundle simulations',\n );\n }\n const exactAmountIn = params.exactAmountIn;\n this.ensureUint128(exactAmountIn, 'exactAmountIn');\n const hookData = '0x' as Hex;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateMulticurveBundleExactIn',\n args: [{ ...createParams }, exactAmountIn, hookData],\n });\n\n const { asset, poolKey, amount, gasEstimate } =\n this.parseMulticurveBundleResult(result);\n\n return {\n asset,\n poolKey,\n amountOut: amount,\n gasEstimate,\n };\n }\n\n /**\n * Execute an atomic create + swap bundle through the Bundler\n * commands/inputs are Universal Router encoded values (e.g., from doppler-router)\n */\n async bundle(\n createParams: CreateParams,\n commands: Hex,\n inputs: Hex[],\n options?: { gas?: bigint; value?: bigint },\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const bundler = this.getBundlerAddress();\n const { request } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'bundle',\n args: [{ ...createParams }, commands, inputs],\n account: this.walletClient.account,\n value: options?.value ?? 0n,\n });\n const gas = options?.gas ?? undefined;\n const tx = await this.walletClient.writeContract(\n gas ? { ...request, gas } : request,\n );\n return tx;\n }\n\n private ensureUint128(\n value: bigint,\n paramName: string,\n options: { allowZero?: boolean } = {},\n ): void {\n const { allowZero = false } = options;\n if (value < 0n) {\n throw new Error(`${paramName} cannot be negative`);\n }\n if (!allowZero && value === 0n) {\n throw new Error(`${paramName} must be greater than zero`);\n }\n if (value > MAX_UINT128) {\n throw new Error(`${paramName} exceeds uint128 range`);\n }\n }\n\n private parseMulticurveBundleResult(result: unknown): {\n asset: Address;\n poolKey: V4PoolKey;\n amount: bigint;\n gasEstimate: bigint;\n } {\n let asset: Address | undefined;\n let poolKeyRaw: unknown;\n let amount: bigint | undefined;\n let gasEstimate: bigint | undefined;\n\n if (Array.isArray(result)) {\n if (result.length < 4) {\n throw new Error('Unexpected multicurve bundle simulation result shape');\n }\n asset = result[0] as Address;\n poolKeyRaw = result[1];\n amount = result[2] as bigint;\n gasEstimate = result[3] as bigint;\n } else if (result && typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n asset = obj.asset as Address | undefined;\n poolKeyRaw = obj.poolKey;\n amount = (obj.amountIn ?? obj.amountOut ?? obj.amount) as\n | bigint\n | undefined;\n gasEstimate = obj.gasEstimate as bigint | undefined;\n } else {\n throw new Error('Unexpected multicurve bundle simulation result format');\n }\n\n if (\n asset === undefined ||\n poolKeyRaw === undefined ||\n amount === undefined ||\n gasEstimate === undefined\n ) {\n throw new Error('Incomplete multicurve bundle simulation result');\n }\n\n return {\n asset,\n poolKey: this.normalizePoolKey(poolKeyRaw),\n amount,\n gasEstimate,\n };\n }\n\n private normalizePoolKey(value: any): V4PoolKey {\n if (Array.isArray(value)) {\n const [currency0, currency1, feeRaw, tickSpacingRaw, hooks] = value as [\n Address,\n Address,\n number | bigint,\n number | bigint,\n Address,\n ];\n const feeValue = Number(feeRaw);\n const tickSpacingValue = Number(tickSpacingRaw);\n if (!Number.isFinite(feeValue) || !Number.isFinite(tickSpacingValue)) {\n throw new Error(\n 'Invalid pool key numeric fields in multicurve bundle simulation result',\n );\n }\n return {\n currency0: currency0 as Address,\n currency1: currency1 as Address,\n fee: feeValue,\n tickSpacing: tickSpacingValue,\n hooks: hooks as Address,\n };\n }\n if (value && typeof value === 'object') {\n const { currency0, currency1, fee, tickSpacing, hooks } = value as Record<\n string,\n unknown\n >;\n const feeValue = Number(fee);\n const tickSpacingValue = Number(tickSpacing);\n if (!Number.isFinite(feeValue) || !Number.isFinite(tickSpacingValue)) {\n throw new Error(\n 'Invalid pool key numeric fields in multicurve bundle simulation result',\n );\n }\n return {\n currency0: currency0 as Address,\n currency1: currency1 as Address,\n fee: feeValue,\n tickSpacing: tickSpacingValue,\n hooks: hooks as Address,\n };\n }\n throw new Error(\n 'Unable to normalize PoolKey from multicurve bundle simulation result',\n );\n }\n /**\n * Mines a salt and hook address with the appropriate flags\n *\n * This method iterates through possible salt values to find a combination that:\n * - Produces a hook address with required Doppler flags\n * - Maintains proper token ordering relative to numeraire\n * - Ensures deterministic deployment addresses\n *\n * @param params - Parameters for hook address mining\n * @returns Tuple of [salt, hook address, token address, pool data, token data]\n * @throws {Error} If no valid salt can be found within the search limit\n * @private\n */\n private mineHookAddress(params: {\n airlock: Address;\n poolManager: Address;\n deployer: Address;\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n tokenFactory: Address;\n tokenFactoryData:\n | {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n }\n | {\n name: string;\n symbol: string;\n initialSupply: bigint;\n airlock: Address;\n yearlyMintRate: bigint;\n vestingDuration: bigint;\n recipients: Address[];\n amounts: bigint[];\n tokenURI: string;\n };\n poolInitializer: Address;\n poolInitializerData: {\n minimumProceeds: bigint;\n maximumProceeds: bigint;\n startingTime: bigint;\n endingTime: bigint;\n startingTick: number;\n endingTick: number;\n epochLength: bigint;\n gamma: number;\n numPDSlugs: bigint;\n fee: number;\n tickSpacing: number;\n };\n customDerc20Bytecode?: `0x${string}`;\n tokenVariant?: 'standard' | 'doppler404';\n }): [Hash, Address, Address, Hex, Hex] {\n const isToken0 = isToken0Expected(params.numeraire);\n\n const {\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n numPDSlugs,\n fee,\n tickSpacing,\n } = params.poolInitializerData;\n\n const poolInitializerData = encodeAbiParameters(\n [\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'int24' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'bool' },\n { type: 'uint256' },\n { type: 'uint24' },\n { type: 'int24' },\n ],\n [\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n isToken0,\n numPDSlugs,\n fee,\n tickSpacing,\n ],\n );\n\n const { poolManager, numTokensToSell, poolInitializer } = params;\n\n const hookInitHashData = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'int24' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'bool' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'uint24' },\n ],\n [\n poolManager,\n numTokensToSell,\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n isToken0,\n numPDSlugs,\n poolInitializer,\n fee,\n ],\n );\n\n const hookInitHash = keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [DopplerBytecode as Hex, hookInitHashData],\n ),\n );\n\n const tokenFactoryData =\n params.tokenVariant === 'doppler404'\n ? (() => {\n const t = params.tokenFactoryData as {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n };\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [t.name, t.symbol, t.baseURI, t.unit ?? 1000n],\n );\n })()\n : (() => {\n const {\n name,\n symbol,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n initialSupply: bigint;\n airlock: Address;\n yearlyMintRate: bigint;\n vestingDuration: bigint;\n recipients: Address[];\n amounts: bigint[];\n tokenURI: string;\n };\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n name,\n symbol,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n ],\n );\n })();\n\n // Compute token init hash; use DN404 bytecode if tokenVariant is doppler404\n let tokenInitHash: Hash | undefined;\n if (params.tokenVariant === 'doppler404') {\n const { name, symbol, baseURI } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n };\n const { airlock, initialSupply } = params;\n // DN404 constructor: (name, symbol, initialSupply, recipient, owner, baseURI)\n const initHashData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'address' },\n { type: 'string' },\n ],\n [name, symbol, initialSupply, airlock, airlock, baseURI],\n );\n tokenInitHash = keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [DopplerDN404Bytecode as Hex, initHashData],\n ),\n );\n } else {\n const {\n name,\n symbol,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n initialSupply: bigint;\n airlock: Address;\n yearlyMintRate: bigint;\n vestingDuration: bigint;\n recipients: Address[];\n amounts: bigint[];\n tokenURI: string;\n };\n const { airlock, initialSupply } = params;\n const initHashData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'address' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n name,\n symbol,\n initialSupply,\n airlock,\n airlock,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n ],\n );\n // Use DERC2080Bytecode for TokenFactory80, DERC20Bytecode otherwise\n const isTokenFactory80 =\n params.tokenFactory.toLowerCase() === TOKEN_FACTORY_80_ADDRESS;\n const bytecode = isTokenFactory80\n ? (DERC2080Bytecode as Hex)\n : ((params.customDerc20Bytecode as Hex) ?? (DERC20Bytecode as Hex));\n\n tokenInitHash = keccak256(\n encodePacked(['bytes', 'bytes'], [bytecode, initHashData]),\n );\n }\n\n // Use the exact flags from V4 SDK\n const flags = BigInt(\n (1 << 13) | // BEFORE_INITIALIZE_FLAG\n (1 << 12) | // AFTER_INITIALIZE_FLAG\n (1 << 11) | // BEFORE_ADD_LIQUIDITY_FLAG\n (1 << 7) | // BEFORE_SWAP_FLAG\n (1 << 6) | // AFTER_SWAP_FLAG\n (1 << 5), // BEFORE_DONATE_FLAG\n );\n\n // Pre-compute values outside the loop (optimization)\n const numeraireBigInt = BigInt(params.numeraire);\n\n // Pre-allocate CREATE2 buffers with constant parts\n const hookBuffer = this.prepareCreate2Buffer(params.deployer, hookInitHash);\n const tokenBuffer = tokenInitHash\n ? this.prepareCreate2Buffer(params.tokenFactory, tokenInitHash)\n : null;\n\n for (let salt = 0n; salt < 1_000_000n; salt++) {\n // Update salt in pre-computed buffer (avoids string formatting)\n this.updateSaltInBuffer(hookBuffer, salt);\n\n // Compute hook address using fast method (no checksum)\n const hookRaw = this.computeCreate2AddressFast(hookBuffer);\n const hookBigInt = BigInt(hookRaw);\n\n // Early termination: skip token computation if hook flags don't match\n // Only ~1 in 8192 addresses match the required flags, so this saves ~50% of keccak256 calls\n if ((hookBigInt & FLAG_MASK) !== flags) {\n continue;\n }\n\n if (tokenBuffer) {\n // Update salt in token buffer\n this.updateSaltInBuffer(tokenBuffer, salt);\n\n // Compute token address using fast method\n const tokenRaw = this.computeCreate2AddressFast(tokenBuffer);\n const tokenBigInt = BigInt(tokenRaw);\n\n if (\n (isToken0 && tokenBigInt < numeraireBigInt) ||\n (!isToken0 && tokenBigInt > numeraireBigInt)\n ) {\n // Found a match! Convert to proper format for return\n const saltBytes = `0x${salt.toString(16).padStart(64, '0')}` as Hash;\n const hook = getAddress(hookRaw) as Address;\n const token = getAddress(tokenRaw) as Address;\n return [\n saltBytes,\n hook,\n token,\n poolInitializerData,\n tokenFactoryData,\n ];\n }\n }\n }\n\n throw new Error('AirlockMiner: could not find salt');\n }\n\n /**\n * Computes the CREATE2 address for a contract deployment\n * @param salt - The salt used for deployment\n * @param initCodeHash - Hash of the initialization code\n * @param deployer - Address of the deploying contract\n * @returns The computed contract address\n * @private\n */\n private computeCreate2Address(\n salt: Hash,\n initCodeHash: Hash,\n deployer: Address,\n ): Address {\n const encoded = encodePacked(\n ['bytes1', 'address', 'bytes32', 'bytes32'],\n ['0xff', deployer, salt, initCodeHash],\n );\n return getAddress(`0x${keccak256(encoded).slice(-40)}`);\n }\n\n /**\n * Helper to convert hex string to Uint8Array\n * @private\n */\n private hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substr(i * 2, 2), 16);\n }\n return bytes;\n }\n\n /**\n * Helper to convert Uint8Array to hex string\n * @private\n */\n private bytesToHex(bytes: Uint8Array): string {\n return (\n '0x' +\n Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n );\n }\n\n /**\n * Pre-compute CREATE2 buffer with constant prefix for fast mining\n * Buffer layout: 0xff (1 byte) + deployer (20 bytes) + salt (32 bytes) + initCodeHash (32 bytes) = 85 bytes\n * @private\n */\n private prepareCreate2Buffer(\n deployer: Address,\n initCodeHash: Hash,\n ): Uint8Array {\n const buffer = new Uint8Array(85);\n buffer[0] = 0xff;\n const deployerBytes = this.hexToBytes(deployer);\n buffer.set(deployerBytes, 1);\n const initCodeHashBytes = this.hexToBytes(initCodeHash);\n buffer.set(initCodeHashBytes, 53); // 1 + 20 + 32 = 53\n return buffer;\n }\n\n /**\n * Update salt in pre-computed CREATE2 buffer (bytes 21-52)\n * Uses direct byte manipulation instead of string conversion\n * @private\n */\n private updateSaltInBuffer(buffer: Uint8Array, salt: bigint): void {\n // Salt is 32 bytes, positioned at offset 21 (after 0xff + 20-byte deployer)\n // Clear salt region first\n for (let i = 21; i < 53; i++) {\n buffer[i] = 0;\n }\n // Write salt bytes from right to left (big-endian)\n let remaining = salt;\n for (let i = 52; remaining > 0n && i >= 21; i--) {\n buffer[i] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n }\n\n /**\n * Compute CREATE2 address from pre-computed buffer (fast version for mining)\n * Returns raw lowercase address without checksum for comparison\n * @private\n */\n private computeCreate2AddressFast(buffer: Uint8Array): string {\n const hash = keccak256(this.bytesToHex(buffer) as Hex);\n // Return last 40 hex chars (20 bytes) as lowercase address\n return '0x' + hash.slice(-40).toLowerCase();\n }\n\n /**\n * Compute V4 pool ID from pool key components\n */\n private computePoolId(poolKey: {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n }): string {\n // V4 pools are identified by the hash of their PoolKey\n const encoded = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'address' },\n { type: 'uint24' },\n { type: 'int24' },\n { type: 'address' },\n ],\n [\n poolKey.currency0,\n poolKey.currency1,\n poolKey.fee,\n poolKey.tickSpacing,\n poolKey.hooks,\n ],\n );\n return keccak256(encoded);\n }\n\n /**\n * Compute the V4 poolId for a multicurve pool by reading the hook address from the initializer\n */\n private async computeMulticurvePoolId(\n params: CreateMulticurveParams<C>,\n tokenAddress: Address,\n ): Promise<Hex> {\n const addresses = getAddresses(this.chainId);\n\n const initializerMode = this.resolveMulticurveInitializerMode(params);\n let hookAddress: Address;\n if (initializerMode.type === 'rehype') {\n // For DopplerHookInitializer mode, hook address comes from the encoded\n // initializer payload (or defaults to zero when no hook config is set).\n hookAddress = initializerMode.hookConfig?.hookAddress ?? ZERO_ADDRESS;\n } else {\n const initializerAddress = (() => {\n if (initializerMode.type === 'decay') {\n return (\n params.modules?.v4DecayMulticurveInitializer ??\n addresses.v4DecayMulticurveInitializer\n );\n }\n if (initializerMode.type === 'scheduled') {\n return (\n params.modules?.v4ScheduledMulticurveInitializer ??\n addresses.v4ScheduledMulticurveInitializer\n );\n }\n return (\n params.modules?.v4MulticurveInitializer ??\n addresses.v4MulticurveInitializer\n );\n })();\n\n if (!initializerAddress) {\n throw new Error('Multicurve initializer address not configured');\n }\n\n // Standard/scheduled/decay initializers expose HOOK() directly.\n hookAddress = (await (this.publicClient as PublicClient).readContract({\n address: initializerAddress,\n abi: v4MulticurveInitializerAbi,\n functionName: 'HOOK',\n })) as Address;\n }\n\n // Construct the pool key and compute poolId\n const numeraire = params.sale.numeraire;\n const currency0 = tokenAddress < numeraire ? tokenAddress : numeraire;\n const currency1 = tokenAddress < numeraire ? numeraire : tokenAddress;\n const fee =\n initializerMode.type === 'decay' ? DYNAMIC_FEE_FLAG : params.pool.fee;\n\n return this.computePoolId({\n currency0,\n currency1,\n fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: hookAddress,\n }) as Hex;\n }\n\n private async ensureMulticurveBundlerSupport(\n bundler: Address,\n ): Promise<void> {\n if (this.multicurveBundlerSupport.get(bundler)) {\n return;\n }\n\n const client = this.publicClient as PublicClient;\n if (!client || typeof client.getBytecode !== 'function') {\n // If we cannot check support, optimistically assume true.\n this.multicurveBundlerSupport.set(bundler, true);\n return;\n }\n\n const bytecode = await client.getBytecode({ address: bundler });\n const supports = Boolean(\n bytecode &&\n MULTICURVE_BUNDLER_SELECTORS.every((selector) =>\n bytecode.includes(selector.slice(2)),\n ),\n );\n\n if (!supports) {\n throw new Error(\n `Bundler at ${bundler} does not support multicurve bundling. Ensure the Doppler Bundler has been upgraded and update chain addresses.`,\n );\n }\n\n this.multicurveBundlerSupport.set(bundler, true);\n }\n}\n\nconst MULTICURVE_BUNDLER_SELECTORS = ['0xe2e9faa1', '0x07087b06'] as const;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/entities/DopplerFactory.ts"],"names":["resolved","decoded"],"mappings":"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","file":"chunk-KITPRKQ4.mjs","sourcesContent":["import {\n type Address,\n type Hex,\n type Hash,\n type PublicClient,\n type WalletClient,\n type Account,\n encodeAbiParameters,\n encodePacked,\n keccak256,\n getAddress,\n decodeEventLog,\n toHex,\n} from 'viem';\nimport type {\n CreateStaticAuctionParams,\n CreateDynamicAuctionParams,\n CreateMulticurveParams,\n MigrationConfig,\n SupportedPublicClient,\n TokenConfig,\n Doppler404TokenConfig,\n StandardTokenConfig,\n SupportedChainId,\n CreateParams,\n MulticurveBundleExactInResult,\n MulticurveBundleExactOutResult,\n V4PoolKey,\n RehypeDopplerHookConfig,\n} from '../types';\nimport type { ModuleAddressOverrides } from '../types';\nimport { getAddresses } from '../addresses';\nimport { zeroAddress } from 'viem';\nimport {\n ZERO_ADDRESS,\n WAD,\n DEFAULT_PD_SLUGS,\n FLAG_MASK,\n DEFAULT_V3_NUM_POSITIONS,\n DEFAULT_V3_YEARLY_MINT_RATE,\n DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n DEFAULT_V4_YEARLY_MINT_RATE,\n DEFAULT_V3_INITIAL_VOTING_DELAY,\n DEFAULT_V3_INITIAL_VOTING_PERIOD,\n DEFAULT_V3_INITIAL_PROPOSAL_THRESHOLD,\n DEFAULT_V4_INITIAL_VOTING_DELAY,\n DEFAULT_V4_INITIAL_VOTING_PERIOD,\n DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n DEFAULT_CREATE_GAS_LIMIT,\n TICK_SPACINGS,\n DOPPLER_MAX_TICK_SPACING,\n DYNAMIC_FEE_FLAG,\n DECAY_MAX_START_FEE,\n V4_MAX_FEE,\n} from '../constants';\nimport {\n computeOptimalGamma,\n MIN_TICK,\n MAX_TICK,\n isToken0Expected,\n} from '../utils';\nimport {\n airlockAbi,\n bundlerAbi,\n DERC20Bytecode,\n DERC2080Bytecode,\n DopplerBytecode,\n DopplerDN404Bytecode,\n v4MulticurveInitializerAbi,\n} from '../abis';\n\n// Type definition for the custom migration encoder function\nexport type MigrationEncoder = (config: MigrationConfig) => Hex;\n\nconst MAX_UINT128 = (1n << 128n) - 1n;\n\n// TokenFactory80 has the same deterministic CREATE2 address across all chains\nconst TOKEN_FACTORY_80_ADDRESS =\n '0xf0b5141dd9096254b2ca624dff26024f46087229' as const;\n\ntype ResolvedMulticurveInitializerMode =\n | { type: 'standard' }\n | { type: 'scheduled'; startTime: number }\n | { type: 'decay'; startTime: number; startFee: number; durationSeconds: number }\n | { type: 'rehype'; hookConfig?: RehypeDopplerHookConfig };\n\nexport class DopplerFactory<C extends SupportedChainId = SupportedChainId> {\n private publicClient: SupportedPublicClient;\n private walletClient?: WalletClient;\n private chainId: C;\n private customMigrationEncoder?: MigrationEncoder;\n\n private multicurveBundlerSupport = new Map<Address, boolean>();\n\n constructor(\n publicClient: SupportedPublicClient,\n walletClient: WalletClient | undefined,\n chainId: C,\n ) {\n this.publicClient = publicClient;\n this.walletClient = walletClient;\n this.chainId = chainId;\n }\n\n /**\n * Set a custom migration data encoder function\n * @param encoder Custom function to encode migration data\n * @returns The factory instance for method chaining\n */\n withCustomMigrationEncoder(encoder: MigrationEncoder): this {\n this.customMigrationEncoder = encoder;\n return this;\n }\n\n async encodeCreateStaticAuctionParams(\n params: CreateStaticAuctionParams<C>,\n ): Promise<CreateParams> {\n // Validate parameters\n this.validateStaticAuctionParams(params);\n\n const addresses = getAddresses(this.chainId);\n\n // Check if beneficiaries are provided - this determines which initializer to use\n const hasBeneficiaries =\n params.pool.beneficiaries && params.pool.beneficiaries.length > 0;\n\n // 1. Encode pool initializer data\n // Standard V3 initializer expects InitData struct WITHOUT beneficiaries (5 fields)\n // Lockable V3 initializer expects InitData struct WITH beneficiaries (6 fields)\n let poolInitializerData: Hex;\n\n if (hasBeneficiaries) {\n // Sort beneficiaries by address (ascending) as required by the contract\n const sortedBeneficiaries = params.pool\n .beneficiaries!.slice()\n .sort((a, b) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n });\n\n // Lockable V3 initializer encoding (6 fields including beneficiaries)\n poolInitializerData = encodeAbiParameters(\n [\n {\n type: 'tuple',\n components: [\n { type: 'uint24', name: 'fee' },\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'maxShareToBeSold' },\n {\n type: 'tuple[]',\n name: 'beneficiaries',\n components: [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ],\n },\n ],\n },\n ],\n [\n {\n fee: params.pool.fee,\n tickLower: params.pool.startTick,\n tickUpper: params.pool.endTick,\n numPositions: params.pool.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.pool.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n beneficiaries: sortedBeneficiaries.map((b) => ({\n beneficiary: b.beneficiary,\n shares: b.shares,\n })),\n },\n ],\n );\n } else {\n // Standard V3 initializer encoding (5 fields, no beneficiaries)\n poolInitializerData = encodeAbiParameters(\n [\n {\n type: 'tuple',\n components: [\n { type: 'uint24', name: 'fee' },\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'maxShareToBeSold' },\n ],\n },\n ],\n [\n {\n fee: params.pool.fee,\n tickLower: params.pool.startTick,\n tickUpper: params.pool.endTick,\n numPositions: params.pool.numPositions ?? DEFAULT_V3_NUM_POSITIONS,\n maxShareToBeSold:\n params.pool.maxShareToBeSold ?? DEFAULT_V3_MAX_SHARE_TO_BE_SOLD,\n },\n ],\n );\n }\n\n // 2. Encode migration data based on MigrationConfig\n const liquidityMigratorData = this.encodeMigrationData(params.migration);\n\n // 3. Encode token parameters (standard vs Doppler404)\n let tokenFactoryData: Hex;\n if (this.isDoppler404Token(params.token)) {\n const token404 = params.token;\n // Doppler404 expects: name, symbol, baseURI, unit\n const baseURI = token404.baseURI;\n const unit = token404.unit !== undefined ? BigInt(token404.unit) : 1000n;\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [params.token.name, params.token.symbol, baseURI, unit],\n );\n } else {\n const tokenStd = params.token as StandardTokenConfig;\n const vestingDuration = params.vesting?.duration ?? BigInt(0);\n const yearlyMintRate =\n tokenStd.yearlyMintRate ?? DEFAULT_V4_YEARLY_MINT_RATE;\n\n // Handle vesting recipients and amounts\n let vestingRecipients: Address[] = [];\n let vestingAmounts: bigint[] = [];\n\n if (params.vesting) {\n if (params.vesting.recipients && params.vesting.amounts) {\n // Use provided recipients and amounts\n vestingRecipients = params.vesting.recipients;\n vestingAmounts = params.vesting.amounts;\n } else {\n // Default: vest all non-sold tokens to userAddress\n vestingRecipients = [params.userAddress];\n vestingAmounts = [\n params.sale.initialSupply - params.sale.numTokensToSell,\n ];\n }\n }\n\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n tokenStd.name,\n tokenStd.symbol,\n yearlyMintRate,\n BigInt(vestingDuration),\n vestingRecipients,\n vestingAmounts,\n tokenStd.tokenURI,\n ],\n );\n }\n\n // 4. Encode governance factory data\n const governanceFactoryData: Hex = (() => {\n if (params.governance.type === 'noOp') {\n return '0x' as Hex;\n }\n if (params.governance.type === 'launchpad') {\n return encodeAbiParameters(\n [{ type: 'address' }],\n [params.governance.multisig],\n );\n }\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint48' },\n { type: 'uint32' },\n { type: 'uint256' },\n ],\n [\n params.token.name,\n params.governance.type === 'custom'\n ? params.governance.initialVotingDelay\n : DEFAULT_V3_INITIAL_VOTING_DELAY,\n params.governance.type === 'custom'\n ? params.governance.initialVotingPeriod\n : DEFAULT_V3_INITIAL_VOTING_PERIOD,\n params.governance.type === 'custom'\n ? params.governance.initialProposalThreshold\n : DEFAULT_V3_INITIAL_PROPOSAL_THRESHOLD,\n ],\n );\n })();\n\n // 4.1 Choose governance factory\n const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n // 5. Generate a unique salt\n // Resolve token factory with override priority\n const resolvedTokenFactory: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\n : addresses.tokenFactory);\n\n if (!resolvedTokenFactory || resolvedTokenFactory === ZERO_ADDRESS) {\n throw new Error(\n 'Token factory address not configured. Provide an explicit address via builder.withTokenFactory(...) or ensure chain config includes a valid factory.',\n );\n }\n\n // Build the base CreateParams for the V3-style ABI; salt will be mined below\n const baseCreateParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactory,\n tokenFactoryData: tokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData: governanceFactoryData,\n poolInitializer: (() => {\n if (hasBeneficiaries) {\n const lockableInitializer =\n params.modules?.lockableV3Initializer ??\n addresses.lockableV3Initializer;\n if (!lockableInitializer) {\n throw new Error(\n 'Lockable V3 initializer address not configured on this chain. Required when using beneficiaries.',\n );\n }\n return lockableInitializer;\n }\n return params.modules?.v3Initializer ?? addresses.v3Initializer;\n })(),\n poolInitializerData: poolInitializerData,\n liquidityMigrator: this.getMigratorAddress(\n params.migration,\n params.modules,\n ),\n liquidityMigratorData: liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n };\n\n const minedCreateParams = await this.mineTokenOrder({\n params,\n baseCreateParams,\n addresses,\n });\n\n return minedCreateParams;\n }\n\n /**\n * Simulate a static auction creation and return predicted addresses.\n * Useful for pre-buy flows (bundle) to know the token/pool before sending.\n */\n async simulateCreateStaticAuction(\n params: CreateStaticAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n asset: Address;\n pool: Address;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n poolAddress: Address;\n tokenAddress: Address;\n transactionHash: string;\n }>;\n }> {\n const createParams = await this.encodeCreateStaticAuctionParams(params);\n const addresses = getAddresses(this.chainId);\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate static auction create');\n }\n\n return {\n createParams,\n asset: simResult[0] as Address,\n pool: simResult[1] as Address,\n gasEstimate,\n execute: () =>\n this.createStaticAuction(params, { _createParams: createParams }),\n };\n }\n\n /**\n * Create a new static auction (using Uniswap V3 for initial liquidity)\n * @param params Configuration for the static auction\n * @returns The address of the created pool and token\n */\n async createStaticAuction(\n params: CreateStaticAuctionParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{\n poolAddress: Address;\n tokenAddress: Address;\n transactionHash: string;\n }> {\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n const createParams =\n options?._createParams ??\n (await this.simulateCreateStaticAuction(params)).createParams;\n\n const addresses = getAddresses(this.chainId);\n\n // Call the airlock contract to create the pool\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gasOverride = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({\n ...request,\n gas: gasOverride,\n });\n\n // Wait for transaction and get the receipt\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash, confirmations: 2 });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract addresses from Create event in transaction logs',\n );\n }\n\n // Warn if simulation predicted different addresses (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 2) {\n const simulatedToken = simResult[0] as Address;\n const simulatedPool = simResult[1] as Address;\n if (\n simulatedToken.toLowerCase() !==\n actualAddresses.tokenAddress.toLowerCase()\n ) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualAddresses.tokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n if (\n simulatedPool.toLowerCase() !==\n actualAddresses.poolOrHookAddress.toLowerCase()\n ) {\n console.warn(\n `[DopplerSDK] Simulation predicted pool ${simulatedPool} but actual is ${actualAddresses.poolOrHookAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n return {\n tokenAddress: actualAddresses.tokenAddress,\n poolAddress: actualAddresses.poolOrHookAddress,\n transactionHash: hash,\n };\n }\n\n /**\n * Generate a random salt based on user address\n */\n private generateRandomSalt(account: Address): Hex {\n // Use crypto.getRandomValues for secure random generation\n const array = new Uint8Array(32);\n\n // Try to use crypto API if available (Node.js or browser)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(array);\n } else {\n // Fallback: use timestamp and account for deterministic generation\n const timestamp = Date.now();\n const timestampBytes = new Uint8Array(8);\n for (let i = 0; i < 8; i++) {\n timestampBytes[i] = (timestamp >> (i * 8)) & 0xff;\n }\n\n // Fill array with timestamp and account-based entropy\n for (let i = 0; i < 32; i++) {\n if (i < 8) {\n array[i] = timestampBytes[i];\n } else {\n array[i] = i;\n }\n }\n }\n\n // XOR with address bytes for additional entropy\n if (account) {\n const addressBytes = account.slice(2).padStart(40, '0');\n for (let i = 0; i < 20; i++) {\n const addressByte = parseInt(\n addressBytes.slice(i * 2, (i + 1) * 2),\n 16,\n );\n array[i] ^= addressByte;\n }\n }\n\n return `0x${Array.from(array)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')}` as Hex;\n }\n\n /**\n * Extract actual deployed addresses from Create event logs.\n * This is the source of truth - what actually deployed on-chain.\n * @param receipt Transaction receipt containing logs\n * @returns Token and pool/hook addresses from the Create event, or null if not found\n */\n private extractAddressesFromCreateEvent(receipt: {\n logs: readonly unknown[];\n }): { tokenAddress: Address; poolOrHookAddress: Address } | null {\n const createEvent = receipt.logs.find((log: unknown) => {\n try {\n const decoded = decodeEventLog({\n abi: airlockAbi,\n data: (log as { data: Hex }).data,\n topics: (log as { topics: readonly `0x${string}`[] }).topics as [\n `0x${string}`,\n ...`0x${string}`[],\n ],\n });\n return decoded.eventName === 'Create';\n } catch {\n return false;\n }\n });\n\n if (!createEvent) return null;\n\n const decoded = decodeEventLog({\n abi: airlockAbi,\n data: (createEvent as { data: Hex }).data,\n topics: (createEvent as { topics: readonly `0x${string}`[] }).topics as [\n `0x${string}`,\n ...`0x${string}`[],\n ],\n });\n\n if (decoded.eventName === 'Create') {\n const args = decoded.args as { asset: Address; poolOrHook: Address };\n return { tokenAddress: args.asset, poolOrHookAddress: args.poolOrHook };\n }\n\n return null;\n }\n\n /**\n * Iteratively mine a salt that ensures the newly created token sorts after the numeraire.\n * This mirrors the legacy SDK behaviour so tick configuration can assume the numeraire is token0.\n */\n private async mineTokenOrder(args: {\n params: CreateStaticAuctionParams<C>;\n baseCreateParams: Omit<CreateParams, 'salt'>;\n addresses: ReturnType<typeof getAddresses>;\n }): Promise<CreateParams> {\n const { params, baseCreateParams, addresses } = args;\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n if (!airlockAddress || airlockAddress === ZERO_ADDRESS) {\n throw new Error(\n 'Airlock address not configured. Provide an explicit address via modules.airlock or ensure chain config includes a valid airlock.',\n );\n }\n\n const accountForSimulation =\n this.walletClient?.account ?? params.userAddress;\n const numeraireBigInt = BigInt(params.sale.numeraire);\n\n let attempt = 0n;\n const maxAttempts = 256n;\n let salt = this.generateRandomSalt(params.userAddress);\n\n while (attempt < maxAttempts) {\n const createParams = { ...baseCreateParams, salt } as CreateParams;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: accountForSimulation,\n });\n\n const simResult = result as readonly unknown[] | undefined;\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error(\n 'Failed to simulate static auction create while mining token ordering',\n );\n }\n\n const tokenAddress = simResult[0] as Address;\n if (BigInt(tokenAddress) > numeraireBigInt) {\n return createParams;\n }\n\n attempt += 1n;\n const incrementedAccount = toHex(\n BigInt(params.userAddress) + attempt,\n ) as Address;\n salt = this.generateRandomSalt(incrementedAccount);\n }\n\n throw new Error(\n 'Token mining exceeded iteration limit while trying to force token order. Try again or provide a different user address.',\n );\n }\n\n async encodeCreateDynamicAuctionParams(\n params: CreateDynamicAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n hookAddress: Address;\n tokenAddress: Address;\n }> {\n // Validate parameters\n this.validateDynamicAuctionParams(params);\n\n const addresses = getAddresses(this.chainId);\n\n // 1. Calculate gamma if not provided\n const gamma =\n params.auction.gamma ??\n computeOptimalGamma(\n params.auction.startTick,\n params.auction.endTick,\n params.auction.duration,\n params.auction.epochLength,\n params.pool.tickSpacing,\n );\n\n // 2. Prepare time parameters\n // Use provided block timestamp or fetch the latest\n let blockTimestamp: number;\n if (params.blockTimestamp !== undefined) {\n blockTimestamp = params.blockTimestamp;\n } else {\n const latestBlock = await (this.publicClient as PublicClient).getBlock({\n blockTag: 'latest',\n });\n blockTimestamp = Number(\n (latestBlock as { timestamp: bigint | number }).timestamp,\n );\n }\n\n // Use startTimeOffset if provided, otherwise default to 30 seconds\n const startTimeOffset = params.startTimeOffset ?? 30;\n const startTime = blockTimestamp + startTimeOffset;\n const endTime = blockTimestamp + params.auction.duration + startTimeOffset;\n\n // 3. Prepare hook initialization data\n const dopplerData = {\n minimumProceeds: params.auction.minProceeds,\n maximumProceeds: params.auction.maxProceeds,\n startingTime: BigInt(startTime),\n endingTime: BigInt(endTime),\n startingTick: params.auction.startTick,\n endingTick: params.auction.endTick,\n epochLength: BigInt(params.auction.epochLength),\n gamma,\n isToken0: false, // Will be determined during mining\n numPDSlugs: BigInt(params.auction.numPdSlugs ?? DEFAULT_PD_SLUGS),\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n };\n\n // 4. Prepare token parameters (standard vs Doppler404)\n if (this.isDoppler404Token(params.token)) {\n if (\n !addresses.doppler404Factory ||\n addresses.doppler404Factory === ZERO_ADDRESS\n ) {\n throw new Error(\n 'Doppler404 factory address not configured for this chain',\n );\n }\n }\n\n const vestingDuration = params.vesting?.duration ?? BigInt(0);\n const tokenFactoryData = this.isDoppler404Token(params.token)\n ? (() => {\n const t = params.token as Doppler404TokenConfig;\n return {\n name: t.name,\n symbol: t.symbol,\n baseURI: t.baseURI,\n unit: t.unit !== undefined ? BigInt(t.unit) : 1000n,\n };\n })()\n : (() => {\n const t = params.token as StandardTokenConfig;\n\n // Handle vesting recipients and amounts\n let vestingRecipients: Address[] = [];\n let vestingAmounts: bigint[] = [];\n\n if (params.vesting) {\n if (params.vesting.recipients && params.vesting.amounts) {\n // Use provided recipients and amounts\n vestingRecipients = params.vesting.recipients;\n vestingAmounts = params.vesting.amounts;\n } else {\n // Default: vest all non-sold tokens to userAddress\n vestingRecipients = [params.userAddress];\n vestingAmounts = [\n params.sale.initialSupply - params.sale.numTokensToSell,\n ];\n }\n }\n\n return {\n name: t.name,\n symbol: t.symbol,\n initialSupply: params.sale.initialSupply,\n airlock: addresses.airlock,\n yearlyMintRate: t.yearlyMintRate ?? DEFAULT_V4_YEARLY_MINT_RATE,\n vestingDuration: BigInt(vestingDuration),\n recipients: vestingRecipients,\n amounts: vestingAmounts,\n tokenURI: t.tokenURI,\n };\n })();\n\n // 5. Mine hook address with appropriate flags\n // Resolve token factory with override priority (works for both standard and doppler404 variants)\n const resolvedTokenFactoryDyn: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\n : addresses.tokenFactory);\n\n if (!resolvedTokenFactoryDyn || resolvedTokenFactoryDyn === ZERO_ADDRESS) {\n throw new Error(\n 'Token factory address not configured. Provide an explicit address via builder.withTokenFactory(...) or ensure chain config includes a valid factory.',\n );\n }\n\n const [\n salt,\n hookAddress,\n tokenAddress,\n poolInitializerData,\n encodedTokenFactoryData,\n ] = this.mineHookAddress({\n airlock: params.modules?.airlock ?? addresses.airlock,\n poolManager: params.modules?.poolManager ?? addresses.poolManager,\n deployer: params.modules?.dopplerDeployer ?? addresses.dopplerDeployer,\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactoryDyn,\n tokenFactoryData: tokenFactoryData,\n poolInitializer: params.modules?.v4Initializer ?? addresses.v4Initializer,\n poolInitializerData: dopplerData,\n tokenVariant: this.isDoppler404Token(params.token)\n ? 'doppler404'\n : 'standard',\n });\n\n // 6. Encode migration data\n const liquidityMigratorData = this.encodeMigrationData(params.migration);\n\n // 7. Encode governance factory data\n const governanceFactoryData: Hex = (() => {\n if (params.governance.type === 'noOp') {\n return '0x' as Hex;\n }\n if (params.governance.type === 'launchpad') {\n return encodeAbiParameters(\n [{ type: 'address' }],\n [params.governance.multisig],\n );\n }\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint48' },\n { type: 'uint32' },\n { type: 'uint256' },\n ],\n [\n params.token.name,\n params.governance.type === 'custom'\n ? params.governance.initialVotingDelay\n : DEFAULT_V4_INITIAL_VOTING_DELAY,\n params.governance.type === 'custom'\n ? params.governance.initialVotingPeriod\n : DEFAULT_V4_INITIAL_VOTING_PERIOD,\n params.governance.type === 'custom'\n ? params.governance.initialProposalThreshold\n : DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n ],\n );\n })();\n\n // 7.1 Choose governance factory\n const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain. Provide a governanceFactory override or use a supported chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n // 8. Build the complete CreateParams for the V4-style ABI\n const createParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactoryDyn,\n tokenFactoryData: encodedTokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData: governanceFactoryData,\n poolInitializer: params.modules?.v4Initializer ?? addresses.v4Initializer,\n poolInitializerData: poolInitializerData,\n liquidityMigrator: this.getMigratorAddress(\n params.migration,\n params.modules,\n ),\n liquidityMigratorData: liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n salt: salt,\n };\n\n return { createParams, hookAddress, tokenAddress };\n }\n\n /**\n * Create a new dynamic auction (using Uniswap V4 hook for gradual Dutch auction)\n * @param params Configuration for the dynamic auction\n * @returns The address of the created hook and token\n */\n async createDynamicAuction(\n params: CreateDynamicAuctionParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n transactionHash: string;\n }> {\n const addresses = getAddresses(this.chainId);\n\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n let createParams: CreateParams;\n\n if (options?._createParams) {\n createParams = options._createParams;\n } else {\n const simulation = await this.simulateCreateDynamicAuction(params);\n createParams = simulation.createParams;\n }\n\n // Call the airlock contract to create the pool\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gasOverride = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({\n ...request,\n gas: gasOverride,\n });\n\n // Wait for transaction and get the receipt\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract addresses from Create event in transaction logs',\n );\n }\n\n const actualTokenAddress = actualAddresses.tokenAddress;\n const actualHookAddress = actualAddresses.poolOrHookAddress;\n\n // Warn if simulation predicted different addresses (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 2) {\n const simulatedToken = simResult[0] as Address;\n const simulatedHook = simResult[1] as Address;\n if (simulatedToken.toLowerCase() !== actualTokenAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualTokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n if (simulatedHook.toLowerCase() !== actualHookAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted hook ${simulatedHook} but actual is ${actualHookAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n // Calculate pool ID for V4 using actual addresses\n const poolId = this.computePoolId({\n currency0:\n actualTokenAddress < params.sale.numeraire\n ? actualTokenAddress\n : params.sale.numeraire,\n currency1:\n actualTokenAddress < params.sale.numeraire\n ? params.sale.numeraire\n : actualTokenAddress,\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: actualHookAddress,\n });\n\n return {\n hookAddress: actualHookAddress,\n tokenAddress: actualTokenAddress,\n poolId,\n transactionHash: hash,\n };\n }\n\n /**\n * Simulate a dynamic auction creation and return predicted addresses and poolId.\n * Useful for clients that need the hook/token/poolId before submitting the tx.\n */\n async simulateCreateDynamicAuction(\n params: CreateDynamicAuctionParams<C>,\n ): Promise<{\n createParams: CreateParams;\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n hookAddress: Address;\n tokenAddress: Address;\n poolId: string;\n transactionHash: string;\n }>;\n }> {\n const { createParams } =\n await this.encodeCreateDynamicAuctionParams(params);\n const addresses = getAddresses(this.chainId);\n\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate dynamic auction create');\n }\n\n const tokenAddress = simResult[0] as Address;\n const hookAddress = simResult[1] as Address;\n\n const poolId = this.computePoolId({\n currency0:\n tokenAddress < params.sale.numeraire\n ? tokenAddress\n : params.sale.numeraire,\n currency1:\n tokenAddress < params.sale.numeraire\n ? params.sale.numeraire\n : tokenAddress,\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: hookAddress,\n });\n\n return {\n createParams,\n hookAddress,\n tokenAddress,\n poolId,\n gasEstimate,\n execute: () =>\n this.createDynamicAuction(params, { _createParams: createParams }),\n };\n }\n\n private async resolveCreateGasEstimate(args: {\n request?: unknown;\n address: Address;\n createParams: CreateParams;\n account?: Address | Account;\n }): Promise<bigint | undefined> {\n const { request, address, createParams, account } = args;\n const gasFromRequest =\n request &&\n typeof request === 'object' &&\n 'gas' in (request as Record<string, unknown>)\n ? (request as { gas?: bigint }).gas\n : undefined;\n\n if (gasFromRequest) {\n return gasFromRequest;\n }\n\n try {\n const estimated = await (\n this.publicClient as PublicClient\n ).estimateContractGas({\n address,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account,\n });\n return estimated;\n } catch {\n return undefined;\n }\n }\n\n private isDoppler404Token(\n token: TokenConfig,\n ): token is Doppler404TokenConfig {\n return (token as Doppler404TokenConfig).type === 'doppler404';\n }\n\n /**\n * Encode migration data based on the MigrationConfig\n * This replaces the manual encoding methods from the old SDKs\n */\n private encodeMigrationData(config: MigrationConfig): Hex {\n // Use custom encoder if available\n if (this.customMigrationEncoder) {\n return this.customMigrationEncoder(config);\n }\n\n switch (config.type) {\n case 'uniswapV2':\n // V2 migrator expects empty data\n return '0x' as Hex;\n\n case 'noOp':\n // NoOp migrator expects empty data\n return '0x' as Hex;\n\n case 'uniswapV4':\n // Encode V4 migration data with optional streamable fees config\n // When streamableFees is omitted, mirror legacy SDK behaviour by emitting an empty payload\n const streamableFees = config.streamableFees;\n if (!streamableFees) {\n // Default V4 migrator behaviour: no additional payload required\n return '0x';\n }\n\n // Copy beneficiaries and sort by address in ascending order (required by contract)\n const beneficiaryData = [...streamableFees.beneficiaries].sort(\n (a, b) => {\n const addrA = a.beneficiary.toLowerCase();\n const addrB = b.beneficiary.toLowerCase();\n return addrA < addrB ? -1 : addrA > addrB ? 1 : 0;\n },\n );\n\n // Note: The contract will validate that the airlock owner gets at least 5%\n // If not present, the SDK user should add it manually\n\n return encodeAbiParameters(\n [\n { type: 'uint24' }, // fee\n { type: 'int24' }, // tickSpacing\n { type: 'uint32' }, // lockDuration (0 if no streamableFees)\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ],\n },\n ],\n [\n config.fee,\n config.tickSpacing,\n streamableFees.lockDuration,\n beneficiaryData,\n ],\n );\n\n default:\n throw new Error('Unknown migration type');\n }\n }\n\n /**\n * Encode create params for Uniswap V4 Multicurve initializer/migrator flow\n */\n private normalizeUint32(\n value: number | bigint,\n label: string,\n ): number {\n const normalized = typeof value === 'bigint' ? Number(value) : Number(value);\n if (!Number.isFinite(normalized) || !Number.isInteger(normalized)) {\n throw new Error(\n `${label} must be an integer number of seconds since Unix epoch`,\n );\n }\n if (normalized < 0) {\n throw new Error(`${label} cannot be negative`);\n }\n const UINT32_MAX = 0xffffffff;\n if (normalized > UINT32_MAX) {\n throw new Error(\n `${label} must fit within uint32 (seconds since Unix epoch up to year 2106)`,\n );\n }\n return normalized;\n }\n\n private resolveMulticurveInitializerMode(\n params: CreateMulticurveParams<C>,\n ): ResolvedMulticurveInitializerMode {\n const legacySchedule = params.schedule;\n const legacyHook = params.dopplerHook;\n const hasLegacySchedule = legacySchedule !== undefined;\n const hasLegacyHook = legacyHook !== undefined;\n\n if (hasLegacySchedule && hasLegacyHook) {\n throw new Error(\n 'Cannot combine schedule and dopplerHook legacy multicurve options. Use exactly one initializer mode.',\n );\n }\n\n const initializer = params.initializer;\n let mode: ResolvedMulticurveInitializerMode;\n\n if (!initializer) {\n if (hasLegacySchedule) {\n mode = {\n type: 'scheduled',\n startTime: this.normalizeUint32(\n legacySchedule.startTime,\n 'Scheduled multicurve startTime',\n ),\n };\n } else if (hasLegacyHook) {\n mode = {\n type: 'rehype',\n hookConfig: legacyHook,\n };\n } else {\n mode = { type: 'standard' };\n }\n } else {\n switch (initializer.type) {\n case 'standard': {\n if (hasLegacySchedule || hasLegacyHook) {\n throw new Error(\n \"Initializer type 'standard' cannot be combined with legacy schedule/dopplerHook fields\",\n );\n }\n mode = { type: 'standard' };\n break;\n }\n case 'scheduled': {\n if (hasLegacyHook) {\n throw new Error(\n \"Initializer type 'scheduled' cannot be combined with dopplerHook\",\n );\n }\n const normalizedStart = this.normalizeUint32(\n initializer.startTime,\n 'Scheduled multicurve startTime',\n );\n if (hasLegacySchedule) {\n const legacyStart = this.normalizeUint32(\n legacySchedule.startTime,\n 'Scheduled multicurve startTime',\n );\n if (legacyStart !== normalizedStart) {\n throw new Error(\n 'Conflicting scheduled start times provided via initializer and schedule',\n );\n }\n }\n mode = { type: 'scheduled', startTime: normalizedStart };\n break;\n }\n case 'decay': {\n if (hasLegacySchedule || hasLegacyHook) {\n throw new Error(\n \"Initializer type 'decay' cannot be combined with legacy schedule/dopplerHook fields\",\n );\n }\n const startTime = this.normalizeUint32(\n initializer.startTime,\n 'Decay multicurve startTime',\n );\n const startFee = Number(initializer.startFee);\n const durationSeconds = this.normalizeUint32(\n initializer.durationSeconds,\n 'Decay multicurve durationSeconds',\n );\n const endFee = Number(params.pool.fee);\n if (!Number.isInteger(startFee)) {\n throw new Error('Decay multicurve startFee must be an integer');\n }\n if (startFee < 0 || startFee > DECAY_MAX_START_FEE) {\n throw new Error(\n `Decay multicurve startFee must be between 0 and ${DECAY_MAX_START_FEE}`,\n );\n }\n if (!Number.isInteger(endFee) || endFee < 0 || endFee > V4_MAX_FEE) {\n throw new Error(\n `Multicurve pool fee must be between 0 and ${V4_MAX_FEE}`,\n );\n }\n if (startFee < endFee) {\n throw new Error(\n `Decay multicurve startFee (${startFee}) must be greater than or equal to terminal pool fee (${endFee})`,\n );\n }\n if (startFee > endFee && durationSeconds <= 0) {\n throw new Error(\n 'Decay multicurve durationSeconds must be greater than 0 when startFee is greater than terminal pool fee',\n );\n }\n mode = {\n type: 'decay',\n startTime,\n startFee,\n durationSeconds,\n };\n break;\n }\n case 'rehype': {\n if (hasLegacySchedule) {\n throw new Error(\n \"Initializer type 'rehype' cannot be combined with schedule\",\n );\n }\n mode = { type: 'rehype', hookConfig: initializer.config };\n break;\n }\n default: {\n const exhaustive: never = initializer;\n throw new Error(\n `Unsupported multicurve initializer type: ${(exhaustive as { type?: string })?.type ?? 'unknown'}`,\n );\n }\n }\n }\n\n // Backwards-compatible behavior: an explicit dopplerHookInitializer override\n // selects the DopplerHookInitializer path even without hook config.\n if (params.modules?.dopplerHookInitializer !== undefined) {\n if (mode.type === 'standard') {\n mode = { type: 'rehype' };\n } else if (mode.type !== 'rehype') {\n throw new Error(\n 'modules.dopplerHookInitializer can only be used with the rehype or standard multicurve initializer mode',\n );\n }\n }\n\n return mode;\n }\n\n encodeCreateMulticurveParams(\n params: CreateMulticurveParams<C>,\n ): CreateParams {\n // Validate parameters\n this.validateMulticurveParams(params);\n\n // Basic validation\n if (!params.pool || params.pool.curves.length === 0) {\n throw new Error('Multicurve pool must include at least one curve');\n }\n\n const normalizedCurves = this.normalizeMulticurveCurves(\n params.pool.curves,\n params.pool.tickSpacing,\n );\n\n const addresses = getAddresses(this.chainId);\n\n // Pool initializer data: (fee, tickSpacing, farTick, curves[], beneficiaries[], dopplerHook, onInitializationCalldata, graduationCalldata)\n const sortedBeneficiaries = (params.pool.beneficiaries ?? [])\n .slice()\n .sort(\n (\n a: NonNullable<typeof params.pool.beneficiaries>[number],\n b: NonNullable<typeof params.pool.beneficiaries>[number],\n ) => {\n const aAddr = a.beneficiary.toLowerCase();\n const bAddr = b.beneficiary.toLowerCase();\n return aAddr < bAddr ? -1 : aAddr > bAddr ? 1 : 0;\n },\n );\n\n const initializerMode = this.resolveMulticurveInitializerMode(params);\n const useScheduledInitializer = initializerMode.type === 'scheduled';\n const useDecayInitializer = initializerMode.type === 'decay';\n const useDopplerHookInitializer = initializerMode.type === 'rehype';\n\n // Validate dopplerHook fee distribution if provided\n if (initializerMode.type === 'rehype' && initializerMode.hookConfig) {\n const hook = initializerMode.hookConfig;\n const totalDistribution =\n hook.assetBuybackPercentWad +\n hook.numeraireBuybackPercentWad +\n hook.beneficiaryPercentWad +\n hook.lpPercentWad;\n if (totalDistribution !== WAD) {\n throw new Error(\n `DopplerHook fee distribution must sum to ${WAD} (100%), but got ${totalDistribution}`,\n );\n }\n }\n\n // Shared curve and beneficiary component definitions for ABI encoding\n const curveComponents = [\n { type: 'int24', name: 'tickLower' },\n { type: 'int24', name: 'tickUpper' },\n { type: 'uint16', name: 'numPositions' },\n { type: 'uint256', name: 'shares' },\n ];\n const beneficiaryComponents = [\n { type: 'address', name: 'beneficiary' },\n { type: 'uint96', name: 'shares' },\n ];\n\n // Prepare curve and beneficiary data (shared across all initializer formats)\n const curvesData = normalizedCurves.map(\n (c: (typeof normalizedCurves)[number]) => ({\n tickLower: c.tickLower,\n tickUpper: c.tickUpper,\n numPositions: c.numPositions,\n shares: c.shares,\n }),\n );\n const beneficiariesData = sortedBeneficiaries.map(\n (b: NonNullable<typeof params.pool.beneficiaries>[number]) => ({\n beneficiary: b.beneficiary,\n shares: b.shares,\n }),\n );\n\n // Encode pool initializer data based on which initializer is being used\n // Each initializer expects a different InitData struct format:\n //\n // UniswapV4MulticurveInitializer (basic):\n // struct InitData { uint24 fee; int24 tickSpacing; Curve[] curves; BeneficiaryData[] beneficiaries; }\n //\n // UniswapV4ScheduledMulticurveInitializer:\n // struct InitData { uint24 fee; int24 tickSpacing; Curve[] curves; BeneficiaryData[] beneficiaries; uint32 startingTime; }\n //\n // DecayMulticurveInitializer:\n // struct InitData { uint24 startFee; uint24 fee; uint32 durationSeconds; int24 tickSpacing; Curve[] curves;\n // BeneficiaryData[] beneficiaries; uint32 startingTime; }\n //\n // DopplerHookInitializer:\n // struct InitData { uint24 fee; int24 tickSpacing; int24 farTick; Curve[] curves; BeneficiaryData[] beneficiaries;\n // address dopplerHook; bytes onInitializationDopplerHookCalldata; bytes graduationDopplerHookCalldata; }\n\n let poolInitializerData: Hex;\n\n if (useDopplerHookInitializer) {\n const hookConfig =\n initializerMode.type === 'rehype'\n ? initializerMode.hookConfig\n : undefined;\n // DopplerHookInitializer format (8 fields)\n // Calculate farTick: use provided value from dopplerHook, or auto-calculate from curves\n let farTick: number;\n if (hookConfig?.farTick !== undefined) {\n farTick = hookConfig.farTick;\n } else {\n // Auto-calculate from curves (max tickUpper)\n const allTickUppers = params.pool.curves.map((c) => c.tickUpper);\n farTick = Math.max(...allTickUppers);\n }\n\n // Encode dopplerHook initialization calldata if provided\n let onInitializationDopplerHookCalldata: Hex = '0x';\n let graduationDopplerHookCalldata: Hex = '0x';\n let dopplerHookAddress: Address = ZERO_ADDRESS;\n\n if (hookConfig) {\n dopplerHookAddress = hookConfig.hookAddress;\n onInitializationDopplerHookCalldata = encodeAbiParameters(\n [\n { type: 'address' }, // numeraire\n { type: 'address' }, // buybackDst\n { type: 'uint24' }, // customFee\n { type: 'uint256' }, // assetBuybackPercentWad\n { type: 'uint256' }, // numeraireBuybackPercentWad\n { type: 'uint256' }, // beneficiaryPercentWad\n { type: 'uint256' }, // lpPercentWad\n ],\n [\n params.sale.numeraire,\n hookConfig.buybackDestination,\n hookConfig.customFee,\n hookConfig.assetBuybackPercentWad,\n hookConfig.numeraireBuybackPercentWad,\n hookConfig.beneficiaryPercentWad,\n hookConfig.lpPercentWad,\n ],\n );\n graduationDopplerHookCalldata = hookConfig.graduationCalldata ?? '0x';\n }\n\n const dopplerHookTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'farTick', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'dopplerHook', type: 'address' },\n { name: 'onInitializationDopplerHookCalldata', type: 'bytes' },\n { name: 'graduationDopplerHookCalldata', type: 'bytes' },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: dopplerHookTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n farTick,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n dopplerHook: dopplerHookAddress,\n onInitializationDopplerHookCalldata,\n graduationDopplerHookCalldata,\n },\n ],\n );\n } else if (useDecayInitializer) {\n // DecayMulticurveInitializer format (7 fields)\n const decayTupleComponents = [\n { name: 'startFee', type: 'uint24' },\n { name: 'fee', type: 'uint24' },\n { name: 'durationSeconds', type: 'uint32' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'startingTime', type: 'uint32' },\n ];\n\n if (initializerMode.type !== 'decay') {\n throw new Error('Invalid multicurve initializer state for decay mode');\n }\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: decayTupleComponents }],\n [\n {\n startFee: initializerMode.startFee,\n fee: params.pool.fee,\n durationSeconds: initializerMode.durationSeconds,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n startingTime: initializerMode.startTime,\n },\n ],\n );\n } else if (useScheduledInitializer) {\n // UniswapV4ScheduledMulticurveInitializer format (5 fields)\n if (initializerMode.type !== 'scheduled') {\n throw new Error(\n 'Invalid multicurve initializer state for scheduled mode',\n );\n }\n const scheduledTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n { name: 'startingTime', type: 'uint32' },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: scheduledTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n startingTime: initializerMode.startTime,\n },\n ],\n );\n } else {\n // UniswapV4MulticurveInitializer format (4 fields - basic)\n const basicTupleComponents = [\n { name: 'fee', type: 'uint24' },\n { name: 'tickSpacing', type: 'int24' },\n { name: 'curves', type: 'tuple[]', components: curveComponents },\n {\n name: 'beneficiaries',\n type: 'tuple[]',\n components: beneficiaryComponents,\n },\n ];\n\n poolInitializerData = encodeAbiParameters(\n [{ type: 'tuple', components: basicTupleComponents }],\n [\n {\n fee: params.pool.fee,\n tickSpacing: params.pool.tickSpacing,\n curves: curvesData,\n beneficiaries: beneficiariesData,\n },\n ],\n );\n }\n\n // Token factory data (standard vs 404)\n let tokenFactoryData: Hex;\n if (this.isDoppler404Token(params.token)) {\n const token404 = params.token;\n const unit = token404.unit !== undefined ? BigInt(token404.unit) : 1000n;\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [token404.name, token404.symbol, token404.baseURI, unit],\n );\n } else {\n const tokenStd = params.token as StandardTokenConfig;\n const vestingDuration = params.vesting?.duration ?? BigInt(0);\n const yearlyMintRate =\n tokenStd.yearlyMintRate ?? DEFAULT_V3_YEARLY_MINT_RATE;\n\n // Handle vesting recipients and amounts\n let vestingRecipients: Address[] = [];\n let vestingAmounts: bigint[] = [];\n\n if (params.vesting) {\n if (params.vesting.recipients && params.vesting.amounts) {\n // Use provided recipients and amounts\n vestingRecipients = params.vesting.recipients;\n vestingAmounts = params.vesting.amounts;\n } else {\n // Default: vest all non-sold tokens to userAddress\n vestingRecipients = [params.userAddress];\n vestingAmounts = [\n params.sale.initialSupply - params.sale.numTokensToSell,\n ];\n }\n }\n\n tokenFactoryData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n tokenStd.name,\n tokenStd.symbol,\n yearlyMintRate,\n BigInt(vestingDuration),\n vestingRecipients,\n vestingAmounts,\n tokenStd.tokenURI,\n ],\n );\n }\n\n // Governance factory data\n const governanceFactoryData: Hex = (() => {\n if (params.governance.type === 'noOp') {\n return '0x' as Hex;\n }\n if (params.governance.type === 'launchpad') {\n return encodeAbiParameters(\n [{ type: 'address' }],\n [params.governance.multisig],\n );\n }\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'uint48' },\n { type: 'uint32' },\n { type: 'uint256' },\n ],\n [\n params.token.name,\n params.governance.type === 'custom'\n ? params.governance.initialVotingDelay\n : DEFAULT_V4_INITIAL_VOTING_DELAY,\n params.governance.type === 'custom'\n ? params.governance.initialVotingPeriod\n : DEFAULT_V4_INITIAL_VOTING_PERIOD,\n params.governance.type === 'custom'\n ? params.governance.initialProposalThreshold\n : DEFAULT_V4_INITIAL_PROPOSAL_THRESHOLD,\n ],\n );\n })();\n\n // Resolve module addresses\n const salt = this.generateRandomSalt(params.userAddress);\n const resolvedTokenFactory: Address | undefined =\n params.modules?.tokenFactory ??\n (this.isDoppler404Token(params.token)\n ? (addresses.doppler404Factory as Address | undefined)\n : addresses.tokenFactory);\n if (!resolvedTokenFactory || resolvedTokenFactory === ZERO_ADDRESS) {\n throw new Error(\n 'Token factory address not configured. Provide an explicit address or ensure chain config includes a valid factory.',\n );\n }\n\n const resolvedInitializer: Address | undefined = (() => {\n if (useDopplerHookInitializer) {\n return (\n params.modules?.dopplerHookInitializer ??\n addresses.dopplerHookInitializer\n );\n }\n if (useDecayInitializer) {\n return (\n params.modules?.v4DecayMulticurveInitializer ??\n addresses.v4DecayMulticurveInitializer\n );\n }\n if (useScheduledInitializer) {\n return (\n params.modules?.v4ScheduledMulticurveInitializer ??\n addresses.v4ScheduledMulticurveInitializer\n );\n }\n return (\n params.modules?.v4MulticurveInitializer ??\n addresses.v4MulticurveInitializer\n );\n })();\n if (!resolvedInitializer || resolvedInitializer === ZERO_ADDRESS) {\n if (useDopplerHookInitializer) {\n throw new Error(\n 'DopplerHookInitializer address not configured on this chain. Override via builder.withDopplerHookInitializer() or update chain config.',\n );\n }\n if (useDecayInitializer) {\n throw new Error(\n 'Decay multicurve initializer address not configured on this chain. Override via builder.withV4DecayMulticurveInitializer() or update chain config.',\n );\n }\n throw new Error(\n useScheduledInitializer\n ? 'Scheduled multicurve initializer address not configured on this chain. Override via builder or update chain config.'\n : 'Multicurve initializer address not configured on this chain. Override via builder or update chain config.',\n );\n }\n\n // When beneficiaries are provided, use NoOpMigrator with empty data\n // The beneficiaries will be handled by the multicurve initializer, not the migrator\n const hasBeneficiaries =\n params.pool.beneficiaries && params.pool.beneficiaries.length > 0;\n\n let liquidityMigratorData: Hex;\n let resolvedMigrator: Address | undefined;\n\n if (hasBeneficiaries) {\n // Use NoOpMigrator with empty data when beneficiaries are provided\n liquidityMigratorData = '0x' as Hex;\n resolvedMigrator = params.modules?.noOpMigrator ?? addresses.noOpMigrator;\n if (!resolvedMigrator || resolvedMigrator === ZERO_ADDRESS) {\n throw new Error(\n 'NoOpMigrator address not configured on this chain. Override via modules.noOpMigrator or update chain config.',\n );\n }\n } else {\n // Use standard migration flow when no beneficiaries\n liquidityMigratorData = this.encodeMigrationData(params.migration);\n resolvedMigrator = this.getMigratorAddress(\n params.migration,\n params.modules,\n );\n if (!resolvedMigrator || resolvedMigrator === ZERO_ADDRESS) {\n throw new Error(\n 'Migrator address not configured on this chain. Override via builder or update chain config.',\n );\n }\n }\n\n const governanceFactoryAddress: Address = (() => {\n if (params.governance.type === 'noOp') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.noOpGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'No-op governance requested, but no-op governanceFactory is not configured on this chain.',\n );\n }\n return resolved;\n }\n if (params.governance.type === 'launchpad') {\n const resolved =\n params.modules?.governanceFactory ??\n addresses.launchpadGovernanceFactory ??\n ZERO_ADDRESS;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Launchpad governance requested, but launchpadGovernanceFactory is not configured on this chain.',\n );\n }\n return resolved;\n }\n const resolved =\n params.modules?.governanceFactory ?? addresses.governanceFactory;\n if (!resolved || resolved === ZERO_ADDRESS) {\n throw new Error(\n 'Standard governance requested but governanceFactory is not deployed on this chain.',\n );\n }\n return resolved;\n })();\n\n const createParams: CreateParams = {\n initialSupply: params.sale.initialSupply,\n numTokensToSell: params.sale.numTokensToSell,\n numeraire: params.sale.numeraire,\n tokenFactory: resolvedTokenFactory,\n tokenFactoryData,\n governanceFactory: governanceFactoryAddress,\n governanceFactoryData,\n poolInitializer: resolvedInitializer,\n poolInitializerData,\n liquidityMigrator: resolvedMigrator,\n liquidityMigratorData,\n integrator: params.integrator ?? ZERO_ADDRESS,\n salt,\n };\n\n return createParams;\n }\n\n async simulateCreateMulticurve(params: CreateMulticurveParams<C>): Promise<{\n createParams: CreateParams;\n tokenAddress: Address;\n poolId: Hex;\n gasEstimate?: bigint;\n /** Execute the create with the same params used in simulation (guarantees address match) */\n execute: () => Promise<{\n tokenAddress: Address;\n poolId: Hex;\n transactionHash: string;\n }>;\n }> {\n const addresses = getAddresses(this.chainId);\n const createParams = this.encodeCreateMulticurveParams(params);\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient?.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient?.account ?? params.userAddress,\n });\n if (!simResult || !Array.isArray(simResult) || simResult.length < 2) {\n throw new Error('Failed to simulate multicurve create');\n }\n\n // simResult[0] is \"asset\" in contract terminology, we call it tokenAddress for SDK consistency\n const tokenAddress = simResult[0] as Address;\n const poolId = await this.computeMulticurvePoolId(params, tokenAddress);\n\n return {\n createParams,\n tokenAddress,\n poolId,\n gasEstimate,\n execute: () =>\n this.createMulticurve(params, { _createParams: createParams }),\n };\n }\n\n async createMulticurve(\n params: CreateMulticurveParams<C>,\n options?: { _createParams?: CreateParams },\n ): Promise<{ tokenAddress: Address; poolId: Hex; transactionHash: string }> {\n const addresses = getAddresses(this.chainId);\n if (!this.walletClient)\n throw new Error('Wallet client required for write operations');\n\n // Use provided createParams (from simulate) or auto-simulate to get consistent params\n const createParams =\n options?._createParams ??\n (await this.simulateCreateMulticurve(params)).createParams;\n const airlockAddress = params.modules?.airlock ?? addresses.airlock;\n const { request, result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: airlockAddress,\n abi: airlockAbi,\n functionName: 'create',\n args: [{ ...createParams }],\n account: this.walletClient.account,\n });\n const simResult = result as readonly unknown[] | undefined;\n const gasEstimate = await this.resolveCreateGasEstimate({\n request,\n address: airlockAddress,\n createParams,\n account: this.walletClient.account,\n });\n const gas = params.gas ?? gasEstimate ?? DEFAULT_CREATE_GAS_LIMIT;\n const hash = await this.walletClient.writeContract({ ...request, gas });\n const receipt = await (\n this.publicClient as PublicClient\n ).waitForTransactionReceipt({ hash, confirmations: 2 });\n\n // Always extract actual addresses from event logs (source of truth)\n const actualAddresses = this.extractAddressesFromCreateEvent(receipt);\n\n if (!actualAddresses) {\n throw new Error(\n 'Failed to extract token address from Create event in transaction logs',\n );\n }\n\n const actualTokenAddress = actualAddresses.tokenAddress;\n\n // Warn if simulation predicted different address (helps debugging state divergence)\n if (simResult && Array.isArray(simResult) && simResult.length >= 1) {\n const simulatedToken = simResult[0] as Address;\n if (simulatedToken.toLowerCase() !== actualTokenAddress.toLowerCase()) {\n console.warn(\n `[DopplerSDK] Simulation predicted token ${simulatedToken} but actual is ${actualTokenAddress}. ` +\n `This may indicate state divergence between simulation and execution.`,\n );\n }\n }\n\n // Compute poolId from the PoolKey using actual token address\n const poolId = await this.computeMulticurvePoolId(\n params,\n actualTokenAddress,\n );\n\n return { tokenAddress: actualTokenAddress, poolId, transactionHash: hash };\n }\n\n /**\n * Normalize user-provided multicurve positions and ensure they satisfy SDK constraints\n */\n private normalizeMulticurveCurves(\n curves: CreateMulticurveParams['pool']['curves'],\n tickSpacing: number,\n ): CreateMulticurveParams['pool']['curves'] {\n if (tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n if (!curves.length) {\n throw new Error('Multicurve pool must include at least one curve');\n }\n\n let totalShares = 0n;\n let mostPositiveTickUpper: number | undefined;\n\n const sanitizedCurves = curves.map((curve) => {\n const sanitized = { ...curve };\n\n if (\n !Number.isFinite(sanitized.tickLower) ||\n !Number.isFinite(sanitized.tickUpper)\n ) {\n throw new Error('Multicurve ticks must be finite numbers');\n }\n if (sanitized.tickLower >= sanitized.tickUpper) {\n throw new Error(\n 'Multicurve curve tickLower must be less than tickUpper',\n );\n }\n if (\n !Number.isInteger(sanitized.numPositions) ||\n sanitized.numPositions <= 0\n ) {\n throw new Error(\n 'Multicurve curve numPositions must be a positive integer',\n );\n }\n if (sanitized.shares <= 0n) {\n throw new Error('Multicurve curve shares must be positive');\n }\n\n totalShares += sanitized.shares;\n if (totalShares > WAD) {\n throw new Error('Total multicurve shares cannot exceed 100% (1e18)');\n }\n\n if (\n mostPositiveTickUpper === undefined ||\n sanitized.tickUpper > mostPositiveTickUpper\n ) {\n mostPositiveTickUpper = sanitized.tickUpper;\n }\n\n return sanitized;\n });\n\n if (totalShares === WAD) {\n return sanitizedCurves;\n }\n\n const missingShare = WAD - totalShares;\n if (missingShare <= 0n) {\n return sanitizedCurves;\n }\n\n const fallbackTickLower = mostPositiveTickUpper;\n if (fallbackTickLower === undefined) {\n throw new Error('Unable to determine fallback multicurve tick range');\n }\n\n const fallbackTickUpper = this.roundMaxTickDown(tickSpacing);\n\n const fallbackCurve = {\n // Extend from the most positive user tick out to the maximum supported tick bucket\n tickLower: fallbackTickLower,\n tickUpper: fallbackTickUpper,\n numPositions:\n sanitizedCurves[sanitizedCurves.length - 1]?.numPositions ?? 1,\n shares: missingShare,\n };\n\n return [...sanitizedCurves, fallbackCurve];\n }\n\n private roundMaxTickDown(tickSpacing: number): number {\n if (tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n\n const rounded = Math.floor(MAX_TICK / tickSpacing) * tickSpacing;\n return rounded;\n }\n\n private validateStaticAuctionParams(params: CreateStaticAuctionParams): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate tick range\n if (params.pool.startTick >= params.pool.endTick) {\n throw new Error('Start tick must be less than end tick');\n }\n\n const tickSpacing = (TICK_SPACINGS as Record<number, number>)[\n params.pool.fee\n ];\n if (tickSpacing === undefined) {\n throw new Error(\n `Unsupported fee tier ${params.pool.fee} for static auctions`,\n );\n }\n\n if (params.pool.startTick < MIN_TICK || params.pool.endTick > MAX_TICK) {\n throw new Error(\n `Ticks must be within the allowed range (${MIN_TICK} to ${MAX_TICK})`,\n );\n }\n\n const startTickAligned = params.pool.startTick % tickSpacing === 0;\n const endTickAligned = params.pool.endTick % tickSpacing === 0;\n if (!startTickAligned || !endTickAligned) {\n throw new Error(\n `Pool ticks must be multiples of tick spacing ${tickSpacing} for fee tier ${params.pool.fee}`,\n );\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate vesting if provided\n if (params.vesting) {\n // Validate recipients and amounts arrays match\n if (params.vesting.recipients && params.vesting.amounts) {\n if (\n params.vesting.recipients.length !== params.vesting.amounts.length\n ) {\n throw new Error(\n 'Vesting recipients and amounts arrays must have the same length',\n );\n }\n if (params.vesting.recipients.length === 0) {\n throw new Error('Vesting recipients array cannot be empty');\n }\n // Validate total vested amount doesn't exceed available tokens\n const totalVested = params.vesting.amounts.reduce(\n (sum, amt) => sum + amt,\n BigInt(0),\n );\n const availableForVesting =\n params.sale.initialSupply - params.sale.numTokensToSell;\n if (totalVested > availableForVesting) {\n throw new Error(\n `Total vesting amount (${totalVested}) exceeds available tokens (${availableForVesting})`,\n );\n }\n } else {\n // Default case: validate there are tokens available for vesting\n const vestedAmount =\n params.sale.initialSupply - params.sale.numTokensToSell;\n if (vestedAmount <= BigInt(0)) {\n throw new Error('No tokens available for vesting');\n }\n }\n }\n\n // Validate migration config\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n\n // Validate pool beneficiaries for V3 locked pools\n if (params.pool.beneficiaries && params.pool.beneficiaries.length > 0) {\n const beneficiaries = params.pool.beneficiaries;\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Pool beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n\n // Validate each beneficiary has positive shares\n for (const b of beneficiaries) {\n if (b.shares <= 0n) {\n throw new Error('Each beneficiary must have positive shares');\n }\n }\n }\n }\n\n /**\n * Validate dynamic auction parameters\n */\n private validateDynamicAuctionParams(\n params: CreateDynamicAuctionParams,\n ): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate tick range\n const isToken0 = isToken0Expected(params.sale.numeraire);\n if (isToken0 && params.auction.startTick <= params.auction.endTick) {\n throw new Error(\n 'Start tick must be greater than end tick if base token is currency0',\n );\n }\n if (!isToken0 && params.auction.startTick >= params.auction.endTick) {\n throw new Error(\n 'Start tick must be less than end tick if base token is currency1',\n );\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate auction parameters\n if (params.auction.duration <= 0) {\n throw new Error('Auction duration must be positive');\n }\n if (params.auction.epochLength <= 0) {\n throw new Error('Epoch length must be positive');\n }\n if (params.pool.tickSpacing <= 0) {\n throw new Error('Tick spacing must be positive');\n }\n\n // Validate tick spacing against Doppler contract constraint\n // @see Doppler.sol line 159: `int24 constant MAX_TICK_SPACING = 30`\n if (params.pool.tickSpacing > DOPPLER_MAX_TICK_SPACING) {\n throw new Error(\n `Dynamic auctions require tickSpacing <= ${DOPPLER_MAX_TICK_SPACING} (Doppler.sol MAX_TICK_SPACING). ` +\n `Got tickSpacing=${params.pool.tickSpacing}. ` +\n `Use withMarketCapRange() which handles this automatically, or use a smaller tickSpacing with poolConfig().`,\n );\n }\n\n // Validate that total duration is divisible by epoch length\n if (params.auction.duration % params.auction.epochLength !== 0) {\n throw new Error('Epoch length must divide total duration evenly');\n }\n\n // Validate gamma if provided\n if (params.auction.gamma !== undefined) {\n if (params.auction.gamma % params.pool.tickSpacing !== 0) {\n throw new Error('Gamma must be divisible by tick spacing');\n }\n }\n\n // Validate migration config\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n\n // Check that shares sum to 100% (WAD)\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n }\n\n /**\n * Validate multicurve auction parameters\n */\n private validateMulticurveParams(params: CreateMulticurveParams<C>): void {\n // Validate token parameters\n if (!params.token.name || params.token.name.trim().length === 0) {\n throw new Error('Token name is required');\n }\n if (!params.token.symbol || params.token.symbol.trim().length === 0) {\n throw new Error('Token symbol is required');\n }\n\n // Validate sale config\n if (params.sale.initialSupply <= BigInt(0)) {\n throw new Error('Initial supply must be positive');\n }\n if (params.sale.numTokensToSell <= BigInt(0)) {\n throw new Error('Number of tokens to sell must be positive');\n }\n if (params.sale.numTokensToSell > params.sale.initialSupply) {\n throw new Error('Cannot sell more tokens than initial supply');\n }\n\n // Validate initializer mode / compatibility and mode-specific constraints.\n this.resolveMulticurveInitializerMode(params);\n\n // Validate vesting if provided\n if (params.vesting) {\n // Validate recipients and amounts arrays match\n if (params.vesting.recipients && params.vesting.amounts) {\n if (\n params.vesting.recipients.length !== params.vesting.amounts.length\n ) {\n throw new Error(\n 'Vesting recipients and amounts arrays must have the same length',\n );\n }\n if (params.vesting.recipients.length === 0) {\n throw new Error('Vesting recipients array cannot be empty');\n }\n // Validate total vested amount doesn't exceed available tokens\n const totalVested = params.vesting.amounts.reduce(\n (sum, amt) => sum + amt,\n BigInt(0),\n );\n const availableForVesting =\n params.sale.initialSupply - params.sale.numTokensToSell;\n if (totalVested > availableForVesting) {\n throw new Error(\n `Total vesting amount (${totalVested}) exceeds available tokens (${availableForVesting})`,\n );\n }\n }\n }\n\n // Validate pool beneficiaries if provided\n if (params.pool.beneficiaries && params.pool.beneficiaries.length > 0) {\n const beneficiaries = params.pool.beneficiaries;\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Pool beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n for (const b of beneficiaries) {\n if (b.shares <= 0n) {\n throw new Error('Each beneficiary must have positive shares');\n }\n }\n }\n\n // Validate migration config for V4\n if (\n params.migration.type === 'uniswapV4' &&\n params.migration.streamableFees\n ) {\n const beneficiaries = params.migration.streamableFees.beneficiaries;\n if (beneficiaries.length === 0) {\n throw new Error(\n 'At least one beneficiary is required for V4 migration',\n );\n }\n const totalShares = beneficiaries.reduce((sum, b) => sum + b.shares, 0n);\n if (totalShares !== WAD) {\n throw new Error(\n `Beneficiary shares must sum to ${WAD} (100%), but got ${totalShares}`,\n );\n }\n }\n }\n\n /**\n * Get the airlock contract address for the current chain\n */\n private getAirlockAddress(): Address {\n const addresses = getAddresses(this.chainId);\n return addresses.airlock;\n }\n\n /**\n * Get the appropriate initializer address based on auction type\n */\n private getInitializerAddress(isStatic: boolean): Address {\n const addresses = getAddresses(this.chainId);\n return isStatic ? addresses.v3Initializer : addresses.v4Initializer;\n }\n\n /**\n * Get the Bundler contract address for the current chain\n * Used to perform atomic create + swap (\"bundle\") flows for static auctions\n */\n private getBundlerAddress(): Address {\n const addresses = getAddresses(this.chainId);\n const addr = addresses.bundler;\n if (!addr || addr === zeroAddress) {\n throw new Error('Bundler address not configured for this chain');\n }\n return addr;\n }\n\n /**\n * Get the appropriate migrator address based on migration config\n * Allows override via ModuleAddressOverrides when provided in params.\n */\n private getMigratorAddress(\n config: MigrationConfig,\n overrides?: ModuleAddressOverrides,\n ): Address {\n const addresses = getAddresses(this.chainId);\n\n switch (config.type) {\n case 'uniswapV2':\n return overrides?.v2Migrator ?? addresses.v2Migrator;\n case 'uniswapV4': {\n const v4Address = overrides?.v4Migrator ?? addresses.v4Migrator;\n if (v4Address === '0x0000000000000000000000000000000000000000') {\n throw new Error(\n 'UniswapV4Migrator not deployed on this chain. Use uniswapV2 migration or provide override via modules.v4Migrator.',\n );\n }\n return v4Address;\n }\n case 'noOp': {\n const noOpAddress = overrides?.noOpMigrator ?? addresses.noOpMigrator;\n if (!noOpAddress) {\n throw new Error(\n 'NoOpMigrator not configured on this chain. Provide override via modules.noOpMigrator or update chain config.',\n );\n }\n return noOpAddress;\n }\n\n default:\n throw new Error('Unknown migration type');\n }\n }\n\n // computeTicks moved to builders. No longer needed here.\n // computeOptimalGamma moved to utils.\n\n // -----------------------------\n // Bundler helpers (Static/V3)\n // -----------------------------\n\n /**\n * Simulate a bundle with exact input on Uniswap V3 as part of create\n * Returns the expected output amount for the provided exact input.\n */\n async simulateBundleExactInput(\n createParams: CreateParams,\n params: {\n tokenIn: Address;\n tokenOut: Address;\n amountIn: bigint;\n fee: number;\n sqrtPriceLimitX96: bigint;\n },\n ): Promise<bigint> {\n const bundler = this.getBundlerAddress();\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateBundleExactIn',\n args: [\n { ...createParams },\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n fee: params.fee,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n },\n ],\n });\n return result as unknown as bigint;\n }\n\n /**\n * Simulate a bundle with exact output on Uniswap V3 as part of create\n * Returns the required input amount for the provided exact output.\n */\n async simulateBundleExactOutput(\n createParams: CreateParams,\n params: {\n tokenIn: Address;\n tokenOut: Address;\n amount: bigint;\n fee: number;\n sqrtPriceLimitX96: bigint;\n },\n ): Promise<bigint> {\n const bundler = this.getBundlerAddress();\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateBundleExactOut',\n args: [\n { ...createParams },\n {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amount: params.amount,\n fee: params.fee,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n },\n ],\n });\n return result as unknown as bigint;\n }\n\n // Bundler helpers (Multicurve/V4)\n async simulateMulticurveBundleExactOut(\n createParams: CreateParams,\n params?: {\n exactAmountOut?: bigint;\n },\n ): Promise<MulticurveBundleExactOutResult> {\n const bundler = this.getBundlerAddress();\n await this.ensureMulticurveBundlerSupport(bundler);\n const exactAmountOut = params?.exactAmountOut ?? 0n;\n this.ensureUint128(exactAmountOut, 'exactAmountOut', { allowZero: true });\n const hookData = '0x' as Hex;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateMulticurveBundleExactOut',\n args: [{ ...createParams }, exactAmountOut, hookData],\n });\n\n const { asset, poolKey, amount, gasEstimate } =\n this.parseMulticurveBundleResult(result);\n\n return {\n asset,\n poolKey,\n amountIn: amount,\n gasEstimate,\n };\n }\n\n async simulateMulticurveBundleExactIn(\n createParams: CreateParams,\n params: {\n exactAmountIn: bigint;\n },\n ): Promise<MulticurveBundleExactInResult> {\n const bundler = this.getBundlerAddress();\n await this.ensureMulticurveBundlerSupport(bundler);\n if (params.exactAmountIn === undefined) {\n throw new Error(\n 'exactAmountIn is required for multicurve bundle simulations',\n );\n }\n const exactAmountIn = params.exactAmountIn;\n this.ensureUint128(exactAmountIn, 'exactAmountIn');\n const hookData = '0x' as Hex;\n\n const { result } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'simulateMulticurveBundleExactIn',\n args: [{ ...createParams }, exactAmountIn, hookData],\n });\n\n const { asset, poolKey, amount, gasEstimate } =\n this.parseMulticurveBundleResult(result);\n\n return {\n asset,\n poolKey,\n amountOut: amount,\n gasEstimate,\n };\n }\n\n /**\n * Execute an atomic create + swap bundle through the Bundler\n * commands/inputs are Universal Router encoded values (e.g., from doppler-router)\n */\n async bundle(\n createParams: CreateParams,\n commands: Hex,\n inputs: Hex[],\n options?: { gas?: bigint; value?: bigint },\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new Error('Wallet client required for write operations');\n }\n\n const bundler = this.getBundlerAddress();\n const { request } = await (\n this.publicClient as PublicClient\n ).simulateContract({\n address: bundler,\n abi: bundlerAbi,\n functionName: 'bundle',\n args: [{ ...createParams }, commands, inputs],\n account: this.walletClient.account,\n value: options?.value ?? 0n,\n });\n const gas = options?.gas ?? undefined;\n const tx = await this.walletClient.writeContract(\n gas ? { ...request, gas } : request,\n );\n return tx;\n }\n\n private ensureUint128(\n value: bigint,\n paramName: string,\n options: { allowZero?: boolean } = {},\n ): void {\n const { allowZero = false } = options;\n if (value < 0n) {\n throw new Error(`${paramName} cannot be negative`);\n }\n if (!allowZero && value === 0n) {\n throw new Error(`${paramName} must be greater than zero`);\n }\n if (value > MAX_UINT128) {\n throw new Error(`${paramName} exceeds uint128 range`);\n }\n }\n\n private parseMulticurveBundleResult(result: unknown): {\n asset: Address;\n poolKey: V4PoolKey;\n amount: bigint;\n gasEstimate: bigint;\n } {\n let asset: Address | undefined;\n let poolKeyRaw: unknown;\n let amount: bigint | undefined;\n let gasEstimate: bigint | undefined;\n\n if (Array.isArray(result)) {\n if (result.length < 4) {\n throw new Error('Unexpected multicurve bundle simulation result shape');\n }\n asset = result[0] as Address;\n poolKeyRaw = result[1];\n amount = result[2] as bigint;\n gasEstimate = result[3] as bigint;\n } else if (result && typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n asset = obj.asset as Address | undefined;\n poolKeyRaw = obj.poolKey;\n amount = (obj.amountIn ?? obj.amountOut ?? obj.amount) as\n | bigint\n | undefined;\n gasEstimate = obj.gasEstimate as bigint | undefined;\n } else {\n throw new Error('Unexpected multicurve bundle simulation result format');\n }\n\n if (\n asset === undefined ||\n poolKeyRaw === undefined ||\n amount === undefined ||\n gasEstimate === undefined\n ) {\n throw new Error('Incomplete multicurve bundle simulation result');\n }\n\n return {\n asset,\n poolKey: this.normalizePoolKey(poolKeyRaw),\n amount,\n gasEstimate,\n };\n }\n\n private normalizePoolKey(value: any): V4PoolKey {\n if (Array.isArray(value)) {\n const [currency0, currency1, feeRaw, tickSpacingRaw, hooks] = value as [\n Address,\n Address,\n number | bigint,\n number | bigint,\n Address,\n ];\n const feeValue = Number(feeRaw);\n const tickSpacingValue = Number(tickSpacingRaw);\n if (!Number.isFinite(feeValue) || !Number.isFinite(tickSpacingValue)) {\n throw new Error(\n 'Invalid pool key numeric fields in multicurve bundle simulation result',\n );\n }\n return {\n currency0: currency0 as Address,\n currency1: currency1 as Address,\n fee: feeValue,\n tickSpacing: tickSpacingValue,\n hooks: hooks as Address,\n };\n }\n if (value && typeof value === 'object') {\n const { currency0, currency1, fee, tickSpacing, hooks } = value as Record<\n string,\n unknown\n >;\n const feeValue = Number(fee);\n const tickSpacingValue = Number(tickSpacing);\n if (!Number.isFinite(feeValue) || !Number.isFinite(tickSpacingValue)) {\n throw new Error(\n 'Invalid pool key numeric fields in multicurve bundle simulation result',\n );\n }\n return {\n currency0: currency0 as Address,\n currency1: currency1 as Address,\n fee: feeValue,\n tickSpacing: tickSpacingValue,\n hooks: hooks as Address,\n };\n }\n throw new Error(\n 'Unable to normalize PoolKey from multicurve bundle simulation result',\n );\n }\n /**\n * Mines a salt and hook address with the appropriate flags\n *\n * This method iterates through possible salt values to find a combination that:\n * - Produces a hook address with required Doppler flags\n * - Maintains proper token ordering relative to numeraire\n * - Ensures deterministic deployment addresses\n *\n * @param params - Parameters for hook address mining\n * @returns Tuple of [salt, hook address, token address, pool data, token data]\n * @throws {Error} If no valid salt can be found within the search limit\n * @private\n */\n private mineHookAddress(params: {\n airlock: Address;\n poolManager: Address;\n deployer: Address;\n initialSupply: bigint;\n numTokensToSell: bigint;\n numeraire: Address;\n tokenFactory: Address;\n tokenFactoryData:\n | {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n }\n | {\n name: string;\n symbol: string;\n initialSupply: bigint;\n airlock: Address;\n yearlyMintRate: bigint;\n vestingDuration: bigint;\n recipients: Address[];\n amounts: bigint[];\n tokenURI: string;\n };\n poolInitializer: Address;\n poolInitializerData: {\n minimumProceeds: bigint;\n maximumProceeds: bigint;\n startingTime: bigint;\n endingTime: bigint;\n startingTick: number;\n endingTick: number;\n epochLength: bigint;\n gamma: number;\n numPDSlugs: bigint;\n fee: number;\n tickSpacing: number;\n };\n customDerc20Bytecode?: `0x${string}`;\n tokenVariant?: 'standard' | 'doppler404';\n }): [Hash, Address, Address, Hex, Hex] {\n const isToken0 = isToken0Expected(params.numeraire);\n\n const {\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n numPDSlugs,\n fee,\n tickSpacing,\n } = params.poolInitializerData;\n\n const poolInitializerData = encodeAbiParameters(\n [\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'int24' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'bool' },\n { type: 'uint256' },\n { type: 'uint24' },\n { type: 'int24' },\n ],\n [\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n isToken0,\n numPDSlugs,\n fee,\n tickSpacing,\n ],\n );\n\n const { poolManager, numTokensToSell, poolInitializer } = params;\n\n const hookInitHashData = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'int24' },\n { type: 'uint256' },\n { type: 'int24' },\n { type: 'bool' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'uint24' },\n ],\n [\n poolManager,\n numTokensToSell,\n minimumProceeds,\n maximumProceeds,\n startingTime,\n endingTime,\n startingTick,\n endingTick,\n epochLength,\n gamma,\n isToken0,\n numPDSlugs,\n poolInitializer,\n fee,\n ],\n );\n\n const hookInitHash = keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [DopplerBytecode as Hex, hookInitHashData],\n ),\n );\n\n const tokenFactoryData =\n params.tokenVariant === 'doppler404'\n ? (() => {\n const t = params.tokenFactoryData as {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n };\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n ],\n [t.name, t.symbol, t.baseURI, t.unit ?? 1000n],\n );\n })()\n : (() => {\n const {\n name,\n symbol,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n initialSupply: bigint;\n airlock: Address;\n yearlyMintRate: bigint;\n vestingDuration: bigint;\n recipients: Address[];\n amounts: bigint[];\n tokenURI: string;\n };\n return encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n name,\n symbol,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n ],\n );\n })();\n\n // Compute token init hash; use DN404 bytecode if tokenVariant is doppler404\n let tokenInitHash: Hash | undefined;\n if (params.tokenVariant === 'doppler404') {\n const { name, symbol, baseURI } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n baseURI: string;\n unit?: bigint;\n };\n const { airlock, initialSupply } = params;\n // DN404 constructor: (name, symbol, initialSupply, recipient, owner, baseURI)\n const initHashData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'address' },\n { type: 'string' },\n ],\n [name, symbol, initialSupply, airlock, airlock, baseURI],\n );\n tokenInitHash = keccak256(\n encodePacked(\n ['bytes', 'bytes'],\n [DopplerDN404Bytecode as Hex, initHashData],\n ),\n );\n } else {\n const {\n name,\n symbol,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n } = params.tokenFactoryData as {\n name: string;\n symbol: string;\n initialSupply: bigint;\n airlock: Address;\n yearlyMintRate: bigint;\n vestingDuration: bigint;\n recipients: Address[];\n amounts: bigint[];\n tokenURI: string;\n };\n const { airlock, initialSupply } = params;\n const initHashData = encodeAbiParameters(\n [\n { type: 'string' },\n { type: 'string' },\n { type: 'uint256' },\n { type: 'address' },\n { type: 'address' },\n { type: 'uint256' },\n { type: 'uint256' },\n { type: 'address[]' },\n { type: 'uint256[]' },\n { type: 'string' },\n ],\n [\n name,\n symbol,\n initialSupply,\n airlock,\n airlock,\n yearlyMintRate,\n vestingDuration,\n recipients,\n amounts,\n tokenURI,\n ],\n );\n // Use DERC2080Bytecode for TokenFactory80, DERC20Bytecode otherwise\n const isTokenFactory80 =\n params.tokenFactory.toLowerCase() === TOKEN_FACTORY_80_ADDRESS;\n const bytecode = isTokenFactory80\n ? (DERC2080Bytecode as Hex)\n : ((params.customDerc20Bytecode as Hex) ?? (DERC20Bytecode as Hex));\n\n tokenInitHash = keccak256(\n encodePacked(['bytes', 'bytes'], [bytecode, initHashData]),\n );\n }\n\n // Use the exact flags from V4 SDK\n const flags = BigInt(\n (1 << 13) | // BEFORE_INITIALIZE_FLAG\n (1 << 12) | // AFTER_INITIALIZE_FLAG\n (1 << 11) | // BEFORE_ADD_LIQUIDITY_FLAG\n (1 << 7) | // BEFORE_SWAP_FLAG\n (1 << 6) | // AFTER_SWAP_FLAG\n (1 << 5), // BEFORE_DONATE_FLAG\n );\n\n // Pre-compute values outside the loop (optimization)\n const numeraireBigInt = BigInt(params.numeraire);\n\n // Pre-allocate CREATE2 buffers with constant parts\n const hookBuffer = this.prepareCreate2Buffer(params.deployer, hookInitHash);\n const tokenBuffer = tokenInitHash\n ? this.prepareCreate2Buffer(params.tokenFactory, tokenInitHash)\n : null;\n\n for (let salt = 0n; salt < 1_000_000n; salt++) {\n // Update salt in pre-computed buffer (avoids string formatting)\n this.updateSaltInBuffer(hookBuffer, salt);\n\n // Compute hook address using fast method (no checksum)\n const hookRaw = this.computeCreate2AddressFast(hookBuffer);\n const hookBigInt = BigInt(hookRaw);\n\n // Early termination: skip token computation if hook flags don't match\n // Only ~1 in 8192 addresses match the required flags, so this saves ~50% of keccak256 calls\n if ((hookBigInt & FLAG_MASK) !== flags) {\n continue;\n }\n\n if (tokenBuffer) {\n // Update salt in token buffer\n this.updateSaltInBuffer(tokenBuffer, salt);\n\n // Compute token address using fast method\n const tokenRaw = this.computeCreate2AddressFast(tokenBuffer);\n const tokenBigInt = BigInt(tokenRaw);\n\n if (\n (isToken0 && tokenBigInt < numeraireBigInt) ||\n (!isToken0 && tokenBigInt > numeraireBigInt)\n ) {\n // Found a match! Convert to proper format for return\n const saltBytes = `0x${salt.toString(16).padStart(64, '0')}` as Hash;\n const hook = getAddress(hookRaw) as Address;\n const token = getAddress(tokenRaw) as Address;\n return [\n saltBytes,\n hook,\n token,\n poolInitializerData,\n tokenFactoryData,\n ];\n }\n }\n }\n\n throw new Error('AirlockMiner: could not find salt');\n }\n\n /**\n * Computes the CREATE2 address for a contract deployment\n * @param salt - The salt used for deployment\n * @param initCodeHash - Hash of the initialization code\n * @param deployer - Address of the deploying contract\n * @returns The computed contract address\n * @private\n */\n private computeCreate2Address(\n salt: Hash,\n initCodeHash: Hash,\n deployer: Address,\n ): Address {\n const encoded = encodePacked(\n ['bytes1', 'address', 'bytes32', 'bytes32'],\n ['0xff', deployer, salt, initCodeHash],\n );\n return getAddress(`0x${keccak256(encoded).slice(-40)}`);\n }\n\n /**\n * Helper to convert hex string to Uint8Array\n * @private\n */\n private hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substr(i * 2, 2), 16);\n }\n return bytes;\n }\n\n /**\n * Helper to convert Uint8Array to hex string\n * @private\n */\n private bytesToHex(bytes: Uint8Array): string {\n return (\n '0x' +\n Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n );\n }\n\n /**\n * Pre-compute CREATE2 buffer with constant prefix for fast mining\n * Buffer layout: 0xff (1 byte) + deployer (20 bytes) + salt (32 bytes) + initCodeHash (32 bytes) = 85 bytes\n * @private\n */\n private prepareCreate2Buffer(\n deployer: Address,\n initCodeHash: Hash,\n ): Uint8Array {\n const buffer = new Uint8Array(85);\n buffer[0] = 0xff;\n const deployerBytes = this.hexToBytes(deployer);\n buffer.set(deployerBytes, 1);\n const initCodeHashBytes = this.hexToBytes(initCodeHash);\n buffer.set(initCodeHashBytes, 53); // 1 + 20 + 32 = 53\n return buffer;\n }\n\n /**\n * Update salt in pre-computed CREATE2 buffer (bytes 21-52)\n * Uses direct byte manipulation instead of string conversion\n * @private\n */\n private updateSaltInBuffer(buffer: Uint8Array, salt: bigint): void {\n // Salt is 32 bytes, positioned at offset 21 (after 0xff + 20-byte deployer)\n // Clear salt region first\n for (let i = 21; i < 53; i++) {\n buffer[i] = 0;\n }\n // Write salt bytes from right to left (big-endian)\n let remaining = salt;\n for (let i = 52; remaining > 0n && i >= 21; i--) {\n buffer[i] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n }\n\n /**\n * Compute CREATE2 address from pre-computed buffer (fast version for mining)\n * Returns raw lowercase address without checksum for comparison\n * @private\n */\n private computeCreate2AddressFast(buffer: Uint8Array): string {\n const hash = keccak256(this.bytesToHex(buffer) as Hex);\n // Return last 40 hex chars (20 bytes) as lowercase address\n return '0x' + hash.slice(-40).toLowerCase();\n }\n\n /**\n * Compute V4 pool ID from pool key components\n */\n private computePoolId(poolKey: {\n currency0: Address;\n currency1: Address;\n fee: number;\n tickSpacing: number;\n hooks: Address;\n }): string {\n // V4 pools are identified by the hash of their PoolKey\n const encoded = encodeAbiParameters(\n [\n { type: 'address' },\n { type: 'address' },\n { type: 'uint24' },\n { type: 'int24' },\n { type: 'address' },\n ],\n [\n poolKey.currency0,\n poolKey.currency1,\n poolKey.fee,\n poolKey.tickSpacing,\n poolKey.hooks,\n ],\n );\n return keccak256(encoded);\n }\n\n /**\n * Compute the V4 poolId for a multicurve pool by reading the hook address from the initializer\n */\n private async computeMulticurvePoolId(\n params: CreateMulticurveParams<C>,\n tokenAddress: Address,\n ): Promise<Hex> {\n const addresses = getAddresses(this.chainId);\n\n const initializerMode = this.resolveMulticurveInitializerMode(params);\n let hookAddress: Address;\n if (initializerMode.type === 'rehype') {\n // For DopplerHookInitializer mode, hook address comes from the encoded\n // initializer payload (or defaults to zero when no hook config is set).\n hookAddress = initializerMode.hookConfig?.hookAddress ?? ZERO_ADDRESS;\n } else {\n const initializerAddress = (() => {\n if (initializerMode.type === 'decay') {\n return (\n params.modules?.v4DecayMulticurveInitializer ??\n addresses.v4DecayMulticurveInitializer\n );\n }\n if (initializerMode.type === 'scheduled') {\n return (\n params.modules?.v4ScheduledMulticurveInitializer ??\n addresses.v4ScheduledMulticurveInitializer\n );\n }\n return (\n params.modules?.v4MulticurveInitializer ??\n addresses.v4MulticurveInitializer\n );\n })();\n\n if (!initializerAddress) {\n throw new Error('Multicurve initializer address not configured');\n }\n\n // Standard/scheduled/decay initializers expose HOOK() directly.\n hookAddress = (await (this.publicClient as PublicClient).readContract({\n address: initializerAddress,\n abi: v4MulticurveInitializerAbi,\n functionName: 'HOOK',\n })) as Address;\n }\n\n // Construct the pool key and compute poolId\n const numeraire = params.sale.numeraire;\n const currency0 = tokenAddress < numeraire ? tokenAddress : numeraire;\n const currency1 = tokenAddress < numeraire ? numeraire : tokenAddress;\n const fee =\n initializerMode.type === 'decay' ? DYNAMIC_FEE_FLAG : params.pool.fee;\n\n return this.computePoolId({\n currency0,\n currency1,\n fee,\n tickSpacing: params.pool.tickSpacing,\n hooks: hookAddress,\n }) as Hex;\n }\n\n private async ensureMulticurveBundlerSupport(\n bundler: Address,\n ): Promise<void> {\n if (this.multicurveBundlerSupport.get(bundler)) {\n return;\n }\n\n const client = this.publicClient as PublicClient;\n if (!client || typeof client.getBytecode !== 'function') {\n // If we cannot check support, optimistically assume true.\n this.multicurveBundlerSupport.set(bundler, true);\n return;\n }\n\n const bytecode = await client.getBytecode({ address: bundler });\n const supports = Boolean(\n bytecode &&\n MULTICURVE_BUNDLER_SELECTORS.every((selector) =>\n bytecode.includes(selector.slice(2)),\n ),\n );\n\n if (!supports) {\n throw new Error(\n `Bundler at ${bundler} does not support multicurve bundling. Ensure the Doppler Bundler has been upgraded and update chain addresses.`,\n );\n }\n\n this.multicurveBundlerSupport.set(bundler, true);\n }\n}\n\nconst MULTICURVE_BUNDLER_SELECTORS = ['0xe2e9faa1', '0x07087b06'] as const;\n"]}
|