@edrlab/thorium-web 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ThPreferencesAdapter-DrZ5_6Dv.d.mts → ThPreferencesAdapter-D0rzsGRl.d.mts} +50 -13
- package/dist/{ThSettingsWrapper-8Kx0SnH4.d.mts → ThSettingsWrapper-BXuRgdqp.d.mts} +42 -4
- package/dist/{actions-D2CHvCHu.d.mts → actions-BLAr0oaM.d.mts} +16 -4
- package/dist/{actionsReducer-kc-S130w.d.mts → actionsReducer-BhG1wicI.d.mts} +37 -12
- package/dist/chunk-3GDQP6AS.mjs +14 -0
- package/dist/chunk-3GDQP6AS.mjs.map +1 -0
- package/dist/{chunk-72XCX5TD.mjs → chunk-3LDWKC5N.mjs} +13 -8
- package/dist/chunk-3LDWKC5N.mjs.map +1 -0
- package/dist/{chunk-NYZBHYW2.mjs → chunk-4ODYHZKD.mjs} +343 -38
- package/dist/chunk-4ODYHZKD.mjs.map +1 -0
- package/dist/{chunk-QPE574OW.mjs → chunk-4TVEDX7L.mjs} +23 -32
- package/dist/chunk-4TVEDX7L.mjs.map +1 -0
- package/dist/chunk-7CGMWOZN.mjs +20 -0
- package/dist/chunk-7CGMWOZN.mjs.map +1 -0
- package/dist/{chunk-7NEQAW7J.mjs → chunk-C236BQQB.mjs} +656 -917
- package/dist/chunk-C236BQQB.mjs.map +1 -0
- package/dist/{chunk-PXAUQJEU.mjs → chunk-D7MFLHXV.mjs} +2267 -1599
- package/dist/chunk-D7MFLHXV.mjs.map +1 -0
- package/dist/{chunk-47AIIJFO.mjs → chunk-ITDBOMY5.mjs} +3 -3
- package/dist/{chunk-47AIIJFO.mjs.map → chunk-ITDBOMY5.mjs.map} +1 -1
- package/dist/{chunk-XVSFXHYB.mjs → chunk-L4XGZAZ5.mjs} +23 -20
- package/dist/chunk-L4XGZAZ5.mjs.map +1 -0
- package/dist/chunk-OWHP7ONM.mjs +134 -0
- package/dist/chunk-OWHP7ONM.mjs.map +1 -0
- package/dist/{chunk-P4V3LA5R.mjs → chunk-RRVLWDT3.mjs} +10 -7
- package/dist/chunk-RRVLWDT3.mjs.map +1 -0
- package/dist/chunk-T2E6MRVP.mjs +862 -0
- package/dist/chunk-T2E6MRVP.mjs.map +1 -0
- package/dist/chunk-TEZB4ULX.mjs +57 -0
- package/dist/chunk-TEZB4ULX.mjs.map +1 -0
- package/dist/chunk-UCTMVCW7.mjs +833 -0
- package/dist/chunk-UCTMVCW7.mjs.map +1 -0
- package/dist/chunk-WECWPYZB.mjs +1950 -0
- package/dist/chunk-WECWPYZB.mjs.map +1 -0
- package/dist/{chunk-4VHEHMJN.mjs → chunk-XBZWGRDM.mjs} +228 -94
- package/dist/chunk-XBZWGRDM.mjs.map +1 -0
- package/dist/{chunk-K3K7TUWM.mjs → chunk-YZ3KCMKY.mjs} +237 -83
- package/dist/chunk-YZ3KCMKY.mjs.map +1 -0
- package/dist/components/Audio/index.css +1858 -0
- package/dist/components/Audio/index.css.map +1 -0
- package/dist/components/Audio/index.d.mts +103 -0
- package/dist/components/Audio/index.mjs +23 -0
- package/dist/components/Audio/index.mjs.map +1 -0
- package/dist/components/Epub/index.css +365 -9
- package/dist/components/Epub/index.css.map +1 -1
- package/dist/components/Epub/index.d.mts +17 -19
- package/dist/components/Epub/index.mjs +15 -10
- package/dist/components/Misc/index.css +5 -2
- package/dist/components/Misc/index.css.map +1 -1
- package/dist/components/Misc/index.mjs +4 -132
- package/dist/components/Misc/index.mjs.map +1 -1
- package/dist/components/Reader/index.css +1022 -183
- package/dist/components/Reader/index.css.map +1 -1
- package/dist/components/Reader/index.d.mts +16 -16
- package/dist/components/Reader/index.mjs +121 -22
- package/dist/components/Reader/index.mjs.map +1 -1
- package/dist/components/WebPub/index.css +365 -9
- package/dist/components/WebPub/index.css.map +1 -1
- package/dist/components/WebPub/index.d.mts +16 -16
- package/dist/components/WebPub/index.mjs +15 -10
- package/dist/core/Components/index.d.mts +64 -15
- package/dist/core/Components/index.mjs +2 -1
- package/dist/core/Helpers/index.d.mts +2 -2
- package/dist/core/Helpers/index.mjs +4 -2
- package/dist/core/Hooks/index.d.mts +7 -8
- package/dist/core/Hooks/index.mjs +3 -1
- package/dist/i18n/index.mjs +4 -5
- package/dist/lib/index.d.mts +159 -15
- package/dist/lib/index.mjs +4 -2
- package/dist/lib-M3PPQDJJ.mjs +6548 -0
- package/dist/lib-M3PPQDJJ.mjs.map +1 -0
- package/dist/locales/en/thorium-web.json +22 -0
- package/dist/next-lib/index.mjs +2 -0
- package/dist/next-lib/index.mjs.map +1 -1
- package/dist/preferences/index.d.mts +111 -13
- package/dist/preferences/index.mjs +6 -3
- package/dist/{settingsReducer-C1wwCAMv.d.mts → settingsReducer-Bu1zeveu.d.mts} +1 -1
- package/dist/{ui-CamWuqOo.d.mts → ui-nBv8gfr0.d.mts} +20 -1
- package/dist/useAudioNavigator-C5aW4-eT.d.mts +133 -0
- package/dist/{useContrast-D6sjPjxy.d.mts → useContrast-2t429O9O.d.mts} +16 -8
- package/dist/usePreferences-VaBf46eP.d.mts +230 -0
- package/dist/useReaderTransitions-JDzlBFsu.d.mts +530 -0
- package/dist/{useTimeline-DyMx_aWY.d.mts → useTimeline-DCZ1qoCO.d.mts} +4 -2
- package/package.json +15 -11
- package/dist/chunk-4VHEHMJN.mjs.map +0 -1
- package/dist/chunk-72XCX5TD.mjs.map +0 -1
- package/dist/chunk-7NEQAW7J.mjs.map +0 -1
- package/dist/chunk-K3K7TUWM.mjs.map +0 -1
- package/dist/chunk-NYZBHYW2.mjs.map +0 -1
- package/dist/chunk-P4V3LA5R.mjs.map +0 -1
- package/dist/chunk-PXAUQJEU.mjs.map +0 -1
- package/dist/chunk-QPE574OW.mjs.map +0 -1
- package/dist/chunk-XVSFXHYB.mjs.map +0 -1
- package/dist/useEpubNavigator-CwHJfoiV.d.mts +0 -42
- package/dist/usePreferences-BXFJbval.d.mts +0 -43
- package/dist/useReaderTransitions-guT-eA-Q.d.mts +0 -365
- package/dist/useWebPubNavigator-CuSNQKMw.d.mts +0 -39
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/preferences/helpers/buildThemeObject.ts","../src/preferences/helpers/fontPref/bunnyFonts.ts","../src/preferences/ThDirectionSetter.tsx","../src/preferences/adapters/ThAudioMemoryPreferencesAdapter.ts","../src/preferences/ThAudioPreferencesProvider.tsx","../src/preferences/adapters/ThMemoryPreferencesAdapter.ts","../src/preferences/ThPreferencesProvider.tsx","../src/preferences/hooks/useActionsPreferences.ts","../src/preferences/hooks/useAudioPreferences.ts","../src/preferences/services/createBunnyFontResources.ts","../src/preferences/services/createGoogleFontResources.ts","../src/preferences/services/createLocalFontResources.ts","../src/preferences/services/fonts.ts","../src/preferences/hooks/usePreferences.ts","../src/preferences/hooks/usePreferenceKeys.ts","../src/core/Helpers/prefixString.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/color-space.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/color.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/pipeline.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/loaders/browser.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/loaders/node.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/worker/worker-script.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/worker/manager.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/api.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/progressive.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/swatches.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/quantizers/mmcq.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/sync.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/index.ts","../src/preferences/helpers/getDominantColor.ts","../src/preferences/helpers/themeGeneration.ts","../src/helpers/proxyUrl.ts","../src/preferences/hooks/useTheming.ts"],"names":["styles","useEffect","useMemo","useState","useCallback","jsx","useContext","contrastRatio"],"mappings":";;;;;;;;AAeO,IAAM,mBAAmB,CAAmB;AAAA,EACjD,KAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,KAA0B;AACxB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,KAAA,KAAU,MAAA,IAAU,WAAA,IAAe,YAAA,EAAc;AACnD,IAAA,KAAA,GAAQ,WAAA,KAAA,MAAA,cAAqC,YAAA,CAAa,IAAA,GAAO,YAAA,CAAa,KAAA;AAAA,EAChF;AAEA,EAAA,IAAI,aAAa,EAAC;AAElB,EAAA,MAAM,UAAA,GAAa,UAAU,KAAU,CAAA;AACvC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,UAAA,GAAa;AAAA,MACX,iBAAiB,UAAA,CAAW,UAAA;AAAA,MAC5B,WAAW,UAAA,CAAW,IAAA;AAAA,MACtB,WAAW,UAAA,CAAW,IAAA;AAAA,MACtB,0BAA0B,UAAA,CAAW,MAAA;AAAA,MACrC,oBAAoB,UAAA,CAAW,QAAA;AAAA,MAC/B,cAAc,UAAA,CAAW;AAAA,KAC3B;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,MAAA,CAAO,KAAK,CAAC,CAAA,yBAAA,CAA2B,CAAA;AACnE,IAAA,UAAA,GAAa;AAAA,MACX,eAAA,EAAiB,IAAA;AAAA,MACjB,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,IAAA;AAAA,MACX,wBAAA,EAA0B,IAAA;AAAA,MAC1B,kBAAA,EAAoB,IAAA;AAAA,MACpB,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;;;AC5CA,IAAM,gBAAA,GAAmB,YAAA;AAQlB,IAAM,+BAAA,GAAkC,CAAC,MAAA,KAAsD;AACpG,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,MAAA;AAC5B,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,MAAA,EAAO,GAAI,WAAW,EAAC;AAGjD,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,CAAS,SAAS,IAC1C,MAAA,CAAO,KAAA,CAAM,uCAAuC,CAAA,GAAI,CAAC,CAAA,IAAK,SAC9D,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,GACrB,MAAA,CAAO,MAAM,uBAAuB,CAAA,GAAI,CAAC,CAAA,IAAK,MAAA,GAC9C,MAAA;AAGN,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,YAAY,CAAA;AAChC,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AACjD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AAGA,EAAA,MAAM,cAAc,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,SAAA,KAA6B;AAE3E,IAAA,MAAM,CAAC,UAAA,EAAY,UAAA,GAAa,EAAE,CAAA,GAAI,SAAA,CAAU,MAAM,GAAG,CAAA;AACzD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAAgC,SAAU,CAAA,CAAE,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAsC;AAG/D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAA,SAAA,KAAa;AACzC,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA;AACvC,QAAA,MAAM,WAAA,GAAc,SAAS,QAAA,GAAW,SAAA,CAAU,MAAM,CAAA,EAAG,EAAE,CAAA,GAAI,SAAA,EAAW,EAAE,CAAA;AAE9E,QAAA,IAAI,CAAC,KAAA,CAAM,WAAW,CAAA,EAAG;AACvB,UAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,EAAG;AAClC,YAAA,YAAA,CAAa,GAAA,CAAI,WAAA,kBAAa,IAAI,GAAA,EAAK,CAAA;AAAA,UACzC;AACA,UAAA,YAAA,CAAa,IAAI,WAAW,CAAA,EAAG,GAAA,CAAI,QAAA,GAAW,WAAW,QAAQ,CAAA;AAAA,QACnE;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACpE,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAAA,OAAAA,KAAUA,OAAAA,CAAO,GAAA,CAAI,QAAQ,CAAC,CAAA;AACvF,IAAA,MAAM,SAAqC,SAAA,GAAY,CAAC,UAAU,QAAQ,CAAA,GAAI,CAAC,QAAQ,CAAA;AAEvF,IAAA,MAAM,MAAA,GAAS,UAAA;AACf,IAAA,MAAM,oBAAoB,UAAA,CACvB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,UAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CACxD,KAAK,GAAG,CAAA;AAEX,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAM,iBAAA;AAAA,QACN,GAAI,SAAS,MAAM,CAAA,IAAK,EAAE,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA,EAAE;AAAA,QAChD,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,MAAA,EAAQ,iBAAA;AAAA,UACR,SAAA,EAAW,SAAA,GAAY,MAAM,CAAA,IAAK,CAAC,gBAAgB,CAAA;AAAA,UACnD,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,MAAA,EAAQ,OAAA,CAAQ,MAAA,GAAS,OAAA,GAAU,CAAC,GAAG;AAAA,WACzC;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAM,MAAA,GAAyB,MAAA,CAAO,WAAA,CAAY,WAAW,CAAA;AAG7D,EAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,gBAAgC,EAAC;AACvC,IAAA,KAAA,CAAM,QAAQ,CAAA,MAAA,KAAU;AACtB,MAAA,IAAI,MAAA,CAAO,MAAM,CAAA,EAAG;AAClB,QAAA,aAAA,CAAc,MAAM,CAAA,GAAI,MAAA,CAAO,MAAM,CAAA;AAAA,MACvC;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,MAAA,EAAQ,UAAU,CAAA,KAAM;AACvD,MAAA,IAAI,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG;AAC1B,QAAA,aAAA,CAAc,MAAM,CAAA,GAAI,UAAA;AAAA,MAC1B;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;ACvHO,IAAM,oBAAoB,CAAC;AAAA,EAChC,SAAA;AAAA,EACA;AACF,CAAA,KAGM;AAEJ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW,QAAA,CAAS,eAAA,CAAgB,GAAA,GAAM,SAAA;AAAA,EAChD,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO,QAAA;AACT,CAAA;;;AChBO,IAAM,kCAAN,MAAuI;AAAA,EACpI,kBAAA;AAAA,EACA,SAAA,uBAA6D,GAAA,EAAI;AAAA,EAEzE,YAAY,kBAAA,EAA2C;AACrD,IAAA,IAAA,CAAK,kBAAA,GAAqB,EAAE,GAAG,kBAAA,EAAmB;AAAA,EACpD;AAAA,EAEO,cAAA,GAAwC;AAC7C,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,kBAAA,EAAmB;AAAA,EACtC;AAAA,EAEO,eAAe,KAAA,EAAoC;AACxD,IAAA,IAAA,CAAK,kBAAA,GAAqB,EAAE,GAAG,KAAA,EAAM;AACrC,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,kBAAkB,CAAA;AAAA,EAC9C;AAAA,EAEO,UAAU,QAAA,EAAwD;AACvE,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAAA,EAC7B;AAAA,EAEO,YAAY,QAAA,EAAwD;AACzE,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,EAChC;AAAA,EAEQ,gBAAgB,KAAA,EAAoC;AAC1D,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,CAAC,CAAA;AAAA,EAC3D;AACF;ACTO,SAAS,0BAAA,CAA+E;AAAA,EAC7F,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAa;AACX,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAM;AACrC,IAAA,IAAI,WAAW,mCAAA,CAAoC,WAAA;AACnD,IAAA,IAAI,OAAA,IAAW,CAAC,kBAAA,EAAoB;AAClC,MAAA,QAAA,GAAW,EAAE,GAAG,QAAA,EAAU,iBAAA,EAAmB,0BAAA,EAA2B;AAAA,IAC1E;AACA,IAAA,OAAO,WAAW,IAAI,+BAAA;AAAA,MACnB,kBAAA,IAAgD;AAAA,KACnD;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,kBAAA,EAAoB,OAAO,CAAC,CAAA;AAEzC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA;AAAA,IAAA,CACnC,MAAM;AACL,MAAA,IAAI,WAAW,mCAAA,CAAoC,WAAA;AACnD,MAAA,IAAI,OAAA,IAAW,CAAC,kBAAA,EAAoB;AAClC,QAAA,QAAA,GAAW,EAAE,GAAG,QAAA,EAAU,iBAAA,EAAmB,0BAAA,EAA2B;AAAA,MAC1E;AACA,MAAA,OAAQ,kBAAA,IAAgD,QAAA;AAAA,IAC1D,CAAA;AAAG,GACL;AAEA,EAAA,MAAM,sBAAA,GAAyB,WAAA,CAAY,CAAC,QAAA,KAAoC;AAC9E,IAAA,cAAA;AAAA,MAAe,CAAA,IAAA,KACb,KAAK,SAAA,CAAU,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,GAAI,IAAA,GAAO;AAAA,KAC7D;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,UAAU,MAAM;AACd,IAAA,gBAAA,CAAiB,UAAU,sBAAsB,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAA,gBAAA,CAAiB,YAAY,sBAAsB,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,sBAAsB,CAAC,CAAA;AAE7C,EAAA,MAAM,YAAA,GAAe,QAAQ,OAAO;AAAA,IAClC,WAAA;AAAA,IACA,iBAAA,EAAmB,CAAC,QAAA,KAAoC;AACtD,MAAA,gBAAA,CAAiB,eAAe,QAAQ,CAAA;AAAA,IAC1C;AAAA,GACF,CAAA,EAAI,CAAC,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAEnC,EAAA,uBACE,GAAA,CAAC,yBAAA,CAA0B,QAAA,EAA1B,EAAmC,KAAA,EAAQ,YAAA,EAC1C,QAAA,kBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAY,WAAA,CAAY,SAAA,EACvC,QAAA,EACJ,CAAA,EACF,CAAA;AAEJ;;;ACxEO,IAAM,6BAAN,MAAmH;AAAA,EAChH,kBAAA;AAAA,EACA,SAAA,uBAAwD,GAAA,EAAI;AAAA,EAEpE,YAAY,kBAAA,EAAsC;AAChD,IAAA,IAAA,CAAK,kBAAA,GAAqB,EAAE,GAAG,kBAAA,EAAmB;AAAA,EACpD;AAAA,EAEO,cAAA,GAAmC;AACxC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,kBAAA,EAAmB;AAAA,EACtC;AAAA,EAEO,eAAe,KAAA,EAA+B;AACnD,IAAA,IAAA,CAAK,kBAAA,GAAqB,EAAE,GAAG,KAAA,EAAM;AACrC,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,kBAAkB,CAAA;AAAA,EAC9C;AAAA,EAEO,UAAU,QAAA,EAAmD;AAClE,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAAA,EAC7B;AAAA,EAEO,YAAY,QAAA,EAAmD;AACpE,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,EAChC;AAAA,EAEQ,gBAAgB,KAAA,EAA+B;AACrD,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,CAAC,CAAA;AAAA,EAC3D;AACF;ACZO,SAAS,qBAAA,CAAgE;AAAA,EAC9E,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAa;AAEX,EAAA,MAAM,gBAAA,GAAmBC,QAAQ,MAAM;AACrC,IAAA,IAAI,sBAAsB,8BAAA,CAA+B,WAAA;AAGzD,IAAA,IAAI,OAAA,IAAW,CAAC,kBAAA,EAAoB;AAClC,MAAA,mBAAA,GAAsB;AAAA,QACpB,GAAG,mBAAA;AAAA,QACH,iBAAA,EAAmB;AAAA,OACrB;AAAA,IACF;AAEA,IAAA,OAAO,WAAW,IAAI,0BAAA;AAAA,MACnB,kBAAA,IAA2C;AAAA,KAC9C;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,kBAAA,EAAoB,OAAO,CAAC,CAAA;AAEzC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,QAAAA;AAAA,IAAA,CACnC,MAAM;AACL,MAAA,IAAI,sBAAsB,8BAAA,CAA+B,WAAA;AAEzD,MAAA,IAAI,OAAA,IAAW,CAAC,kBAAA,EAAoB;AAClC,QAAA,mBAAA,GAAsB;AAAA,UACpB,GAAG,mBAAA;AAAA,UACH,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF;AAEA,MAAA,OAAQ,kBAAA,IAA2C,mBAAA;AAAA,IACrD,CAAA;AAAG,GACL;AAGA,EAAA,MAAM,sBAAA,GAAyBC,WAAAA,CAAY,CAAC,QAAA,KAA+B;AACzE,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ;AAErB,MAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA,KAAM,KAAK,SAAA,CAAU,QAAQ,IAAI,IAAA,GAAO,QAAA;AAAA,IACpE,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAH,UAAU,MAAM;AAEd,IAAA,gBAAA,CAAiB,UAAU,sBAAsB,CAAA;AAGjD,IAAA,OAAO,MAAM;AACX,MAAA,gBAAA,CAAiB,YAAY,sBAAsB,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,sBAAsB,CAAC,CAAA;AAG7C,EAAA,MAAM,YAAA,GAAeC,QAAQ,OAAO;AAAA,IAClC,WAAA;AAAA,IACA,iBAAA,EAAmB,CAAC,QAAA,KAA+B;AACjD,MAAA,gBAAA,CAAiB,eAAe,QAAQ,CAAA;AAAA,IAC1C;AAAA,GACF,CAAA,EAAI,CAAC,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAEnC,EAAA,uBACEG,GAAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,KAAA,EAAQ,YAAA,EACrC,QAAA,kBAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAY,WAAA,CAAY,SAAA,EACvC,UACJ,CAAA,EACF,CAAA;AAEJ;ACnEO,IAAM,wBAAwB,MAA0B;AAC7D,EAAA,MAAM,QAAA,GAAW,WAAW,yBAAyB,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,WAAW,oBAAoB,CAAA;AAEjD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAS,WAAA,CAAY,OAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,QACX,GAAG,QAAA,CAAS,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,QACxC,GAAG,QAAA,CAAS,WAAA,CAAY,OAAA,CAAQ,SAAA,CAAU;AAAA;AAC5C,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAU,WAAA,CAAY,OAAA;AAAA,MAC/B,WAAA,EAAa,SAAA,CAAU,WAAA,CAAY,OAAA,CAAQ;AAAA,KAC7C;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,MAAM,iGAAiG,CAAA;AACnH;AAEO,IAAM,6BAA6B,MAA+B;AACvE,EAAA,MAAM,QAAA,GAAW,WAAW,yBAAyB,CAAA;AAErD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,MAAM,6EAA6E,CAAA;AAAA,EAC/F;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,SAAS,WAAA,CAAY,OAAA;AAAA,IAC9B,kBAAA,EAAoB,QAAA,CAAS,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,IACzD,oBAAA,EAAsB,QAAA,CAAS,WAAA,CAAY,OAAA,CAAQ,SAAA,CAAU;AAAA,GAC/D;AACF;ACtDO,SAAS,mBAAA,GAA0E;AACxF,EAAA,MAAM,OAAA,GAAUC,WAAW,yBAAyB,CAAA;AAEpD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,EACxF;AAEA,EAAA,OAAO;AAAA,IACL,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,mBAAmB,OAAA,CAAQ;AAAA,GAC7B;AACF;;;ACVA,IAAM,qBAAqB,CAAC;AAAA,EAC1B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS,CAAC,QAAQ;AACpB,CAAA,KAIc;AACZ,EAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AACA,EAAA,MAAM,eAAe,OAAA,CAAQ,MAAA;AAG7B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,EAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AAEjC,IAAA,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,CAAA;AAG9B,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC7B,MAAA,QAAA,CAAS,GAAA,CAAI,CAAA,EAAI,MAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7B;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAK;AAE9C,EAAA,MAAM,cAAc,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,GAAG,EAAE,WAAA,EAAY;AAC1D,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA;AAEzC,EAAA,OAAO,CAAA,mCAAA,EAAuC,WAAY,CAAA,CAAA,EAAK,YAAa,CAAA,CAAA;AAC9E,CAAA;AAKO,IAAM,wBAAA,GAA2B,CAAC,IAAA,KAA8C;AACrF,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,OAAA,IAAW,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AAC5G,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,KAAW,IAAA,CAAK,IAAA;AAEzC,EAAA,MAAM,MAAM,kBAAA,CAAmB;AAAA,IAC7B,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,GAAA,EAAK,YAAA;AAAA,IACL;AAAA,GACF;AACF,CAAA;;;ACzDA,IAAM,wBAAwB,CAAC;AAAA,EAC7B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS,CAAC,QAAQ,CAAA;AAAA,EAClB,MAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV;AACF,CAAA,KAOc;AAEZ,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,CAAA,yCAAA,EAA6C,OAAO,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAE,CAAA,MAAA,EAAU,kBAAA,CAAmB,IAAI,CAAE,CAAA,CAAA;AAAA,EACnH;AAEA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,MAAA;AACnB,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,KAAS,QAAA,GAClC,QAAQ,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GACvB,CAAA,EAAI,OAAA,CAAQ,GAAI,CAAA,EAAA,EAAM,QAAQ,GAAI,CAAA,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,YAAY,MAAA,GAAS,CAAA,EAAI,OAAO,GAAI,CAAA,EAAA,EAAM,MAAA,CAAO,GAAI,CAAA,CAAA,GAAK,MAAA;AAE9E,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC5C,EAAA,IAAI,SAAA;AAEJ,EAAA,IAAI,aAAa,QAAA,EAAU;AAEzB,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,CAAA,EAAA,EAAM,WAAY,CAAA,CAAA,EAAK,YAAa,CAAA,CAAA;AAAA;AAAA,MACpC,CAAA,EAAA,EAAM,WAAY,CAAA,CAAA,EAAK,YAAa,CAAA;AAAA;AAAA,KACtC;AACA,IAAA,SAAA,GAAY,CAAA,gBAAA,EAAoB,QAAA,CAAS,IAAA,CAAK,GAAG,CAAE,CAAA,CAAA;AAAA,EACrD,WAAW,SAAA,EAAW;AAEpB,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,KAAM,YAAa,CAAA,CAAA;AAAA;AAAA,MACnB,KAAM,YAAa,CAAA;AAAA;AAAA,KACrB;AACA,IAAA,SAAA,GAAY,CAAA,WAAA,EAAe,QAAA,CAAS,IAAA,CAAK,GAAG,CAAE,CAAA,CAAA;AAAA,EAChD,WAAW,QAAA,EAAU;AAEnB,IAAA,SAAA,GAAY,CAAA,WAAA,EAAe,WAAY,CAAA,CAAA,EAAK,YAAa,CAAA,CAAA;AAAA,EAC3D,CAAA,MAAO;AAEL,IAAA,SAAA,GAAY,SAAU,YAAa,CAAA,CAAA;AAAA,EACrC;AACA,EAAA,MAAM,YAAA,GAAe,OAAA,GAAU,CAAA,SAAA,EAAa,OAAQ,CAAA,CAAA,GAAK,EAAA;AAEzD,EAAA,OAAO,CAAA,yCAAA,EAA6C,WAAY,CAAA,EAAI,SAAU,GAAI,YAAa,CAAA,CAAA;AACjG,CAAA;AAKO,IAAM,yBAAA,GAA4B,CAAC,IAAA,EAAsB,IAAA,KAAuC;AACrG,EAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,YAAY,IAAA,CAAK,MAAA,CAAO,aAAa,QAAA,EAAU;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAS,MAAA,EAAQ,MAAA,KAAW,IAAA,CAAK,IAAA;AAE1D,EAAA,MAAM,MAAM,qBAAA,CAAsB;AAAA,IAChC,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,GAAA,EAAK,YAAA;AAAA,IACL;AAAA,GACF;AACF,CAAA;;;ACjFE,IAAM,aAAA,GAAgB,CAAC,IAAA,KAAyB;AAC9C,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AAC/C,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AAAQ,MAAA,OAAO,MAAA;AAAA,IACpB,KAAK,OAAA;AAAS,MAAA,OAAO,OAAA;AAAA,IACrB,KAAK,KAAA;AAAO,MAAA,OAAO,UAAA;AAAA,IACnB,KAAK,KAAA;AAAO,MAAA,OAAO,UAAA;AAAA,IACnB,KAAK,KAAA;AAAO,MAAA,OAAO,mBAAA;AAAA,IACnB,KAAK,KAAA;AAAO,MAAA,OAAO,KAAA;AAAA,IACnB;AAAS,MAAA,OAAO,OAAA;AAAA;AAEpB,CAAA;AAKO,IAAM,wBAAA,GAA2B,CAAC,IAAA,KAA8C;AACrF,EAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,YAAY,IAAA,CAAK,MAAA,CAAO,aAAa,OAAA,EAAS;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,MAAA,KAAW,IAAA,CAAK,IAAA;AAClD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAC;AAGxC,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,CAAI,CAAA,QAAA,KAAY;AAC3C,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,QAAA,CAAS,MAAM,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,CAAE,QAAA,EAAS;AAGxE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,YACrB,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,OAAA,IACzB,SAAA,IAAa,IAAA,CAAK,MAAA,IAClB,IAAA,CAAK,OAAO,OAAA,KAAY,UAAA;AAE3C,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,CAAA,YAAA,CAAA;AAAA,MACA,mBAAoB,MAAO,CAAA,EAAA,CAAA;AAAA,MAC3B,CAAA,YAAA,EAAgB,OAAQ,CAAA,WAAA,EAAe,MAAO,CAAA,GAAA;AAAA,KAChD;AAGA,IAAA,IAAI,UAAA,IAAc,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AAC7C,MAAA,KAAA,CAAM,KAAK,CAAA,eAAA,EAAmB,OAAA,CAAQ,GAAI,CAAA,CAAA,EAAK,OAAA,CAAQ,GAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE,CAAA,MAAA,IAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAmB,QAAA,CAAS,MAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAkB,QAAA,CAAS,KAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,MAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAoB,MAAA,CAAO,GAAI,CAAA,EAAA,EAAM,MAAA,CAAO,GAAI,CAAA,EAAA,CAAI,CAAA;AAAA,IACjE;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAoB,OAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,CAAwB,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AAAA,EAC5B,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AAE9B,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,UAAU,CAAA,EAAG,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA;AAGxD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,GAAA,EAAK,YAAA;AAAA,IACL;AAAA,GACF;AACF,CAAA;;;ACnDK,IAAM,iBAAA,GAAoB,CAAC,cAAA,KAAkD;AAClF,EAAA,MAAM,wBAAkC,EAAC;AACzC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA0B;AAElD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA8B;AACrD,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA8B;AACtD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA8B;AAqBrD,EAAA,MAAM,mBAAA,GAAsB,CAC1B,QAAA,EACA,SAAA,GAA2B,KAAA,KAChB;AACX,IAAA,IAAI,CAAC,UAAU,OAAO,SAAA;AAGtB,IAAA,IAAI,qBAAA,CAAsB,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC5C,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AACtC,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,CAAC,CAAA,EAAG,WAAA,EAAY;AAG7C,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,kBAAA,GAAqB,CAAA,EAAI,QAAS,CAAA,CAAA,EAAK,cAAe,CAAA,CAAA;AAC5D,MAAA,IAAI,qBAAA,CAAsB,QAAA,CAAS,kBAAkB,CAAA,EAAG;AACtD,QAAA,OAAO,kBAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,CAAC,cAAA,EAAgB;AACxC,MAAA,IAAI,SAAA,KAAc,KAAA,IAAS,qBAAA,CAAsB,QAAA,CAAS,MAAM,CAAA,EAAG;AACjE,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,IAAI,qBAAA,CAAsB,QAAA,CAAS,IAAI,CAAA,EAAG;AACxC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GACH,QAAA,KAAa,IAAA,KAAS,cAAA,KAAmB,MAAA,IAAU,cAAA,KAAmB,MAAA,CAAA,IACtE,QAAA,KAAa,IAAA,KAAS,cAAA,KAAmB,MAAA,IAAU,cAAA,KAAmB,QAAQ,cAAA,KAAmB,IAAA,CAAA;AAGpG,IAAA,IAAI,CAAC,YAAA,IAAgB,qBAAA,CAAsB,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC7D,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,cAAA,EAAgB,cAAc,CAAA,KAAM;AAE3E,IAAA,MAAM,cAAA,GAAiB,OAAA,IAAW,cAAA,GAC/B,cAAA,CAA+C,KAAA,GAChD,cAAA;AAGF,IAAA,IAAI,wBAAwB,cAAA,EAAgB;AAC1C,MAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,kBAAA,CAAmB,GAAA,CAAI,CAAC,IAAA,KAAiB;AAC/E,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC/B,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AACtC,QAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,CAAC,CAAA,EAAG,WAAA,EAAY;AAC7C,QAAA,OAAO,cAAA,GAAiB,CAAA,EAAI,QAAS,CAAA,CAAA,EAAK,cAAe,CAAA,CAAA,GAAK,QAAA;AAAA,MAChE,CAAC,CAAA;AACD,MAAA,qBAAA,CAAsB,IAAA,CAAK,GAAG,gBAAgB,CAAA;AAAA,IAChD;AAGA,IAAA,UAAA,CAAW,GAAA,CAAI,cAAA,EAAgB,EAAE,CAAA;AACjC,IAAA,WAAA,CAAY,GAAA,CAAI,cAAA,EAAgB,EAAE,CAAA;AAClC,IAAA,UAAA,CAAW,GAAA,CAAI,cAAA,EAAgB,EAAE,CAAA;AAEjC,IAAA,MAAM,oBAAA,GAAuB,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AAC1D,IAAA,MAAM,qBAAA,GAAwB,WAAA,CAAY,GAAA,CAAI,cAAc,CAAA;AAC5D,IAAA,MAAM,oBAAA,GAAuB,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AAG1D,IAAA,MAAA,CAAO,OAAA,CAAwB,cAAgD,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,EAAA,EAAI,IAAI,CAAA,KAAM;AACvG,MAAA,MAAM,UAAA,GAAa,KAAK,IAAA,CAAK,MAAA;AAC7B,MAAA,IAAI,SAAA,GAAY,UAAA;AAEhB,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AACjC,QAAA,QAAQ,IAAA,CAAK,OAAO,QAAA;AAAU,UAC5B,KAAK,OAAA;AACH,YAAA,oBAAA,CAAqB,KAAK,IAAI,CAAA;AAC9B,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,qBAAA,CAAsB,KAAK,IAAI,CAAA;AAC/B,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,oBAAA,CAAqB,KAAK,IAAI,CAAA;AAC9B,YAAA;AAAA;AACJ,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAyB;AAC7C,QAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,QAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AAGrB,QAAA,IAAI,OAAA,CAAQ,SAAS,GAAG,CAAA,IAAK,CAAC,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,EAAG;AAC1D,UAAA,OAAO,IAAK,OAAQ,CAAA,CAAA,CAAA;AAAA,QACtB;AACA,QAAA,OAAO,OAAA;AAAA,MACT,CAAA;AAEA,MAAA,MAAM,iBAAA,GAAoB,aAAa,UAAU,CAAA;AAEjD,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAA,EAAQ;AAC/B,QAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,IAAI,GAAA;AAAA,UAC9B,IAAA,CAAK,IAAA,CAAK,SAAA,CACP,MAAA,CAAO,CAAC,QAAA,KAAqB,QAAA,CAAS,WAAA,EAAY,KAAM,UAAA,CAAW,WAAA,EAAa,CAAA,CAChF,IAAI,YAAY;AAAA,SACpB,CAAA;AACD,QAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,UAAA,SAAA,GAAY,CAAC,iBAAA,EAAmB,GAAG,eAAe,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,QAC/D;AAAA,MACF;AAEA,MAAA,WAAA,CAAY,IAAI,EAAA,EAAI;AAAA,QAClB,WAAW,SAAA,IAAa,iBAAA;AAAA,QACxB,UAAA,EAAY,iBAAA;AAAA,QACZ,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,OAAA,IAAW,IAAA;AAAA,QAC9B,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU;AAAA,OAC7B,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,GAAA,CAAI,SAAS,KAAK,EAAC;AACxD,EAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,GAAA,CAAI,SAAS,KAAK,EAAC;AAC1D,EAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,GAAA,CAAI,SAAS,KAAK,EAAC;AAGxD,EAAA,MAAM,eAAe,CAAC,cAAA,EAAkC,eAAA,EAAmC,cAAA,EAAkC,WAAoB,KAAA,KAA0C;AACzL,IAAA,MAAM,MAAA,GAAkC;AAAA,MACtC,gBAAgB,EAAC;AAAA,MACjB,SAAS,EAAC;AAAA,MACV,QAAQ;AAAC,KACX;AAGA,IAAA,MAAM,cAAA,GAAiB,cAAA,CACpB,GAAA,CAAI,CAAA,IAAA,KAAQ,wBAAA,CAAyB,IAAI,CAAC,CAAA,CAC1C,MAAA,CAAO,CAAC,QAAA,KAAuC,QAAA,KAAa,IAAI,CAAA;AAEnE,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,cAAA,CAAe,IAAA;AAAA,QACpB;AAAA,OACF;AAEA,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA;AAAA,QACb;AAAA,UACE,EAAA,EAAI,MAAA;AAAA,UACJ,GAAA,EAAK,YAAA;AAAA,UACL,GAAA,EAAK;AAAA;AACP,OACF;AAEA,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,cAAc,CAAA;AAAA,IACtC;AAGA,IAAA,MAAM,kBAAkB,eAAA,CACrB,GAAA,CAAI,CAAA,IAAA,KAAQ,yBAAA,CAA0B,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,GAAO,MAAS,CAAC,CAAA,CAC7E,MAAA,CAAO,CAAC,QAAA,KAAuC,aAAa,IAAI,CAAA;AAEnE,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,cAAA,CAAe,IAAA;AAAA,QACpB,8BAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA;AAAA,QACb;AAAA,UACE,EAAA,EAAI,MAAA;AAAA,UACJ,GAAA,EAAK,YAAA;AAAA,UACL,GAAA,EAAK;AAAA,SACP;AAAA,QACA;AAAA,UACE,EAAA,EAAI,MAAA;AAAA,UACJ,GAAA,EAAK,YAAA;AAAA,UACL,GAAA,EAAK,2BAAA;AAAA,UACL,UAAA,EAAY,EAAE,WAAA,EAAa,WAAA;AAAY;AACzC,OACF;AAEA,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,eAAe,CAAA;AAAA,IACvC;AAGA,IAAA,MAAM,cAAA,GAAiB,eACpB,GAAA,CAAI,wBAAwB,EAC5B,MAAA,CAAO,CAAC,QAAA,KAAuC,QAAA,KAAa,IAAI,CAAA;AAEnE,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AACjD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,cAAc,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,EAC7C,CAAA;AASA,EAAA,MAAM,cAAA,GAAiB,CAAC,OAAA,EAAoD,QAAA,GAAW,KAAA,KAA0C;AAE7H,IAAA,IAAI,OAAA,IAAW,SAAS,OAAA,EAAS;AAC/B,MAAA,MAAM,EAAE,KAAI,GAAI,OAAA;AAEhB,MAAA,IAAI,CAAC,GAAA,IAAO,EAAE,GAAA,IAAO,cAAA,CAAA,EAAiB;AACpC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,aAAa,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,IAAK,IAAI,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,IAAK,IAAI,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,IAAK,IAAI,QAAQ,CAAA;AAAA,IAChH;AAGA,IAAA,IAAI,OAAA,IAAW,cAAc,OAAA,EAAS;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,mBAAA,EAAoB,GAAI,OAAA;AAG1C,MAAA,KAAA,MAAW,CAAC,cAAA,EAAgB,cAAc,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC7E,QAAA,IAAI,mBAAmB,SAAA,EAAW;AAElC,QAAA,MAAM,cAAA,GAAiB,oBAAA,IAAwB,cAAA,GAC7C,cAAA,CAAe,kBAAA,GAAqB,IAAA;AAEtC,QAAA,IAAI,cAAA,IAAkB,MAAM,OAAA,CAAQ,cAAc,KAAK,mBAAA,IAAuB,cAAA,CAAe,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAC1H,UAAA,OAAO,aAAa,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA,IAAK,IAAI,WAAA,CAAY,GAAA,CAAI,cAAc,CAAA,IAAK,IAAI,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA,IAAK,IAAI,QAAQ,CAAA;AAAA,QACjJ;AAAA,MACF;AAAA,IACF;AAGA,IAAA,OAAO,YAAA,CAAa,iBAAA,EAAmB,kBAAA,EAAoB,iBAAA,EAAmB,QAAQ,CAAA;AAAA,EACxF,CAAA;AAQA,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,KAAmB;AAC1C,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA;AACrC,IAAA,OAAO,MAAA,IAAU,EAAE,SAAA,EAAW,IAAA,EAAM,YAAY,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAAA,EACpF,CAAA;AAQA,EAAA,MAAM,iBAAA,GAAoB,CAAC,OAAA,KAAuE;AAEhG,IAAA,IAAI,OAAA,IAAW,SAAS,OAAA,EAAS;AAC/B,MAAA,MAAM,EAAE,KAAI,GAAI,OAAA;AAEhB,MAAA,IAAI,CAAC,GAAA,IAAO,EAAE,GAAA,IAAO,cAAA,CAAA,EAAiB;AACpC,QAAA,OAAO,cAAA,CAAe,OAAA;AAAA,MACxB;AAGA,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,OAAO,cAAA,CAAe,OAAA;AAAA,MACxB;AAGA,MAAA,MAAM,UAAA,GAAa,cAAA;AACnB,MAAA,MAAM,UAAA,GAAa,WAAW,GAAG,CAAA;AACjC,MAAA,IAAI,UAAA,IAAc,WAAW,UAAA,EAAY;AACvC,QAAA,OAAO,UAAA,CAAW,KAAA;AAAA,MACpB;AAGA,MAAA,OAAO,cAAA,CAAe,OAAA;AAAA,IACxB;AAGA,IAAA,IAAI,OAAA,IAAW,cAAc,OAAA,EAAS;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,mBAAA,EAAoB,GAAI,OAAA;AAG1C,MAAA,KAAA,MAAW,CAAC,cAAA,EAAgB,cAAc,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC7E,QAAA,IAAI,mBAAmB,SAAA,EAAW;AAElC,QAAA,MAAM,aAAa,OAAA,IAAW,cAAA,GAAiB,cAAA,GAAiB,EAAE,OAAO,cAAA,EAAe;AACxF,QAAA,MAAM,cAAA,GAAiB,oBAAA,IAAwB,UAAA,GAC7C,UAAA,CAAW,kBAAA,GAAqB,IAAA;AAElC,QAAA,IAAI,cAAA,EAAgB,QAAA,CAAS,mBAAoB,CAAA,EAAG;AAClD,UAAA,OAAO,UAAA,CAAW,KAAA;AAAA,QACpB;AAAA,MACF;AAGA,MAAA,OAAO,cAAA,CAAe,OAAA;AAAA,IACxB;AAGA,IAAA,OAAO,cAAA,CAAe,OAAA;AAAA,EACxB,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;;;AC3WO,SAAS,cAAA,GAA2D;AACzE,EAAA,MAAM,OAAA,GAAUA,WAAW,oBAAoB,CAAA;AAE/C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAC9E;AAGA,EAAA,MAAM,cAAc,iBAAA,CAAkB,OAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,KAAK,UAAU,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,IAE3B,kBAAA,EAAoB,CAAC,OAAA,EAAoD,QAAA,KAAuB;AAC9F,MAAA,OAAO,WAAA,CAAY,cAAA,CAAe,OAAA,EAAS,QAAQ,CAAA;AAAA,IACrD,CAAA;AAAA,IAEA,YAAA,EAAc,CAAC,OAAA,KAAuD;AACpE,MAAA,OAAO,WAAA,CAAY,kBAAkB,OAAO,CAAA;AAAA,IAC9C,CAAA;AAAA,IAEA,eAAA,EAAiB,CAAC,MAAA,KAAmB;AACnC,MAAA,OAAO,WAAA,CAAY,gBAAgB,MAAM,CAAA;AAAA,IAC3C,CAAA;AAAA,IAEA,mBAAA,EAAqB,CAAC,QAAA,EAA8B,SAAA,KAA6B;AAC/E,MAAA,OAAO,WAAA,CAAY,mBAAA,CAAoB,QAAA,EAAU,SAAS,CAAA;AAAA,IAC5D;AAAA,GACF;AACF;;;ACxBO,IAAM,oBAAoB,MAAM;AACrC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,MAAM,gBAAA,GAAmB,YAAY,OAAA,CAAQ,WAAA;AAC7C,EAAA,MAAM,aAAA,GAAgB,YAAY,OAAA,CAAQ,QAAA;AAC1C,EAAA,MAAM,gBAAA,GAAmB,YAAY,OAAA,CAAQ,WAAA;AAE7C,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,WAAA;AACnD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,QAAA;AAEhD,EAAA,MAAM,kBAAA,GAAqB,YAAY,QAAA,CAAS,WAAA;AAChD,EAAA,MAAM,eAAA,GAAkB,YAAY,QAAA,CAAS,QAAA;AAC7C,EAAA,MAAM,kBAAA,GAAqB,YAAY,QAAA,CAAS,WAAA;AAEhD,EAAA,MAAM,oBAAA,GAAuB,WAAA,CAAY,QAAA,CAAS,IAAA,EAAM,IAAA,IAAQ,uBAAA;AAChE,EAAA,MAAM,wBAAA,GAA2B,WAAA,CAAY,QAAA,CAAS,IAAA,EAAM,QAAA,IAAY,2BAAA;AACxE,EAAA,MAAM,uBAAA,GAA0B,WAAA,CAAY,QAAA,CAAS,OAAA,EAAS,IAAA,IAAQ,0BAAA;AACtE,EAAA,MAAM,2BAAA,GAA8B,WAAA,CAAY,QAAA,CAAS,OAAA,EAAS,QAAA,IAAY,8BAAA;AAE9E,EAAA,MAAM,uBAAA,GAA0B,WAAA,CAAY,QAAA,CAAS,OAAA,EAAS,SAAS,WAAA,IAAe,0BAAA;AACtF,EAAA,MAAM,uBAA8C,EAAC;AACrD,EAAA,MAAM,uBAAA,GAA0B,WAAA,CAAY,QAAA,CAAS,OAAA,EAAS,SAAS,WAAA,IAAe,0BAAA;AAEtF,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,wBAAA;AAAA,IACA,uBAAA;AAAA,IACA,2BAAA;AAAA,IACA,uBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACrDA,IAAM,QAAA,GAAW;AAAA,EACf,KAAA,EAAO,IAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AAIO,IAAM,YAAA,GAAe,CAAC,GAAA,EAAa,OAAA,GAAyB,OAAA,KAAY;AAC7E,EAAA,OAAO,CAAA,EAAI,QAAA,CAAS,OAAO,CAAE,IAAK,GAAI,CAAA,CAAA;AACxC;;;;;;;;;;;;ACFO,SAAS,aAAa,CAAA,EAAmB;AAC5C,EAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,EAAA,OAAO,CAAA,IAAK,UAAU,CAAA,GAAI,KAAA,GAAQ,KAAK,GAAA,CAAA,CAAK,CAAA,GAAI,KAAA,IAAS,KAAA,EAAO,GAAG,CAAA;AACvE;AAGO,SAAS,aAAa,CAAA,EAAmB;AAC5C,EAAA,MAAM,CAAA,GAAI,CAAA,IAAK,QAAA,GAAY,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,GAAI,KAAA;AACtE,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAC,CAAC,CAAA;AACzD;AAOO,SAAS,UAAA,CAAW,CAAA,EAAW,CAAA,EAAW,CAAA,EAAkB;AAE/D,EAAA,MAAM,EAAA,GAAK,aAAa,CAAC,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,aAAa,CAAC,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,aAAa,CAAC,CAAA;AAGzB,EAAA,MAAM,EAAA,GAAK,YAAA,GAAe,EAAA,GAAK,YAAA,GAAe,KAAK,YAAA,GAAe,EAAA;AAClE,EAAA,MAAM,EAAA,GAAK,YAAA,GAAe,EAAA,GAAK,YAAA,GAAe,KAAK,YAAA,GAAe,EAAA;AAClE,EAAA,MAAM,EAAA,GAAK,YAAA,GAAe,EAAA,GAAK,YAAA,GAAe,KAAK,YAAA,GAAe,EAAA;AAGlE,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AACvB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AACvB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AAGvB,EAAA,MAAM,CAAA,GAAI,YAAA,GAAe,EAAA,GAAK,WAAA,GAAe,KAAK,YAAA,GAAe,EAAA;AACjE,EAAA,MAAM,CAAA,GAAI,YAAA,GAAe,EAAA,GAAK,WAAA,GAAe,KAAK,YAAA,GAAe,EAAA;AACjE,EAAA,MAAM,IAAA,GAAO,YAAA,GAAe,EAAA,GAAK,YAAA,GAAe,KAAK,WAAA,GAAe,EAAA;AAGpE,EAAA,MAAM,IAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAA,GAAI,OAAO,IAAI,CAAA;AACvC,EAAA,IAAI,IAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA,IAAK,MAAM,IAAA,CAAK,EAAA,CAAA;AAC1C,EAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,GAAA;AAEhB,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC9B;AAOO,SAAS,UAAA,CAAW,CAAA,EAAW,CAAA,EAAW,CAAA,EAAqC;AAElF,EAAA,MAAM,IAAA,GAAO,CAAA,IAAK,IAAA,CAAK,EAAA,GAAK,GAAA,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAG9B,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,YAAA,GAAe,CAAA,GAAI,YAAA,GAAe,IAAA;AACjD,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,YAAA,GAAe,CAAA,GAAI,YAAA,GAAe,IAAA;AACjD,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,YAAA,GAAe,CAAA,GAAI,WAAA,GAAe,IAAA;AAGjD,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACrB,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AAGrB,EAAA,MAAM,EAAA,GAAK,YAAA,GAAgB,EAAA,GAAK,YAAA,GAAe,KAAK,YAAA,GAAe,EAAA;AACnE,EAAA,MAAM,EAAA,GAAK,aAAA,GAAgB,EAAA,GAAK,YAAA,GAAe,KAAK,YAAA,GAAe,EAAA;AACnE,EAAA,MAAM,EAAA,GAAK,aAAA,GAAgB,EAAA,GAAK,YAAA,GAAe,KAAK,WAAA,GAAe,EAAA;AAEnE,EAAA,OAAO,CAAC,aAAa,EAAE,CAAA,EAAG,aAAa,EAAE,CAAA,EAAG,YAAA,CAAa,EAAE,CAAC,CAAA;AAChE;AAYO,SAAS,uBACZ,MAAA,EAC+B;AAC/B,EAAA,MAAM,GAAA,GAAuC,IAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACpE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA;AAC1B,IAAA,MAAM,EAAE,GAAG,CAAA,EAAG,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AACtC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI;MACL,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;MAClB,IAAA,CAAK,KAAA,CAAO,CAAA,GAAI,GAAA,GAAO,GAAG,CAAA;MAC1B,IAAA,CAAK,KAAA,CAAO,CAAA,GAAI,GAAA,GAAO,GAAG;AAC9B,KAAA;AACJ,EAAA;AACA,EAAA,OAAO,GAAA;AACX;AAKO,SAAS,wBACZ,MAAA,EAC8D;AAC9D,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG,UAAA,EAAW,KAAM;AACvD,IAAA,MAAM,IAAI,EAAA,GAAK,GAAA;AACf,IAAA,MAAM,CAAA,GAAK,KAAK,GAAA,GAAO,GAAA;AACvB,IAAA,MAAM,CAAA,GAAK,KAAK,GAAA,GAAO,GAAA;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,UAAA,CAAW,GAAG,CAAA,EAAG,CAAC,GAAG,UAAA,EAAW;EACpD,CAAC,CAAA;AACL;AAvHA,IAAA,mBAAA,KAAA,CAAA;EAAA,oBAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACOA,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAgB;AACpD,EAAA,MAAM,KAAK,CAAA,GAAI,GAAA;AACf,EAAA,MAAM,KAAK,CAAA,GAAI,GAAA;AACf,EAAA,MAAM,KAAK,CAAA,GAAI,GAAA;AACf,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAA,CAAK,MAAM,GAAA,IAAO,CAAA;AACxB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,IAAI,QAAQ,GAAA,EAAK;AACb,IAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,IAAA,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA,IAAK,IAAI,GAAA,GAAM,GAAA,CAAA,GAAO,KAAK,GAAA,GAAM,GAAA,CAAA;AAE/C,IAAA,IAAI,QAAQ,EAAA,EAAI;AACZ,MAAA,CAAA,GAAA,CAAA,CAAM,KAAK,EAAA,IAAM,CAAA,IAAK,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA,CAAA,IAAM,CAAA;AAC9C,IAAA,CAAA,MAAA,IAAW,QAAQ,EAAA,EAAI;AACnB,MAAA,CAAA,GAAA,CAAA,CAAM,EAAA,GAAK,EAAA,IAAM,CAAA,GAAI,CAAA,IAAK,CAAA;IAC9B,CAAA,MAAO;AACH,MAAA,CAAA,GAAA,CAAA,CAAM,EAAA,GAAK,EAAA,IAAM,CAAA,GAAI,CAAA,IAAK,CAAA;AAC9B,IAAA;AACJ,EAAA;AAEA,EAAA,OAAO;IACH,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;IACrB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;IACrB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG;AACzB,GAAA;AACJ;AAGA,SAAS,iBAAA,CAAkB,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAChE,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAc;AAC5B,IAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,IAAA,OAAO,CAAA,IAAK,UAAU,CAAA,GAAI,KAAA,GAAQ,KAAK,GAAA,CAAA,CAAK,CAAA,GAAI,KAAA,IAAS,KAAA,EAAO,GAAG,CAAA;AACvE,EAAA,CAAA;AACA,EAAA,OAAO,MAAA,GAAS,QAAA,CAAS,CAAC,CAAA,GAAI,MAAA,GAAS,SAAS,CAAC,CAAA,GAAI,MAAA,GAAS,QAAA,CAAS,CAAC,CAAA;AAC5E;AAGA,SAAS,aAAA,CAAc,IAAY,EAAA,EAAoB;AACnD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,EAAA,OAAA,CAAQ,OAAA,GAAU,SAAS,MAAA,GAAS,IAAA,CAAA;AACxC;AAmHO,SAAS,YACZ,CAAA,EACA,CAAA,EACA,CAAA,EACA,UAAA,EACA,aAAqB,CAAA,EAChB;AACL,EAAA,OAAO,IAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,UAAU,CAAA;AACxD;AA9KA,IAyDM,SAAA;AAzDN,IAAA,aAAA,KAAA,CAAA;EAAA,cAAA,GAAA;AACA,IAAA,gBAAA,EAAA;AAwDM,IAAA,SAAA,GAAN,MAAiC;AAY7B,MAAA,WAAA,CAAY,CAAA,EAAW,CAAA,EAAW,CAAA,EAAW,UAAA,EAAoB,UAAA,EAAoB;AACjF,QAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,QAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,QAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AACtB,MAAA;MAEA,GAAA,GAAW;AACP,QAAA,OAAO,EAAE,GAAG,IAAA,CAAK,EAAA,EAAI,GAAG,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,EAAA,EAAG;AAChD,MAAA;MAEA,GAAA,GAAc;AACV,QAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAc,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAC3D,QAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AAC/D,MAAA;MAEA,GAAA,GAAW;AACP,QAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACZ,UAAA,IAAA,CAAK,OAAO,QAAA,CAAS,IAAA,CAAK,IAAI,IAAA,CAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAClD,QAAA;AACA,QAAA,OAAO,IAAA,CAAK,IAAA;AAChB,MAAA;MAEA,KAAA,GAAe;AACX,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AACd,UAAA,IAAA,CAAK,SAAS,UAAA,CAAW,IAAA,CAAK,IAAI,IAAA,CAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACtD,QAAA;AACA,QAAA,OAAO,IAAA,CAAK,MAAA;AAChB,MAAA;AAEA,MAAA,GAAA,CAAI,SAAyB,KAAA,EAAe;AACxC,QAAA,QAAQ,MAAA;AACJ,UAAA,KAAK,KAAA,EAAO;AACR,YAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAI,KAAK,GAAA,EAAI;AAC7B,YAAA,OAAO,CAAA,IAAA,EAAO,CAAC,CAAA,EAAA,EAAK,CAAC,MAAM,CAAC,CAAA,EAAA,CAAA;AAChC,UAAA;AACA,UAAA,KAAK,OAAA,EAAS;AACV,YAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,GAAI,KAAK,KAAA,EAAM;AAC/B,YAAA,OAAO,CAAA,MAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAChE,UAAA;UACA,KAAK,KAAA;AACL,UAAA;AACI,YAAA,OAAO,CAAA,IAAA,EAAO,KAAK,EAAE,CAAA,EAAA,EAAK,KAAK,EAAE,CAAA,EAAA,EAAK,KAAK,EAAE,CAAA,CAAA,CAAA;AACrD;AACJ,MAAA;MAEA,KAAA,GAAkC;AAC9B,QAAA,OAAO,CAAC,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACrC,MAAA;MAEA,QAAA,GAAmB;AACf,QAAA,OAAO,KAAK,GAAA,EAAI;AACpB,MAAA;AAEA,MAAA,IAAI,SAAA,GAAoB;AACpB,QAAA,OAAO,IAAA,CAAK,SAAS,SAAA,GAAY,SAAA;AACrC,MAAA;AAEA,MAAA,IAAY,SAAA,GAAoB;AAC5B,QAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW;AAC/B,UAAA,IAAA,CAAK,aAAa,iBAAA,CAAkB,IAAA,CAAK,IAAI,IAAA,CAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACjE,QAAA;AACA,QAAA,OAAO,IAAA,CAAK,UAAA;AAChB,MAAA;AAEA,MAAA,IAAI,MAAA,GAAkB;AAClB,QAAA,OAAO,KAAK,SAAA,IAAa,KAAA;AAC7B,MAAA;AAEA,MAAA,IAAI,OAAA,GAAmB;AACnB,QAAA,OAAO,CAAC,IAAA,CAAK,MAAA;AACjB,MAAA;AAEA,MAAA,IAAI,QAAA,GAAyB;AACzB,QAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACjB,UAAA,MAAM,MAAM,IAAA,CAAK,SAAA;AACjB,UAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,CAAC,CAAA;AAClC,UAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,EAAK,CAAC,CAAA;AAClC,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,GAClB,WAAA,CAAY,KAAK,GAAA,EAAK,GAAA,EAAK,CAAA,EAAG,CAAC,IAC/B,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC/B,UAAA,IAAA,CAAK,SAAA,GAAY;AACb,YAAA,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACjC,YAAA,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACjC,YAAA;AACJ,WAAA;AACJ,QAAA;AACA,QAAA,OAAO,IAAA,CAAK,SAAA;AAChB,MAAA;AACJ,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC/JA,IAAA,mBAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA2BO,SAAS,gBAAgB,OAAA,EAA8C;AAC1E,EAAA,IAAI,EAAE,UAAA,EAAY,OAAA,EAAQ,GAAI,OAAA;AAE9B,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAe,CAAC,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA,EAAG;AACpE,IAAA,UAAA,GAAa,EAAA;AACjB,EAAA,CAAA,MAAA,IAAW,eAAe,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,KAAA;AACN,MAAA;AACJ,KAAA;EACJ,CAAA,MAAO;AACH,IAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAC,CAAA;AACnC,IAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,EAAE,CAAA;AACxC,EAAA;AAEA,EAAA,IACI,OAAO,YAAY,WAAA,IACnB,CAAC,OAAO,SAAA,CAAU,OAAO,CAAA,IACzB,OAAA,GAAU,CAAA,EACZ;AACE,IAAA,OAAA,GAAU,EAAA;AACd,EAAA;AAEA,EAAA,MAAM,cACF,OAAA,CAAQ,WAAA,KAAgB,SAAY,CAAC,CAAC,QAAQ,WAAA,GAAc,IAAA;AAChE,EAAA,MAAM,iBACF,OAAO,OAAA,CAAQ,cAAA,KAAmB,QAAA,GAAW,QAAQ,cAAA,GAAiB,GAAA;AAC1E,EAAA,MAAM,iBACF,OAAO,OAAA,CAAQ,cAAA,KAAmB,QAAA,GAAW,QAAQ,cAAA,GAAiB,GAAA;AAC1E,EAAA,MAAM,aAAA,GACF,OAAO,OAAA,CAAQ,aAAA,KAAkB,WAC3B,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,aAAa,CAAC,CAAA,GAC9C,CAAA;AACV,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,OAAA;AAEzC,EAAA,OAAO;AACH,IAAA,UAAA;AACA,IAAA,OAAA;AACA,IAAA,WAAA;AACA,IAAA,cAAA;AACA,IAAA,cAAA;AACA,IAAA,aAAA;AACA,IAAA;AACJ,GAAA;AACJ;AAMO,SAAS,gBAAA,CACZ,IAAA,EACA,UAAA,EACA,OAAA,EACA,aAAA,EAC+B;AAC/B,EAAA,MAAM;IACF,WAAA,GAAc,IAAA;IACd,cAAA,GAAiB,GAAA;IACjB,cAAA,GAAiB,GAAA;IACjB,aAAA,GAAgB;GACpB,GAAI,aAAA;AAEJ,EAAA,MAAM,aAA8C,EAAC;AAErD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,KAAK,OAAA,EAAS;AAC1C,IAAA,MAAM,SAAS,CAAA,GAAI,CAAA;AACnB,IAAA,MAAM,CAAA,GAAI,KAAK,MAAM,CAAA;AACrB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAGzB,IAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,GAAI,cAAA,EAAgB;AAG3C,IAAA,IACI,WAAA,IACA,CAAA,GAAI,cAAA,IACJ,CAAA,GAAI,kBACJ,CAAA,GAAI,cAAA;AAEJ,MAAA;AAGJ,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACnB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,MAAA,IAAI,GAAA,KAAQ,MAAM,GAAA,GAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,IAAK,GAAA,GAAM,aAAA;AAC/C,QAAA;AACR,IAAA;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAC7B,EAAA;AAEA,EAAA,OAAO,UAAA;AACX;AAMO,SAAS,oBAAA,CACZ,IAAA,EACA,UAAA,EACA,OAAA,EAC+B;AAC/B,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,KAAK,OAAA,EAAS;AAC1C,IAAA,MAAM,SAAS,CAAA,GAAI,CAAA;AACnB,IAAA,MAAA,IAAU,KAAK,MAAM,CAAA;AACrB,IAAA,MAAA,IAAU,IAAA,CAAK,SAAS,CAAC,CAAA;AACzB,IAAA,MAAA,IAAU,IAAA,CAAK,SAAS,CAAC,CAAA;AACzB,IAAA,KAAA,EAAA;AACJ,EAAA;AAEA,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA;AAExB,EAAA,OAAO;IACH,IAAA,CAAK,KAAA,CAAM,SAAS,KAAK,CAAA;IACzB,IAAA,CAAK,KAAA,CAAM,SAAS,KAAK,CAAA;IACzB,IAAA,CAAK,KAAA,CAAM,SAAS,KAAK;AAC7B,GAAA;AACJ;AAMO,SAAS,cAAA,CACZ,IAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,SAAA,EACc;AACd,EAAA,MAAM,aAAa,KAAA,GAAQ,MAAA;AAC3B,EAAA,MAAM,aAAA,GAA+B;AACjC,IAAA,WAAA,EAAa,IAAA,CAAK,WAAA;AAClB,IAAA,cAAA,EAAgB,IAAA,CAAK,cAAA;AACrB,IAAA,cAAA,EAAgB,IAAA,CAAK,cAAA;AACrB,IAAA,aAAA,EAAe,IAAA,CAAK;AACxB,GAAA;AAEA,EAAA,IAAI,aAAa,gBAAA,CAAiB,IAAA,EAAM,UAAA,EAAY,IAAA,CAAK,SAAS,aAAa,CAAA;AAG/E,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AACzB,IAAA,UAAA,GAAa,gBAAA,CAAiB,IAAA,EAAM,UAAA,EAAY,IAAA,CAAK,OAAA,EAAS;MAC1D,GAAG,aAAA;MACH,WAAA,EAAa;KAChB,CAAA;AACL,EAAA;AACA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AACzB,IAAA,UAAA,GAAa,gBAAA,CAAiB,IAAA,EAAM,UAAA,EAAY,IAAA,CAAK,OAAA,EAAS;MAC1D,GAAG,aAAA;MACH,WAAA,EAAa,KAAA;MACb,cAAA,EAAgB;KACnB,CAAA;AACL,EAAA;AAGA,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,IAAA,CAAK,eAAe,OAAA,EAAS;AAC7B,IAAA,MAAM,MAAA,GAAS,uBAAuB,UAAU,CAAA;AAChD,IAAA,SAAA,GAAY,uBAAA;MACR,SAAA,CAAU,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,UAAU;AAC9C,KAAA;EACJ,CAAA,MAAO;AACH,IAAA,SAAA,GAAY,SAAA,CAAU,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAC9D,EAAA;AAEA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,eAAA,GAAkB,UAAU,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA;AAC1E,IAAA,OAAO,SAAA,CAAU,GAAA;AAAI,MAAA,CAAC,EAAE,KAAA,EAAO,CAAC,GAAG,CAAA,EAAG,CAAC,GAAG,UAAA,EAAW,KACjD,WAAA,CAAY,CAAA,EAAG,GAAG,CAAA,EAAG,UAAA,EAAY,kBAAkB,CAAA,GAAI,UAAA,GAAa,kBAAkB,CAAC;AAC3F,KAAA;AACJ,EAAA;AAGA,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,IAAA,EAAM,UAAA,EAAY,KAAK,OAAO,CAAA;AACpE,EAAA,OAAO,QAAA,GAAW,CAAC,WAAA,CAAY,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,EAAG,SAAS,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA,GAAI,IAAA;AACnF;AAnNA,IAAA,gBAAA,KAAA,CAAA;EAAA,iBAAA,GAAA;AAOA,IAAA,UAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACRA,IAAA,kBAAA,EAAA;AAAA,QAAA,CAAA,eAAA,EAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAMa,kBAAA;AANb,IAAA,eAAA,KAAA,CAAA;EAAA,wBAAA,GAAA;AAMa,IAAA,kBAAA,GAAN,MAA+D;AAClE,MAAA,MAAM,KAAK,MAAA,EAA2C;AAClD,QAAA,IAAI,OAAO,gBAAA,KAAqB,WAAA,IAAe,MAAA,YAAkB,gBAAA,EAAkB;AAC/E,UAAA,OAAO,IAAA,CAAK,cAAc,MAAM,CAAA;AACpC,QAAA;AACA,QAAA,IAAI,OAAO,iBAAA,KAAsB,WAAA,IAAe,MAAA,YAAkB,iBAAA,EAAmB;AACjF,UAAA,OAAO,IAAA,CAAK,eAAe,MAAM,CAAA;AACrC,QAAA;AACA,QAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,MAAA,YAAkB,SAAA,EAAW;AACjE,UAAA,OAAO;AACH,YAAA,IAAA,EAAM,MAAA,CAAO,IAAA;AACb,YAAA,KAAA,EAAO,MAAA,CAAO,KAAA;AACd,YAAA,MAAA,EAAQ,MAAA,CAAO;AACnB,WAAA;AACJ,QAAA;AACA,QAAA,IAAI,OAAO,gBAAA,KAAqB,WAAA,IAAe,MAAA,YAAkB,gBAAA,EAAkB;AAC/E,UAAA,OAAO,IAAA,CAAK,cAAc,MAAM,CAAA;AACpC,QAAA;AACA,QAAA,IAAI,OAAO,WAAA,KAAgB,WAAA,IAAe,MAAA,YAAkB,WAAA,EAAa;AACrE,UAAA,OAAO,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAC1C,QAAA;AACA,QAAA,IAAI,OAAO,eAAA,KAAoB,WAAA,IAAe,MAAA,YAAkB,eAAA,EAAiB;AAC7E,UAAA,OAAO,IAAA,CAAK,wBAAwB,MAAM,CAAA;AAC9C,QAAA;AACA,QAAA,MAAM,IAAI,KAAA;AACN,UAAA;AACJ,SAAA;AACJ,MAAA;AAEQ,MAAA,aAAA,CAAc,GAAA,EAAkC;AACpD,QAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AACf,UAAA,MAAM,IAAI,KAAA;AACN,YAAA;AACJ,WAAA;AACJ,QAAA;AACA,QAAA,IAAI,CAAC,IAAI,YAAA,EAAc;AACnB,UAAA,MAAM,IAAI,KAAA;AACN,YAAA;AACJ,WAAA;AACJ,QAAA;AACA,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,QAAA,MAAM,KAAA,GAAS,MAAA,CAAO,KAAA,GAAQ,GAAA,CAAI,YAAA;AAClC,QAAA,MAAM,MAAA,GAAU,MAAA,CAAO,MAAA,GAAS,GAAA,CAAI,aAAA;AACpC,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtC,QAAA,IAAI;AACA,UAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtD,UAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,EAAO;AACjD,QAAA,CAAA,CAAA,OAAS,CAAA,EAAY;AACjB,UAAA,IAAI,CAAA,YAAa,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,eAAA,EAAiB;AACzD,YAAA,MAAM,MAAM,IAAI,KAAA;AACZ,cAAA;AACJ,aAAA;AACA,YAAA,GAAA,CAAI,KAAA,GAAQ,CAAA;AACZ,YAAA,MAAM,GAAA;AACV,UAAA;AACA,UAAA,MAAM,CAAA;AACV,QAAA;AACJ,MAAA;AAEQ,MAAA,cAAA,CAAe,MAAA,EAAsC;AACzD,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAA;AAC1B,QAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtD,QAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,EAAO;AACjD,MAAA;AAEQ,MAAA,aAAA,CAAc,KAAA,EAAoC;AACtD,QAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AACtB,UAAA,MAAM,IAAI,KAAA;AACN,YAAA;AACJ,WAAA;AACJ,QAAA;AACA,QAAA,MAAM,QAAQ,KAAA,CAAM,UAAA;AACpB,QAAA,MAAM,SAAS,KAAA,CAAM,WAAA;AACrB,QAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AACnB,UAAA,MAAM,IAAI,KAAA;AACN,YAAA;AACJ,WAAA;AACJ,QAAA;AACA,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,QAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,QAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,QAAA,GAAA,CAAI,SAAA,CAAU,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACxC,QAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtD,QAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,EAAO;AACjD,MAAA;AAEQ,MAAA,uBAAA,CAAwB,MAAA,EAAoC;AAChE,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,QAAA,IAAI,CAAC,GAAA,EAAK;AACN,UAAA,MAAM,IAAI,KAAA;AACN,YAAA;AACJ,WAAA;AACJ,QAAA;AACA,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAA;AAC1B,QAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtD,QAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,EAAO;AACjD,MAAA;AAEQ,MAAA,mBAAA,CAAoB,MAAA,EAAgC;AACxD,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,QAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,KAAA;AACtB,QAAA,MAAA,CAAO,SAAS,MAAA,CAAO,MAAA;AACvB,QAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAC1B,QAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa,CAAA,EAAG,GAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACpE,QAAA,OAAO,EAAE,MAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO;AAC9E,MAAA;AACJ,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACpHA,IAAA,eAAA,EAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA4DO,SAAS,iBAAiB,OAAA,EAA8C;AAC3E,EAAA,OAAO,IAAI,gBAAgB,OAAO,CAAA;AACtC;AA9DA,IAmBa,eAAA;ACnBb,IAYa,aAAA;ACZb,IAAA,kBAAA,EAAA;AAAA,QAAA,CAAA,eAAA,EAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAaO,SAAS,iBAAA,GAA6B;AACzC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC7B;AAEA,SAAS,iBAAA,GAA4B;AACjC,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACtB,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AACxE,EAAA;AACA,EAAA,OAAA,GAAU,GAAA,CAAI,eAAA;AACV,IAAA,IAAI,KAAK,CAAC,aAAa,GAAG,EAAE,IAAA,EAAM,0BAA0B;AAChE,GAAA;AACA,EAAA,MAAA,GAAS,IAAI,OAAO,OAAO,CAAA;AAC3B,EAAA,MAAA,CAAO,SAAA,GAAY,CAAC,CAAA,KAAoB;AACpC,IAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,KAAU,CAAA,CAAE,IAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC5B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,KAAA,CAAM,MAAA,CAAO,IAAI,KAAA,CAAM,KAAK,CAAC,CAAA;IACjC,CAAA,MAAO;AACH,MAAA,MAAM,GAAA,GAAM,OAAA;AACZ,MAAA,MAAM,eAAA,GAAkB,IAAI,MAAA,CAAO,CAAC,KAAa,CAAA,KAA8B,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA;AACpG,MAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,YAAW,KACnD,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,kBAAkB,CAAA,GAAI,UAAA,GAAa,eAAA,GAAkB,CAAC,CAAC,CAAA;AAC5F,MAAA,KAAA,CAAM,QAAQ,MAAM,CAAA;AACxB,IAAA;AACJ,EAAA,CAAA;AACA,EAAA,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,KAAM;AAEpB,IAAA,KAAA,MAAW,GAAG,KAAK,CAAA,IAAK,OAAA,EAAS;AAC7B,MAAA,KAAA,CAAM,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AACrC,IAAA;AACA,IAAA,OAAA,CAAQ,KAAA,EAAM;AAClB,EAAA,CAAA;AACA,EAAA,OAAO,MAAA;AACX;AAQO,SAAS,eAAA,CACZ,MAAA,EACA,SAAA,EACA,MAAA,EACgB;AAChB,EAAA,OAAO,IAAI,OAAA,CAAiB,CAAC,OAAA,EAAS,MAAA,KAAW;AAC7C,IAAA,IAAI,QAAQ,OAAA,EAAS;AACjB,MAAA,MAAA,CAAO,OAAO,MAAA,IAAU,IAAI,YAAA,CAAa,SAAA,EAAW,YAAY,CAAC,CAAA;AACjE,MAAA;AACJ,IAAA;AAEA,IAAA,MAAM,EAAA,GAAK,MAAA,EAAA;AACX,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,OAAA,EAAS,QAAQ,CAAA;AAEnC,IAAA,MAAM,UAAU,MAAM;AAClB,MAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,MAAA,MAAA,CAAO,OAAQ,MAAA,IAAU,IAAI,YAAA,CAAa,SAAA,EAAW,YAAY,CAAC,CAAA;AACtE,IAAA,CAAA;AAEA,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAEzD,IAAA,IAAI;AACA,MAAA,MAAM,IAAI,iBAAA,EAAkB;AAC5B,MAAA,CAAA,CAAE,WAAA,CAAY,EAAE,EAAA,EAAI,MAAA,EAAQ,WAAW,CAAA;AAC3C,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACV,MAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACjB,MAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC5C,MAAA,MAAA,CAAO,GAAG,CAAA;AACd,IAAA;EACJ,CAAC,CAAA;AACL;AAGO,SAAS,eAAA,GAAwB;AACpC,EAAA,IAAI,MAAA,EAAQ;AACR,IAAA,MAAA,CAAO,SAAA,EAAU;AACjB,IAAA,MAAA,GAAS,IAAA;AACb,EAAA;AACA,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,GAAA,CAAI,gBAAgB,OAAO,CAAA;AAC3B,IAAA,OAAA,GAAU,IAAA;AACd,EAAA;AAEA,EAAA,KAAA,MAAW,GAAG,KAAK,CAAA,IAAK,OAAA,EAAS;AAC7B,IAAA,KAAA,CAAM,MAAA,CAAO,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAC/C,EAAA;AACA,EAAA,OAAA,CAAQ,KAAA,EAAM;AAClB;AAxGA,IAII,MAAA;AAJJ,IAKI,OAAA;AALJ,IAMI,MAAA;AANJ,IAOM,OAAA;ACGN,aAAA,EAAA;ACJA,aAAA,EAAA;ACLA,UAAA,EAAA;AA2Dc,WAAA,CAAY,GAAA,EAAK,GAAA,EAAK,KAAK,CAAC;AAC5B,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;ACvDpC,IAAM,OAAA,GAAU,CAAA;AAChB,IAAM,SAAS,CAAA,GAAI,OAAA;AACnB,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,oBAAA,GAAuB,IAAA;AAC7B,IAAM,UAAA,GAAa,KAAM,CAAA,GAAI,OAAA;AAM7B,SAAS,aAAA,CAAc,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAC5D,EAAA,OAAA,CAAQ,CAAA,IAAM,CAAA,GAAI,OAAA,KAAa,CAAA,IAAK,OAAA,CAAA,GAAW,CAAA;AACnD;AAMA,IAAM,IAAA,GAAN,MAAM,KAAA,CAAK;AAaP,EAAA,WAAA,CACI,IACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,IACA,KAAA,EACF;AACE,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACjB,EAAA;AAEA,EAAA,MAAA,CAAO,QAAQ,KAAA,EAAe;AAC1B,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,IAAa,KAAA,EAAO;AACrC,MAAA,IAAA,CAAK,OAAA,GAAA,CACA,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,KAAK,CAAA,KACpB,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA,CAAA,IACpB,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,CAAA;AAC7B,IAAA;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAChB,EAAA;AAEA,EAAA,KAAA,CAAM,QAAQ,KAAA,EAAe;AACzB,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,IAAa,KAAA,EAAO;AACpC,MAAA,IAAI,IAAA,GAAO,CAAA;AACX,MAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,QAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,UAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,YAAA,IAAA,IAAQ,KAAK,KAAA,CAAM,aAAA,CAAc,GAAG,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,CAAA;AAClD,UAAA;AACJ,QAAA;AACJ,MAAA;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAClB,IAAA;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAChB,EAAA;EAEA,IAAA,GAAa;AACT,IAAA,OAAO,IAAI,KAAA,CAAK,IAAA,CAAK,EAAA,EAAI,KAAK,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,IAAI,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,KAAK,KAAK,CAAA;AACpF,EAAA;AAEA,EAAA,GAAA,CAAI,QAAQ,KAAA,EAAiC;AACzC,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAa,KAAA,EAAO;AAClC,MAAA,MAAM,OAAO,CAAA,IAAK,MAAA;AAGlB,MAAA,IAAI,IAAA,CAAK,EAAA,KAAO,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,EAAA,KAAO,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,EAAA,KAAO,IAAA,CAAK,EAAA,EAAI;AACnE,QAAA,IAAA,CAAK,IAAA,GAAO;AACR,UAAA,IAAA,CAAK,EAAA,IAAM,MAAA;AACX,UAAA,IAAA,CAAK,EAAA,IAAM,MAAA;AACX,UAAA,IAAA,CAAK,EAAA,IAAM;AACf,SAAA;MACJ,CAAA,MAAO;AACH,QAAA,IAAI,IAAA,GAAO,CAAA;AACX,QAAA,IAAI,IAAA,GAAO,CAAA;AACX,QAAA,IAAI,IAAA,GAAO,CAAA;AACX,QAAA,IAAI,IAAA,GAAO,CAAA;AAEX,QAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,UAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,YAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,cAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,aAAA,CAAc,GAAG,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,CAAA;AACnD,cAAA,IAAA,IAAQ,IAAA;AACR,cAAA,IAAA,IAAQ,IAAA,IAAQ,IAAI,GAAA,CAAA,GAAO,IAAA;AAC3B,cAAA,IAAA,IAAQ,IAAA,IAAQ,IAAI,GAAA,CAAA,GAAO,IAAA;AAC3B,cAAA,IAAA,IAAQ,IAAA,IAAQ,IAAI,GAAA,CAAA,GAAO,IAAA;AAC/B,YAAA;AACJ,UAAA;AACJ,QAAA;AAEA,QAAA,IAAI,IAAA,EAAM;AACN,UAAA,IAAA,CAAK,IAAA,GAAO;AACR,YAAA,CAAC,EAAE,IAAA,GAAO,IAAA,CAAA;AACV,YAAA,CAAC,EAAE,IAAA,GAAO,IAAA,CAAA;AACV,YAAA,CAAC,EAAE,IAAA,GAAO,IAAA;AACd,WAAA;QACJ,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,IAAA,GAAO;AACR,YAAA,CAAC,EAAG,IAAA,IAAQ,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,KAAK,CAAA,CAAA,GAAM,CAAA,CAAA;AACtC,YAAA,CAAC,EAAG,IAAA,IAAQ,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,KAAK,CAAA,CAAA,GAAM,CAAA,CAAA;AACtC,YAAA,CAAC,EAAG,IAAA,IAAQ,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,KAAK,CAAA,CAAA,GAAM,CAAA;AAC1C,WAAA;AACJ,QAAA;AACJ,MAAA;AACJ,IAAA;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAChB,EAAA;AACJ,CAAA;AAMA,IAAM,SAAN,MAAgB;AAIZ,EAAA,WAAA,CAAoB,UAAA,EAAoC;AAApC,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAHpB,IAAA,IAAA,CAAQ,WAAgB,EAAC;AACzB,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AAEwC,EAAA;EAEjD,IAAA,GAAa;AACjB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAClB,EAAA;AAEA,EAAA,IAAA,CAAK,IAAA,EAAe;AAChB,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAClB,EAAA;AAEA,EAAA,IAAA,CAAK,KAAA,EAAmB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAK;AAC5B,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAC1D,EAAA;EAEA,GAAA,GAAS;AACL,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAS,GAAA,EAAI;AAC7B,EAAA;EAEA,IAAA,GAAe;AACX,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AACzB,EAAA;AAEA,EAAA,GAAA,CAAO,EAAA,EAAyB;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC/B,EAAA;AACJ,CAAA;AAMA,SAAS,SAAS,MAAA,EAAsD;AACpE,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,UAAU,CAAA;AACxC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA;AACzB,IAAA,KAAA,CAAM,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA,EAAA;AACzC,EAAA;AACA,EAAA,OAAO,KAAA;AACX;AAEA,SAAS,cAAA,CACL,QACA,KAAA,EACI;AACJ,EAAA,IAAI,IAAA,GAAO,GAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,GAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,GAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA;AACzB,IAAA,IAAI,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AACf,SAAA,IAAA,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AAC7B,IAAA,IAAI,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AACf,SAAA,IAAA,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AAC7B,IAAA,IAAI,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AACf,SAAA,IAAA,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AACjC,EAAA;AAEA,EAAA,OAAO,IAAI,KAAK,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,KAAK,CAAA;AAC7D;AAMA,SAAS,cAAA,CAAe,OAAoB,IAAA,EAA6C;AACrF,EAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAM,EAAG,OAAO,MAAA;AAG1B,EAAA,IAAI,IAAA,CAAK,OAAM,KAAM,CAAA,SAAU,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG,IAAI,CAAA;AAEjD,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAEhC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,IAAI,SAAS,EAAA,EAAI;AACb,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,QAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,UAAA,GAAA,IAAO,MAAM,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,CAAA;AAC5C,QAAA;AACJ,MAAA;AACA,MAAA,KAAA,IAAS,GAAA;AACT,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,KAAA;AACpB,IAAA;AACJ,EAAA,CAAA,MAAA,IAAW,SAAS,EAAA,EAAI;AACpB,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,QAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,UAAA,GAAA,IAAO,MAAM,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,CAAA;AAC5C,QAAA;AACJ,MAAA;AACA,MAAA,KAAA,IAAS,GAAA;AACT,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,KAAA;AACpB,IAAA;EACJ,CAAA,MAAO;AACH,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,QAAA,KAAA,IAAS,IAAI,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK;AACrC,UAAA,GAAA,IAAO,MAAM,aAAA,CAAc,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,CAAA;AAC5C,QAAA;AACJ,MAAA;AACA,MAAA,KAAA,IAAS,GAAA;AACT,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,KAAA;AACpB,IAAA;AACJ,EAAA;AAEA,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACzB,IAAA,YAAA,CAAa,CAAC,IAAI,KAAA,GAAQ,CAAA;EAC9B,CAAC,CAAA;AAED,EAAA,SAAS,MAAM,KAAA,EAAkD;AAC7D,IAAA,MAAM,OAAQ,KAAA,GAAQ,GAAA;AACtB,IAAA,MAAM,OAAQ,KAAA,GAAQ,GAAA;AAEtB,IAAA,KAAA,IAAS,CAAA,GAAI,KAAK,IAAI,CAAA,EAAG,KAAK,IAAA,CAAK,IAAI,GAAG,CAAA,EAAA,EAAK;AAC3C,MAAA,IAAI,UAAA,CAAW,CAAC,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG;AAC3B,QAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,QAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,QAAA,MAAM,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA;AAC1B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AAE3B,QAAA,IAAI,EAAA;AACJ,QAAA,IAAI,QAAQ,KAAA,EAAO;AACf,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,GAAG,CAAC,EAAE,CAAA,GAAI,KAAA,GAAQ,CAAA,CAAE,CAAA;QACnD,CAAA,MAAO;AACH,UAAA,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,EAAE,CAAA,GAAI,CAAA,GAAI,IAAA,GAAO,CAAA,CAAE,CAAA;AAClD,QAAA;AAGA,QAAA,OAAO,CAAC,UAAA,CAAW,EAAE,CAAA,EAAG,EAAA,EAAA;AACxB,QAAA,IAAI,MAAA,GAAS,aAAa,EAAE,CAAA;AAC5B,QAAA,OAAO,CAAC,UAAU,UAAA,CAAW,EAAA,GAAK,CAAC,CAAA,EAAG,MAAA,GAAS,YAAA,CAAa,EAAE,EAAE,CAAA;AAGhE,QAAA,KAAA,CAAM,IAAI,CAAA,GAAI,EAAA;AACd,QAAA,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA;AAE5B,QAAA,OAAO,CAAC,OAAO,KAAK,CAAA;AACxB,MAAA;AACJ,IAAA;AACA,IAAA,OAAO,MAAA;AACX,EAAA;AAEA,EAAA,IAAI,IAAA,KAAS,EAAA,EAAI,OAAO,KAAA,CAAM,GAAG,CAAA;AACjC,EAAA,IAAI,IAAA,KAAS,EAAA,EAAI,OAAO,KAAA,CAAM,GAAG,CAAA;AACjC,EAAA,OAAO,MAAM,GAAG,CAAA;AACpB;AAMA,SAAS,OAAA,CAAQ,EAAA,EAAkB,MAAA,EAAgB,KAAA,EAA0B;AACzE,EAAA,IAAI,OAAA,GAAU,GAAG,IAAA,EAAK;AACtB,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,OAAO,SAAS,cAAA,EAAgB;AAC5B,IAAA,IAAI,WAAW,MAAA,EAAQ;AACvB,IAAA,MAAA,EAAA;AAEA,IAAA,MAAM,IAAA,GAAO,GAAG,GAAA,EAAI;AAEpB,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAM,EAAG;AACf,MAAA,EAAA,CAAG,KAAK,IAAI,CAAA;AACZ,MAAA;AACJ,IAAA;AAEA,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,CAAC,CAAA,EAAG;AAE3B,IAAA,EAAA,CAAG,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AACjB,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,EAAG;AACX,MAAA,EAAA,CAAG,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AACjB,MAAA,OAAA,EAAA;AACJ,IAAA;AACJ,EAAA;AACJ;AAMA,SAAS,QAAA,CACL,QACA,SAAA,EAC8D;AAC9D,EAAA,IAAI,CAAC,OAAO,MAAA,IAAU,SAAA,GAAY,KAAK,SAAA,GAAY,GAAA,SAAY,EAAC;AAGhE,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,MAAM,eAAgD,EAAC;AACvD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,MAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAC3B,IAAA;AACJ,EAAA;AACA,EAAA,IAAI,YAAA,CAAa,UAAU,SAAA,EAAW;AAElC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC1B,MAAA,QAAA,CAAS,IAAI,GAAA,EAAA,CAAM,QAAA,CAAS,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAClD,IAAA;AACA,IAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,MAAW;AAChC,MAAA,KAAA;AACA,MAAA,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC;KAC5C,CAAE,CAAA;AACN,EAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAM,CAAA;AAG7B,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,MAAA,EAAQ,KAAK,CAAA;AACzC,EAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAa,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,EAAM,GAAI,CAAA,CAAE,KAAA,EAAO,CAAA;AAC3D,EAAA,EAAA,CAAG,KAAK,IAAI,CAAA;AAGZ,EAAA,OAAA,CAAQ,EAAA,EAAI,oBAAA,GAAuB,SAAA,EAAW,KAAK,CAAA;AAGnD,EAAA,MAAM,MAAM,IAAI,MAAA,CAAa,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,EAAM,GAAI,CAAA,CAAE,QAAO,GAAI,CAAA,CAAE,OAAM,GAAI,CAAA,CAAE,QAAQ,CAAA;AACtF,EAAA,OAAO,EAAA,CAAG,MAAK,EAAG;AACd,IAAA,GAAA,CAAI,IAAA,CAAK,EAAA,CAAG,GAAA,EAAK,CAAA;AACrB,EAAA;AACA,EAAA,OAAA,CAAQ,GAAA,EAAK,WAAW,KAAK,CAAA;AAG7B,EAAA,MAAM,UAA0E,EAAC;AACjF,EAAA,OAAO,GAAA,CAAI,MAAK,EAAG;AACf,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,EAAI;AACpB,IAAA,OAAA,CAAQ,IAAA,CAAK;AACT,MAAA,KAAA,EAAO,IAAI,GAAA,EAAI;AACf,MAAA,UAAA,EAAY,IAAI,KAAA;KACnB,CAAA;AACL,EAAA;AAEA,EAAA,OAAO,OAAA;AACX;AAUO,IAAM,gBAAN,MAAyC;AAC5C,EAAA,MAAM,IAAA,GAAsB;AAE5B,EAAA;AAEA,EAAA,QAAA,CACI,QACA,SAAA,EAC8D;AAC9D,IAAA,OAAO,QAAA,CAAS,QAAQ,SAAS,CAAA;AACrC,EAAA;AACJ,CAAA;ACnZA,YAAA,EAAA;AAEA,aAAA,EAAA;AAsBe,IAAI,kBAAA;AACnB,IAAM,gBAAA,GAAmB,IAAI,aAAA,EAAc;AAcpC,SAAS,YAAA,CACZ,QACA,OAAA,EACY;AACZ,EAAA,MAAM,OAAA,GAAU,eAAe,MAAA,EAAQ,EAAE,YAAY,CAAA,EAAG,GAAG,SAAS,CAAA;AACpE,EAAA,OAAO,OAAA,GAAU,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA;AAClC;AAUO,SAAS,cAAA,CACZ,QACA,OAAA,EACc;AACd,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,OAAA,IAAW,EAAE,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,gBAAA;AAKxC,EAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AAEpC,EAAA,OAAO,cAAA;IACH,MAAA,CAAO,IAAA;IACP,MAAA,CAAO,KAAA;IACP,MAAA,CAAO,MAAA;AACP,IAAA,IAAA;AACA,IAAA;AACJ,GAAA;AACJ;AAsBA,SAAS,eAAe,MAAA,EAAuB;AAC3C,EAAA,IAAI,OAAO,gBAAA,KAAqB,WAAA,IAAe,MAAA,YAAkB,gBAAA,EAAkB;AAC/E,IAAA,OAAO,cAAc,MAAM,CAAA;AAC/B,EAAA;AACA,EAAA,IAAI,OAAO,iBAAA,KAAsB,WAAA,IAAe,MAAA,YAAkB,iBAAA,EAAmB;AACjF,IAAA,OAAO,eAAe,MAAM,CAAA;AAChC,EAAA;AACA,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,MAAA,YAAkB,SAAA,EAAW;AACjE,IAAA,OAAO,EAAE,MAAM,MAAA,CAAO,IAAA,EAAM,OAAO,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO;AAC3E,EAAA;AACA,EAAA,IAAI,OAAO,gBAAA,KAAqB,WAAA,IAAe,MAAA,YAAkB,gBAAA,EAAkB;AAC/E,IAAA,OAAO,cAAc,MAAM,CAAA;AAC/B,EAAA;AACA,EAAA,IAAI,OAAO,WAAA,KAAgB,WAAA,IAAe,MAAA,YAAkB,WAAA,EAAa;AACrE,IAAA,OAAO,oBAAoB,MAAM,CAAA;AACrC,EAAA;AACA,EAAA,IAAI,OAAO,eAAA,KAAoB,WAAA,IAAe,MAAA,YAAkB,eAAA,EAAiB;AAC7E,IAAA,OAAO,wBAAwB,MAAM,CAAA;AACzC,EAAA;AACA,EAAA,MAAM,IAAI,KAAA;AACN,IAAA;AACJ,GAAA;AACJ;AAEA,SAAS,cAAc,GAAA,EAAuB;AAC1C,EAAA,IAAI,CAAC,IAAI,QAAA,EAAU;AACf,IAAA,MAAM,IAAI,KAAA;AACN,MAAA;AACJ,KAAA;AACJ,EAAA;AACA,EAAA,IAAI,CAAC,IAAI,YAAA,EAAc;AACnB,IAAA,MAAM,IAAI,KAAA;AACN,MAAA;AACJ,KAAA;AACJ,EAAA;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,MAAM,KAAA,GAAS,MAAA,CAAO,KAAA,GAAQ,GAAA,CAAI,YAAA;AAClC,EAAA,MAAM,MAAA,GAAU,MAAA,CAAO,MAAA,GAAS,GAAA,CAAI,aAAA;AACpC,EAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtC,EAAA,IAAI;AACA,IAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtD,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,EAAO;AACjD,EAAA,CAAA,CAAA,OAAS,CAAA,EAAY;AACjB,IAAA,IAAI,CAAA,YAAa,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,eAAA,EAAiB;AACzD,MAAA,MAAM,MAAM,IAAI,KAAA;AACZ,QAAA;AACJ,OAAA;AACA,MAAA,GAAA,CAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,MAAM,GAAA;AACV,IAAA;AACA,IAAA,MAAM,CAAA;AACV,EAAA;AACJ;AAEA,SAAS,eAAe,MAAA,EAA2B;AAC/C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAA;AAC1B,EAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtD,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,EAAO;AACjD;AAEA,SAAS,cAAc,KAAA,EAAyB;AAC5C,EAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA;AACN,MAAA;AACJ,KAAA;AACJ,EAAA;AACA,EAAA,MAAM,QAAQ,KAAA,CAAM,UAAA;AACpB,EAAA,MAAM,SAAS,KAAA,CAAM,WAAA;AACrB,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAI,KAAA;AACN,MAAA;AACJ,KAAA;AACJ,EAAA;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,EAAA,GAAA,CAAI,SAAA,CAAU,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACxC,EAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtD,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,EAAO;AACjD;AAEA,SAAS,wBAAwB,MAAA,EAAyB;AACtD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK;AACN,IAAA,MAAM,IAAI,KAAA;AACN,MAAA;AACJ,KAAA;AACJ,EAAA;AACA,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAA;AAC1B,EAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtD,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,EAAO;AACjD;AAEA,SAAS,oBAAoB,MAAA,EAAqB;AAC9C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,KAAA;AACtB,EAAA,MAAA,CAAO,SAAS,MAAA,CAAO,MAAA;AACvB,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAC1B,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa,CAAA,EAAG,GAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACpE,EAAA,OAAO,EAAE,MAAM,SAAA,CAAU,IAAA,EAAM,OAAO,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO;AAC9E;AC5LA,UAAA,EAAA;;;ACtBO,IAAM,gBAAA,GAAmB,CAAC,GAAA,KAA2C;AAC1E,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,iBAAiB,CAAA,EAAG;AAC3C,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,EAAI;AACtB,QAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAG,EAAE,CAAC,CAAA;AAAA,QACrD,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,QACb;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,oBAAoB,CAAC,CAAA;AAAA,MACxC;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA6B,KAAA,CAAM,OAAQ,EAAE,CAAC,CAAA;AAAA,IACjE;AAAA,EACF,CAAC,CAAA;AACH,CAAA;;;AC3BA,IAAM,QAAA,GAAW,CAAC,GAAA,KAA0C;AAC1D,EAAA,MAAM,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACrD,EAAA,MAAM,CAAA,GAAA,CAAK,MAAM,GAAA,IAAO,CAAA;AACxB,EAAA,IAAI,QAAQ,GAAA,EAAK,OAAO,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AAChC,EAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,EAAA,MAAM,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA,IAAK,IAAI,GAAA,GAAM,GAAA,CAAA,GAAO,KAAK,GAAA,GAAM,GAAA,CAAA;AACrD,EAAA,MAAM,CAAA,GAAI,QAAQ,CAAA,GAAA,CAAA,CAAM,CAAA,GAAI,KAAK,CAAA,IAAK,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA,CAAA,IAAM,IAC9C,GAAA,KAAQ,CAAA,GAAA,CAAA,CAAM,IAAI,CAAA,IAAK,CAAA,GAAI,KAAK,CAAA,GAAA,CAAA,CAClB,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,CAAA;AAC1C,EAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACjB,CAAA;AAEA,IAAM,QAAA,GAAW,CAAC,CAAA,EAAW,CAAA,EAAW,CAAA,KAAsB;AAC5D,EAAA,MAAM,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAc;AACvB,IAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,GAAI,EAAA,IAAM,EAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC5D,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,KAAK,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAAA,EAC7D,CAAA;AACA,EAAA,OAAO,CAAA,CAAA,EAAK,CAAA,CAAE,CAAC,CAAE,CAAA,EAAI,CAAA,CAAE,CAAC,CAAE,CAAA,EAAI,CAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AACrC,CAAA;AAGA,IAAM,SAAA,GAAY,CAAC,GAAA,KAAwB;AACzC,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAc,CAAA,IAAK,OAAA,GAAU,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,GAAI,KAAA,IAAS,KAAA,EAAO,GAAG,CAAA;AAC5F,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAG,CAAA;AACtD,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAG,CAAA;AACtD,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAG,CAAA;AACtD,EAAA,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAA;AAC5C,CAAA;AAGA,IAAMC,cAAAA,GAAgB,CAAC,CAAA,EAAW,CAAA,KAAsB;AACtD,EAAA,MAAM,KAAK,SAAA,CAAU,CAAC,CAAA,EAAG,EAAA,GAAK,UAAU,CAAC,CAAA;AACzC,EAAA,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAI,SAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAA;AACzD,CAAA;AAKO,IAAM,YAAA,GAAe,CAAC,QAAA,KAA8B,SAAA,CAAU,QAAQ,CAAA,GAAI,KAAA;AAOjF,IAAM,UAAA,GAAa,CAAC,GAAA,EAAa,OAAA,KAA6B;AAC5D,EAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,GAAG,CAAA;AAC3B,EAAA,OAAO,UACH,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA,GACnC,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAI,GAAG,IAAI,CAAA;AACzC,CAAA;AAOO,IAAM,sBAAA,GAAyB,CAAC,KAAA,KAA+B;AACpE,EAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,KAAK,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA;AAG5C,EAAA,MAAM,IAAA,GAAOA,eAAc,UAAA,EAAY,SAAS,KAAKA,cAAAA,CAAc,UAAA,EAAY,SAAS,CAAA,GACpF,SAAA,GACA,SAAA;AAGJ,EAAA,MAAM,SAAU,OAAA,GAAU,QAAA,CAAS,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA,GAAI,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,IAAI,GAAG,IAAI,CAAA;AACpG,EAAA,MAAM,QAAU,OAAA,GAAU,QAAA,CAAS,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,GAAI,CAAA,EAAG,IAAI,CAAA,GAAI,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAI,GAAG,IAAI,CAAA;AACpG,EAAA,MAAM,OAAA,GAAU,CAAA,YAAA,EAAgB,OAAA,GAAU,QAAA,CAAS,CAAA,EAAG,GAAA,EAAM,GAAI,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAM,IAAI,CAAE,CAAA,CAAA;AAG5F,EAAA,MAAM,IAAA,GAAU,OAAA,GAAU,QAAA,CAAS,CAAA,EAAG,GAAA,EAAM,IAAI,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAM,IAAI,CAAA;AAC1E,EAAA,MAAM,OAAA,GAAU,OAAA,GAAU,QAAA,CAAS,CAAA,EAAG,GAAA,EAAM,IAAI,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,IAAA,EAAM,GAAI,CAAA;AAC1E,EAAA,MAAM,SAAU,QAAA,CAAS,CAAA,EAAG,GAAA,EAAM,OAAA,GAAU,MAAO,IAAI,CAAA;AACvD,EAAA,MAAM,QAAU,QAAA,CAAS,CAAA,EAAG,GAAA,EAAM,OAAA,GAAU,MAAO,IAAI,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAU,MAAA;AAAA,IACV,KAAA;AAAA,IACA,OAAA,EAAU,IAAA;AAAA,IACV,MAAA;AAAA,IACA,QAAA,EAAU,SAAA;AAAA,IACV,KAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,UAAU,KAAA,GAAQ;AAAA,GAC7B;AACF,CAAA;AAKO,IAAM,qBAAA,GAAwB,OAAO,QAAA,KAA2C;AACrF,EAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,EAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAElB,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,GAAA,CAAI,SAAS,MAAM;AACjB,MAAA,IAAI,GAAA,CAAI,iBAAiB,CAAA,EAAG;AAC1B,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,sDAAsD,CAAC,CAAA;AAAA,MAC1E,CAAA,MAAO;AACL,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AACA,IAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,sBAAA,EAAyB,QAAQ,EAAE,CAAC,CAAA;AACzE,IAAA,GAAA,CAAI,GAAA,GAAM,QAAA;AAAA,EACZ,CAAC,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,MAAM,gBAAA,CAAiB,GAAG,CAAA;AAChD,EAAA,OAAO,uBAAuB,aAAa,CAAA;AAC7C,CAAA;;;ACxHO,IAAM,QAAA,GAAW,CAAC,GAAA,KAAgD;AACvE,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AAEjB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,OAAA,IAAW,MAAA,CAAO,aAAa,QAAA,EAAU;AAC/D,MAAA,OAAO,CAAA,eAAA,EAAmB,kBAAA,CAAmB,GAAG,CAAE,CAAA,CAAA;AAAA,IACpD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,GAAA;AACT;;;ACyCO,IAAM,aAAa,CAAmB;AAAA,EAC3C,KAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACF,CAAA,KAA0B;AACxB,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIJ,SAA6B,IAAI,CAAA;AACjF,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,cAAA,EAAgB,kBAAkB,CAAA;AACrE,EAAA,MAAM,WAAA,GAAc,eAAe,mBAAmB,CAAA;AACtD,EAAA,MAAM,cAAA,GAAiB,OAAO,WAAW,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW,YAAY,gBAAgB,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,gBAAgB,oBAAoB,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,cAAc,kBAAkB,CAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,iBAAiB,qBAAqB,CAAA;AAC5D,EAAA,MAAM,mBAAA,GAAsB,uBAAuB,2BAA2B,CAAA;AAG9E,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,eAAA,KAAoB,OAAA,IAAW,QAAA,IAAY,CAAC,gBAAA,EAAkB;AAChE,MAAA,MAAM,eAAe,YAAY;AAC/B,QAAA,IAAI;AACF,UAAA,MAAM,cAAc,MAAM,qBAAA,CAAsB,QAAA,CAAS,QAAQ,KAAK,QAAQ,CAAA;AAC9E,UAAA,mBAAA,CAAoB,WAAW,CAAA;AAC/B,UAAA,qBAAA,GAAwB,WAAW,CAAA;AAAA,QACrC,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,kCAAkC,KAAK,CAAA;AACpD,UAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA;AAEA,MAAA,YAAA,EAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,eAAA,EAAiB,QAAA,EAAU,gBAAA,EAAkB,qBAAqB,CAAC,CAAA;AAEvE,EAAA,MAAM,uBAAA,GAA0BG,WAAAA,CAAY,CAAC,KAAA,KAAwB;AACnE,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,IAAI,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,0BAA0B,CAAA;AAC/D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,QAAA,CAAS,cAAc,MAAM,CAAA;AACvC,MAAA,OAAA,CAAQ,YAAA,CAAa,QAAQ,aAAa,CAAA;AAC1C,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,IACnC;AACA,IAAA,OAAA,CAAQ,YAAA,CAAa,WAAW,KAAK,CAAA;AAAA,EACvC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,sBAAA,GAAyBA,YAAY,MAAM;AAC/C,IAAA,KAAA,IAAS,KAAK,SAAA,EAAW;AACvB,MAAA,QAAA,CAAS,gBAAgB,KAAA,CAAM,WAAA,CAAY,CAAA,EAAG,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,IAC5D;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,IAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,MAAA,IAAI,kBAAkB,OAAO,OAAA;AAE7B,MAAA,IAAI,CAAC,kBAAkB,OAAO,MAAA;AAAA,IAChC;AAEA,IAAA,OAAO,cAAA,CAAe,OAAA,KAAA,MAAA,cAAiC,UAAA,EAAY,IAAA,GAAO,UAAA,EAAY,KAAA;AAAA,EACxF,GAAG,CAAC,UAAA,EAAY,eAAA,EAAiB,gBAAA,EAAkB,gBAAgB,CAAC,CAAA;AAEpE,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,CAAA,KAAe;AACtD,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,MAAM,YAAY,cAAA,EAAe;AACjC,MAAA,IAAI,CAAC,SAAA,EAAW;AAId,QAAA;AAAA,MACF;AACA,MAAA,CAAA,GAAI,SAAA;AAAA,IACN;AAEA,IAAA,IAAI,WAAA;AAEJ,IAAA,IAAI,CAAA,KAAM,WAAW,gBAAA,EAAkB;AAErC,MAAA,WAAA,GAAc,gBAAA;AAAA,IAChB,CAAA,MAAO;AAEL,MAAA,WAAA,GAAc,UAAU,CAAM,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AAIhB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,eAAe,WAAA,EAAa,EAAE,QAAQ,YAAA,CAAa,OAAO,GAAG,CAAA;AAE3E,IAAA,KAAA,IAAS,KAAK,KAAA,EAAO;AACnB,MAAA,QAAA,CAAS,gBAAgB,KAAA,CAAM,WAAA,CAAY,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,uBAAA,CAAwB,YAAY,UAAU,CAAA;AAAA,EAChD,GAAG,CAAC,cAAA,EAAgB,uBAAA,EAAyB,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAGzE,EAAAH,UAAU,MAAM;AACd,IAAA,sBAAA,EAAuB;AAAA,EACzB,CAAA,EAAG,CAAC,sBAAsB,CAAC,CAAA;AAG3B,EAAAA,UAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AACzB,IAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,mBAAA,EAAqB,KAAA,EAAO,WAAW,CAAC,CAAA;AAG5C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAA,IAAoB,KAAA,KAAU,MAAA,EAAQ;AAC3C,IAAA,MAAM,KAAA,GAAQ,eAAe,gBAAA,EAAkB,EAAE,QAAQ,YAAA,CAAa,OAAO,GAAG,CAAA;AAChF,IAAA,KAAA,IAAS,KAAK,KAAA,EAAO;AACnB,MAAA,QAAA,CAAS,gBAAgB,KAAA,CAAM,WAAA,CAAY,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,uBAAA,CAAwB,iBAAiB,UAAU,CAAA;AAAA,EACrD,CAAA,EAAG,CAAC,gBAAA,EAAkB,KAAA,EAAO,uBAAuB,CAAC,CAAA;AAErD,EAAA,MAAM,gBAAgB,eAAA,KAAoB,OAAA,IAAW,CAAC,QAAA,IAAY,CAAC,CAAC,gBAAA,IAAoB,gBAAA;AAExF,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-WECWPYZB.mjs","sourcesContent":["\"use client\";\n\nimport { ThColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { ThemeTokens } from \"../hooks/useTheming\";\n\nexport interface buildThemeProps<T extends string> {\n theme?: string;\n themeKeys: { [key in T]?: ThemeTokens },\n systemThemes?: {\n light: T,\n dark: T\n },\n colorScheme?: ThColorScheme;\n}\n\nexport const buildThemeObject = <T extends string>({\n theme,\n themeKeys,\n systemThemes,\n colorScheme\n}: buildThemeProps<T>) => {\n if (!theme) {\n return {};\n }\n\n if (theme === \"auto\" && colorScheme && systemThemes) {\n theme = colorScheme === ThColorScheme.dark ? systemThemes.dark : systemThemes.light;\n }\n\n let themeProps = {};\n\n const themeToken = themeKeys[theme as T];\n if (themeToken) {\n themeProps = {\n backgroundColor: themeToken.background,\n textColor: themeToken.text,\n linkColor: themeToken.link,\n selectionBackgroundColor: themeToken.select,\n selectionTextColor: themeToken.onSelect,\n visitedColor: themeToken.visited\n };\n } else {\n // Fallback if theme doesn't exist\n console.warn(`Theme key \"${String(theme)}\" not found in themeKeys.`);\n themeProps = {\n backgroundColor: null,\n textColor: null,\n linkColor: null,\n selectionBackgroundColor: null,\n selectionTextColor: null,\n visitedColor: null\n };\n }\n\n return themeProps;\n};","import { FontCollection, FontDefinition } from \"@/preferences/models\";\n\ninterface BunnyFontDefinitionParams {\n cssUrl: string;\n options?: {\n labels?: Record<string, string>; // derived fontId -> label\n fallbacks?: Record<string, string[]>; // derived fontId -> fallback array\n order?: string[]; // array of font IDs in desired order\n };\n}\n\nconst DEFAULT_FALLBACK = \"sans-serif\";\n\n/**\n * Parses a Bunny Fonts CSS URL and creates font definitions for all families\n * @param params Bunny Fonts CSS URL and optional configuration\n * @returns FontCollection object with all font definitions\n * @throws Error if CSS URL is invalid or cannot be parsed\n */\nexport const createDefinitionsFromBunnyFonts = (params: BunnyFontDefinitionParams): FontCollection => {\n const { cssUrl, options } = params;\n const { fallbacks, order, labels } = options || {};\n \n // Extract URL from @import url() or href=\"\", otherwise use as-is\n const processedUrl = cssUrl.includes(\"@import\") \n ? cssUrl.match(/@import\\s+url\\(['\"]?([^'\")]+)['\"]?\\)/i)?.[1] || cssUrl\n : cssUrl.includes(\"href=\")\n ? cssUrl.match(/href=[\"']([^\"']+)[\"']/)?.[1] || cssUrl\n : cssUrl;\n \n // Parse the URL\n const url = new URL(processedUrl);\n if (!url.hostname.includes(\"fonts.bunny.net\")) {\n throw new Error(\"Invalid Bunny Fonts URL\");\n }\n\n // Get the family parameter\n const familyParam = url.searchParams.get(\"family\");\n if (!familyParam) {\n throw new Error(\"No family parameter found in Bunny Fonts URL\"); \n }\n\n // Split multiple font families and process each one\n const fontEntries = familyParam.split(\"|\").map((familyStr): [string, any] => {\n // Format: \"font-name:weight1,weight1i,weight2,weight3i,weight4,weight4i\"\n const [familyName, weightsStr = \"\"] = familyStr.split(\":\");\n if (!familyName) {\n throw new Error(`Invalid font family format: ${ familyStr }`);\n }\n\n // Track weights and their styles\n const weightStyles = new Map<number, Set<\"normal\" | \"italic\">>();\n\n // Parse weights and their styles\n if (weightsStr) {\n weightsStr.split(\",\").forEach(weightStr => {\n const isItalic = weightStr.endsWith(\"i\");\n const weightValue = parseInt(isItalic ? weightStr.slice(0, -1) : weightStr, 10);\n \n if (!isNaN(weightValue)) {\n if (!weightStyles.has(weightValue)) {\n weightStyles.set(weightValue, new Set());\n }\n weightStyles.get(weightValue)?.add(isItalic ? \"italic\" : \"normal\");\n }\n });\n }\n\n // Convert to arrays\n const weights = Array.from(weightStyles.keys()).sort((a, b) => a - b);\n const hasItalic = Array.from(weightStyles.values()).some(styles => styles.has(\"italic\"));\n const styles: Array<\"normal\" | \"italic\"> = hasItalic ? [\"normal\", \"italic\"] : [\"normal\"];\n\n const fontId = familyName; // Keep the original ID as is (e.g., \"advent-pro\")\n const familyDisplayName = familyName\n .split(\"-\")\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n\n return [\n fontId,\n {\n id: fontId,\n name: familyDisplayName,\n ...(labels?.[fontId] && { label: labels[fontId] }),\n source: {\n type: \"custom\",\n provider: \"bunny\"\n },\n spec: {\n family: familyDisplayName,\n fallbacks: fallbacks?.[fontId] || [DEFAULT_FALLBACK],\n weights: {\n type: \"static\",\n values: weights.length ? weights : [400],\n },\n styles\n },\n },\n ] as [string, FontDefinition];\n });\n\n // Convert to FontCollection format\n const result: FontCollection = Object.fromEntries(fontEntries);\n \n // Apply ordering if specified\n if (order && order.length > 0) {\n const orderedResult: FontCollection = {};\n order.forEach(fontId => {\n if (result[fontId]) {\n orderedResult[fontId] = result[fontId];\n }\n });\n \n // Add any remaining fonts that weren't in the order array\n Object.entries(result).forEach(([fontId, definition]) => {\n if (!orderedResult[fontId]) {\n orderedResult[fontId] = definition;\n }\n });\n \n return orderedResult;\n }\n \n return result;\n};","\"use client\";\n\nimport { useEffect } from \"react\";\n\nimport { ThLayoutDirection } from \"./models\";\n\nexport const ThDirectionSetter = ({ \n direction, \n children \n}: { \n direction?: ThLayoutDirection,\n children: React.ReactNode \n}) => {\n \n useEffect(() => {\n if (direction) document.documentElement.dir = direction;\n }, [direction]);\n\n return children;\n};","import { ThAudioPreferences, AudioCustomizableKeys } from \"../audioPreferences\";\nimport { ThAudioPreferencesAdapter } from \"./ThAudioPreferencesAdapter\";\n\nexport class ThAudioMemoryPreferencesAdapter<T extends AudioCustomizableKeys = AudioCustomizableKeys> implements ThAudioPreferencesAdapter<T> {\n private currentPreferences: ThAudioPreferences<T>;\n private listeners: Set<(prefs: ThAudioPreferences<T>) => void> = new Set();\n\n constructor(initialPreferences: ThAudioPreferences<T>) {\n this.currentPreferences = { ...initialPreferences };\n }\n\n public getPreferences(): ThAudioPreferences<T> {\n return { ...this.currentPreferences };\n }\n\n public setPreferences(prefs: ThAudioPreferences<T>): void {\n this.currentPreferences = { ...prefs };\n this.notifyListeners(this.currentPreferences);\n }\n\n public subscribe(listener: (prefs: ThAudioPreferences<T>) => void): void {\n this.listeners.add(listener);\n }\n\n public unsubscribe(listener: (prefs: ThAudioPreferences<T>) => void): void {\n this.listeners.delete(listener);\n }\n\n private notifyListeners(prefs: ThAudioPreferences<T>): void {\n this.listeners.forEach(listener => listener({ ...prefs }));\n }\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { ThAudioPreferences, AudioCustomizableKeys, AudioDefaultKeys } from \"./audioPreferences\";\nimport { ThDirectionSetter } from \"./ThDirectionSetter\";\nimport {\n ThAudioPreferencesContext,\n defaultAudioPreferencesContextValue,\n} from \"./ThAudioPreferencesContext\";\n\nimport { ThAudioMemoryPreferencesAdapter } from \"./adapters/ThAudioMemoryPreferencesAdapter\";\nimport { ThAudioPreferencesAdapter } from \"./adapters/ThAudioPreferencesAdapter\";\nimport { devContentProtectionConfig } from \"./models/protection\";\n\ntype Props<K extends AudioCustomizableKeys = AudioDefaultKeys> = {\n adapter?: ThAudioPreferencesAdapter<K>;\n initialPreferences?: ThAudioPreferences<K>;\n devMode?: boolean;\n children: React.ReactNode;\n};\n\nexport function ThAudioPreferencesProvider<K extends AudioCustomizableKeys = AudioDefaultKeys>({\n adapter,\n initialPreferences,\n devMode,\n children,\n}: Props<K>) {\n const effectiveAdapter = useMemo(() => {\n let fallback = defaultAudioPreferencesContextValue.preferences as ThAudioPreferences<K>;\n if (devMode && !initialPreferences) {\n fallback = { ...fallback, contentProtection: devContentProtectionConfig };\n }\n return adapter || new ThAudioMemoryPreferencesAdapter<K>(\n (initialPreferences as ThAudioPreferences<K>) || fallback\n );\n }, [adapter, initialPreferences, devMode]);\n\n const [preferences, setPreferences] = useState<ThAudioPreferences<K>>(\n (() => {\n let fallback = defaultAudioPreferencesContextValue.preferences as ThAudioPreferences<K>;\n if (devMode && !initialPreferences) {\n fallback = { ...fallback, contentProtection: devContentProtectionConfig };\n }\n return (initialPreferences as ThAudioPreferences<K>) || fallback;\n })()\n );\n\n const handlePreferenceChange = useCallback((newPrefs: ThAudioPreferences<K>) => {\n setPreferences(prev =>\n JSON.stringify(prev) === JSON.stringify(newPrefs) ? prev : newPrefs\n );\n }, []);\n\n useEffect(() => {\n effectiveAdapter.subscribe(handlePreferenceChange);\n return () => {\n effectiveAdapter.unsubscribe(handlePreferenceChange);\n };\n }, [effectiveAdapter, handlePreferenceChange]);\n\n const contextValue = useMemo(() => ({\n preferences,\n updatePreferences: (newPrefs: ThAudioPreferences<K>) => {\n effectiveAdapter.setPreferences(newPrefs);\n },\n }), [preferences, effectiveAdapter]);\n\n return (\n <ThAudioPreferencesContext.Provider value={ contextValue }>\n <ThDirectionSetter direction={ preferences.direction }>\n { children }\n </ThDirectionSetter>\n </ThAudioPreferencesContext.Provider>\n );\n}\n","import { ThPreferences, CustomizableKeys } from \"../preferences\";\nimport { ThPreferencesAdapter } from \"./ThPreferencesAdapter\";\n\nexport class ThMemoryPreferencesAdapter<T extends CustomizableKeys = CustomizableKeys> implements ThPreferencesAdapter<T> {\n private currentPreferences: ThPreferences<T>;\n private listeners: Set<(prefs: ThPreferences<T>) => void> = new Set();\n\n constructor(initialPreferences: ThPreferences<T>) {\n this.currentPreferences = { ...initialPreferences };\n }\n\n public getPreferences(): ThPreferences<T> {\n return { ...this.currentPreferences };\n }\n\n public setPreferences(prefs: ThPreferences<T>): void {\n this.currentPreferences = { ...prefs };\n this.notifyListeners(this.currentPreferences);\n }\n\n public subscribe(listener: (prefs: ThPreferences<T>) => void): void {\n this.listeners.add(listener);\n }\n\n public unsubscribe(listener: (prefs: ThPreferences<T>) => void): void {\n this.listeners.delete(listener);\n }\n\n private notifyListeners(prefs: ThPreferences<T>): void {\n this.listeners.forEach(listener => listener({ ...prefs }));\n }\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { ThPreferences, CustomizableKeys, DefaultKeys } from \"./preferences\";\nimport { ThPreferencesContext, defaultPreferencesContextValue } from \"./ThPreferencesContext\";\nimport { devContentProtectionConfig } from \"./models/protection\";\n\nimport { ThPreferencesAdapter } from \"./adapters/ThPreferencesAdapter\";\nimport { ThMemoryPreferencesAdapter } from \"./adapters/ThMemoryPreferencesAdapter\";\nimport { ThDirectionSetter } from \"./ThDirectionSetter\";\n\ntype Props<K extends CustomizableKeys = DefaultKeys> = {\n adapter?: ThPreferencesAdapter<K>;\n initialPreferences?: ThPreferences<K>;\n devMode?: boolean;\n children: React.ReactNode;\n};\n\nexport function ThPreferencesProvider<K extends CustomizableKeys = DefaultKeys>({ \n adapter,\n initialPreferences,\n devMode,\n children, \n}: Props<K>) {\n // Create a default in-memory adapter if none is provided\n const effectiveAdapter = useMemo(() => {\n let fallbackPreferences = defaultPreferencesContextValue.preferences as ThPreferences<K>;\n \n // Apply dev mode modifications if needed and no initial preferences provided\n if (devMode && !initialPreferences) {\n fallbackPreferences = {\n ...fallbackPreferences,\n contentProtection: devContentProtectionConfig,\n };\n }\n\n return adapter || new ThMemoryPreferencesAdapter<K>(\n (initialPreferences as ThPreferences<K>) || fallbackPreferences\n );\n }, [adapter, initialPreferences, devMode]);\n\n const [preferences, setPreferences] = useState<ThPreferences<K>>(\n (() => {\n let fallbackPreferences = defaultPreferencesContextValue.preferences as ThPreferences<K>;\n\n if (devMode && !initialPreferences) {\n fallbackPreferences = {\n ...fallbackPreferences,\n contentProtection: devContentProtectionConfig,\n };\n }\n \n return (initialPreferences as ThPreferences<K>) || fallbackPreferences;\n })()\n );\n\n // Handle preference changes\n const handlePreferenceChange = useCallback((newPrefs: ThPreferences<K>) => {\n setPreferences(prev => {\n // Only update if preferences actually changed\n return JSON.stringify(prev) === JSON.stringify(newPrefs) ? prev : newPrefs;\n });\n }, []);\n\n // Set up and clean up subscription to preference changes\n useEffect(() => {\n // Set up the subscription\n effectiveAdapter.subscribe(handlePreferenceChange);\n \n // Clean up the subscription when the component unmounts or dependencies change\n return () => {\n effectiveAdapter.unsubscribe(handlePreferenceChange);\n };\n }, [effectiveAdapter, handlePreferenceChange]);\n\n // Provide current app context typing\n const contextValue = useMemo(() => ({\n preferences,\n updatePreferences: (newPrefs: ThPreferences<K>) => {\n effectiveAdapter.setPreferences(newPrefs);\n },\n }), [preferences, effectiveAdapter]);\n\n return (\n <ThPreferencesContext.Provider value={ contextValue }>\n <ThDirectionSetter direction={ preferences.direction }>\n { children }\n </ThDirectionSetter>\n </ThPreferencesContext.Provider>\n );\n}","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ThActionsTokens, ThAudioActionsTokens, ThDockingKeys, ThDockingPref } from \"../models\";\nimport { ThAudioPreferencesContext } from \"../ThAudioPreferencesContext\";\nimport { ThPreferencesContext } from \"../ThPreferencesContext\";\n\nexport interface ActionsPreferences {\n docking: ThDockingPref<ThDockingKeys>;\n actionsKeys: Record<string, ThActionsTokens | ThAudioActionsTokens>;\n}\n\nexport interface AudioActionsPreferences {\n docking: ThDockingPref<ThDockingKeys>;\n primaryActionsKeys: Record<string, ThAudioActionsTokens>;\n secondaryActionsKeys: Record<string, ThActionsTokens>;\n}\n\n/**\n * Context-agnostic hook for docking/actions infrastructure.\n * Resolves preferences from the audio context when available,\n * falling back to the reader context. This allows shared\n * components (docking, action containers) to work in both.\n */\nexport const useActionsPreferences = (): ActionsPreferences => {\n const audioCtx = useContext(ThAudioPreferencesContext);\n const readerCtx = useContext(ThPreferencesContext);\n\n if (audioCtx) {\n return {\n docking: audioCtx.preferences.docking,\n actionsKeys: {\n ...audioCtx.preferences.actions.primary.keys,\n ...audioCtx.preferences.actions.secondary.keys,\n },\n };\n }\n\n if (readerCtx) {\n return {\n docking: readerCtx.preferences.docking,\n actionsKeys: readerCtx.preferences.actions.keys as Record<string, ThActionsTokens>,\n };\n }\n\n throw new Error(\"useActionsPreferences must be used within a ThPreferencesProvider or ThAudioPreferencesProvider\");\n};\n\nexport const useAudioActionsPreferences = (): AudioActionsPreferences => {\n const audioCtx = useContext(ThAudioPreferencesContext);\n\n if (!audioCtx) {\n throw new Error(\"useAudioActionsPreferences must be used within a ThAudioPreferencesProvider\");\n }\n\n return {\n docking: audioCtx.preferences.docking,\n primaryActionsKeys: audioCtx.preferences.actions.primary.keys,\n secondaryActionsKeys: audioCtx.preferences.actions.secondary.keys,\n };\n};\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ThAudioPreferencesContext } from \"../ThAudioPreferencesContext\";\nimport { ThAudioPreferences, AudioCustomizableKeys, AudioDefaultKeys } from \"../audioPreferences\";\n\nexport function useAudioPreferences<K extends AudioCustomizableKeys = AudioDefaultKeys>() {\n const context = useContext(ThAudioPreferencesContext);\n\n if (!context) {\n throw new Error(\"useAudioPreferences must be used within a ThAudioPreferencesProvider\");\n }\n\n return {\n preferences: context.preferences as ThAudioPreferences<K>,\n updatePreferences: context.updatePreferences as (prefs: ThAudioPreferences<K>) => void,\n };\n}\n","import { FontDefinition, FontSpec, WeightConfig } from \"../models\";\nimport { FontResource } from \"./fonts\";\n\n/**\n * Builds a Bunny Fonts API URL\n * @see https://fonts.bunny.net\n */\nconst buildBunnyFontsUrl = ({\n family,\n weights,\n styles = [\"normal\"]\n}: {\n family: string;\n weights: WeightConfig;\n styles?: FontSpec[\"styles\"];\n}): string => {\n if (weights.type !== \"static\") {\n throw new Error(\"Bunny Fonts only supports static fonts\");\n }\n const weightValues = weights.values;\n \n // For Bunny Fonts, we need to handle italic variants by appending \"i\" to the weight\n const variants = new Set<string>();\n \n for (const weight of weightValues) {\n // Always add the base weight\n variants.add(weight.toString());\n \n // Add italic variant if needed\n if (styles.includes(\"italic\")) {\n variants.add(`${ weight }i`);\n }\n }\n\n // Convert set to array and sort for consistent URLs\n const variantList = Array.from(variants).sort();\n \n const familyParam = family.replace(/ /g, \"-\").toLowerCase();\n const variantParam = variantList.join(\",\");\n\n return `https://fonts.bunny.net/css?family=${ familyParam }:${ variantParam }`;\n};\n\n/**\n * Creates Bunny Fonts resources for injection\n */\nexport const createBunnyFontResources = (font: FontDefinition): FontResource | null => {\n if (font.source.type !== \"custom\" || font.source.provider !== \"bunny\" || font.spec.weights.type !== \"static\") {\n return null;\n }\n\n const { family, weights, styles } = font.spec;\n\n const url = buildBunnyFontsUrl({\n family,\n weights,\n styles\n });\n\n return {\n as: \"link\",\n rel: \"stylesheet\",\n url\n };\n};","import { FontDefinition, WeightConfig, VariableFontRangeConfig, FontSpec } from \"../models\";\nimport { FontResource } from \"./fonts\";\n\n/**\n * Builds a Google Fonts API v2 URL according to the specification.\n * @see https://developers.google.com/fonts/docs/css2\n */\nconst buildGoogleFontsV2Url = ({\n family,\n weights,\n styles = [\"normal\"],\n widths,\n display = \"block\",\n text\n}: {\n family: string;\n weights: WeightConfig;\n styles?: FontSpec[\"styles\"];\n widths?: VariableFontRangeConfig;\n display?: FontSpec[\"display\"];\n text?: string;\n}): string => {\n // If optimizing with text, just load the font family with the text parameter\n if (text) {\n return `https://fonts.googleapis.com/css2?family=${ family.replace(/ /g, \"+\") }&text=${ encodeURIComponent(text) }`;\n }\n\n const hasItalic = styles.includes(\"italic\");\n const hasWidth = !!widths;\n const weightValues = weights.type === \"static\"\n ? weights.values.join(\",\")\n : `${ weights.min }..${ weights.max }`;\n const widthValues = hasWidth && widths ? `${ widths.min }..${ widths.max }` : undefined;\n\n const familyParam = family.replace(/ /g, \"+\");\n let axesParam: string;\n\n if (hasItalic && hasWidth) {\n // With italic and width: ital,wdth,wght@0,widthValues,weightValues;1,widthValues,weightValues\n const variants = [\n `0,${ widthValues },${ weightValues }`, // normal\n `1,${ widthValues },${ weightValues }` // italic\n ];\n axesParam = `:ital,wdth,wght@${ variants.join(\";\") }`;\n } else if (hasItalic) {\n // With italic only: ital,wght@0,weightValues;1,weightValues\n const variants = [\n `0,${ weightValues }`, // normal\n `1,${ weightValues }` // italic\n ];\n axesParam = `:ital,wght@${ variants.join(\";\") }`;\n } else if (hasWidth) {\n // With width only: wdth,wght@widthValues,weightValues\n axesParam = `:wdth,wght@${ widthValues },${ weightValues }`;\n } else {\n // Without italic or width: wght@weightValues\n axesParam = `:wght@${ weightValues }`;\n }\n const displayParam = display ? `&display=${ display }` : \"\";\n\n return `https://fonts.googleapis.com/css2?family=${ familyParam }${ axesParam }${ displayParam }`;\n};\n\n/**\n * Creates Google Font resources for injection\n */\nexport const createGoogleFontResources = (font: FontDefinition, text?: string): FontResource | null => {\n if (font.source.type !== \"custom\" || font.source.provider !== \"google\") {\n return null;\n }\n\n const { family, weights, display, styles, widths } = font.spec;\n\n const url = buildGoogleFontsV2Url({\n family,\n weights,\n display,\n styles,\n widths,\n text\n });\n\n return {\n as: \"link\",\n rel: \"stylesheet\",\n url\n };\n};\n","import { FontDefinition } from \"../models\";\nimport { FontResource } from \"./fonts\";\n\n/**\n * Determines the font format from a file path\n */\n const getFontFormat = (path: string): string => {\n const ext = path.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"woff\": return \"woff\";\n case \"woff2\": return \"woff2\";\n case \"ttf\": return \"truetype\";\n case \"otf\": return \"opentype\";\n case \"eot\": return \"embedded-opentype\";\n case \"svg\": return \"svg\";\n default: return \"woff2\"; // default to woff2 if unknown\n }\n };\n\n/**\n * Creates local font resources for injection\n */\n export const createLocalFontResources = (font: FontDefinition): FontResource | null => {\n if (font.source.type !== \"custom\" || font.source.provider !== \"local\") {\n return null;\n }\n\n const { family, weights, display, widths } = font.spec;\n const fontFiles = font.source.files || [];\n \n // Generate CSS for each font file\n const cssContent = fontFiles.map(fontFile => {\n const format = getFontFormat(fontFile.path);\n const fontUrl = new URL(fontFile.path, window.location.origin).toString();\n\n // Check if this is a variable font\n const isVariable = font.source.type === \"custom\" && \n font.source.provider === \"local\" && \n \"variant\" in font.source && \n font.source.variant === \"variable\";\n \n const rules = [\n `@font-face {`,\n ` font-family: \"${ family }\";`,\n ` src: url(\"${ fontUrl }\") format(\"${ format }\");`\n ];\n\n // Handle font weight\n if (isVariable && weights.type === \"variable\") {\n rules.push(` font-weight: ${ weights.min } ${ weights.max };`);\n } else if (\"weight\" in fontFile) {\n rules.push(` font-weight: ${ fontFile.weight };`);\n }\n\n // Handle font style\n if (\"style\" in fontFile) {\n rules.push(` font-style: ${ fontFile.style };`);\n }\n\n // Handle font width for variable fonts\n if (isVariable && widths) {\n rules.push(` font-stretch: ${ widths.min }% ${ widths.max }%;`);\n }\n \n if (display) {\n rules.push(` font-display: ${ display };`);\n } else {\n rules.push(` font-display: block;`);\n }\n \n return rules.join(\"\\n\") + \"\\n}\";\n }).filter(Boolean).join(\"\\n\\n\");\n \n const blob = new Blob([cssContent], { type: \"text/css\" });\n \n // Return the font face as a stylesheet resource\n return {\n as: \"link\",\n rel: \"stylesheet\",\n blob: blob\n };\n };\n","import { FontDefinition, VariableFontRangeConfig, WeightConfig, ThFontFamilyPref, FontCollection, ValidatedLanguageCollection } from \"../models\";\n\nimport { ILinkInjectable, IUrlInjectable, IBlobInjectable } from \"@readium/navigator\";\n\nimport { createBunnyFontResources } from \"./createBunnyFontResources\";\nimport { createGoogleFontResources } from \"./createGoogleFontResources\";\nimport { createLocalFontResources } from \"./createLocalFontResources\";\n\nexport type FontResource = (ILinkInjectable & IUrlInjectable) | (ILinkInjectable & IBlobInjectable);\n\nexport interface InjectableFontResources {\n allowedDomains: string[];\n prepend: FontResource[];\n append: FontResource[];\n}\n\nexport interface FontMetadata {\n fontStack: string | null;\n fontFamily: string | null;\n weights: WeightConfig | null;\n widths: VariableFontRangeConfig | null;\n}\n\nexport interface FontService {\n getInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => InjectableFontResources | null;\n getFontMetadata: (fontId: string) => FontMetadata;\n getFontCollection: (options?: { language?: string } | { key?: string }) => FontCollection;\n resolveFontLanguage: (bcp47Tag: string | undefined, direction: \"ltr\" | \"rtl\") => string;\n}\n\nexport const createFontService = (fontFamilyPref: ThFontFamilyPref): FontService => {\n const allSupportedLanguages: string[] = [];\n const parsedFonts = new Map<string, FontMetadata>();\n \n const bunnyFonts = new Map<string, FontDefinition[]>();\n const googleFonts = new Map<string, FontDefinition[]>();\n const localFonts = new Map<string, FontDefinition[]>();\n \n /**\n * Resolves a BCP47 language tag to a supported language format based on specific rules and available font collections.\n * \n * Rules:\n * - First checks if the full BCP47 tag exists in supportedLanguages\n * - If not found, checks for { language }-{ scriptOrRegion } format\n * - Special case for Japanese (ja):\n * - For RTL direction, checks if \"ja-v\" is supported\n * - Otherwise falls back to \"ja\" if supported\n * - Filters out specific language-script combinations:\n * - Mongolian: \"mn-mong\" and \"mn-cyrl\"\n * - Chinese: \"zh-hant\", \"zh-tw\", \"zh-hk\"\n * - If not filtered, falls back to { language } if supported\n * - Returns \"default\" if no match is found\n * \n * @param bcp47Tag - The BCP47 language tag to resolve\n * @param direction - Text direction (\"ltr\" or \"rtl\")\n * @returns The resolved language tag or \"default\" if no match found\n */\n const resolveFontLanguage = (\n bcp47Tag: string | undefined, \n direction: \"ltr\" | \"rtl\" = \"ltr\"\n ): string => {\n if (!bcp47Tag) return \"default\";\n \n // Check direct match of full BCP47 tag\n if (allSupportedLanguages.includes(bcp47Tag)) {\n return bcp47Tag;\n }\n \n const parts = bcp47Tag.split(/[-_]/);\n const language = parts[0].toLowerCase();\n const scriptOrRegion = parts[1]?.toLowerCase();\n \n // Check { language }-{ scriptOrRegion } format\n if (scriptOrRegion) {\n const langScriptOrRegion = `${ language }-${ scriptOrRegion }`;\n if (allSupportedLanguages.includes(langScriptOrRegion)) {\n return langScriptOrRegion;\n }\n }\n \n // Special case for Japanese\n if (language === \"ja\" && !scriptOrRegion) {\n if (direction === \"rtl\" && allSupportedLanguages.includes(\"ja-v\")) {\n return \"ja-v\";\n }\n if (allSupportedLanguages.includes(\"ja\")) {\n return \"ja\";\n }\n }\n \n // Special cases that should be filtered out\n const shouldFilter = \n (language === \"mn\" && (scriptOrRegion === \"mong\" || scriptOrRegion === \"cyrl\")) ||\n (language === \"zh\" && (scriptOrRegion === \"hant\" || scriptOrRegion === \"tw\" || scriptOrRegion === \"hk\"));\n \n // If not filtered, check if just the language is supported\n if (!shouldFilter && allSupportedLanguages.includes(language)) {\n return language;\n }\n \n return \"default\";\n };\n\n // Parse ALL fonts upfront - index by collection\n Object.entries(fontFamilyPref).forEach(([collectionName, collectionData]) => {\n // Handle both FontCollection and ValidatedLanguageCollection\n const fontCollection = \"fonts\" in collectionData ? \n (collectionData as ValidatedLanguageCollection).fonts : \n collectionData as FontCollection;\n \n // Collect supported languages if this is a ValidatedLanguageCollection\n if (\"supportedLanguages\" in collectionData) {\n const reducedLanguages = collectionData.supportedLanguages.map((lang: string) => {\n const parts = lang.split(/[-_]/);\n const language = parts[0].toLowerCase();\n const scriptOrRegion = parts[1]?.toLowerCase();\n return scriptOrRegion ? `${ language }-${ scriptOrRegion }` : language;\n });\n allSupportedLanguages.push(...reducedLanguages);\n }\n \n // Initialize arrays for this collection\n bunnyFonts.set(collectionName, []);\n googleFonts.set(collectionName, []);\n localFonts.set(collectionName, []);\n \n const collectionBunnyFonts = bunnyFonts.get(collectionName)!;\n const collectionGoogleFonts = googleFonts.get(collectionName)!;\n const collectionLocalFonts = localFonts.get(collectionName)!;\n \n // Process each font in the collection\n Object.entries<FontDefinition>(fontCollection as Record<string, FontDefinition>).forEach(([id, font]) => {\n const fontFamily = font.spec.family;\n let fontStack = fontFamily;\n\n if (font.source.type === \"custom\") {\n switch (font.source.provider) {\n case \"bunny\":\n collectionBunnyFonts.push(font);\n break;\n case \"google\":\n collectionGoogleFonts.push(font);\n break;\n case \"local\":\n collectionLocalFonts.push(font);\n break;\n }\n }\n\n const wrapIfNeeded = (name: string): string => {\n const trimmed = name.trim();\n if (!trimmed) return \"\";\n \n // If the name has spaces and isn't already wrapped in quotes\n if (trimmed.includes(\" \") && !/^['\"].*['\"]$/.test(trimmed)) {\n return `\"${ trimmed }\"`;\n }\n return trimmed;\n };\n\n const wrappedFontFamily = wrapIfNeeded(fontFamily);\n \n if (font.spec.fallbacks?.length) {\n const uniqueFallbacks = [...new Set(\n font.spec.fallbacks\n .filter((fallback: string) => fallback.toLowerCase() !== fontFamily.toLowerCase())\n .map(wrapIfNeeded)\n )];\n if (uniqueFallbacks.length > 0) {\n fontStack = [wrappedFontFamily, ...uniqueFallbacks].join(\", \");\n }\n }\n\n parsedFonts.set(id, { \n fontStack: fontStack || wrappedFontFamily, \n fontFamily: wrappedFontFamily,\n weights: font.spec.weights || null,\n widths: font.spec.widths || null\n });\n });\n });\n\n // Get default collection for fallback\n const defaultBunnyFonts = bunnyFonts.get(\"default\") || [];\n const defaultGoogleFonts = googleFonts.get(\"default\") || [];\n const defaultLocalFonts = localFonts.get(\"default\") || [];\n \n // Helper function to process fonts into injectable resources\n const processFonts = (bunnyFontsList: FontDefinition[], googleFontsList: FontDefinition[], localFontsList: FontDefinition[], optimize: boolean = false): InjectableFontResources | null => {\n const result: InjectableFontResources = {\n allowedDomains: [],\n prepend: [],\n append: []\n };\n\n // Process Bunny Fonts\n const bunnyResources = bunnyFontsList\n .map(font => createBunnyFontResources(font))\n .filter((resource): resource is FontResource => resource !== null);\n\n if (bunnyResources.length > 0) {\n result.allowedDomains.push(\n \"https://fonts.bunny.net\"\n );\n\n result.prepend.push(\n { \n as: \"link\",\n rel: \"preconnect\",\n url: \"https://fonts.bunny.net\"\n }\n );\n\n result.append.push(...bunnyResources);\n }\n\n // Process Google Fonts\n const googleResources = googleFontsList\n .map(font => createGoogleFontResources(font, optimize ? font.name : undefined))\n .filter((resource): resource is FontResource => resource !== null);\n\n if (googleResources.length > 0) {\n result.allowedDomains.push(\n \"https://fonts.googleapis.com\",\n \"https://fonts.gstatic.com\"\n );\n \n result.prepend.push(\n { \n as: \"link\",\n rel: \"preconnect\",\n url: \"https://fonts.googleapis.com\"\n },\n { \n as: \"link\",\n rel: \"preconnect\",\n url: \"https://fonts.gstatic.com\",\n attributes: { crossOrigin: \"anonymous\" }\n }\n );\n \n result.append.push(...googleResources);\n }\n\n // Process Local Fonts\n const localResources = localFontsList\n .map(createLocalFontResources)\n .filter((resource): resource is FontResource => resource !== null);\n\n if (localResources.length > 0) {\n result.allowedDomains.push(window.location.origin);\n result.append.push(...localResources);\n }\n\n return result.append.length > 0 ? result : null;\n };\n\n /**\n * Returns injectable font resources based on the provided options.\n * \n * @param options - The options object containing either a language or a key.\n * @param optimize - Whether to optimize the font resources. This will use the font label/name to determine the letters to request from Google Fonts.\n * @returns The injectable font resources or null if no valid collection is found.\n */\n const getInjectables = (options?: { language?: string } | { key?: string }, optimize = false): InjectableFontResources | null => {\n // Handle key-based selection\n if (options && \"key\" in options) {\n const { key } = options;\n \n if (!key || !(key in fontFamilyPref)) {\n return null;\n }\n \n return processFonts(bunnyFonts.get(key) || [], googleFonts.get(key) || [], localFonts.get(key) || [], optimize);\n }\n \n // Handle language-based selection\n if (options && \"language\" in options) {\n const { language: publicationLanguage } = options;\n \n // Find the collection for this language (validation already done in createPreferences)\n for (const [collectionName, collectionData] of Object.entries(fontFamilyPref)) {\n if (collectionName === \"default\") continue;\n \n const supportedLangs = \"supportedLanguages\" in collectionData ? \n collectionData.supportedLanguages : null;\n \n if (supportedLangs && Array.isArray(supportedLangs) && publicationLanguage && supportedLangs.includes(publicationLanguage)) {\n return processFonts(bunnyFonts.get(collectionName) || [], googleFonts.get(collectionName) || [], localFonts.get(collectionName) || [], optimize);\n }\n }\n }\n \n // Default behavior - return default collection\n return processFonts(defaultBunnyFonts, defaultGoogleFonts, defaultLocalFonts, optimize);\n };\n \n /**\n * Returns metadata for a specific font.\n * \n * @param fontId - The ID of the font.\n * @returns The metadata for the font or null if the font is not found.\n */\n const getFontMetadata = (fontId: string) => {\n const parsed = parsedFonts.get(fontId);\n return parsed || { fontStack: null, fontFamily: null, weights: null, widths: null };\n };\n\n /**\n * Returns the font collection based on the provided options.\n * \n * @param options - The options object containing either a language or a key.\n * @returns The font collection or the default collection if no valid collection is found.\n */\n const getFontCollection = (options?: { language?: string } | { key?: string }): FontCollection => {\n // Handle key-based selection\n if (options && \"key\" in options) {\n const { key } = options;\n \n if (!key || !(key in fontFamilyPref)) {\n return fontFamilyPref.default as FontCollection;\n }\n \n // Check if we're accessing the default collection\n if (key === \"default\") {\n return fontFamilyPref.default as FontCollection;\n }\n \n // For non-default keys, we expect ValidatedLanguageCollection\n const prefRecord = fontFamilyPref as Record<string, FontCollection | ValidatedLanguageCollection>;\n const collection = prefRecord[key] as ValidatedLanguageCollection;\n if (collection && \"fonts\" in collection) {\n return collection.fonts;\n }\n \n // Fallback to default\n return fontFamilyPref.default as FontCollection;\n }\n \n // Handle language-based selection\n if (options && \"language\" in options) {\n const { language: publicationLanguage } = options;\n \n // Find the collection for this language (validation already done in createPreferences)\n for (const [collectionName, collectionData] of Object.entries(fontFamilyPref)) {\n if (collectionName === \"default\") continue;\n \n const collection = \"fonts\" in collectionData ? collectionData : { fonts: collectionData };\n const supportedLangs = \"supportedLanguages\" in collection ? \n collection.supportedLanguages : null;\n \n if (supportedLangs?.includes(publicationLanguage!)) {\n return collection.fonts;\n }\n }\n\n // Fall back to default if no collection supports this language\n return fontFamilyPref.default as FontCollection;\n }\n \n // Default behavior - return default collection\n return fontFamilyPref.default as FontCollection;\n };\n\n return {\n getInjectables,\n getFontMetadata,\n getFontCollection,\n resolveFontLanguage\n };\n};\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ThPreferencesContext } from \"../ThPreferencesContext\";\nimport { CustomizableKeys, DefaultKeys, ThPreferences } from \"../preferences\";\nimport { createFontService } from \"../services/fonts\";\n\nexport function usePreferences<K extends CustomizableKeys = DefaultKeys>() {\n const context = useContext(ThPreferencesContext);\n \n if (!context) {\n throw new Error(\"usePreferences must be used within a ThPreferencesProvider\");\n }\n\n // Create font service that handles the entire ThFontFamilyPref object\n const fontService = createFontService(context.preferences.settings.keys.fontFamily);\n \n return {\n preferences: context.preferences as ThPreferences<K>,\n updatePreferences: context.updatePreferences as (prefs: ThPreferences<K>) => void,\n \n getFontInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => {\n return fontService.getInjectables(options, optimize);\n },\n \n getFontsList: (options?: { language?: string } | { key?: string }) => {\n return fontService.getFontCollection(options);\n },\n \n getFontMetadata: (fontId: string) => {\n return fontService.getFontMetadata(fontId);\n },\n \n resolveFontLanguage: (bcp47Tag: string | undefined, direction: \"ltr\" | \"rtl\") => {\n return fontService.resolveFontLanguage(bcp47Tag, direction);\n }\n };\n}","\"use client\";\n\nimport { \n ThSpacingPresetKeys,\n defaultSpacingSettingsSubpanel,\n defaultTextSettingsMain,\n defaultTextSettingsSubpanel,\n defaultSpacingSettingsMain,\n defaultSpacingPresetsOrder\n} from \"@/preferences/models\";\n\nimport { usePreferences } from \"./usePreferences\";\n\nexport const usePreferenceKeys = () => {\n const { preferences } = usePreferences();\n\n const reflowActionKeys = preferences.actions.reflowOrder;\n const fxlActionKeys = preferences.actions.fxlOrder;\n const webPubActionKeys = preferences.actions.webPubOrder;\n\n const reflowThemeKeys = preferences.theming.themes.reflowOrder;\n const fxlThemeKeys = preferences.theming.themes.fxlOrder;\n\n const reflowSettingsKeys = preferences.settings.reflowOrder;\n const fxlSettingsKeys = preferences.settings.fxlOrder;\n const webPubSettingsKeys = preferences.settings.webPubOrder;\n\n const mainTextSettingsKeys = preferences.settings.text?.main ?? defaultTextSettingsMain;\n const subPanelTextSettingsKeys = preferences.settings.text?.subPanel ?? defaultTextSettingsSubpanel;\n const mainSpacingSettingsKeys = preferences.settings.spacing?.main ?? defaultSpacingSettingsMain;\n const subPanelSpacingSettingsKeys = preferences.settings.spacing?.subPanel ?? defaultSpacingSettingsSubpanel;\n\n const reflowSpacingPresetKeys = preferences.settings.spacing?.presets?.reflowOrder ?? defaultSpacingPresetsOrder;\n const fxlSpacingPresetKeys: ThSpacingPresetKeys[] = [];\n const webPubSpacingPresetKeys = preferences.settings.spacing?.presets?.webPubOrder ?? defaultSpacingPresetsOrder;\n\n return {\n reflowActionKeys,\n fxlActionKeys,\n webPubActionKeys,\n reflowThemeKeys,\n fxlThemeKeys,\n reflowSettingsKeys,\n fxlSettingsKeys,\n webPubSettingsKeys,\n mainTextSettingsKeys,\n subPanelTextSettingsKeys,\n mainSpacingSettingsKeys,\n subPanelSpacingSettingsKeys,\n reflowSpacingPresetKeys,\n fxlSpacingPresetKeys,\n webPubSpacingPresetKeys\n };\n}","const PREFIXES = {\n short: \"th\",\n full: \"thorium_web\"\n} as const;\n\ntype PrefixVariant = keyof typeof PREFIXES;\n\nexport const prefixString = (str: string, variant: PrefixVariant = \"short\") => {\n return `${ PREFIXES[variant] }-${ str }`;\n}","import type { OKLCH } from './types.js';\n\n// ---------------------------------------------------------------------------\n// sRGB ↔ Linear\n// ---------------------------------------------------------------------------\n\n/** Convert a single sRGB channel (0–255) to linear (0–1). */\nexport function srgbToLinear(c: number): number {\n const s = c / 255;\n return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n}\n\n/** Convert a linear channel (0–1) back to sRGB (0–255). */\nexport function linearToSrgb(c: number): number {\n const s = c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n return Math.round(Math.max(0, Math.min(255, s * 255)));\n}\n\n// ---------------------------------------------------------------------------\n// RGB → OKLab → OKLCH\n// ---------------------------------------------------------------------------\n\n/** Convert sRGB (0–255 each) to OKLCH. */\nexport function rgbToOklch(r: number, g: number, b: number): OKLCH {\n // sRGB → linear\n const lr = srgbToLinear(r);\n const lg = srgbToLinear(g);\n const lb = srgbToLinear(b);\n\n // Linear sRGB → LMS (using Oklab M1 matrix)\n const l_ = 0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb;\n const m_ = 0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb;\n const s_ = 0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb;\n\n // Cube root (LMS → Lab cone response)\n const l3 = Math.cbrt(l_);\n const m3 = Math.cbrt(m_);\n const s3 = Math.cbrt(s_);\n\n // LMS cone response → OKLab\n const L = 0.2104542553 * l3 + 0.7936177850 * m3 - 0.0040720468 * s3;\n const a = 1.9779984951 * l3 - 2.4285922050 * m3 + 0.4505937099 * s3;\n const bLab = 0.0259040371 * l3 + 0.7827717662 * m3 - 0.8086757660 * s3;\n\n // OKLab → OKLCH\n const C = Math.sqrt(a * a + bLab * bLab);\n let H = Math.atan2(bLab, a) * (180 / Math.PI);\n if (H < 0) H += 360;\n\n return { l: L, c: C, h: H };\n}\n\n// ---------------------------------------------------------------------------\n// OKLCH → OKLab → RGB\n// ---------------------------------------------------------------------------\n\n/** Convert OKLCH back to sRGB (0–255 each). Clamps out-of-gamut values. */\nexport function oklchToRgb(l: number, c: number, h: number): [number, number, number] {\n // OKLCH → OKLab\n const hRad = h * (Math.PI / 180);\n const a = c * Math.cos(hRad);\n const bLab = c * Math.sin(hRad);\n\n // OKLab → LMS cone response\n const l3 = l + 0.3963377774 * a + 0.2158037573 * bLab;\n const m3 = l - 0.1055613458 * a - 0.0638541728 * bLab;\n const s3 = l - 0.0894841775 * a - 1.2914855480 * bLab;\n\n // Cube (cone response → LMS)\n const l_ = l3 * l3 * l3;\n const m_ = m3 * m3 * m3;\n const s_ = s3 * s3 * s3;\n\n // LMS → linear sRGB (inverse of M1)\n const lr = +4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_;\n const lg = -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_;\n const lb = -0.0041960863 * l_ - 0.7034186147 * m_ + 1.7076147010 * s_;\n\n return [linearToSrgb(lr), linearToSrgb(lg), linearToSrgb(lb)];\n}\n\n// ---------------------------------------------------------------------------\n// Batch conversion helpers for OKLCH quantization pipeline\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an array of RGB pixel triplets to OKLCH, scaled to 0–255 for\n * compatibility with the MMCQ quantizer (which expects integer ranges).\n *\n * Scaling: L (0–1) → 0–255, C (0–0.4) → 0–255, H (0–360) → 0–255\n */\nexport function pixelsRgbToOklchScaled(\n pixels: Array<[number, number, number]>,\n): Array<[number, number, number]> {\n const out: Array<[number, number, number]> = new Array(pixels.length);\n for (let i = 0; i < pixels.length; i++) {\n const [r, g, b] = pixels[i];\n const { l, c, h } = rgbToOklch(r, g, b);\n out[i] = [\n Math.round(l * 255),\n Math.round((c / 0.4) * 255),\n Math.round((h / 360) * 255),\n ];\n }\n return out;\n}\n\n/**\n * Convert scaled OKLCH palette entries back to RGB.\n */\nexport function paletteOklchScaledToRgb(\n colors: Array<{ color: [number, number, number]; population: number }>,\n): Array<{ color: [number, number, number]; population: number }> {\n return colors.map(({ color: [ls, cs, hs], population }) => {\n const l = ls / 255;\n const c = (cs / 255) * 0.4;\n const h = (hs / 255) * 360;\n return { color: oklchToRgb(l, c, h), population };\n });\n}\n","import type { RGB, HSL, OKLCH, Color, ContrastInfo, CssColorFormat } from './types.js';\nimport { rgbToOklch } from './color-space.js';\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction rgbToHsl(r: number, g: number, b: number): HSL {\n const r1 = r / 255;\n const g1 = g / 255;\n const b1 = b / 255;\n const max = Math.max(r1, g1, b1);\n const min = Math.min(r1, g1, b1);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n if (max === r1) {\n h = ((g1 - b1) / d + (g1 < b1 ? 6 : 0)) / 6;\n } else if (max === g1) {\n h = ((b1 - r1) / d + 2) / 6;\n } else {\n h = ((r1 - g1) / d + 4) / 6;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\n/** WCAG relative luminance from sRGB 0–255. */\nfunction relativeLuminance(r: number, g: number, b: number): number {\n const toLinear = (c: number) => {\n const s = c / 255;\n return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** WCAG contrast ratio between two luminances (always ≥ 1). */\nfunction contrastRatio(l1: number, l2: number): number {\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n// ---------------------------------------------------------------------------\n// ColorImpl\n// ---------------------------------------------------------------------------\n\nclass ColorImpl implements Color {\n private readonly _r: number;\n private readonly _g: number;\n private readonly _b: number;\n readonly population: number;\n readonly proportion: number;\n\n private _hsl: HSL | undefined;\n private _oklch: OKLCH | undefined;\n private _luminance: number | undefined;\n private _contrast: ContrastInfo | undefined;\n\n constructor(r: number, g: number, b: number, population: number, proportion: number) {\n this._r = r;\n this._g = g;\n this._b = b;\n this.population = population;\n this.proportion = proportion;\n }\n\n rgb(): RGB {\n return { r: this._r, g: this._g, b: this._b };\n }\n\n hex(): string {\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\n return `#${toHex(this._r)}${toHex(this._g)}${toHex(this._b)}`;\n }\n\n hsl(): HSL {\n if (!this._hsl) {\n this._hsl = rgbToHsl(this._r, this._g, this._b);\n }\n return this._hsl;\n }\n\n oklch(): OKLCH {\n if (!this._oklch) {\n this._oklch = rgbToOklch(this._r, this._g, this._b);\n }\n return this._oklch;\n }\n\n css(format: CssColorFormat = 'rgb'): string {\n switch (format) {\n case 'hsl': {\n const { h, s, l } = this.hsl();\n return `hsl(${h}, ${s}%, ${l}%)`;\n }\n case 'oklch': {\n const { l, c, h } = this.oklch();\n return `oklch(${l.toFixed(3)} ${c.toFixed(3)} ${h.toFixed(1)})`;\n }\n case 'rgb':\n default:\n return `rgb(${this._r}, ${this._g}, ${this._b})`;\n }\n }\n\n array(): [number, number, number] {\n return [this._r, this._g, this._b];\n }\n\n toString(): string {\n return this.hex();\n }\n\n get textColor(): string {\n return this.isDark ? '#ffffff' : '#000000';\n }\n\n private get luminance(): number {\n if (this._luminance === undefined) {\n this._luminance = relativeLuminance(this._r, this._g, this._b);\n }\n return this._luminance;\n }\n\n get isDark(): boolean {\n return this.luminance <= 0.179;\n }\n\n get isLight(): boolean {\n return !this.isDark;\n }\n\n get contrast(): ContrastInfo {\n if (!this._contrast) {\n const lum = this.luminance;\n const white = contrastRatio(lum, 1); // white luminance = 1\n const black = contrastRatio(lum, 0); // black luminance = 0\n const foreground = this.isDark\n ? createColor(255, 255, 255, 0, 0)\n : createColor(0, 0, 0, 0, 0);\n this._contrast = {\n white: Math.round(white * 100) / 100,\n black: Math.round(black * 100) / 100,\n foreground,\n };\n }\n return this._contrast;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/** Create a Color object from RGB components, population count, and proportion. */\nexport function createColor(\n r: number,\n g: number,\n b: number,\n population: number,\n proportion: number = 0,\n): Color {\n return new ColorImpl(r, g, b, population, proportion);\n}\n","import type {\n Color,\n ExtractionOptions,\n FilterOptions,\n PixelBuffer,\n Quantizer,\n} from './types.js';\nimport { createColor } from './color.js';\nimport {\n pixelsRgbToOklchScaled,\n paletteOklchScaledToRgb,\n} from './color-space.js';\n\n// ---------------------------------------------------------------------------\n// Validate & normalize options\n// ---------------------------------------------------------------------------\n\nexport interface ValidatedOptions {\n colorCount: number;\n quality: number;\n ignoreWhite: boolean;\n whiteThreshold: number;\n alphaThreshold: number;\n minSaturation: number;\n colorSpace: 'rgb' | 'oklch';\n}\n\nexport function validateOptions(options: ExtractionOptions): ValidatedOptions {\n let { colorCount, quality } = options;\n\n if (typeof colorCount === 'undefined' || !Number.isInteger(colorCount)) {\n colorCount = 10;\n } else if (colorCount === 1) {\n throw new Error(\n 'colorCount should be between 2 and 20. To get one color, call getColor() instead of getPalette()',\n );\n } else {\n colorCount = Math.max(colorCount, 2);\n colorCount = Math.min(colorCount, 20);\n }\n\n if (\n typeof quality === 'undefined' ||\n !Number.isInteger(quality) ||\n quality < 1\n ) {\n quality = 10;\n }\n\n const ignoreWhite =\n options.ignoreWhite !== undefined ? !!options.ignoreWhite : true;\n const whiteThreshold =\n typeof options.whiteThreshold === 'number' ? options.whiteThreshold : 250;\n const alphaThreshold =\n typeof options.alphaThreshold === 'number' ? options.alphaThreshold : 125;\n const minSaturation =\n typeof options.minSaturation === 'number'\n ? Math.max(0, Math.min(1, options.minSaturation))\n : 0;\n const colorSpace = options.colorSpace ?? 'oklch';\n\n return {\n colorCount,\n quality,\n ignoreWhite,\n whiteThreshold,\n alphaThreshold,\n minSaturation,\n colorSpace,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pixel sampling\n// ---------------------------------------------------------------------------\n\nexport function createPixelArray(\n data: PixelBuffer,\n pixelCount: number,\n quality: number,\n filterOptions: FilterOptions,\n): Array<[number, number, number]> {\n const {\n ignoreWhite = true,\n whiteThreshold = 250,\n alphaThreshold = 125,\n minSaturation = 0,\n } = filterOptions;\n\n const pixelArray: Array<[number, number, number]> = [];\n\n for (let i = 0; i < pixelCount; i += quality) {\n const offset = i * 4;\n const r = data[offset];\n const g = data[offset + 1];\n const b = data[offset + 2];\n const a = data[offset + 3];\n\n // Skip transparent pixels\n if (a !== undefined && a < alphaThreshold) continue;\n\n // Skip white pixels\n if (\n ignoreWhite &&\n r > whiteThreshold &&\n g > whiteThreshold &&\n b > whiteThreshold\n )\n continue;\n\n // Skip low-saturation pixels\n if (minSaturation > 0) {\n const max = Math.max(r, g, b);\n if (max === 0 || (max - Math.min(r, g, b)) / max < minSaturation)\n continue;\n }\n\n pixelArray.push([r, g, b]);\n }\n\n return pixelArray;\n}\n\n// ---------------------------------------------------------------------------\n// Fallback color (average)\n// ---------------------------------------------------------------------------\n\nexport function computeFallbackColor(\n data: PixelBuffer,\n pixelCount: number,\n quality: number,\n): [number, number, number] | null {\n let rTotal = 0;\n let gTotal = 0;\n let bTotal = 0;\n let count = 0;\n\n for (let i = 0; i < pixelCount; i += quality) {\n const offset = i * 4;\n rTotal += data[offset];\n gTotal += data[offset + 1];\n bTotal += data[offset + 2];\n count++;\n }\n\n if (count === 0) return null;\n\n return [\n Math.round(rTotal / count),\n Math.round(gTotal / count),\n Math.round(bTotal / count),\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Main extraction pipeline\n// ---------------------------------------------------------------------------\n\nexport function extractPalette(\n data: PixelBuffer,\n width: number,\n height: number,\n opts: ValidatedOptions,\n quantizer: Quantizer,\n): Color[] | null {\n const pixelCount = width * height;\n const filterOptions: FilterOptions = {\n ignoreWhite: opts.ignoreWhite,\n whiteThreshold: opts.whiteThreshold,\n alphaThreshold: opts.alphaThreshold,\n minSaturation: opts.minSaturation,\n };\n\n let pixelArray = createPixelArray(data, pixelCount, opts.quality, filterOptions);\n\n // Progressively relax filters if all pixels were excluded\n if (pixelArray.length === 0) {\n pixelArray = createPixelArray(data, pixelCount, opts.quality, {\n ...filterOptions,\n ignoreWhite: false,\n });\n }\n if (pixelArray.length === 0) {\n pixelArray = createPixelArray(data, pixelCount, opts.quality, {\n ...filterOptions,\n ignoreWhite: false,\n alphaThreshold: 0,\n });\n }\n\n // OKLCH quantization path\n let quantized: Array<{ color: [number, number, number]; population: number }>;\n if (opts.colorSpace === 'oklch') {\n const scaled = pixelsRgbToOklchScaled(pixelArray);\n quantized = paletteOklchScaledToRgb(\n quantizer.quantize(scaled, opts.colorCount),\n );\n } else {\n quantized = quantizer.quantize(pixelArray, opts.colorCount);\n }\n\n if (quantized.length > 0) {\n const totalPopulation = quantized.reduce((sum, q) => sum + q.population, 0);\n return quantized.map(({ color: [r, g, b], population }) =>\n createColor(r, g, b, population, totalPopulation > 0 ? population / totalPopulation : 0),\n );\n }\n\n // Fallback: average all pixels\n const fallback = computeFallbackColor(data, pixelCount, opts.quality);\n return fallback ? [createColor(fallback[0], fallback[1], fallback[2], 1, 1)] : null;\n}\n","import type { BrowserSource, PixelData, PixelLoader } from '../types.js';\n\n/**\n * Browser pixel loader. Extracts RGBA pixel data from DOM image sources\n * using an off-screen canvas.\n */\nexport class BrowserPixelLoader implements PixelLoader<BrowserSource> {\n async load(source: BrowserSource): Promise<PixelData> {\n if (typeof HTMLImageElement !== 'undefined' && source instanceof HTMLImageElement) {\n return this.loadFromImage(source);\n }\n if (typeof HTMLCanvasElement !== 'undefined' && source instanceof HTMLCanvasElement) {\n return this.loadFromCanvas(source);\n }\n if (typeof ImageData !== 'undefined' && source instanceof ImageData) {\n return {\n data: source.data,\n width: source.width,\n height: source.height,\n };\n }\n if (typeof HTMLVideoElement !== 'undefined' && source instanceof HTMLVideoElement) {\n return this.loadFromVideo(source);\n }\n if (typeof ImageBitmap !== 'undefined' && source instanceof ImageBitmap) {\n return this.loadFromImageBitmap(source);\n }\n if (typeof OffscreenCanvas !== 'undefined' && source instanceof OffscreenCanvas) {\n return this.loadFromOffscreenCanvas(source);\n }\n throw new Error(\n 'Unsupported source type. Expected HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageData, ImageBitmap, or OffscreenCanvas.',\n );\n }\n\n private loadFromImage(img: HTMLImageElement): PixelData {\n if (!img.complete) {\n throw new Error(\n 'Image has not finished loading. Wait for the \"load\" event before calling getColor/getPalette.',\n );\n }\n if (!img.naturalWidth) {\n throw new Error(\n 'Image has no dimensions. It may not have loaded successfully.',\n );\n }\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n const width = (canvas.width = img.naturalWidth);\n const height = (canvas.height = img.naturalHeight);\n ctx.drawImage(img, 0, 0, width, height);\n try {\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n } catch (e: unknown) {\n if (e instanceof DOMException && e.name === 'SecurityError') {\n const err = new Error(\n 'Image is tainted by cross-origin data. Add crossorigin=\"anonymous\" to the <img> tag and ensure the server sends appropriate CORS headers.',\n );\n err.cause = e;\n throw err;\n }\n throw e;\n }\n }\n\n private loadFromCanvas(canvas: HTMLCanvasElement): PixelData {\n const ctx = canvas.getContext('2d')!;\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n }\n\n private loadFromVideo(video: HTMLVideoElement): PixelData {\n if (video.readyState < 2) {\n throw new Error(\n 'Video is not ready. Wait for the \"loadeddata\" or \"canplay\" event before calling getColor/getPalette.',\n );\n }\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n throw new Error(\n 'Video has no dimensions. It may not have loaded successfully.',\n );\n }\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(video, 0, 0, width, height);\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n }\n\n private loadFromOffscreenCanvas(canvas: OffscreenCanvas): PixelData {\n const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\n 'Could not get 2D context from OffscreenCanvas.',\n );\n }\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n }\n\n private loadFromImageBitmap(bitmap: ImageBitmap): PixelData {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n ctx.drawImage(bitmap, 0, 0);\n const imageData = ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n return { data: imageData.data, width: bitmap.width, height: bitmap.height };\n }\n}\n","import type { NodeSource, PixelData, PixelLoader } from '../types.js';\n\n/** Custom decoder signature for pluggable Node decoders. */\nexport type NodeImageDecoder = (\n input: string | Buffer,\n) => Promise<{ data: Uint8Array; width: number; height: number }>;\n\ninterface NodeLoaderOptions {\n /** Override the default sharp-based decoder. */\n decoder?: NodeImageDecoder;\n}\n\n/**\n * Node.js pixel loader. Uses `sharp` (dynamically imported) to decode images\n * into raw RGBA pixel buffers. Accepts file paths or Buffers.\n *\n * The sharp dependency is optional — use `createNodeLoader({ decoder })`\n * to supply a custom decoder if sharp is not available.\n */\nexport class NodePixelLoader implements PixelLoader<NodeSource> {\n private readonly decoder: NodeImageDecoder;\n\n constructor(options?: NodeLoaderOptions) {\n this.decoder = options?.decoder ?? defaultSharpDecoder;\n }\n\n async load(source: NodeSource): Promise<PixelData> {\n const result = await this.decoder(source);\n return {\n data: result.data,\n width: result.width,\n height: result.height,\n };\n }\n}\n\n/** Default decoder using sharp. Dynamically imports sharp so it stays optional. */\nasync function defaultSharpDecoder(\n input: string | Buffer,\n): Promise<{ data: Uint8Array; width: number; height: number }> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let sharpFn: any;\n try {\n const mod = await import('sharp');\n sharpFn = mod.default ?? mod;\n } catch {\n throw new Error(\n 'sharp is required for Node.js image loading. Install it with: npm install sharp',\n );\n }\n const image = sharpFn(input).ensureAlpha();\n const { width, height } = await image.metadata();\n if (!width || !height) {\n throw new Error('Could not determine image dimensions.');\n }\n const { data } = await image.raw().toBuffer({ resolveWithObject: true });\n return { data: new Uint8Array(data.buffer, data.byteOffset, data.byteLength), width, height };\n}\n\n/** Factory to create a NodePixelLoader with optional custom decoder. */\nexport function createNodeLoader(options?: NodeLoaderOptions): NodePixelLoader {\n return new NodePixelLoader(options);\n}\n","/**\n * Self-contained worker script that receives pixel data, runs quantization,\n * and returns the serialized palette.\n *\n * Message protocol:\n * Request: { id: number, pixels: number[][], maxColors: number }\n * Response: { id: number, palette: Array<{ color: [r,g,b], population: number }> }\n * Error: { id: number, error: string }\n */\n\n// This entire string is turned into a Blob URL by the worker manager.\n// It must be fully self-contained — no imports, no external dependencies.\nexport const WORKER_SOURCE = /* js */ `\n'use strict';\n\n// -------------------------------------------------------------------------\n// Inlined MMCQ (Modified Median Cut Quantization)\n// -------------------------------------------------------------------------\n\nvar SIGBITS = 5;\nvar RSHIFT = 3;\nvar MAX_ITER = 1000;\nvar FRACT_POP = 0.75;\nvar HISTO_SIZE = 32768;\n\nfunction colorIndex(r, g, b) {\n return (r << 10) + (g << 5) + b;\n}\n\nfunction getHisto(pixels) {\n var h = new Uint32Array(HISTO_SIZE);\n for (var i = 0; i < pixels.length; i++) {\n var p = pixels[i];\n h[colorIndex(p[0] >> RSHIFT, p[1] >> RSHIFT, p[2] >> RSHIFT)]++;\n }\n return h;\n}\n\nfunction VBox(r1, r2, g1, g2, b1, b2, histo) {\n this.r1 = r1; this.r2 = r2;\n this.g1 = g1; this.g2 = g2;\n this.b1 = b1; this.b2 = b2;\n this.histo = histo;\n this._count = -1;\n this._volume = -1;\n this._avg = null;\n}\n\nVBox.prototype.volume = function(force) {\n if (this._volume < 0 || force) {\n this._volume = (this.r2 - this.r1 + 1) * (this.g2 - this.g1 + 1) * (this.b2 - this.b1 + 1);\n }\n return this._volume;\n};\n\nVBox.prototype.count = function(force) {\n if (this._count < 0 || force) {\n var n = 0;\n for (var i = this.r1; i <= this.r2; i++)\n for (var j = this.g1; j <= this.g2; j++)\n for (var k = this.b1; k <= this.b2; k++)\n n += this.histo[colorIndex(i, j, k)] || 0;\n this._count = n;\n }\n return this._count;\n};\n\nVBox.prototype.copy = function() {\n return new VBox(this.r1, this.r2, this.g1, this.g2, this.b1, this.b2, this.histo);\n};\n\nVBox.prototype.avg = function(force) {\n if (!this._avg || force) {\n var mult = 1 << RSHIFT;\n if (this.r1 === this.r2 && this.g1 === this.g2 && this.b1 === this.b2) {\n this._avg = [this.r1 << RSHIFT, this.g1 << RSHIFT, this.b1 << RSHIFT];\n } else {\n var ntot = 0, rsum = 0, gsum = 0, bsum = 0;\n for (var i = this.r1; i <= this.r2; i++)\n for (var j = this.g1; j <= this.g2; j++)\n for (var k = this.b1; k <= this.b2; k++) {\n var hval = this.histo[colorIndex(i, j, k)] || 0;\n ntot += hval;\n rsum += hval * (i + 0.5) * mult;\n gsum += hval * (j + 0.5) * mult;\n bsum += hval * (k + 0.5) * mult;\n }\n this._avg = ntot\n ? [~~(rsum / ntot), ~~(gsum / ntot), ~~(bsum / ntot)]\n : [~~(mult * (this.r1 + this.r2 + 1) / 2), ~~(mult * (this.g1 + this.g2 + 1) / 2), ~~(mult * (this.b1 + this.b2 + 1) / 2)];\n }\n }\n return this._avg;\n};\n\nfunction PQueue(comparator) {\n this.contents = [];\n this.sorted = false;\n this.comparator = comparator;\n}\n\nPQueue.prototype.push = function(item) { this.contents.push(item); this.sorted = false; };\nPQueue.prototype.pop = function() {\n if (!this.sorted) { this.contents.sort(this.comparator); this.sorted = true; }\n return this.contents.pop();\n};\nPQueue.prototype.size = function() { return this.contents.length; };\n\nfunction vboxFromPixels(pixels, histo) {\n var rmin = 1e6, rmax = 0, gmin = 1e6, gmax = 0, bmin = 1e6, bmax = 0;\n for (var i = 0; i < pixels.length; i++) {\n var p = pixels[i];\n var rv = p[0] >> RSHIFT, gv = p[1] >> RSHIFT, bv = p[2] >> RSHIFT;\n if (rv < rmin) rmin = rv; if (rv > rmax) rmax = rv;\n if (gv < gmin) gmin = gv; if (gv > gmax) gmax = gv;\n if (bv < bmin) bmin = bv; if (bv > bmax) bmax = bv;\n }\n return new VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo);\n}\n\nfunction medianCutApply(histo, vbox) {\n if (!vbox.count()) return undefined;\n if (vbox.count() === 1) return [vbox.copy(), null];\n\n var rw = vbox.r2 - vbox.r1 + 1;\n var gw = vbox.g2 - vbox.g1 + 1;\n var bw = vbox.b2 - vbox.b1 + 1;\n var maxw = Math.max(rw, gw, bw);\n var total = 0;\n var partialsum = [];\n var lookaheadsum = [];\n var i, j, k, sum;\n\n if (maxw === rw) {\n for (i = vbox.r1; i <= vbox.r2; i++) {\n sum = 0;\n for (j = vbox.g1; j <= vbox.g2; j++)\n for (k = vbox.b1; k <= vbox.b2; k++)\n sum += histo[colorIndex(i, j, k)] || 0;\n total += sum; partialsum[i] = total;\n }\n } else if (maxw === gw) {\n for (i = vbox.g1; i <= vbox.g2; i++) {\n sum = 0;\n for (j = vbox.r1; j <= vbox.r2; j++)\n for (k = vbox.b1; k <= vbox.b2; k++)\n sum += histo[colorIndex(j, i, k)] || 0;\n total += sum; partialsum[i] = total;\n }\n } else {\n for (i = vbox.b1; i <= vbox.b2; i++) {\n sum = 0;\n for (j = vbox.r1; j <= vbox.r2; j++)\n for (k = vbox.g1; k <= vbox.g2; k++)\n sum += histo[colorIndex(j, k, i)] || 0;\n total += sum; partialsum[i] = total;\n }\n }\n\n partialsum.forEach(function(d, idx) { lookaheadsum[idx] = total - d; });\n\n function doCut(color) {\n var dim1 = color + '1', dim2 = color + '2';\n for (var i = vbox[dim1]; i <= vbox[dim2]; i++) {\n if (partialsum[i] > total / 2) {\n var vbox1 = vbox.copy(), vbox2 = vbox.copy();\n var left = i - vbox[dim1], right = vbox[dim2] - i;\n var d2 = left <= right\n ? Math.min(vbox[dim2] - 1, ~~(i + right / 2))\n : Math.max(vbox[dim1], ~~(i - 1 - left / 2));\n while (!partialsum[d2]) d2++;\n var count2 = lookaheadsum[d2];\n while (!count2 && partialsum[d2 - 1]) count2 = lookaheadsum[--d2];\n vbox1[dim2] = d2;\n vbox2[dim1] = d2 + 1;\n return [vbox1, vbox2];\n }\n }\n }\n\n if (maxw === rw) return doCut('r');\n if (maxw === gw) return doCut('g');\n return doCut('b');\n}\n\nfunction iterate(pq, target, histo) {\n var ncolors = pq.size(), niters = 0;\n while (niters < MAX_ITER) {\n if (ncolors >= target) return;\n niters++;\n var vbox = pq.pop();\n if (!vbox.count()) { pq.push(vbox); continue; }\n var result = medianCutApply(histo, vbox);\n if (!result || !result[0]) return;\n pq.push(result[0]);\n if (result[1]) { pq.push(result[1]); ncolors++; }\n }\n}\n\nfunction quantize(pixels, maxColors) {\n if (!pixels.length || maxColors < 2 || maxColors > 256) return [];\n\n var histo = getHisto(pixels);\n var vbox = vboxFromPixels(pixels, histo);\n var pq = new PQueue(function(a, b) { return a.count() - b.count(); });\n pq.push(vbox);\n iterate(pq, FRACT_POP * maxColors, histo);\n\n var pq2 = new PQueue(function(a, b) { return a.count() * a.volume() - b.count() * b.volume(); });\n while (pq.size()) pq2.push(pq.pop());\n iterate(pq2, maxColors, histo);\n\n var results = [];\n while (pq2.size()) {\n var box = pq2.pop();\n results.push({ color: box.avg(), population: box.count() });\n }\n return results;\n}\n\n// -------------------------------------------------------------------------\n// Worker message handler\n// -------------------------------------------------------------------------\n\nself.onmessage = function (e) {\n var data = e.data;\n var id = data.id;\n try {\n var palette = quantize(data.pixels, data.maxColors);\n self.postMessage({ id: id, palette: palette });\n } catch (err) {\n self.postMessage({ id: id, error: err.message || 'Unknown worker error' });\n }\n};\n`;\n","import type { Color } from '../types.js';\nimport { createColor } from '../color.js';\nimport { WORKER_SOURCE } from './worker-script.js';\n\nlet worker: Worker | null = null;\nlet blobUrl: string | null = null;\nlet nextId = 0;\nconst pending = new Map<\n number,\n { resolve: (value: Color[]) => void; reject: (reason: unknown) => void }\n>();\n\n/** Check whether the current environment supports Web Workers. */\nexport function isWorkerSupported(): boolean {\n return typeof Worker !== 'undefined';\n}\n\nfunction getOrCreateWorker(): Worker {\n if (worker) return worker;\n if (!isWorkerSupported()) {\n throw new Error('Web Workers are not supported in this environment.');\n }\n blobUrl = URL.createObjectURL(\n new Blob([WORKER_SOURCE], { type: 'application/javascript' }),\n );\n worker = new Worker(blobUrl);\n worker.onmessage = (e: MessageEvent) => {\n const { id, palette, error } = e.data;\n const entry = pending.get(id);\n if (!entry) return;\n pending.delete(id);\n if (error) {\n entry.reject(new Error(error));\n } else {\n const raw = palette as Array<{ color: [number, number, number]; population: number }>;\n const totalPopulation = raw.reduce((sum: number, q: { population: number }) => sum + q.population, 0);\n const colors = raw.map(({ color: [r, g, b], population }) =>\n createColor(r, g, b, population, totalPopulation > 0 ? population / totalPopulation : 0));\n entry.resolve(colors);\n }\n };\n worker.onerror = (e) => {\n // Reject all pending\n for (const [, entry] of pending) {\n entry.reject(new Error(e.message));\n }\n pending.clear();\n };\n return worker;\n}\n\n/**\n * Run quantization in a Web Worker.\n * @param pixels - Sampled pixel array (RGB triplets).\n * @param maxColors - Maximum palette size.\n * @param signal - Optional AbortSignal.\n */\nexport function extractInWorker(\n pixels: Array<[number, number, number]>,\n maxColors: number,\n signal?: AbortSignal,\n): Promise<Color[]> {\n return new Promise<Color[]>((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));\n return;\n }\n\n const id = nextId++;\n pending.set(id, { resolve, reject });\n\n const onAbort = () => {\n pending.delete(id);\n reject(signal!.reason ?? new DOMException('Aborted', 'AbortError'));\n };\n\n signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const w = getOrCreateWorker();\n w.postMessage({ id, pixels, maxColors });\n } catch (err) {\n pending.delete(id);\n signal?.removeEventListener('abort', onAbort);\n reject(err);\n }\n });\n}\n\n/** Terminate the worker and release the Blob URL. */\nexport function terminateWorker(): void {\n if (worker) {\n worker.terminate();\n worker = null;\n }\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n blobUrl = null;\n }\n // Reject any outstanding requests\n for (const [, entry] of pending) {\n entry.reject(new Error('Worker terminated'));\n }\n pending.clear();\n}\n","import type {\n Color,\n ExtractionOptions,\n ImageSource,\n PixelData,\n PixelLoader,\n ProgressiveResult,\n Quantizer,\n SwatchMap,\n} from './types.js';\nimport { validateOptions, extractPalette } from './pipeline.js';\nimport { extractProgressive } from './progressive.js';\nimport { classifySwatches } from './swatches.js';\nimport { MmcqQuantizer } from './quantizers/mmcq.js';\nimport { resolveDefaultLoader } from './resolve-loader.js';\n\n// ---------------------------------------------------------------------------\n// Global configuration\n// ---------------------------------------------------------------------------\n\nlet globalLoader: PixelLoader<ImageSource> | null = null;\nlet globalQuantizer: Quantizer | null = null;\n\n/**\n * Override the default pixel loader and/or quantizer.\n *\n * ```ts\n * import { configure } from 'colorthief';\n * import { WasmQuantizer } from 'colorthief/internals';\n * const q = new WasmQuantizer();\n * await q.init();\n * configure({ quantizer: q });\n * ```\n */\nexport function configure(opts: {\n loader?: PixelLoader<ImageSource>;\n quantizer?: Quantizer;\n}): void {\n if (opts.loader) globalLoader = opts.loader;\n if (opts.quantizer) globalQuantizer = opts.quantizer;\n}\n\n// ---------------------------------------------------------------------------\n// Lazy environment detection\n// ---------------------------------------------------------------------------\n\nasync function getLoader(perCall?: PixelLoader<ImageSource>): Promise<PixelLoader<ImageSource>> {\n if (perCall) return perCall;\n if (globalLoader) return globalLoader;\n globalLoader = await resolveDefaultLoader();\n return globalLoader;\n}\n\nasync function getQuantizer(perCall?: Quantizer): Promise<Quantizer> {\n if (perCall) {\n await perCall.init();\n return perCall;\n }\n if (globalQuantizer) return globalQuantizer;\n const q = new MmcqQuantizer();\n await q.init();\n globalQuantizer = q;\n return q;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction checkAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException('Aborted', 'AbortError');\n }\n}\n\nasync function loadPixels(\n source: ImageSource,\n options?: ExtractionOptions,\n): Promise<PixelData> {\n checkAborted(options?.signal);\n const loader = await getLoader(options?.loader);\n return loader.load(source, options?.signal);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Get the single dominant color from an image.\n *\n * ```ts\n * const color = await getColor(imgElement);\n * console.log(color.hex()); // '#e84393'\n * ```\n */\nexport async function getColor(\n source: ImageSource,\n options?: ExtractionOptions,\n): Promise<Color | null> {\n const palette = await getPalette(source, {\n colorCount: 5,\n ...options,\n });\n return palette ? palette[0] : null;\n}\n\n/**\n * Get a color palette from an image.\n *\n * ```ts\n * const palette = await getPalette(imgElement, { colorCount: 5 });\n * palette.forEach(c => console.log(c.hex()));\n * ```\n */\nexport async function getPalette(\n source: ImageSource,\n options?: ExtractionOptions,\n): Promise<Color[] | null> {\n const opts = validateOptions(options ?? {});\n\n checkAborted(options?.signal);\n\n // Worker path (browser only)\n if (options?.worker) {\n const { isWorkerSupported, extractInWorker } = await import(\n './worker/manager.js'\n );\n if (isWorkerSupported()) {\n const { data, width, height } = await loadPixels(source, options);\n const { createPixelArray } = await import('./pipeline.js');\n const pixelArray = createPixelArray(data, width * height, opts.quality, {\n ignoreWhite: opts.ignoreWhite,\n whiteThreshold: opts.whiteThreshold,\n alphaThreshold: opts.alphaThreshold,\n minSaturation: opts.minSaturation,\n });\n return extractInWorker(pixelArray, opts.colorCount, options?.signal);\n }\n // Fall through to main thread if workers not supported\n }\n\n const [pixels, quantizer] = await Promise.all([\n loadPixels(source, options),\n getQuantizer(options?.quantizer),\n ]);\n\n checkAborted(options?.signal);\n\n return extractPalette(\n pixels.data,\n pixels.width,\n pixels.height,\n opts,\n quantizer,\n );\n}\n\n/**\n * Get semantic swatches (Vibrant, Muted, etc.) from an image.\n *\n * ```ts\n * const swatches = await getSwatches(imgElement);\n * console.log(swatches.Vibrant?.color.hex());\n * ```\n */\nexport async function getSwatches(\n source: ImageSource,\n options?: ExtractionOptions,\n): Promise<SwatchMap> {\n const palette = await getPalette(source, {\n colorCount: 16,\n ...options,\n });\n return classifySwatches(palette ?? []);\n}\n\n/**\n * Progressively extract a palette with increasing quality.\n * Yields intermediate results so the UI can update incrementally.\n *\n * ```ts\n * for await (const { palette, progress, done } of getPaletteProgressive(img)) {\n * updateUI(palette, progress);\n * }\n * ```\n */\nexport async function* getPaletteProgressive(\n source: ImageSource,\n options?: ExtractionOptions,\n): AsyncGenerator<ProgressiveResult> {\n const opts = validateOptions(options ?? {});\n\n const [pixels, quantizer] = await Promise.all([\n loadPixels(source, options),\n getQuantizer(options?.quantizer),\n ]);\n\n yield* extractProgressive(\n pixels.data,\n pixels.width,\n pixels.height,\n opts,\n quantizer,\n options?.signal,\n );\n}\n","import type {\n Color,\n PixelBuffer,\n ProgressiveResult,\n Quantizer,\n} from './types.js';\nimport { extractPalette, type ValidatedOptions } from './pipeline.js';\n\n/** Quality divisors for the 3 progressive passes. */\nconst PASSES = [\n { divisor: 16, progress: 0.06 },\n { divisor: 4, progress: 0.25 },\n { divisor: 1, progress: 1.0 },\n];\n\n/** Yield between passes so the UI can repaint. */\nfunction yieldToMain(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\n/**\n * Progressive palette extraction. Runs 3 passes with increasing quality\n * (16x skip → 4x skip → full quality), yielding intermediate results.\n */\nexport async function* extractProgressive(\n data: PixelBuffer,\n width: number,\n height: number,\n opts: ValidatedOptions,\n quantizer: Quantizer,\n signal?: AbortSignal,\n): AsyncGenerator<ProgressiveResult> {\n for (let i = 0; i < PASSES.length; i++) {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException('Aborted', 'AbortError');\n }\n\n const pass = PASSES[i];\n const passOpts: ValidatedOptions = {\n ...opts,\n quality: opts.quality * pass.divisor,\n };\n\n const palette = extractPalette(data, width, height, passOpts, quantizer);\n const done = i === PASSES.length - 1;\n\n yield {\n palette: palette ?? [],\n progress: pass.progress,\n done,\n };\n\n if (!done) {\n await yieldToMain();\n }\n }\n}\n","import type { Color, Swatch, SwatchMap, SwatchRole } from './types.js';\nimport { createColor } from './color.js';\n\n// ---------------------------------------------------------------------------\n// OKLCH target ranges for each swatch role\n// ---------------------------------------------------------------------------\n\ninterface SwatchTarget {\n role: SwatchRole;\n /** Target OKLCH lightness (0–1). */\n targetL: number;\n /** Min / max lightness. */\n minL: number;\n maxL: number;\n /** Target chroma (0–0.4). */\n targetC: number;\n /** Min chroma. */\n minC: number;\n}\n\nconst TARGETS: SwatchTarget[] = [\n { role: 'Vibrant', targetL: 0.65, minL: 0.40, maxL: 0.85, targetC: 0.20, minC: 0.08 },\n { role: 'Muted', targetL: 0.65, minL: 0.40, maxL: 0.85, targetC: 0.04, minC: 0.00 },\n { role: 'DarkVibrant', targetL: 0.30, minL: 0.00, maxL: 0.45, targetC: 0.20, minC: 0.08 },\n { role: 'DarkMuted', targetL: 0.30, minL: 0.00, maxL: 0.45, targetC: 0.04, minC: 0.00 },\n { role: 'LightVibrant', targetL: 0.85, minL: 0.70, maxL: 1.00, targetC: 0.20, minC: 0.08 },\n { role: 'LightMuted', targetL: 0.85, minL: 0.70, maxL: 1.00, targetC: 0.04, minC: 0.00 },\n];\n\n// ---------------------------------------------------------------------------\n// Scoring\n// ---------------------------------------------------------------------------\n\nconst WEIGHT_L = 6;\nconst WEIGHT_C = 3;\nconst WEIGHT_POP = 1;\n\nfunction score(\n color: Color,\n target: SwatchTarget,\n maxPopulation: number,\n): number {\n const { l, c } = color.oklch();\n\n // Out of lightness range → disqualified\n if (l < target.minL || l > target.maxL) return -Infinity;\n // Below minimum chroma → disqualified\n if (c < target.minC) return -Infinity;\n\n const lDist = 1 - Math.abs(l - target.targetL);\n const cDist = 1 - Math.min(Math.abs(c - target.targetC) / 0.2, 1);\n const pop = maxPopulation > 0 ? color.population / maxPopulation : 0;\n\n return lDist * WEIGHT_L + cDist * WEIGHT_C + pop * WEIGHT_POP;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nconst WHITE = createColor(255, 255, 255, 0);\nconst BLACK = createColor(0, 0, 0, 0);\n\nfunction textColors(color: Color): { title: Color; body: Color } {\n return {\n title: color.isDark ? WHITE : BLACK,\n body: color.isDark ? WHITE : BLACK,\n };\n}\n\n/**\n * Classify a palette into semantic swatch roles using OKLCH distance scoring.\n * Each role is matched to the best-scoring palette color. A color can only\n * be assigned to one role (the one where it scores highest).\n */\nexport function classifySwatches(palette: Color[]): SwatchMap {\n const maxPopulation = Math.max(...palette.map((c) => c.population), 1);\n\n // Score every (color, target) pair\n const assignments: Array<{\n role: SwatchRole;\n color: Color;\n score: number;\n }> = [];\n\n for (const target of TARGETS) {\n let bestColor: Color | null = null;\n let bestScore = -Infinity;\n\n for (const color of palette) {\n const s = score(color, target, maxPopulation);\n if (s > bestScore) {\n bestScore = s;\n bestColor = color;\n }\n }\n\n if (bestColor && bestScore > -Infinity) {\n assignments.push({ role: target.role, color: bestColor, score: bestScore });\n }\n }\n\n // Resolve conflicts: if the same color is best for multiple roles,\n // keep the role where it scored highest; re-pick the loser.\n const used = new Set<Color>();\n const result: Partial<SwatchMap> = {};\n\n // Sort assignments by score descending so highest-scoring role wins\n assignments.sort((a, b) => b.score - a.score);\n\n for (const assignment of assignments) {\n if (used.has(assignment.color)) {\n // Try to find next best unused color for this role\n const target = TARGETS.find((t) => t.role === assignment.role)!;\n let fallback: Color | null = null;\n let fallbackScore = -Infinity;\n for (const color of palette) {\n if (used.has(color)) continue;\n const s = score(color, target, maxPopulation);\n if (s > fallbackScore) {\n fallbackScore = s;\n fallback = color;\n }\n }\n if (fallback && fallbackScore > -Infinity) {\n used.add(fallback);\n const { title, body } = textColors(fallback);\n result[assignment.role] = {\n color: fallback,\n role: assignment.role,\n titleTextColor: title,\n bodyTextColor: body,\n };\n } else {\n result[assignment.role] = null;\n }\n } else {\n used.add(assignment.color);\n const { title, body } = textColors(assignment.color);\n result[assignment.role] = {\n color: assignment.color,\n role: assignment.role,\n titleTextColor: title,\n bodyTextColor: body,\n };\n }\n }\n\n // Fill any unassigned roles with null\n for (const target of TARGETS) {\n if (!(target.role in result)) {\n result[target.role] = null;\n }\n }\n\n return result as SwatchMap;\n}\n","import type { Quantizer } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Constants (match original quantize library)\n// ---------------------------------------------------------------------------\n\nconst SIGBITS = 5;\nconst RSHIFT = 8 - SIGBITS;\nconst MAX_ITERATIONS = 1000;\nconst FRACT_BY_POPULATIONS = 0.75;\nconst HISTO_SIZE = 1 << (3 * SIGBITS);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColorIndex(r: number, g: number, b: number): number {\n return (r << (2 * SIGBITS)) + (g << SIGBITS) + b;\n}\n\n// ---------------------------------------------------------------------------\n// VBox — a 3-D box in reduced (5-bit) RGB color space\n// ---------------------------------------------------------------------------\n\nclass VBox {\n r1: number;\n r2: number;\n g1: number;\n g2: number;\n b1: number;\n b2: number;\n\n private readonly histo: Uint32Array;\n private _volume: number | undefined;\n private _count: number | undefined;\n private _avg: [number, number, number] | undefined;\n\n constructor(\n r1: number,\n r2: number,\n g1: number,\n g2: number,\n b1: number,\n b2: number,\n histo: Uint32Array,\n ) {\n this.r1 = r1;\n this.r2 = r2;\n this.g1 = g1;\n this.g2 = g2;\n this.b1 = b1;\n this.b2 = b2;\n this.histo = histo;\n }\n\n volume(force = false): number {\n if (this._volume === undefined || force) {\n this._volume =\n (this.r2 - this.r1 + 1) *\n (this.g2 - this.g1 + 1) *\n (this.b2 - this.b1 + 1);\n }\n return this._volume;\n }\n\n count(force = false): number {\n if (this._count === undefined || force) {\n let npix = 0;\n for (let i = this.r1; i <= this.r2; i++) {\n for (let j = this.g1; j <= this.g2; j++) {\n for (let k = this.b1; k <= this.b2; k++) {\n npix += this.histo[getColorIndex(i, j, k)] || 0;\n }\n }\n }\n this._count = npix;\n }\n return this._count;\n }\n\n copy(): VBox {\n return new VBox(this.r1, this.r2, this.g1, this.g2, this.b1, this.b2, this.histo);\n }\n\n avg(force = false): [number, number, number] {\n if (this._avg === undefined || force) {\n const mult = 1 << RSHIFT;\n\n // Single-color box: return exact color\n if (this.r1 === this.r2 && this.g1 === this.g2 && this.b1 === this.b2) {\n this._avg = [\n this.r1 << RSHIFT,\n this.g1 << RSHIFT,\n this.b1 << RSHIFT,\n ];\n } else {\n let ntot = 0;\n let rsum = 0;\n let gsum = 0;\n let bsum = 0;\n\n for (let i = this.r1; i <= this.r2; i++) {\n for (let j = this.g1; j <= this.g2; j++) {\n for (let k = this.b1; k <= this.b2; k++) {\n const hval = this.histo[getColorIndex(i, j, k)] || 0;\n ntot += hval;\n rsum += hval * (i + 0.5) * mult;\n gsum += hval * (j + 0.5) * mult;\n bsum += hval * (k + 0.5) * mult;\n }\n }\n }\n\n if (ntot) {\n this._avg = [\n ~~(rsum / ntot),\n ~~(gsum / ntot),\n ~~(bsum / ntot),\n ];\n } else {\n this._avg = [\n ~~((mult * (this.r1 + this.r2 + 1)) / 2),\n ~~((mult * (this.g1 + this.g2 + 1)) / 2),\n ~~((mult * (this.b1 + this.b2 + 1)) / 2),\n ];\n }\n }\n }\n return this._avg;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PQueue — lazy-sorted priority queue\n// ---------------------------------------------------------------------------\n\nclass PQueue<T> {\n private contents: T[] = [];\n private sorted = false;\n\n constructor(private comparator: (a: T, b: T) => number) {}\n\n private sort(): void {\n this.contents.sort(this.comparator);\n this.sorted = true;\n }\n\n push(item: T): void {\n this.contents.push(item);\n this.sorted = false;\n }\n\n peek(index?: number): T {\n if (!this.sorted) this.sort();\n return this.contents[index ?? this.contents.length - 1];\n }\n\n pop(): T {\n if (!this.sorted) this.sort();\n return this.contents.pop()!;\n }\n\n size(): number {\n return this.contents.length;\n }\n\n map<U>(fn: (item: T) => U): U[] {\n return this.contents.map(fn);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Histogram & initial VBox\n// ---------------------------------------------------------------------------\n\nfunction getHisto(pixels: Array<[number, number, number]>): Uint32Array {\n const histo = new Uint32Array(HISTO_SIZE);\n for (const pixel of pixels) {\n const rval = pixel[0] >> RSHIFT;\n const gval = pixel[1] >> RSHIFT;\n const bval = pixel[2] >> RSHIFT;\n histo[getColorIndex(rval, gval, bval)]++;\n }\n return histo;\n}\n\nfunction vboxFromPixels(\n pixels: Array<[number, number, number]>,\n histo: Uint32Array,\n): VBox {\n let rmin = 1000000;\n let rmax = 0;\n let gmin = 1000000;\n let gmax = 0;\n let bmin = 1000000;\n let bmax = 0;\n\n for (const pixel of pixels) {\n const rval = pixel[0] >> RSHIFT;\n const gval = pixel[1] >> RSHIFT;\n const bval = pixel[2] >> RSHIFT;\n if (rval < rmin) rmin = rval;\n else if (rval > rmax) rmax = rval;\n if (gval < gmin) gmin = gval;\n else if (gval > gmax) gmax = gval;\n if (bval < bmin) bmin = bval;\n else if (bval > bmax) bmax = bval;\n }\n\n return new VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo);\n}\n\n// ---------------------------------------------------------------------------\n// Median-cut split\n// ---------------------------------------------------------------------------\n\nfunction medianCutApply(histo: Uint32Array, vbox: VBox): [VBox, VBox | null] | undefined {\n if (!vbox.count()) return undefined;\n\n // Only one pixel — no split possible\n if (vbox.count() === 1) return [vbox.copy(), null];\n\n const rw = vbox.r2 - vbox.r1 + 1;\n const gw = vbox.g2 - vbox.g1 + 1;\n const bw = vbox.b2 - vbox.b1 + 1;\n const maxw = Math.max(rw, gw, bw);\n\n let total = 0;\n const partialsum: number[] = [];\n const lookaheadsum: number[] = [];\n\n if (maxw === rw) {\n for (let i = vbox.r1; i <= vbox.r2; i++) {\n let sum = 0;\n for (let j = vbox.g1; j <= vbox.g2; j++) {\n for (let k = vbox.b1; k <= vbox.b2; k++) {\n sum += histo[getColorIndex(i, j, k)] || 0;\n }\n }\n total += sum;\n partialsum[i] = total;\n }\n } else if (maxw === gw) {\n for (let i = vbox.g1; i <= vbox.g2; i++) {\n let sum = 0;\n for (let j = vbox.r1; j <= vbox.r2; j++) {\n for (let k = vbox.b1; k <= vbox.b2; k++) {\n sum += histo[getColorIndex(j, i, k)] || 0;\n }\n }\n total += sum;\n partialsum[i] = total;\n }\n } else {\n for (let i = vbox.b1; i <= vbox.b2; i++) {\n let sum = 0;\n for (let j = vbox.r1; j <= vbox.r2; j++) {\n for (let k = vbox.g1; k <= vbox.g2; k++) {\n sum += histo[getColorIndex(j, k, i)] || 0;\n }\n }\n total += sum;\n partialsum[i] = total;\n }\n }\n\n partialsum.forEach((d, i) => {\n lookaheadsum[i] = total - d;\n });\n\n function doCut(color: 'r' | 'g' | 'b'): [VBox, VBox] | undefined {\n const dim1 = (color + '1') as 'r1' | 'g1' | 'b1';\n const dim2 = (color + '2') as 'r2' | 'g2' | 'b2';\n\n for (let i = vbox[dim1]; i <= vbox[dim2]; i++) {\n if (partialsum[i] > total / 2) {\n const vbox1 = vbox.copy();\n const vbox2 = vbox.copy();\n const left = i - vbox[dim1];\n const right = vbox[dim2] - i;\n\n let d2: number;\n if (left <= right) {\n d2 = Math.min(vbox[dim2] - 1, ~~(i + right / 2));\n } else {\n d2 = Math.max(vbox[dim1], ~~(i - 1 - left / 2));\n }\n\n // Avoid 0-count boxes\n while (!partialsum[d2]) d2++;\n let count2 = lookaheadsum[d2];\n while (!count2 && partialsum[d2 - 1]) count2 = lookaheadsum[--d2];\n\n // Set dimensions\n vbox1[dim2] = d2;\n vbox2[dim1] = vbox1[dim2] + 1;\n\n return [vbox1, vbox2];\n }\n }\n return undefined;\n }\n\n if (maxw === rw) return doCut('r');\n if (maxw === gw) return doCut('g');\n return doCut('b');\n}\n\n// ---------------------------------------------------------------------------\n// Iterative splitting\n// ---------------------------------------------------------------------------\n\nfunction iterate(pq: PQueue<VBox>, target: number, histo: Uint32Array): void {\n let ncolors = pq.size();\n let niters = 0;\n\n while (niters < MAX_ITERATIONS) {\n if (ncolors >= target) return;\n niters++;\n\n const vbox = pq.pop();\n\n if (!vbox.count()) {\n pq.push(vbox);\n continue;\n }\n\n const result = medianCutApply(histo, vbox);\n if (!result || !result[0]) return;\n\n pq.push(result[0]);\n if (result[1]) {\n pq.push(result[1]);\n ncolors++;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main quantize function\n// ---------------------------------------------------------------------------\n\nfunction quantize(\n pixels: Array<[number, number, number]>,\n maxColors: number,\n): Array<{ color: [number, number, number]; population: number }> {\n if (!pixels.length || maxColors < 2 || maxColors > 256) return [];\n\n // Short-circuit: if unique colors <= maxColors, return them directly\n const seenColors = new Set<string>();\n const uniqueColors: Array<[number, number, number]> = [];\n for (const color of pixels) {\n const key = color.join(',');\n if (!seenColors.has(key)) {\n seenColors.add(key);\n uniqueColors.push(color);\n }\n }\n if (uniqueColors.length <= maxColors) {\n // Count populations for unique colors\n const countMap = new Map<string, number>();\n for (const color of pixels) {\n const key = color.join(',');\n countMap.set(key, (countMap.get(key) || 0) + 1);\n }\n return uniqueColors.map((color) => ({\n color,\n population: countMap.get(color.join(','))!,\n }));\n }\n\n const histo = getHisto(pixels);\n\n // Get the initial vbox from the pixels\n const vbox = vboxFromPixels(pixels, histo);\n const pq = new PQueue<VBox>((a, b) => a.count() - b.count());\n pq.push(vbox);\n\n // Phase 1: split by population until FRACT_BY_POPULATIONS * maxColors\n iterate(pq, FRACT_BY_POPULATIONS * maxColors, histo);\n\n // Phase 2: re-sort by count * volume, continue splitting\n const pq2 = new PQueue<VBox>((a, b) => a.count() * a.volume() - b.count() * b.volume());\n while (pq.size()) {\n pq2.push(pq.pop());\n }\n iterate(pq2, maxColors, histo);\n\n // Extract palette with population counts\n const results: Array<{ color: [number, number, number]; population: number }> = [];\n while (pq2.size()) {\n const box = pq2.pop();\n results.push({\n color: box.avg(),\n population: box.count(),\n });\n }\n\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// Quantizer adapter\n// ---------------------------------------------------------------------------\n\n/**\n * MMCQ (Modified Median Cut Quantization) — inlined TypeScript implementation.\n * Port of the @lokesh.dhakar/quantize algorithm with population tracking.\n */\nexport class MmcqQuantizer implements Quantizer {\n async init(): Promise<void> {\n // No-op — pure TypeScript, ready to use.\n }\n\n quantize(\n pixels: Array<[number, number, number]>,\n maxColors: number,\n ): Array<{ color: [number, number, number]; population: number }> {\n return quantize(pixels, maxColors);\n }\n}\n","/**\n * Synchronous browser-only API.\n *\n * These functions accept only BrowserSource (HTMLImageElement, HTMLCanvasElement,\n * ImageData, ImageBitmap) and run entirely on the main thread with no async overhead.\n *\n * For Node.js sources (file paths, Buffers) or features like Web Workers and\n * AbortSignal, use the async API (getColor, getPalette, getSwatches).\n */\nimport type {\n BrowserSource,\n Color,\n FilterOptions,\n ColorSpace,\n Quantizer,\n SwatchMap,\n} from './types.js';\nimport { BrowserPixelLoader } from './loaders/browser.js';\nimport { MmcqQuantizer } from './quantizers/mmcq.js';\nimport { validateOptions, extractPalette } from './pipeline.js';\nimport { classifySwatches } from './swatches.js';\n\n// ---------------------------------------------------------------------------\n// Sync-specific options (subset — no worker, no signal, no loader)\n// ---------------------------------------------------------------------------\n\nexport interface SyncExtractionOptions extends FilterOptions {\n /** Number of colors in the palette (2–20). @default 10 */\n colorCount?: number;\n /** Sampling quality (1 = highest). @default 10 */\n quality?: number;\n /** Color space for quantization. @default 'rgb' */\n colorSpace?: ColorSpace;\n /** Override the quantizer for this call. Must already be init()'d. */\n quantizer?: Quantizer;\n}\n\n// ---------------------------------------------------------------------------\n// Shared singletons\n// ---------------------------------------------------------------------------\n\nconst loader = new BrowserPixelLoader();\nconst defaultQuantizer = new MmcqQuantizer();\n\n// ---------------------------------------------------------------------------\n// Public sync API\n// ---------------------------------------------------------------------------\n\n/**\n * Synchronously get the dominant color from a browser image source.\n *\n * ```ts\n * const color = getColorSync(imgElement);\n * console.log(color.hex()); // '#e84393'\n * ```\n */\nexport function getColorSync(\n source: BrowserSource,\n options?: SyncExtractionOptions,\n): Color | null {\n const palette = getPaletteSync(source, { colorCount: 5, ...options });\n return palette ? palette[0] : null;\n}\n\n/**\n * Synchronously get a color palette from a browser image source.\n *\n * ```ts\n * const palette = getPaletteSync(imgElement, { colorCount: 5 });\n * palette.forEach(c => console.log(c.hex()));\n * ```\n */\nexport function getPaletteSync(\n source: BrowserSource,\n options?: SyncExtractionOptions,\n): Color[] | null {\n const opts = validateOptions(options ?? {});\n const quantizer = options?.quantizer ?? defaultQuantizer;\n\n // BrowserPixelLoader.load is async in signature but synchronous in practice\n // for HTMLImageElement/Canvas/ImageData/ImageBitmap. We call the internal\n // methods directly to avoid the Promise wrapper.\n const pixels = loadPixelsSync(source);\n\n return extractPalette(\n pixels.data,\n pixels.width,\n pixels.height,\n opts,\n quantizer,\n );\n}\n\n/**\n * Synchronously get semantic swatches from a browser image source.\n *\n * ```ts\n * const swatches = getSwatchesSync(imgElement);\n * console.log(swatches.Vibrant?.color.hex());\n * ```\n */\nexport function getSwatchesSync(\n source: BrowserSource,\n options?: SyncExtractionOptions,\n): SwatchMap {\n const palette = getPaletteSync(source, { colorCount: 16, ...options });\n return classifySwatches(palette ?? []);\n}\n\n// ---------------------------------------------------------------------------\n// Internal sync pixel loading\n// ---------------------------------------------------------------------------\n\nfunction loadPixelsSync(source: BrowserSource) {\n if (typeof HTMLImageElement !== 'undefined' && source instanceof HTMLImageElement) {\n return loadFromImage(source);\n }\n if (typeof HTMLCanvasElement !== 'undefined' && source instanceof HTMLCanvasElement) {\n return loadFromCanvas(source);\n }\n if (typeof ImageData !== 'undefined' && source instanceof ImageData) {\n return { data: source.data, width: source.width, height: source.height };\n }\n if (typeof HTMLVideoElement !== 'undefined' && source instanceof HTMLVideoElement) {\n return loadFromVideo(source);\n }\n if (typeof ImageBitmap !== 'undefined' && source instanceof ImageBitmap) {\n return loadFromImageBitmap(source);\n }\n if (typeof OffscreenCanvas !== 'undefined' && source instanceof OffscreenCanvas) {\n return loadFromOffscreenCanvas(source);\n }\n throw new Error(\n 'Unsupported source type. Expected HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageData, ImageBitmap, or OffscreenCanvas.',\n );\n}\n\nfunction loadFromImage(img: HTMLImageElement) {\n if (!img.complete) {\n throw new Error(\n 'Image has not finished loading. Wait for the \"load\" event before calling getColorSync/getPaletteSync.',\n );\n }\n if (!img.naturalWidth) {\n throw new Error(\n 'Image has no dimensions. It may not have loaded successfully.',\n );\n }\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n const width = (canvas.width = img.naturalWidth);\n const height = (canvas.height = img.naturalHeight);\n ctx.drawImage(img, 0, 0, width, height);\n try {\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n } catch (e: unknown) {\n if (e instanceof DOMException && e.name === 'SecurityError') {\n const err = new Error(\n 'Image is tainted by cross-origin data. Add crossorigin=\"anonymous\" to the <img> tag and ensure the server sends appropriate CORS headers.',\n );\n err.cause = e;\n throw err;\n }\n throw e;\n }\n}\n\nfunction loadFromCanvas(canvas: HTMLCanvasElement) {\n const ctx = canvas.getContext('2d')!;\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n}\n\nfunction loadFromVideo(video: HTMLVideoElement) {\n if (video.readyState < 2) {\n throw new Error(\n 'Video is not ready. Wait for the \"loadeddata\" or \"canplay\" event before calling getColorSync/getPaletteSync.',\n );\n }\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n throw new Error(\n 'Video has no dimensions. It may not have loaded successfully.',\n );\n }\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(video, 0, 0, width, height);\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n}\n\nfunction loadFromOffscreenCanvas(canvas: OffscreenCanvas) {\n const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\n 'Could not get 2D context from OffscreenCanvas.',\n );\n }\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n}\n\nfunction loadFromImageBitmap(bitmap: ImageBitmap) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n ctx.drawImage(bitmap, 0, 0);\n const imageData = ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n return { data: imageData.data, width: bitmap.width, height: bitmap.height };\n}\n","// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\nexport {\n getColor,\n getPalette,\n getSwatches,\n getPaletteProgressive,\n configure,\n} from './api.js';\n\n// ---------------------------------------------------------------------------\n// Sync browser API\n// ---------------------------------------------------------------------------\nexport {\n getColorSync,\n getPaletteSync,\n getSwatchesSync,\n} from './sync.js';\n\n// ---------------------------------------------------------------------------\n// Live extraction (browser only)\n// ---------------------------------------------------------------------------\nexport { observe } from './observe.js';\nexport type { ObservableSource, ObserveOptions, ObserveController } from './observe.js';\n\n// ---------------------------------------------------------------------------\n// Color factory\n// ---------------------------------------------------------------------------\nexport { createColor } from './color.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\nexport type {\n RGB,\n HSL,\n OKLCH,\n FilterOptions,\n ColorSpace,\n ExtractionOptions,\n ContrastInfo,\n Color,\n CssColorFormat,\n SwatchRole,\n Swatch,\n SwatchMap,\n BrowserSource,\n NodeSource,\n ImageSource,\n ProgressiveResult,\n} from './types.js';\n\nexport type { SyncExtractionOptions } from './sync.js';\n","import { getColorSync } from 'colorthief';\n\n/**\n * Extracts the dominant color from an HTML image element using Color Thief\n * @param img - The HTML image element to analyze\n * @returns Promise that resolves to hex color string (e.g. \"#ff0000\")\n */\nexport const getDominantColor = (img: HTMLImageElement): Promise<string> => {\n return new Promise((resolve, reject) => {\n if (!img.complete || img.naturalWidth === 0) {\n reject(new Error(\"Image not loaded\"));\n return;\n }\n\n try {\n const color = getColorSync(img);\n if (color) {\n const hex = color.hex();\n if (!/^#[0-9a-fA-F]{6}$/.test(hex)) {\n reject(new Error(`Invalid color extracted: ${hex}`));\n } else {\n resolve(hex);\n }\n } else {\n reject(new Error(\"No color extracted\"));\n }\n } catch (error: any) {\n reject(new Error(`Color extraction failed: ${ error.message }`));\n }\n });\n};\n","import { ThemeTokens } from \"@/preferences/hooks/useTheming\";\nimport { getDominantColor } from \"@/preferences/helpers/getDominantColor\";\n\nconst hexToHsl = (hex: string): [number, number, number] => {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n const h = max === r ? ((g - b) / d + (g < b ? 6 : 0)) / 6\n : max === g ? ((b - r) / d + 2) / 6\n : ((r - g) / d + 4) / 6;\n return [h, s, l];\n};\n\nconst hslToHex = (h: number, s: number, l: number): string => {\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h * 12) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, \"0\");\n };\n return `#${ f(0) }${ f(8) }${ f(4) }`;\n};\n\n/** WCAG relative luminance of a hex color (0–1) */\nconst luminance = (hex: string): number => {\n const toLinear = (c: number) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n const r = toLinear(parseInt(hex.slice(1, 3), 16) / 255);\n const g = toLinear(parseInt(hex.slice(3, 5), 16) / 255);\n const b = toLinear(parseInt(hex.slice(5, 7), 16) / 255);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/** WCAG contrast ratio between two hex colors */\nconst contrastRatio = (a: string, b: string): number => {\n const l1 = luminance(a), l2 = luminance(b);\n return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05);\n};\n\n/**\n * Determines if a hex color is light or dark based on luminance\n */\nexport const isLightColor = (hexColor: string): boolean => luminance(hexColor) > 0.179;\n\n/**\n * Produces a muted shade of the dominant color suitable for use as a background.\n * Light variant: high lightness + low saturation (Spotify/Apple Music style).\n * Dark variant: low lightness + moderate saturation.\n */\nconst shadeColor = (hex: string, isLight: boolean): string => {\n const [h, s] = hexToHsl(hex);\n return isLight\n ? hslToHex(h, Math.min(s, 0.25), 0.93)\n : hslToHex(h, Math.min(s, 0.30), 0.13);\n};\n\n/**\n * Generates a complete ThemeTokens object from a dominant color.\n * Neutrals are derived from the background hue; accents use the dominant hue;\n * text is chosen by WCAG contrast ratio.\n */\nexport const generateThemeFromColor = (color: string): ThemeTokens => {\n const [h, s] = hexToHsl(color);\n const isLight = isLightColor(color);\n const background = shadeColor(color, isLight);\n\n // Text: pick black or white by whichever meets better WCAG contrast\n const text = contrastRatio(background, \"#ffffff\") >= contrastRatio(background, \"#000000\")\n ? \"#ffffff\"\n : \"#000000\";\n\n // Neutrals derived from the background hue\n const subdue = isLight ? hslToHex(h, Math.min(s, 0.15), 0.55) : hslToHex(h, Math.min(s, 0.15), 0.55);\n const hover = isLight ? hslToHex(h, Math.min(s, 0.20), 0.83) : hslToHex(h, Math.min(s, 0.20), 0.22);\n const elevate = `0px 0px 2px ${ isLight ? hslToHex(h, 0.10, 0.70) : hslToHex(h, 0.10, 0.08) }`;\n\n // Accents use the dominant hue\n const link = isLight ? hslToHex(h, 0.70, 0.35) : hslToHex(h, 0.80, 0.72);\n const visited = isLight ? hslToHex(h, 0.50, 0.28) : hslToHex(h, 0.55, 0.60);\n const select = hslToHex(h, 0.60, isLight ? 0.80 : 0.35);\n const focus = hslToHex(h, 0.90, isLight ? 0.40 : 0.65);\n\n return {\n background,\n text,\n link,\n visited,\n subdue,\n disable: subdue,\n hover,\n onHover: text,\n select,\n onSelect: \"inherit\",\n focus,\n elevate,\n immerse: isLight ? \"0.6\" : \"0.4\",\n };\n};\n\n/**\n * Extracts dominant color from an image URL and generates theme tokens\n */\nexport const extractThemeFromImage = async (imageUrl: string): Promise<ThemeTokens> => {\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n\n await new Promise<void>((resolve, reject) => {\n img.onload = () => {\n if (img.naturalWidth === 0) {\n reject(new Error(\"Image loaded but has no content (blocked or corrupt)\"));\n } else {\n resolve();\n }\n };\n img.onerror = () => reject(new Error(`Failed to load image: ${imageUrl}`));\n img.src = imageUrl;\n });\n\n const dominantColor = await getDominantColor(img);\n return generateThemeFromColor(dominantColor);\n};\n","/**\n * Rewrites an absolute external URL through the local proxy API to avoid CORS issues.\n * Relative URLs and non-http(s) URLs are returned unchanged.\n */\nexport const proxyUrl = (url: string | undefined): string | undefined => {\n if (!url) return undefined;\n\n try {\n const parsed = new URL(url);\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") {\n return `/api/proxy?url=${ encodeURIComponent(url) }`;\n }\n } catch {\n // relative or invalid — return as-is\n }\n\n return url;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { ThBreakpoints, CSSColor } from \"../models\";\n\nimport { BreakpointsMap, useBreakpoints } from \"@/core/Hooks/useBreakpoints\";\nimport { useReducedMotion } from \"@/core/Hooks/useReducedMotion\";\nimport { useReducedTransparency } from \"@/core/Hooks/useReducedTransparency\";\nimport { ThColorScheme, useColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { ThContrast, useContrast } from \"@/core/Hooks/useContrast\";\nimport { useForcedColors } from \"@/core/Hooks/useForcedColors\";\nimport { useMonochrome } from \"@/core/Hooks/useMonochrome\";\n\nimport { propsToCSSVars } from \"@/core/Helpers/propsToCSSVars\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\nimport { extractThemeFromImage } from \"../helpers/themeGeneration\";\nimport { proxyUrl } from \"@/helpers/proxyUrl\";\n\nexport interface ThemeTokens {\n background: CSSColor;\n text: CSSColor;\n link: CSSColor;\n visited: CSSColor;\n subdue: CSSColor;\n disable: CSSColor;\n hover: CSSColor;\n onHover: CSSColor;\n select: CSSColor;\n onSelect: CSSColor;\n focus: CSSColor;\n elevate: string;\n immerse: string;\n}\n\nexport interface useThemingProps<T extends string> {\n theme?: string;\n themeKeys: { [key in T]?: ThemeTokens };\n systemKeys?: {\n light: T;\n dark: T;\n };\n breakpointsMap: BreakpointsMap<number | null>;\n initProps?: Record<string, any>;\n coverUrl?: string;\n autoThemeSource?: \"cover\" | \"system\";\n onCoverThemeGenerated?: (themeTokens: ThemeTokens) => void;\n onBreakpointChange?: (breakpoint: ThBreakpoints | null) => void;\n onColorSchemeChange?: (colorScheme: ThColorScheme) => void;\n onContrastChange?: (contrast: ThContrast) => void;\n onForcedColorsChange?: (forcedColors: boolean) => void;\n onMonochromeChange?: (isMonochrome: boolean) => void;\n onReducedMotionChange?: (reducedMotion: boolean) => void;\n onReducedTransparencyChange?: (reducedTransparency: boolean) => void; \n}\n\n// Takes care of the init of theming and side effects on :root/html\n// Reader still has to handle the side effects on Navigator\nexport const useTheming = <T extends string>({\n theme,\n systemKeys,\n themeKeys,\n breakpointsMap,\n initProps,\n coverUrl,\n autoThemeSource,\n onBreakpointChange,\n onColorSchemeChange,\n onContrastChange,\n onForcedColorsChange,\n onMonochromeChange,\n onReducedMotionChange,\n onReducedTransparencyChange,\n onCoverThemeGenerated,\n}: useThemingProps<T>) => {\n const [coverThemeTokens, setCoverThemeTokens] = useState<ThemeTokens | null>(null);\n const [coverThemeFailed, setCoverThemeFailed] = useState(false);\n \n const breakpoints = useBreakpoints(breakpointsMap, onBreakpointChange);\n const colorScheme = useColorScheme(onColorSchemeChange);\n const colorSchemeRef = useRef(colorScheme);\n const contrast = useContrast(onContrastChange);\n const forcedColors = useForcedColors(onForcedColorsChange);\n const monochrome = useMonochrome(onMonochromeChange);\n const reducedMotion = useReducedMotion(onReducedMotionChange);\n const reducedTransparency = useReducedTransparency(onReducedTransparencyChange);\n \n // Extract theme from cover when needed\n useEffect(() => {\n if (autoThemeSource === \"cover\" && coverUrl && !coverThemeTokens) {\n const extractTheme = async () => {\n try {\n const themeTokens = await extractThemeFromImage(proxyUrl(coverUrl) ?? coverUrl);\n setCoverThemeTokens(themeTokens);\n onCoverThemeGenerated?.(themeTokens);\n } catch (error) {\n console.warn(\"Failed to extract cover theme:\", error);\n setCoverThemeFailed(true);\n }\n };\n \n extractTheme();\n }\n }, [autoThemeSource, coverUrl, coverThemeTokens, onCoverThemeGenerated]);\n\n const updateThemeColorMetaTag = useCallback((color: string): void => {\n if (typeof document === \"undefined\") return;\n \n let metaTag = document.querySelector(\"meta[name='theme-color']\");\n if (!metaTag) {\n metaTag = document.createElement(\"meta\");\n metaTag.setAttribute(\"name\", \"theme-color\");\n document.head.appendChild(metaTag);\n }\n metaTag.setAttribute(\"content\", color);\n }, []);\n\n const initThemingCustomProps = useCallback(() => {\n for (let p in initProps) {\n document.documentElement.style.setProperty(p, initProps[p])\n }\n }, [initProps]);\n\n const inferThemeAuto = useCallback(() => {\n if (autoThemeSource === \"cover\") {\n if (coverThemeTokens) return \"cover\" as T;\n // Pending: hold until resolved; failed: fall back to system\n if (!coverThemeFailed) return undefined;\n }\n // Default behavior: use colorScheme (system)\n return colorSchemeRef.current === ThColorScheme.dark ? systemKeys?.dark : systemKeys?.light;\n }, [systemKeys, autoThemeSource, coverThemeTokens, coverThemeFailed]);\n\n const setThemeCustomProps = useCallback((t?: string) => {\n if (!t) {\n return;\n }\n\n if (t === \"auto\") {\n const autoTheme = inferThemeAuto();\n if (!autoTheme) {\n // We are not removing properties cos iframes won't update\n // Removing here would consequently create a theme inconsistency\n // between the iframe and the main window\n return;\n }\n t = autoTheme;\n }\n \n let themeTokens: ThemeTokens | undefined;\n \n if (t === \"cover\" && coverThemeTokens) {\n // Use the generated cover theme tokens\n themeTokens = coverThemeTokens;\n } else {\n // Use predefined theme keys\n themeTokens = themeKeys[t as T];\n }\n \n if (!themeTokens) {\n // We are not removing properties cos iframes won't update\n // Removing here would consequently create a theme inconsistency\n // between the iframe and the main window\n return;\n }\n \n const props = propsToCSSVars(themeTokens, { prefix: prefixString(\"theme\") });\n \n for (let p in props) {\n document.documentElement.style.setProperty(p, props[p])\n }\n\n updateThemeColorMetaTag(themeTokens.background);\n }, [inferThemeAuto, updateThemeColorMetaTag, themeKeys, coverThemeTokens]);\n\n // On mount add custom props to :root/html\n useEffect(() => {\n initThemingCustomProps();\n }, [initThemingCustomProps]);\n\n // Update theme custom props\n useEffect(() => {\n colorSchemeRef.current = colorScheme;\n setThemeCustomProps(theme);\n }, [setThemeCustomProps, theme, colorScheme]);\n\n // Apply cover theme as soon as tokens are available\n useEffect(() => {\n if (!coverThemeTokens || theme !== \"auto\") return;\n const props = propsToCSSVars(coverThemeTokens, { prefix: prefixString(\"theme\") });\n for (let p in props) {\n document.documentElement.style.setProperty(p, props[p]);\n }\n updateThemeColorMetaTag(coverThemeTokens.background);\n }, [coverThemeTokens, theme, updateThemeColorMetaTag]);\n\n const themeResolved = autoThemeSource !== \"cover\" || !coverUrl || !!coverThemeTokens || coverThemeFailed;\n\n return {\n inferThemeAuto,\n theme,\n breakpoints,\n colorScheme,\n contrast,\n forcedColors,\n monochrome,\n reducedMotion,\n reducedTransparency,\n coverThemeTokens,\n themeResolved\n }\n}\n"]}
|