@skaile/workspaces 5.13.0 → 5.14.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/CHANGELOG.md +18 -0
- package/dist/app-sdk/index.js +1 -1
- package/dist/{asset-feeds-ALMTHLPV.js → asset-feeds-PAOX3FUT.js} +11 -11
- package/dist/{asset-feeds-ALMTHLPV.js.map → asset-feeds-PAOX3FUT.js.map} +1 -1
- package/dist/asset-manager/catalog-deployer.js +3 -3
- package/dist/asset-manager/index.js +7 -7
- package/dist/asset-manager/installer.js +5 -5
- package/dist/asset-manager/renderers.js +4 -4
- package/dist/bridge/drivers/claude-sdk.js +145 -10
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +6 -5
- package/dist/bridge/drivers/codex.js.map +1 -1
- package/dist/bridge/drivers/continue.js +7 -6
- package/dist/bridge/drivers/continue.js.map +1 -1
- package/dist/bridge/drivers/echo.js +4 -3
- package/dist/bridge/drivers/echo.js.map +1 -1
- package/dist/bridge/drivers/gemini.js +6 -5
- package/dist/bridge/drivers/goose.js +7 -6
- package/dist/bridge/drivers/goose.js.map +1 -1
- package/dist/bridge/drivers/omp.js +5 -4
- package/dist/bridge/drivers/omp.js.map +1 -1
- package/dist/bridge/drivers/opencode.js +7 -6
- package/dist/bridge/drivers/opencode.js.map +1 -1
- package/dist/bridge/drivers/qwen.js +6 -5
- package/dist/bridge/drivers/qwen.js.map +1 -1
- package/dist/bridge/index.js +9 -8
- package/dist/bridge/src/drivers/claude-sdk.d.ts +2 -0
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/bridge/src/drivers/claude-self-turns.d.ts +72 -0
- package/dist/bridge/src/drivers/claude-self-turns.d.ts.map +1 -0
- package/dist/bridge/src/normalizer.d.ts.map +1 -1
- package/dist/bridge/src/types.d.ts +12 -0
- package/dist/bridge/src/types.d.ts.map +1 -1
- package/dist/{chunk-6GICC4RJ.js → chunk-3NNL334S.js} +10 -10
- package/dist/{chunk-6GICC4RJ.js.map → chunk-3NNL334S.js.map} +1 -1
- package/dist/{chunk-4NJ3QQHZ.js → chunk-5IMGZAKH.js} +4 -4
- package/dist/{chunk-4NJ3QQHZ.js.map → chunk-5IMGZAKH.js.map} +1 -1
- package/dist/{chunk-6NQDDCIL.js → chunk-5NVDOEWX.js} +15 -7
- package/dist/chunk-5NVDOEWX.js.map +1 -0
- package/dist/{chunk-BVJU2GKE.js → chunk-6VIVUBNN.js} +4 -271
- package/dist/chunk-6VIVUBNN.js.map +1 -0
- package/dist/{chunk-GMDSRSGI.js → chunk-7LGNJJ76.js} +6 -6
- package/dist/{chunk-GMDSRSGI.js.map → chunk-7LGNJJ76.js.map} +1 -1
- package/dist/{chunk-FB3NREF7.js → chunk-BASMWKPM.js} +7 -7
- package/dist/{chunk-FB3NREF7.js.map → chunk-BASMWKPM.js.map} +1 -1
- package/dist/{chunk-L3ZGYSWY.js → chunk-CAPKENNF.js} +9 -4
- package/dist/chunk-CAPKENNF.js.map +1 -0
- package/dist/{chunk-4L4R5LV3.js → chunk-CNZI37HV.js} +3 -3
- package/dist/{chunk-4L4R5LV3.js.map → chunk-CNZI37HV.js.map} +1 -1
- package/dist/{chunk-F4NJDSR7.js → chunk-D5WTOVLG.js} +7 -4
- package/dist/chunk-D5WTOVLG.js.map +1 -0
- package/dist/{chunk-XJYBCDY2.js → chunk-DHUJRIQQ.js} +3 -3
- package/dist/{chunk-XJYBCDY2.js.map → chunk-DHUJRIQQ.js.map} +1 -1
- package/dist/chunk-DWRYUWOK.js +273 -0
- package/dist/chunk-DWRYUWOK.js.map +1 -0
- package/dist/{chunk-5FYOM4RF.js → chunk-FD2IPIE2.js} +5 -5
- package/dist/{chunk-5FYOM4RF.js.map → chunk-FD2IPIE2.js.map} +1 -1
- package/dist/{chunk-PYTTF754.js → chunk-GJGEDWRT.js} +4 -4
- package/dist/{chunk-PYTTF754.js.map → chunk-GJGEDWRT.js.map} +1 -1
- package/dist/{chunk-FHDK3BFD.js → chunk-IPN7N2AZ.js} +3 -3
- package/dist/{chunk-FHDK3BFD.js.map → chunk-IPN7N2AZ.js.map} +1 -1
- package/dist/{chunk-4DLQESIY.js → chunk-IQVZIVSA.js} +3 -3
- package/dist/{chunk-4DLQESIY.js.map → chunk-IQVZIVSA.js.map} +1 -1
- package/dist/{chunk-NDUYFYJB.js → chunk-MCLT3BJG.js} +5 -5
- package/dist/{chunk-NDUYFYJB.js.map → chunk-MCLT3BJG.js.map} +1 -1
- package/dist/{chunk-PZOO7L26.js → chunk-O3Q3MOAV.js} +4 -4
- package/dist/{chunk-PZOO7L26.js.map → chunk-O3Q3MOAV.js.map} +1 -1
- package/dist/{chunk-DKGEV6SQ.js → chunk-ODQGLELI.js} +4 -4
- package/dist/{chunk-DKGEV6SQ.js.map → chunk-ODQGLELI.js.map} +1 -1
- package/dist/chunk-OKQXY6FS.js +1336 -0
- package/dist/chunk-OKQXY6FS.js.map +1 -0
- package/dist/{chunk-BF422IDP.js → chunk-OX2W5YF3.js} +4 -4
- package/dist/{chunk-BF422IDP.js.map → chunk-OX2W5YF3.js.map} +1 -1
- package/dist/{chunk-HBZD3MIW.js → chunk-PAUM35HD.js} +169 -33
- package/dist/chunk-PAUM35HD.js.map +1 -0
- package/dist/{chunk-J4DB5G36.js → chunk-PGVSOHWE.js} +2 -2
- package/dist/{chunk-J4DB5G36.js.map → chunk-PGVSOHWE.js.map} +1 -1
- package/dist/{chunk-ZSMMX3JD.js → chunk-PUG7IWFF.js} +11 -11
- package/dist/{chunk-ZSMMX3JD.js.map → chunk-PUG7IWFF.js.map} +1 -1
- package/dist/{chunk-2H73V6XR.js → chunk-PW3TYWOI.js} +3 -3
- package/dist/{chunk-2H73V6XR.js.map → chunk-PW3TYWOI.js.map} +1 -1
- package/dist/{chunk-Y7WKXPWS.js → chunk-QAYL3PYY.js} +8 -8
- package/dist/{chunk-Y7WKXPWS.js.map → chunk-QAYL3PYY.js.map} +1 -1
- package/dist/{chunk-XBYSURMK.js → chunk-QELQDY5K.js} +3 -3
- package/dist/{chunk-XBYSURMK.js.map → chunk-QELQDY5K.js.map} +1 -1
- package/dist/{chunk-7SMP4GNW.js → chunk-S6FZUR5H.js} +7 -6
- package/dist/chunk-S6FZUR5H.js.map +1 -0
- package/dist/{chunk-QO7CR3KB.js → chunk-TYUJPQNX.js} +3 -3
- package/dist/{chunk-QO7CR3KB.js.map → chunk-TYUJPQNX.js.map} +1 -1
- package/dist/{chunk-5SKVCMRC.js → chunk-UK3LRPJ5.js} +3 -3
- package/dist/{chunk-5SKVCMRC.js.map → chunk-UK3LRPJ5.js.map} +1 -1
- package/dist/{chunk-R6QHJEHE.js → chunk-UQ4SQOR6.js} +5 -5
- package/dist/{chunk-R6QHJEHE.js.map → chunk-UQ4SQOR6.js.map} +1 -1
- package/dist/{chunk-V5JHD4I2.js → chunk-V7AWO5FL.js} +2 -2
- package/dist/{chunk-V5JHD4I2.js.map → chunk-V7AWO5FL.js.map} +1 -1
- package/dist/{chunk-PN44DOGP.js → chunk-VTG5Z3KD.js} +3 -3
- package/dist/{chunk-PN44DOGP.js.map → chunk-VTG5Z3KD.js.map} +1 -1
- package/dist/{chunk-Y4Z7LGSH.js → chunk-VTXXBYB3.js} +9 -9
- package/dist/{chunk-Y4Z7LGSH.js.map → chunk-VTXXBYB3.js.map} +1 -1
- package/dist/{chunk-AHCI4V5L.js → chunk-WTEYDNTR.js} +3 -3
- package/dist/{chunk-AHCI4V5L.js.map → chunk-WTEYDNTR.js.map} +1 -1
- package/dist/{chunk-B7CZYFB2.js → chunk-YFIHFJEB.js} +3 -3
- package/dist/{chunk-B7CZYFB2.js.map → chunk-YFIHFJEB.js.map} +1 -1
- package/dist/{chunk-VMKMFS2Q.js → chunk-YIDZJHY6.js} +3 -3
- package/dist/{chunk-VMKMFS2Q.js.map → chunk-YIDZJHY6.js.map} +1 -1
- package/dist/{chunk-HWGYJMME.js → chunk-ZBD6EITA.js} +4 -4
- package/dist/{chunk-HWGYJMME.js.map → chunk-ZBD6EITA.js.map} +1 -1
- package/dist/{chunk-VLBIME5L.js → chunk-ZDTZGEJG.js} +4 -4
- package/dist/{chunk-VLBIME5L.js.map → chunk-ZDTZGEJG.js.map} +1 -1
- package/dist/{chunk-X4BAYGMT.js → chunk-ZIW34FGO.js} +3 -3
- package/dist/{chunk-X4BAYGMT.js.map → chunk-ZIW34FGO.js.map} +1 -1
- package/dist/cli/index.js +86 -67
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/serve.d.ts +7 -0
- package/dist/cli/src/commands/serve.d.ts.map +1 -1
- package/dist/connectors/config.js +2 -2
- package/dist/connectors/index.js +13 -12
- package/dist/{connectors-GFKMKAXV.js → connectors-2TEGRRYC.js} +16 -15
- package/dist/{connectors-GFKMKAXV.js.map → connectors-2TEGRRYC.js.map} +1 -1
- package/dist/connectors-shared/index.js +2 -2
- package/dist/core/index.js +3 -3
- package/dist/core/runtime-assets.js +2 -2
- package/dist/core/src/index.d.ts +1 -1
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +16 -0
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +1 -1
- package/dist/deploy/index.js +3 -3
- package/dist/{ensure-sources-VUKHL65L.js → ensure-sources-EG7YKKZL.js} +10 -10
- package/dist/{ensure-sources-VUKHL65L.js.map → ensure-sources-EG7YKKZL.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +13 -12
- package/dist/factory-assets/connectors/deploy.js +13 -12
- package/dist/factory-assets/connectors/devserver.js +13 -12
- package/dist/factory-assets/connectors/flow/adapter.js +13 -12
- package/dist/factory-assets/connectors/flow/engine.js +4 -4
- package/dist/factory-assets/connectors/flow/run-flow.js +14 -13
- package/dist/factory-assets/connectors/flow.js +13 -12
- package/dist/factory-assets/connectors/git.js +13 -12
- package/dist/factory-assets/connectors/gmail.js +13 -12
- package/dist/factory-assets/connectors/googledrive.js +13 -12
- package/dist/factory-assets/connectors/local.js +13 -12
- package/dist/factory-assets/connectors/mattermost.js +13 -12
- package/dist/factory-assets/connectors/memory.js +13 -12
- package/dist/factory-assets/connectors/minio.js +13 -12
- package/dist/factory-assets/connectors/postgres.js +13 -12
- package/dist/factory-assets/connectors/s3.js +13 -12
- package/dist/factory-assets/connectors/sharepoint.js +13 -12
- package/dist/factory-assets/connectors/sqlite.js +13 -12
- package/dist/factory-assets/connectors/static-server.js +13 -12
- package/dist/factory-assets/connectors/tunnel.js +13 -12
- package/dist/factory-assets/connectors/webdav.js +13 -12
- package/dist/factory-assets/connectors/xstate-store.js +13 -12
- package/dist/factory-assets/connectors/xstate.js +13 -12
- package/dist/{flows-A4YALSZY.js → flows-5TW3XFMH.js} +6 -6
- package/dist/{flows-A4YALSZY.js.map → flows-5TW3XFMH.js.map} +1 -1
- package/dist/{helpers-53XZW7KF.js → helpers-BQGXEKRP.js} +10 -10
- package/dist/{helpers-53XZW7KF.js.map → helpers-BQGXEKRP.js.map} +1 -1
- package/dist/library/index.js +4 -4
- package/dist/{library-publish-FFIPWIRM.js → library-publish-EUP524PE.js} +17 -17
- package/dist/{library-publish-FFIPWIRM.js.map → library-publish-EUP524PE.js.map} +1 -1
- package/dist/model-endpoint/index.d.ts +2 -0
- package/dist/model-endpoint/index.js +9 -0
- package/dist/model-endpoint/index.js.map +1 -0
- package/dist/model-endpoint/src/index.d.ts +4 -0
- package/dist/model-endpoint/src/index.d.ts.map +1 -0
- package/dist/model-endpoint/src/openai-chat.d.ts +105 -0
- package/dist/model-endpoint/src/openai-chat.d.ts.map +1 -0
- package/dist/model-endpoint/src/openai-responses.d.ts +106 -0
- package/dist/model-endpoint/src/openai-responses.d.ts.map +1 -0
- package/dist/model-endpoint/src/openai-shared.d.ts +77 -0
- package/dist/model-endpoint/src/openai-shared.d.ts.map +1 -0
- package/dist/model-endpoint/src/resolve.d.ts +36 -0
- package/dist/model-endpoint/src/resolve.d.ts.map +1 -0
- package/dist/model-endpoint/src/server.d.ts +16 -0
- package/dist/model-endpoint/src/server.d.ts.map +1 -0
- package/dist/model-endpoint/src/types.d.ts +78 -0
- package/dist/model-endpoint/src/types.d.ts.map +1 -0
- package/dist/{open-library-PZAT3TJA.js → open-library-QNMIMZYS.js} +13 -13
- package/dist/{open-library-PZAT3TJA.js.map → open-library-QNMIMZYS.js.map} +1 -1
- package/dist/{open-registry-W46UXZ3I.js → open-registry-BOUCBDLF.js} +8 -8
- package/dist/{open-registry-W46UXZ3I.js.map → open-registry-BOUCBDLF.js.map} +1 -1
- package/dist/{paths-KKY3NSBZ.js → paths-B6SX6J6T.js} +6 -6
- package/dist/{paths-KKY3NSBZ.js.map → paths-B6SX6J6T.js.map} +1 -1
- package/dist/{plugin-store-CK7YWRIC.js → plugin-store-MLFP3WJ7.js} +5 -5
- package/dist/{plugin-store-CK7YWRIC.js.map → plugin-store-MLFP3WJ7.js.map} +1 -1
- package/dist/{project-EZUH7PUJ.js → project-GXCIEJGM.js} +30 -27
- package/dist/{project-EZUH7PUJ.js.map → project-GXCIEJGM.js.map} +1 -1
- package/dist/resolver/index.js +3 -3
- package/dist/runner/index.js +22 -19
- package/dist/runner/src/model-endpoint-discovery.d.ts +64 -0
- package/dist/runner/src/model-endpoint-discovery.d.ts.map +1 -0
- package/dist/runner/src/serve.d.ts +6 -0
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts +8 -0
- package/dist/runner/src/session-builder.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +7 -7
- package/dist/sdk/bridge.js +9 -8
- package/dist/sdk/core.js +3 -3
- package/dist/sdk/flow.js +4 -4
- package/dist/sdk/index.js +22 -19
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +3 -3
- package/dist/sdk/runner.js +22 -19
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/types.js +1 -1
- package/dist/{serve-preflight-F7MYF747.js → serve-preflight-GNBW3O4U.js} +5 -5
- package/dist/{serve-preflight-F7MYF747.js.map → serve-preflight-GNBW3O4U.js.map} +1 -1
- package/dist/session/index.js +2 -2
- package/dist/{setup-L632QIHV.js → setup-HJEYEXLS.js} +17 -16
- package/dist/setup-HJEYEXLS.js.map +1 -0
- package/dist/{skills-OY3Y5GKA.js → skills-4WMYGJDL.js} +5 -5
- package/dist/{skills-OY3Y5GKA.js.map → skills-4WMYGJDL.js.map} +1 -1
- package/dist/{source-36FHMN5V.js → source-5VL6PHER.js} +15 -15
- package/dist/{source-36FHMN5V.js.map → source-5VL6PHER.js.map} +1 -1
- package/dist/{source-manifest-publish-NIXJSJ22.js → source-manifest-publish-Q66H7EJI.js} +17 -17
- package/dist/{source-manifest-publish-NIXJSJ22.js.map → source-manifest-publish-Q66H7EJI.js.map} +1 -1
- package/dist/tui/index.js +22 -19
- package/dist/tui/index.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/src/delivery.d.ts.map +1 -1
- package/dist/types/src/events.d.ts +55 -1
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +11 -1
- package/dist/types/src/version.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +16 -15
- package/dist/workspace-plugin/adapters/omp.js +14 -14
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +12 -1
- package/dist/chunk-6NQDDCIL.js.map +0 -1
- package/dist/chunk-7SMP4GNW.js.map +0 -1
- package/dist/chunk-BVJU2GKE.js.map +0 -1
- package/dist/chunk-F4NJDSR7.js.map +0 -1
- package/dist/chunk-HBZD3MIW.js.map +0 -1
- package/dist/chunk-L3ZGYSWY.js.map +0 -1
- package/dist/setup-L632QIHV.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../model-endpoint/src/types.ts","../model-endpoint/src/resolve.ts","../model-endpoint/src/openai-shared.ts","../model-endpoint/src/openai-chat.ts","../model-endpoint/src/openai-responses.ts","../model-endpoint/src/server.ts"],"names":["parseTools","item","isRecord","chunk"],"mappings":";;;;;;;AA+FO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EACnC,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,MAAA,EAAgB,OAAA,EAAiB,IAAA,EAAe,IAAA,EAA+B;AACzF,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA,IAAQ,gBAAA,CAAiB,MAAM,CAAA;AAC3C,IAAA,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACtC;AACF;AAGA,SAAS,iBAAiB,MAAA,EAAwC;AAChE,EAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK,OAAO,sBAAA;AAC7C,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,iBAAA;AAC3B,EAAA,IAAI,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,KAAK,OAAO,gBAAA;AAC/D,EAAA,IAAI,MAAA,IAAU,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK,OAAO,cAAA;AAC5C,EAAA,OAAO,uBAAA;AACT;;;ACnFA,IAAM,sBAAA,GAAyB,KAAA;AAE/B,IAAM,kBAAA,GAAqB,IAAA;AAE3B,IAAM,mBAAA,GAAsB,QAAA;AAoB5B,SAAS,SAAA,CAAU,UAA6B,eAAA,EAAiC;AAC/E,EAAA,OAAO,eAAA,CAAgB,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAC3C;AAWO,SAAS,YAAA,CAAa,UAAkB,IAAA,EAAkC;AAC/E,EAAA,MAAM,MAAM,aAAA,CAAc,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,KAAK,KAAK,CAAA;AAC7D,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW;AACrC,IAAA,MAAM,IAAI,kBAAA,CAAmB,GAAA,EAAK,CAAA,OAAA,EAAU,QAAQ,eAAe,iBAAiB,CAAA;AAAA,EACtF;AACA,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,EAAE,CAAA,KAAM,EAAA,KAAO,GAAA,CAAI,UAAU,CAAA;AACnF,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,kBAAA,CAAmB,GAAA,EAAK,CAAA,OAAA,EAAU,QAAQ,eAAe,iBAAiB,CAAA;AAAA,EACtF;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,KAAK,CAAA,GAAI,KAAA;AAC5B,EAAA,MAAM,YAAY,GAAA,CAAI,OAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,cAAc,KAAK,CAAA;AACpC,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,CAAC,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,EAAE,CAAA,KAAM,EAAA,KAAO,SAAS,CAAA,EAAG;AACrE,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,GAAA;AAAA,MACA,CAAA,OAAA,EAAU,SAAS,CAAA,+BAAA,EAAkC,UAAU,CAAA,CAAA,CAAA;AAAA,MAC/D;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AACxB,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,GAAA;AAAA,MACA,aAAa,UAAU,CAAA,kDAAA,CAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,IAAmB,SAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,YAAA,GAAe,SAAS,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAoB;AAAA,IACxB,EAAA,EAAI,eAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,GAAA,EAAK,OAAA;AAAA,IACL,QAAA,EAAU,UAAA;AAAA,IACV,OAAA,EAAS,SAAA,CAAU,OAAA,EAAS,OAAO,CAAA;AAAA,IACnC,KAAA,EAAO,MAAM,MAAA,KAAW,KAAA,GAAQ,CAAC,MAAM,CAAA,GAAI,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC3D,IAAA,EAAM,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,UAAA,EAAY,CAAA,EAAE;AAAA,IACzD,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,MAAM,cAAA,IAAkB,sBAAA;AAAA,IACvC,SAAA,EAAW,kBAAA;AAAA,IACX,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY;AAAC,GACpD;AAEA,EAAA,MAAM,MAAA,GACJ,oBAAA,CAAqB,UAAA,EAAY,KAAA,EAAO,EAAE,GAAA,EAAK,IAAA,CAAK,SAAA,EAAW,YAAA,EAAc,OAAO,CAAA,KACnF,SAAA,CAAU,KAAK,IAAI,mBAAA,GAAsB,MAAA,CAAA;AAE5C,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,IACzC,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY;AAAC,GACpD;AACF;AAGA,SAAS,UAAU,KAAA,EAAoC;AACrD,EAAA,OAAO,CAAC,MAAM,MAAA,KAAW,CAAC,MAAM,UAAA,IAAc,KAAA,CAAM,WAAW,IAAA,KAAS,MAAA,CAAA;AAC1E;AAOO,SAAS,WACd,QAAA,EACyC;AACzC,EAAA,OAAO,iBAAA,CAAkB,QAAQ,CAAA,CAAE,OAAA;AAAA,IAAQ,CAAC,CAAC,UAAA,EAAY,KAAK,CAAA,KAC5D,aAAA,CAAc,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,SAAS,CAAA,MAAO;AAAA,MACzC,EAAA,EAAI,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MAC9B,QAAA,EAAU;AAAA,KACZ,CAAE;AAAA,GACJ;AACF;;;AClHA,IAAM,eAAA,GAA4C;AAAA,EAChD,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA;AAGO,SAAS,WAAW,OAAA,EAAqC;AAC9D,EAAA,OAAO,IAAI,kBAAA,CAAmB,GAAA,EAAK,OAAO,CAAA;AAC5C;AAEO,SAAS,SAAS,KAAA,EAAkD;AACzE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEO,SAAS,aAAa,IAAA,EAAuC;AAClE,EAAA,IAAI,OAAO,IAAA,CAAK,KAAA,KAAU,YAAY,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC7D,IAAA,MAAM,WAAW,mBAAmB,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,IAAA,CAAK,KAAA;AACd;AAEO,SAAS,eAAA,CAAgB,OAAgB,KAAA,EAAwB;AACtE,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,KAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,QAAiB,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAC7E,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAA,CAAe,OAAgB,KAAA,EAAmC;AAChF,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,MAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,SAAS,KAAK,CAAA;AACrD,IAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,iBAAA,CAAmB,CAAA;AAC9C,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,mBAAA,CAAoB,OAAgB,KAAA,EAAmC;AACrF,EAAA,MAAM,CAAA,GAAI,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AACrC,EAAA,IAAI,CAAA,KAAM,QAAW,OAAO,MAAA;AAC5B,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,2BAAA,CAA6B,CAAA;AAC1F,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,gBAAgB,KAAA,EAAuC;AAC9D,EAAA,OAAQ,eAAA,CAAsC,SAAS,KAAK,CAAA;AAC9D;AAGO,SAAS,oBAAA,CAAqB,OAAgB,KAAA,EAA0C;AAC7F,EAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,QAAQ,OAAO,MAAA;AACtE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,eAAA,CAAgB,KAAK,GAAG,OAAO,KAAA;AAChE,EAAA,MAAM,UAAA,CAAW,GAAG,KAAK,CAAA,sBAAA,EAAyB,gBAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAChF;AAOO,SAAS,kBAAA,CACd,MACA,IAAA,EAC4B;AAC5B,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,IAAA,MAAM,EAAA,GACJ,OAAO,KAAA,KAAU,QAAA,IAChB,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,KAClD,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA;AACnE,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,UAAA,CAAW,CAAA,EAAG,GAAG,CAAA,wBAAA,CAA0B,CAAA;AAC1D,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EAChB;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AACnD;AAEO,SAAS,aAAa,KAAA,EAKL;AACtB,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,WAAA;AACjE,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,SAAA;AAC7D,EAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,OAAA,CAAQ,iBAAiB,KAAA,CAAM,cAAA;AACvE,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,YAAY,KAAA,CAAM,SAAA;AAC7D,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,QAAA,GAAW,0CAAA;AAOV,SAAS,YAAA,CAAa,KAAc,KAAA,EAA6B;AACtE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,CAAA;AAC5C,IAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,2BAAA,CAA6B,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAC/B,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,UAAA;AAAA,MACJ,GAAG,KAAK,CAAA,gFAAA;AAAA,KACV;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,EAAA,IAAI,CAAC,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA;AAC/B,IAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,4BAAA,EAA+B,QAAQ,CAAA,CAAA,CAAG,CAAA;AACrE,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,KAAA,CAAM,CAAC,GAAa,QAAA,EAAS;AAC7D;AAMO,SAAS,mBAAmB,KAAA,EAA4B;AAC7D,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC5B,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AACpE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACxC,IAAA,OAAO,QAAA,CAAS,MAAM,CAAA,GAAK,MAAA,GAAwB,EAAC;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,IAAM,0BAA0B,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,EAAC,EAAE;AAEjE,SAAS,QAAA,CAAS,IAAA,EAAc,WAAA,EAAsB,UAAA,EAA2B;AACtF,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,WAAA,EAAa,OAAO,WAAA,KAAgB,QAAA,GAAW,WAAA,GAAc,EAAA;AAAA,IAC7D,UAAA,EAAa,QAAA,CAAS,UAAU,CAAA,GAAI,UAAA,GAAa;AAAA,GACnD;AACF;AAOO,SAAS,WAAA,CACd,KAAA,EACA,MAAA,EACA,UAAA,EACQ;AACR,EAAA,IAAI,WAAW,MAAA,IAAa,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,UAAU,MAAA,KAAW,UAAA;AAC7E,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,EAAC;AAC/B,EAAA,IAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACpB,IAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAC9B,IAAA,MAAM,UAAU,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,IAAI,CAAA;AACzD,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,WAAW,CAAA,EAAG;AACpD,MAAA,MAAM,WAAW,4CAA4C,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,8BAA8B,CAAA;AACjD;AAEO,SAAS,YAAA,CAAa,WAAA,EAAuB,QAAA,EAAqB,KAAA,EAAwB;AAC/F,EAAA,MAAM,OAAA,GAAmB,EAAE,QAAA,EAAS;AACpC,EAAA,IAAI,YAAY,MAAA,GAAS,CAAA,UAAW,YAAA,GAAe,WAAA,CAAY,KAAK,MAAM,CAAA;AAC1E,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,KAAA,GAAQ,KAAA;AACtC,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,UAAA,GAAoB;AAClC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,SAAA,EAAW,CAAA;AAAA,IACX,UAAA,EAAY,CAAA;AAAA,IACZ,WAAA,EAAa,CAAA;AAAA,IACb,IAAA,EAAM,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,KAAA,EAAO,CAAA;AAAE,GACrE;AACF;AAGO,SAAS,aAAa,KAAA,EAAsB;AACjD,EAAA,OAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,UAAA;AAC/C;AAEO,SAAS,YAAY,KAAA,EAAsB;AAChD,EAAA,OAAO,KAAA,CAAM,cAAc,CAAA,GAAI,KAAA,CAAM,cAAc,YAAA,CAAa,KAAK,IAAI,KAAA,CAAM,MAAA;AACjF;AAOO,SAAS,gBAAA,CACd,OACA,OAAA,EACkB;AAClB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,OAAA;AAAA,IACA,GAAA,EAAK,oBAAA;AAAA,IACL,QAAA,EAAU,QAAA;AAAA,IACV,KAAA;AAAA,IACA,OAAO,UAAA,EAAW;AAAA,IAClB,UAAA,EAAY,QAAQ,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,IAAA,KAAS,UAAU,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,IAC7E,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AAEO,SAAS,iBAAA,CACd,UAAA,EACA,QAAA,EACA,IAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,UAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,IAChC,OAAA,EAAS,KAAA;AAAA,IACT,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;;;ACrKA,SAAS,WAAA,CAAY,OAAA,EAAkB,KAAA,EAAe,OAAA,EAAoC;AACxF,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,EAAA;AACtD,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AACxB,IAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,2CAAA,CAA6C,CAAA;AACxE,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,IAAA,GAAgB,QAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,CAAC,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACpF,MAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,2BAAA,CAA6B,CAAA;AAAA,IAC7D;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,KAAS,SAAA,GAAY,IAAA,CAAK,UAAU,IAAA,CAAK,IAAA;AAC5D,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA;AACnB,MAAA,MAAM,UAAA;AAAA,QACJ,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,CAAC,KAAK,IAAA,CAAK,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,MAAM,CAAA,iBAAA;AAAA,OAChE;AACF,IAAA,IAAA,IAAQ,KAAA;AAAA,EACV;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAA,CACP,SACA,KAAA,EACyC;AACzC,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AACxB,IAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,8CAAA,CAAgD,CAAA;AAC3E,EAAA,MAAM,QAAwC,EAAC;AAC/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,IAAA,GAAgB,QAAQ,CAAC,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA;AAC/B,IAAA,IAAI,CAAC,SAAS,IAAI,CAAA,QAAS,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,kBAAA,CAAoB,CAAA;AACtE,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,IAAI,OAAO,KAAK,IAAA,KAAS,QAAA,QAAgB,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,sBAAA,CAAwB,CAAA;AACxF,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AACpC,MAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,SAAS,IAAI,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,CAAK,SAAA;AACjE,MAAA,KAAA,CAAM,KAAK,YAAA,CAAa,GAAA,EAAK,CAAA,EAAG,SAAS,gBAAgB,CAAC,CAAA;AAAA,IAC5D,CAAA,MAAO;AACL,MAAA,MAAM,UAAA,CAAW,GAAG,SAAS,CAAA,iCAAA,EAAoC,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACvF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,qBAAA,CACP,GAAA,EACA,KAAA,EACA,KAAA,EACA,SAAA,EAC8B;AAC9B,EAAA,MAAM,SAAsC,EAAC;AAC7C,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,OAAA,EAAS,CAAA,EAAG,KAAK,CAAA,QAAA,CAAA,EAAY,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAC7E,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA;AACvD,EAAA,IAAI,GAAA,CAAI,UAAA,KAAe,MAAA,IAAa,GAAA,CAAI,eAAe,IAAA,EAAM;AAC3D,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,UAAU,GAAG,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAC3F,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC9C,MAAA,MAAM,IAAA,GAAgB,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AACtC,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,KAAK,CAAA,YAAA,EAAe,CAAC,CAAA,CAAA,CAAA;AAC1C,MAAA,IAAI,CAAC,QAAA,CAAS,IAAI,KAAK,CAAC,QAAA,CAAS,KAAK,QAAQ,CAAA;AAC5C,QAAA,MAAM,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,6BAAA,CAA+B,CAAA;AAC9D,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,IAAA,KAAS,UAAA;AAC3C,QAAA,MAAM,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,wBAAA,CAA0B,CAAA;AACzD,MAAA,IAAI,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,IAAY,IAAA,CAAK,GAAG,MAAA,KAAW,CAAA;AACpD,QAAA,MAAM,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,eAAA,CAAiB,CAAA;AAChD,MAAA,IAAI,OAAO,KAAK,QAAA,CAAS,IAAA,KAAS,YAAY,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC7E,QAAA,MAAM,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,0BAAA,CAA4B,CAAA;AAAA,MAC3D;AACA,MAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,SAAS,IAAI,CAAA;AACzC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,UAAA;AAAA,QACN,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,QACpB,SAAA,EAAW,kBAAA,CAAmB,IAAA,CAAK,QAAA,CAAS,SAAS;AAAA,OACtD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,gBAAA,CAAiB,KAAA,EAAO,MAAM,CAAA,GAAI,MAAA;AAC/D;AAEA,SAAS,WAAW,KAAA,EAAwB;AAC1C,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,SAAa,EAAC;AACnD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,MAAM,WAAW,wBAAwB,CAAA;AACpE,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAgB,MAAM,CAAC,CAAA;AAC7B,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,CAAC,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC3E,MAAA,MAAM,UAAA,CAAW,CAAA,MAAA,EAAS,CAAC,CAAA,2CAAA,CAA6C,CAAA;AAAA,IAC1E;AACA,IAAA,MAAM,KAAK,IAAA,CAAK,QAAA;AAChB,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,QAAA,IAAY,EAAA,CAAG,KAAK,MAAA,KAAW,CAAA;AACpD,MAAA,MAAM,UAAA,CAAW,CAAA,MAAA,EAAS,CAAC,CAAA,2BAAA,CAA6B,CAAA;AAC1D,IAAA,KAAA,CAAM,IAAA,CAAK,SAAS,EAAA,CAAG,IAAA,EAAM,GAAG,WAAA,EAAa,EAAA,CAAG,UAAU,CAAC,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,KAAA;AACT;AASO,SAAS,2BAA2B,IAAA,EAAsC;AAC/E,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG,MAAM,WAAW,oCAAoC,CAAA;AAC1E,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC/D,IAAA,MAAM,WAAW,oCAAoC,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,IAAA,CAAK,MAAM,MAAA,IAAa,IAAA,CAAK,MAAM,IAAA,IAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AAC3D,IAAA,MAAM,WAAW,iDAAiD,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAE1C,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,GAAA,GAAe,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,YAAY,CAAC,CAAA,CAAA,CAAA;AAC3B,IAAA,IAAI,CAAC,SAAS,GAAG,CAAA,QAAS,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,kBAAA,CAAoB,CAAA;AACjE,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,QAAA;AAAA,MACL,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,IAAA,GAAO,YAAY,GAAA,CAAI,OAAA,EAAS,GAAG,KAAK,CAAA,QAAA,CAAA,EAAY,CAAC,MAAM,CAAC,CAAA;AAClE,QAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,WAAA,CAAY,KAAK,IAAI,CAAA;AAC1C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA;AACH,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,MAAA;AAAA,UACN,SAAS,gBAAA,CAAiB,GAAA,CAAI,OAAA,EAAS,CAAA,EAAG,KAAK,CAAA,QAAA,CAAU,CAAA;AAAA,UACzD,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AACD,QAAA;AAAA,MACF,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,GAAA,EAAK,KAAA,EAAO,OAAO,SAAS,CAAA;AACpE,QAAA,IAAI,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AACtC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,OAAO,GAAA,CAAI,YAAA,KAAiB,YAAY,GAAA,CAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AACzE,UAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,yBAAA,CAA2B,CAAA;AAAA,QACtD;AACA,QAAA,MAAM,IAAA,GAAO,YAAY,GAAA,CAAI,OAAA,EAAS,GAAG,KAAK,CAAA,QAAA,CAAA,EAAY,CAAC,MAAM,CAAC,CAAA;AAClE,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,iBAAA,CAAkB,IAAI,YAAA,EAAc,SAAA,CAAU,IAAI,GAAA,CAAI,YAAY,CAAA,IAAK,EAAA,EAAI,IAAI;AAAA,SACjF;AACA,QAAA;AAAA,MACF;AAAA,MACA;AACE,QAAA,MAAM,UAAA,CAAW,GAAG,KAAK,CAAA,OAAA,EAAU,OAAO,GAAA,CAAI,IAAI,CAAC,CAAA,kBAAA,CAAoB,CAAA;AAAA;AAC3E,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,WAAA;AAAA,IAAY,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,IAAG,IAAA,CAAK,WAAA;AAAA,IAAa,CAAC,MAAA,KACnE,MAAA,CAAO,IAAA,KAAS,UAAA,IAAc,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO;AAAA,GACnF;AAEA,EAAA,MAAM,UAAU,YAAA,CAAa;AAAA,IAC3B,WAAA,EAAa,cAAA,CAAe,IAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AAAA,IAC3D,SAAA,EAAW,mBAAA;AAAA,MACT,IAAA,CAAK,yBAAyB,IAAA,CAAK,UAAA;AAAA,MACnC;AAAA,KACF;AAAA,IACA,cAAA,EAAgB,mBAAmB,IAAA,EAAM;AAAA,MACvC,OAAA;AAAA,MACA,mBAAA;AAAA,MACA,kBAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,SAAA,EAAW,oBAAA,CAAqB,IAAA,CAAK,gBAAA,EAAkB,kBAAkB;AAAA,GAC1E,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA,EAAS,YAAA,CAAa,WAAA,EAAa,QAAA,EAAU,KAAK,CAAA;AAAA,IAClD,OAAA;AAAA,IACA,MAAA,EAAQ,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC7C,cAAc,QAAA,CAAS,IAAA,CAAK,cAAc,CAAA,IAAK,IAAA,CAAK,eAAe,aAAA,KAAkB;AAAA,GACvF;AACF;AAIA,SAAS,YAAA,CAAa,YAAwB,YAAA,EAAoD;AAChG,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,MAAM,IAAI,kBAAA,CAAmB,GAAA,EAAK,YAAA,IAAgB,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAEA,SAAS,YAAY,KAAA,EAAuD;AAC1E,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,MAAM,MAAA,GAA8B;AAAA,IAClC,aAAA,EAAe,MAAA;AAAA,IACf,mBAAmB,KAAA,CAAM,MAAA;AAAA,IACzB,YAAA,EAAc,YAAY,KAAK,CAAA;AAAA,IAC/B,qBAAA,EAAuB,EAAE,aAAA,EAAe,KAAA,CAAM,SAAA;AAAU,GAC1D;AACA,EAAA,IAAI,MAAM,SAAA,KAAc,MAAA;AACtB,IAAA,MAAA,CAAO,yBAAA,GAA4B,EAAE,gBAAA,EAAkB,KAAA,CAAM,SAAA,EAAU;AACzE,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,gBAAA,CACd,SACA,IAAA,EACgB;AAChB,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,UAAA,EAAY,QAAQ,YAAY,CAAA;AACpE,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,MAAM,YAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,OAAA,EAAS;AACnC,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ,IAAA,IAAQ,KAAA,CAAM,IAAA;AAAA,SAAA,IAChC,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY,QAAA,IAAY,KAAA,CAAM,QAAA;AAAA,SACjD;AACH,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,WAAW,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AAAE,OAC1E,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAA6B,EAAE,IAAA,EAAM,WAAA,EAAa,SAAS,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,IAAA,EAAK;AAC/F,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,iBAAA,GAAoB,QAAA;AACjD,EAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,UAAA,GAAa,SAAA;AAC3C,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAA,EAAQ,iBAAA;AAAA,IACR,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,OAAA,EAAS,CAAC,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,GAAA,EAAK,aAAA,EAAe,MAAA,EAAQ,CAAA;AAAA,IAC3D,KAAA,EAAO,WAAA,CAAY,OAAA,CAAQ,KAAK;AAAA,GAClC;AACF;AAgBO,SAAS,sBAAsB,IAAA,EAKlB;AAClB,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,aAAA,EAAe,GAAG,kBAAA,kBAAoB,IAAI,KAAI,EAAE;AACpE;AAEA,SAAS,KAAA,CACP,KAAA,EACA,KAAA,EACA,MAAA,GAAkC,IAAA,EACb;AACrB,EAAA,OAAO;AAAA,IACL,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,MAAA,EAAQ,uBAAA;AAAA,IACR,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,OAAA,EAAS,CAAC,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,aAAA,EAAe,QAAQ;AAAA,GACtD;AACF;AAOO,SAAS,oBAAA,CACd,OACA,KAAA,EACuB;AACvB,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,OAAA;AACH,MAAA,OAAO,CAAC,MAAM,KAAA,EAAO,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,EAAA,EAAI,CAAC,CAAA;AAAA,IAC1D,KAAK,YAAA;AACH,MAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,CAAC,KAAA,CAAM,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,CAAM,KAAA,EAAO,CAAC,IAAI,EAAC;AAAA,IAC9E,KAAK,gBAAA;AACH,MAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,CAAC,KAAA,CAAM,KAAA,EAAO,EAAE,iBAAA,EAAmB,KAAA,CAAM,KAAA,EAAO,CAAC,IAAI,EAAC;AAAA,IACxF,KAAK,gBAAA;AACH,MAAA,KAAA,CAAM,kBAAA,CAAmB,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,MAAM,aAAA,EAAe,CAAA;AACtE,MAAA,OAAO,EAAC;AAAA,IACV,KAAK,cAAA,EAAgB;AACnB,MAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,kBAAA,CAAmB,GAAA,CAAI,MAAM,YAAY,CAAA;AAC3D,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,KAAA,GAAQ,KAAA,CAAM,aAAA,EAAA;AACd,QAAA,KAAA,CAAM,kBAAA,CAAmB,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,KAAK,CAAA;AAAA,MACxD;AACA,MAAA,OAAO;AAAA,QACL,MAAM,KAAA,EAAO;AAAA,UACX,UAAA,EAAY;AAAA,YACV;AAAA,cACE,KAAA;AAAA,cACA,EAAA,EAAI,MAAM,QAAA,CAAS,EAAA;AAAA,cACnB,IAAA,EAAM,UAAA;AAAA,cACN,QAAA,EAAU;AAAA,gBACR,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA;AAAA,gBACrB,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,SAAS;AAAA;AACpD;AACF;AACF,SACD;AAAA,OACH;AAAA,IACF;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,MAAA,GAAS,CAAC,KAAA,CAAM,KAAA,EAAO,EAAC,EAAG,YAAA,CAAa,KAAA,CAAM,MAAA,EAAQ,MAAS,CAAC,CAAC,CAAA;AACvE,MAAA,IAAI,MAAM,YAAA,EAAc;AACtB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,MAAA,EAAQ,uBAAA;AAAA,UACR,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,SAAS,EAAC;AAAA,UACV,KAAA,EAAO,WAAA,CAAY,KAAA,CAAM,OAAA,CAAQ,KAAK;AAAA,SACvC,CAAA;AAAA,MACH;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,IACA,KAAK,OAAA;AACH,MAAA,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,YAAA,IAAgB,CAAA,iBAAA,EAAoB,MAAM,MAAM,CAAA,CAAA;AAC1E,MAAA,OAAO,EAAC;AAAA,IACV;AACE,MAAA,OAAO,EAAC;AAAA;AAEd;;;ACvVA,SAAS,UAAA,CACP,OAAA,EACA,KAAA,EACA,IAAA,EACyC;AACzC,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AACxC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AACxB,IAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,8CAAA,CAAgD,CAAA;AAC3E,EAAA,MAAM,SAAA,GAAY,SAAS,WAAA,GAAc,CAAC,eAAe,MAAM,CAAA,GAAI,CAAC,YAAA,EAAc,MAAM,CAAA;AACxF,EAAA,MAAM,QAAwC,EAAC;AAC/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,IAAA,GAAgB,QAAQ,CAAC,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA;AAC/B,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,OAAO,KAAK,IAAA,KAAS,QAAA;AAC1C,MAAA,MAAM,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,uBAAA,CAAyB,CAAA;AACxD,IAAA,IAAI,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACjC,MAAA,IAAI,OAAO,KAAK,IAAA,KAAS,QAAA,QAAgB,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,sBAAA,CAAwB,CAAA;AACxF,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9C,CAAA,MAAA,IACE,KAAK,IAAA,KAAS,SAAA,IACd,SAAS,WAAA,IACT,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,EACxB;AACA,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,CAAK,SAAS,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,aAAA,IAAiB,SAAS,MAAA,EAAQ;AACzD,MAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,IAAa,IAAA,CAAK,OAAA,KAAY,IAAA;AACjD,QAAA,MAAM,UAAA,CAAW,CAAA,EAAG,SAAS,CAAA,yBAAA,CAA2B,CAAA;AAC1D,MAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,SAAS,IAAI,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,CAAK,SAAA;AACjE,MAAA,KAAA,CAAM,KAAK,YAAA,CAAa,GAAA,EAAK,CAAA,EAAG,SAAS,YAAY,CAAC,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,MAAM,WAAW,CAAA,EAAG,SAAS,CAAA,iCAAA,EAAoC,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/E;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAAwD;AACxE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,CAAK,IAAA,KAAS,MAAA,GAAS,IAAA,CAAK,IAAA,GAAO,EAAG,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAC7E;AAEA,SAAS,eAAA,CAAgB,QAAiB,KAAA,EAAuB;AAC/D,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,MAAA;AACvC,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,IAAA,EAAM,OAAO,EAAA;AACpD,EAAA,OAAO,QAAA,CAAS,UAAA,CAAW,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAC,CAAA;AACnD;AAEA,SAAS,UAAA,CAAW,KAAA,EAAgB,KAAA,EAAe,WAAA,EAAkC;AACnF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,IAAA,CAAK,GAAA,IAAO,CAAA;AAC9F,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,MAAM,WAAW,6CAA6C,CAAA;AACzF,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAE1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAgB,MAAM,CAAC,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA,CAAA,CAAA;AACxB,IAAA,IAAI,CAAC,SAAS,IAAI,CAAA,QAAS,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAClE,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,SAAA;AAC1B,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,WAAA,EAAa;AAC7C,UAAA,MAAM,IAAA,GAAO,SAAS,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG,KAAK,CAAA,QAAA,CAAA,EAAY,QAAQ,CAAC,CAAA;AAC5E,UAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,QAC5C,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,MAAA;AAAA,YACN,SAAS,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG,KAAK,YAAY,MAAM,CAAA;AAAA,YAC5D,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,SAAS,WAAA,EAAa;AAC/B,UAAA,MAAM,IAAA,GAAO,SAAS,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG,KAAK,CAAA,QAAA,CAAA,EAAY,WAAW,CAAC,CAAA;AAC/E,UAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,KAAK,gBAAA,CAAiB,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,QACtF,CAAA,MAAO;AACL,UAAA,MAAM,WAAW,CAAA,EAAG,KAAK,UAAU,MAAA,CAAO,IAAI,CAAC,CAAA,kBAAA,CAAoB,CAAA;AAAA,QACrE;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IAAY,IAAA,CAAK,QAAQ,MAAA,KAAW,CAAA;AAC9D,UAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,oBAAA,CAAsB,CAAA;AACjD,QAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,KAAK,MAAA,KAAW,CAAA;AACxD,UAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,iBAAA,CAAmB,CAAA;AAC9C,QAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AACrC,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,IAAA,EAAM,UAAA;AAAA,UACN,IAAI,IAAA,CAAK,OAAA;AAAA,UACT,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,SAAA,EAAW,kBAAA,CAAmB,IAAA,CAAK,SAAS;AAAA,SAC9C;AAEA,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,EAAA,CAAG,EAAE,CAAA;AAC3B,QAAA,IAAI,IAAA,EAAM,SAAS,WAAA,EAAa;AAC9B,UAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAI,CAAA;AACtB,UAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,QACpB,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAK,gBAAA,CAAiB,KAAA,EAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AAAA,QAC/C;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,sBAAA,EAAwB;AAC3B,QAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IAAY,IAAA,CAAK,QAAQ,MAAA,KAAW,CAAA;AAC9D,UAAA,MAAM,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA,oBAAA,CAAsB,CAAA;AACjD,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,iBAAA;AAAA,YACE,IAAA,CAAK,OAAA;AAAA,YACL,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,IAAK,EAAA;AAAA,YAC/B,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,KAAK,CAAA,OAAA,CAAS;AAAA;AAChD,SACF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA;AAEH,QAAA;AAAA,MACF;AACE,QAAA,MAAM,WAAW,CAAA,EAAG,KAAK,UAAU,MAAA,CAAO,IAAI,CAAC,CAAA,kBAAA,CAAoB,CAAA;AAAA;AACvE,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAASA,YAAW,KAAA,EAAwB;AAC1C,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,SAAa,EAAC;AACnD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,MAAM,WAAW,wBAAwB,CAAA;AACpE,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAgB,MAAM,CAAC,CAAA;AAC7B,IAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,UAAA,EAAY;AAC/C,MAAA,MAAM,UAAA,CAAW,CAAA,MAAA,EAAS,CAAC,CAAA,oCAAA,CAAsC,CAAA;AAAA,IACnE;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,KAAK,MAAA,KAAW,CAAA;AACxD,MAAA,MAAM,UAAA,CAAW,CAAA,MAAA,EAAS,CAAC,CAAA,kBAAA,CAAoB,CAAA;AACjD,IAAA,KAAA,CAAM,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA,EAAM,KAAK,WAAA,EAAa,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,sBAAsB,IAAA,EAAiC;AACrE,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG,MAAM,WAAW,oCAAoC,CAAA;AAC1E,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,IAAa,IAAA,CAAK,UAAU,IAAA,EAAM,MAAM,WAAW,mBAAmB,CAAA;AACzF,EAAA,IAAI,IAAA,CAAK,oBAAA,KAAyB,MAAA,IAAa,IAAA,CAAK,yBAAyB,IAAA,EAAM;AACjF,IAAA,MAAM,WAAW,kEAAkE,CAAA;AAAA,EACrF;AAEA,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,IAAI,IAAA,CAAK,YAAA,KAAiB,MAAA,IAAa,IAAA,CAAK,iBAAiB,IAAA,EAAM;AACjE,IAAA,IAAI,OAAO,IAAA,CAAK,YAAA,KAAiB,QAAA,EAAU,MAAM,WAAW,+BAA+B,CAAA;AAC3F,IAAA,IAAI,KAAK,YAAA,CAAa,MAAA,GAAS,GAAG,WAAA,CAAY,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,OAAO,WAAW,CAAA;AAC1D,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,MAAM,WAAW,yCAAyC,CAAA;AAErF,EAAA,MAAM,KAAA,GAAQ,WAAA;AAAA,IAAYA,WAAAA,CAAW,KAAK,KAAK,CAAA;AAAA,IAAG,IAAA,CAAK,WAAA;AAAA,IAAa,CAAC,MAAA,KACnE,MAAA,CAAO,IAAA,KAAS,UAAA,GAAa,OAAO,IAAA,GAAO;AAAA,GAC7C;AAEA,EAAA,MAAM,YAAY,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,UAAU,MAAA,GAAS,MAAA;AACrE,EAAA,MAAM,UAAU,YAAA,CAAa;AAAA,IAC3B,WAAA,EAAa,cAAA,CAAe,IAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AAAA,IAC3D,SAAA,EAAW,mBAAA,CAAoB,IAAA,CAAK,iBAAA,EAAmB,mBAAmB,CAAA;AAAA,IAC1E,cAAA,EAAgB,kBAAA,CAAmB,IAAA,EAAM,CAAC,OAAO,CAAC,CAAA;AAAA,IAClD,SAAA,EAAW,oBAAA,CAAqB,SAAA,EAAW,kBAAkB;AAAA,GAC9D,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA,EAAS,YAAA,CAAa,WAAA,EAAa,QAAA,EAAU,KAAK,CAAA;AAAA,IAClD,OAAA;AAAA,IACA,MAAA,EAAQ,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC7C,YAAA,EAAc;AAAA,GAChB;AACF;AAIA,SAAS,MAAA,CAAO,MAAA,EAAgB,UAAA,EAAoB,KAAA,EAAuB;AACzE,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,UAAA,CAAW,QAAQ,QAAA,EAAU,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAC/D;AAEA,SAAS,gBAAgB,KAAA,EAA6B;AACpD,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,aAAa,KAAK,CAAA;AAAA,IAChC,eAAe,KAAA,CAAM,MAAA;AAAA,IACrB,YAAA,EAAc,YAAY,KAAK,CAAA;AAAA,IAC/B,oBAAA,EAAsB,EAAE,aAAA,EAAe,KAAA,CAAM,SAAA,EAAU;AAAA,IACvD,qBAAA,EAAuB,EAAE,gBAAA,EAAkB,KAAA,CAAM,aAAa,CAAA;AAAE,GAClE;AACF;AAEA,SAAS,WAAA,CACP,EAAA,EACA,IAAA,EACA,MAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,EAAA;AAAA,IACA,IAAA,EAAM,WAAA;AAAA,IACN,MAAA;AAAA,IACA,OAAA,EAAS,MAAA,KAAW,WAAA,GAAc,CAAC,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,WAAA,EAAa,EAAC,EAAG,IAAI;AAAC,GACxF;AACF;AAEA,SAAS,WAAA,CAAY,SAA2B,UAAA,EAA0C;AACxF,EAAA,MAAM,SAA+B,EAAC;AACtC,EAAA,MAAM,YAAmC,EAAC;AAC1C,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,MAAM,QAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,OAAA,EAAS;AACnC,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,MAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,IAC9F,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAChC,MAAA,IAAA,IAAQ,KAAA,CAAM,IAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,eAAA;AAAA,QACN,EAAA,EAAI,EAAA;AAAA,QACJ,SAAS,KAAA,CAAM,EAAA;AAAA,QACf,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA;AAAA,QACzC,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,WAAA;AAAA,MACN,EAAA,EAAI,MAAA,CAAO,IAAA,EAAM,UAAA,EAAY,OAAO,MAAM,CAAA;AAAA,MAC1C,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,UAAA,EAAY,OAAO,MAAM,CAAA,EAAG,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,EACtF;AACA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAA,CAAK,EAAA,GAAK,MAAA,CAAO,IAAA,EAAM,UAAA,EAAY,OAAO,MAAM,CAAA;AAChD,IAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAA,CACP,IAAA,EACA,MAAA,EACA,MAAA,EACA,KAAA,EACgB;AAChB,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAA,EAAQ,UAAA;AAAA,IACR,YAAY,IAAA,CAAK,OAAA;AAAA,IACjB,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAA;AAAA,IACA,oBAAoB,MAAA,KAAW,YAAA,GAAe,EAAE,MAAA,EAAQ,qBAAoB,GAAI,IAAA;AAAA,IAChF,KAAA,EAAO,IAAA;AAAA,IACP,MAAA;AAAA,IACA,KAAA,EAAO,KAAA,GAAQ,eAAA,CAAgB,KAAK,CAAA,GAAI;AAAA,GAC1C;AACF;AAMO,SAAS,UAAA,CAAW,SAA2B,IAAA,EAAqC;AACzF,EAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,OAAA,IAAW,OAAA,CAAQ,eAAe,SAAA,EAAW;AACtE,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,GAAA;AAAA,MACA,OAAA,CAAQ,YAAA,IAAgB,CAAA,iBAAA,EAAoB,OAAA,CAAQ,UAAU,CAAA;AAAA,KAChE;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,UAAA,KAAe,QAAA,GAAW,YAAA,GAAe,WAAA;AAChE,EAAA,OAAO,cAAA,CAAe,MAAM,MAAA,EAAQ,WAAA,CAAY,SAAS,IAAA,CAAK,EAAE,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAClF;AAwBO,SAAS,2BAA2B,IAAA,EAA2C;AACpF,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,QAAA,EAAU,CAAA;AAAA,IACV,eAAA,EAAiB,CAAA;AAAA,IACjB,IAAA,sBAAU,GAAA,EAAI;AAAA,IACd,SAAA,sBAAe,GAAA;AAAI,GACrB;AACF;AAEA,SAAS,EAAA,CACP,KAAA,EACA,IAAA,EACA,MAAA,EACsB;AACtB,EAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,CAAM,QAAA,EAAA,EAAY,GAAG,MAAA,EAAO;AAC9D;AAEA,SAAS,SAAA,CACP,KAAA,EACA,YAAA,EACA,IAAA,EACsD;AACtD,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA;AAC5C,EAAA,IAAI,UAAU,OAAO,EAAE,OAAO,QAAA,EAAU,MAAA,EAAQ,EAAC,EAAE;AACnD,EAAA,MAAM,cAAc,KAAA,CAAM,eAAA,EAAA;AAC1B,EAAA,MAAM,KAAA,GAAmB;AAAA,IACvB,IAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA,EAAQ,OAAO,IAAA,KAAS,SAAA,GAAY,QAAQ,IAAA,EAAM,KAAA,CAAM,IAAI,WAAW,CAAA;AAAA,IACvE,IAAA,EAAM;AAAA,GACR;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,KAAK,CAAA;AAClC,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,EAAA,CAAG,OAAO,4BAAA,EAA8B;AAAA,UACtC,YAAA,EAAc,WAAA;AAAA,UACd,IAAA,EAAM,WAAA,CAAY,KAAA,CAAM,MAAA,EAAQ,IAAI,aAAa;AAAA,SAClD,CAAA;AAAA,QACD,EAAA,CAAG,OAAO,6BAAA,EAA+B;AAAA,UACvC,SAAS,KAAA,CAAM,MAAA;AAAA,UACf,YAAA,EAAc,WAAA;AAAA,UACd,aAAA,EAAe,CAAA;AAAA,UACf,IAAA,EAAM,EAAE,IAAA,EAAM,aAAA,EAAe,MAAM,EAAA,EAAI,WAAA,EAAa,EAAC;AAAE,SACxD;AAAA;AACH,KACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAA,CAAG,OAAO,4BAAA,EAA8B;AAAA,QACtC,YAAA,EAAc,WAAA;AAAA,QACd,IAAA,EAAM,EAAE,IAAA,EAAM,WAAA,EAAa,IAAI,KAAA,CAAM,MAAA,EAAQ,OAAA,EAAS,EAAC;AAAE,OAC1D,CAAA;AAAA,MACD,EAAA,CAAG,OAAO,uCAAA,EAAyC;AAAA,QACjD,SAAS,KAAA,CAAM,MAAA;AAAA,QACf,YAAA,EAAc,WAAA;AAAA,QACd,aAAA,EAAe,CAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,EAAA;AAAG,OACxC;AAAA;AACH,GACF;AACF;AAEA,SAAS,UAAA,CACP,KAAA,EACA,YAAA,EACA,IAAA,EACA,SAAA,EACwB;AACxB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,KAAW,SAAA,CAAU,KAAA,EAAO,cAAc,IAAI,CAAA;AAC7D,EAAA,KAAA,CAAM,IAAA,CAAK,OAAO,YAAY,CAAA;AAC9B,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,MAAMC,KAAAA,GAAO,WAAA,CAAY,KAAA,CAAM,MAAA,EAAQ,WAAW,WAAW,CAAA;AAC7D,IAAA,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,WAAA,EAAaA,KAAI,CAAA;AAC3C,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,EAAA,CAAG,OAAO,2BAAA,EAA6B;AAAA,QACrC,SAAS,KAAA,CAAM,MAAA;AAAA,QACf,cAAc,KAAA,CAAM,WAAA;AAAA,QACpB,aAAA,EAAe,CAAA;AAAA,QACf,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,MACD,EAAA,CAAG,OAAO,4BAAA,EAA8B;AAAA,QACtC,SAAS,KAAA,CAAM,MAAA;AAAA,QACf,cAAc,KAAA,CAAM,WAAA;AAAA,QACpB,aAAA,EAAe,CAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,EAAM,aAAA,EAAe,MAAM,SAAA,EAAW,WAAA,EAAa,EAAC;AAAE,OAC/D,CAAA;AAAA,MACD,EAAA,CAAG,OAAO,2BAAA,EAA6B,EAAE,cAAc,KAAA,CAAM,WAAA,EAAa,IAAA,EAAAA,KAAAA,EAAM;AAAA,KAClF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAA4B,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,SAAA,EAAU;AAC1E,EAAA,MAAM,IAAA,GAA8B,EAAE,IAAA,EAAM,WAAA,EAAa,EAAA,EAAI,MAAM,MAAA,EAAQ,OAAA,EAAS,CAAC,IAAI,CAAA,EAAE;AAC3F,EAAA,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,IAAI,CAAA;AAC3C,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,EAAA,CAAG,OAAO,sCAAA,EAAwC;AAAA,MAChD,SAAS,KAAA,CAAM,MAAA;AAAA,MACf,cAAc,KAAA,CAAM,WAAA;AAAA,MACpB,aAAA,EAAe,CAAA;AAAA,MACf,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,IACD,EAAA,CAAG,OAAO,sCAAA,EAAwC;AAAA,MAChD,SAAS,KAAA,CAAM,MAAA;AAAA,MACf,cAAc,KAAA,CAAM,WAAA;AAAA,MACpB,aAAA,EAAe,CAAA;AAAA,MACf;AAAA,KACD,CAAA;AAAA,IACD,EAAA,CAAG,OAAO,2BAAA,EAA6B,EAAE,cAAc,KAAA,CAAM,WAAA,EAAa,MAAM;AAAA,GAClF;AACA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,eAAA,CACd,OACA,KAAA,EACwB;AACxB,EAAA,MAAM,IAAA,GAAsB,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,SAAS,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AACvF,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,WAAW,cAAA,CAAe,IAAA,EAAM,aAAA,EAAe,IAAI,MAAS,CAAA;AAClE,MAAA,OAAO;AAAA,QACL,EAAA,CAAG,KAAA,EAAO,kBAAA,EAAoB,EAAE,UAAU,CAAA;AAAA,QAC1C,EAAA,CAAG,KAAA,EAAO,sBAAA,EAAwB,EAAE,UAAU;AAAA,OAChD;AAAA,IACF;AAAA,IACA,KAAK,YAAA;AACH,MAAA,OAAO,SAAA,CAAU,KAAA,EAAO,KAAA,CAAM,YAAA,EAAc,SAAS,CAAA,CAAE,MAAA;AAAA,IACzD,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,EAAE,OAAO,MAAA,EAAO,GAAI,UAAU,KAAA,EAAO,KAAA,CAAM,cAAc,SAAS,CAAA;AACxE,MAAA,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAA,CAAG,OAAO,4BAAA,EAA8B;AAAA,UACtC,SAAS,KAAA,CAAM,MAAA;AAAA,UACf,cAAc,KAAA,CAAM,WAAA;AAAA,UACpB,aAAA,EAAe,CAAA;AAAA,UACf,OAAO,KAAA,CAAM;AAAA,SACd;AAAA,OACH;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,IACA,KAAK,UAAA;AACH,MAAA,OAAO,WAAW,KAAA,EAAO,KAAA,CAAM,YAAA,EAAc,SAAA,EAAW,MAAM,OAAO,CAAA;AAAA,IACvE,KAAK,gBAAA;AACH,MAAA,OAAO,SAAA,CAAU,KAAA,EAAO,KAAA,CAAM,YAAA,EAAc,WAAW,CAAA,CAAE,MAAA;AAAA,IAC3D,KAAK,gBAAA,EAAkB;AACrB,MAAA,MAAM,EAAE,OAAO,MAAA,EAAO,GAAI,UAAU,KAAA,EAAO,KAAA,CAAM,cAAc,WAAW,CAAA;AAC1E,MAAA,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAA,CAAG,OAAO,uCAAA,EAAyC;AAAA,UACjD,SAAS,KAAA,CAAM,MAAA;AAAA,UACf,cAAc,KAAA,CAAM,WAAA;AAAA,UACpB,aAAA,EAAe,CAAA;AAAA,UACf,OAAO,KAAA,CAAM;AAAA,SACd;AAAA,OACH;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,IACA,KAAK,cAAA;AACH,MAAA,OAAO,WAAW,KAAA,EAAO,KAAA,CAAM,YAAA,EAAc,WAAA,EAAa,MAAM,OAAO,CAAA;AAAA,IACzE,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,cAAc,KAAA,CAAM,eAAA,EAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,IAAI,WAAW,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,SAAS,CAAA;AACpD,MAAA,MAAM,IAAA,GAAiC;AAAA,QACrC,IAAA,EAAM,eAAA;AAAA,QACN,EAAA;AAAA,QACA,OAAA,EAAS,MAAM,QAAA,CAAS,EAAA;AAAA,QACxB,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA;AAAA,QACrB,SAAA,EAAW,IAAA;AAAA,QACX,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,IAAI,CAAA;AACrC,MAAA,OAAO;AAAA,QACL,EAAA,CAAG,OAAO,4BAAA,EAA8B;AAAA,UACtC,YAAA,EAAc,WAAA;AAAA,UACd,MAAM,EAAE,GAAG,MAAM,SAAA,EAAW,EAAA,EAAI,QAAQ,aAAA;AAAc,SACvD,CAAA;AAAA,QACD,EAAA,CAAG,OAAO,wCAAA,EAA0C;AAAA,UAClD,OAAA,EAAS,EAAA;AAAA,UACT,YAAA,EAAc,WAAA;AAAA,UACd,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,QACD,EAAA,CAAG,OAAO,uCAAA,EAAyC;AAAA,UACjD,OAAA,EAAS,EAAA;AAAA,UACT,YAAA,EAAc,WAAA;AAAA,UACd,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,QACD,GAAG,KAAA,EAAO,2BAAA,EAA6B,EAAE,YAAA,EAAc,WAAA,EAAa,MAAM;AAAA,OAC5E;AAAA,IACF;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAA,CAAM,SAAA,CAAU,SAAS,CAAA,CAC3C,IAAA,CAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,CACxB,GAAA,CAAI,CAAC,GAAG,IAAI,CAAA,KAAM,IAAI,CAAA;AACzB,MAAA,MAAM,MAAA,GAAS,SAAS,MAAA,GAAS,CAAA,GAAI,WAAW,WAAA,CAAY,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,EAAE,CAAA;AACnF,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,KAAW,QAAA;AACpC,MAAA,MAAM,QAAA,GAAW,cAAA;AAAA,QACf,IAAA;AAAA,QACA,aAAa,YAAA,GAAe,WAAA;AAAA,QAC5B,MAAA;AAAA,QACA,MAAM,OAAA,CAAQ;AAAA,OAChB;AACA,MAAA,OAAO,CAAC,GAAG,KAAA,EAAO,UAAA,GAAa,wBAAwB,oBAAA,EAAsB,EAAE,QAAA,EAAU,CAAC,CAAA;AAAA,IAC5F;AAAA,IACA,KAAK,OAAA;AACH,MAAA,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,YAAA,IAAgB,CAAA,iBAAA,EAAoB,MAAM,MAAM,CAAA,CAAA;AAC1E,MAAA,OAAO,EAAC;AAAA,IACV;AACE,MAAA,OAAO,EAAC;AAAA;AAEd;;;ACllBA,IAAM,cAAA,GAAiB,KAAK,IAAA,GAAO,IAAA;AAEnC,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,oBAAA,EAAsB,kBAAkB,CAAC,CAAA;AAe7E,eAAsB,mBACpB,OAAA,EAC8B;AAC9B,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,EAAO,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAC/E,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,WAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,KAAQ,MAAM;AAAA,EAAC,CAAA,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,cAAA;AACnC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAExC,EAAA,MAAM,OAAO,OAAoB;AAAA,IAC/B,QAAA,EAAU,QAAQ,WAAA,EAAY;AAAA,IAC9B,SAAA,EAAW,QAAQ,YAAA,EAAa;AAAA,IAChC,KAAA,EAAO,QAAQ,QAAA;AAAW,GAC5B,CAAA;AAEA,EAAA,SAAS,aAAa,GAAA,EAA4B;AAChD,IAAA,MAAM,QAAQ,kBAAA,CAAmB,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,iBAAiB,EAAE,CAAA;AAErE,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,WAAW,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,kBAAA,CAAmB,GAAA,EAAK,iCAAA,EAAmC,iBAAiB,CAAA;AAAA,IACxF;AAAA,EACF;AAGA,EAAA,eAAe,aAAA,CACb,OAAA,EACA,QAAA,EACA,MAAA,EAC+C;AAC/C,IAAA,MAAM,EAAA,GAAK,MAAM,MAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,SAAS,KAAA,CAAM,GAAA;AAC/B,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,QAAQ,OAAO,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,GAAA;AAAA,QACA,CAAA,SAAA,EAAY,OAAO,CAAA,2CAAA,EAA8C,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AAAA,QACjF;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAW,cAAA,EAAgB,SAAA,KAAc,OAAA,CAAQ,OAAA;AACtE,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAI,SAAS,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAO,GAAI,EAAC;AAAA,MACnE,GAAI,SAAS,OAAA,GAAU,EAAE,SAAS,QAAA,CAAS,OAAA,KAAY,EAAC;AAAA,MACxD,MAAA;AAAA,MACA,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,MACnD,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MAC/C,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAE,cAAA,KAAmB;AAAC,KAC3D;AACA,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA;AAGnD,IAAA,IAAI,SAAA,KAAc,MAAA,IAAa,GAAA,CAAI,YAAA,EAAc;AAC/C,MAAA,OAAO,GAAA,CAAI,aAAa,QAAA,CAAS,KAAA,EAAO,SAAS,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,CAAA;AAAA,IAC3E;AACA,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,SAAS,MAAM,CAAA;AAAA,EACnD;AAEA,EAAA,eAAe,UAAA,CACb,GAAA,EACA,GAAA,EACA,MAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,OAAA,GAAU,0BAAA,CAA2B,MAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AAC9D,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA;AACnD,IAAA,KAAA,CAAM,SAAS,CAAA,EAAG,QAAA,CAAS,UAAU,CAAA,CAAA,EAAI,SAAS,SAAS,CAAA,CAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,OAAA,EAAS,UAAU,MAAM,CAAA;AAC5D,IAAA,MAAM,KAAK,CAAA,SAAA,EAAY,UAAA,GAAa,UAAA,CAAW,GAAA,EAAK,EAAE,CAAC,CAAA,CAAA;AACvD,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAE5C,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,MAAM,CAAA;AACzC,MAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,gBAAA,CAAiB,OAAA,EAAS,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA;AACnF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,qBAAA,CAAsB;AAAA,MAClC,EAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AACD,IAAA,MAAM,OAAA,CAAQ,KAAK,MAAA,EAAQ;AAAA,MACzB,MAAA,EAAQ,CAAC,KAAA,KAAU,oBAAA,CAAqB,OAAO,KAAK,CAAA;AAAA,MACpD,UAAA,EAAY,CAAC,OAAA,MAAa,EAAE,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,gBAAA,EAAiB,EAAE,CAAA;AAAA,MACvE,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAEA,EAAA,eAAe,eAAA,CACb,GAAA,EACA,GAAA,EACA,MAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,MAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA;AACnD,IAAA,KAAA,CAAM,SAAS,CAAA,EAAG,QAAA,CAAS,UAAU,CAAA,CAAA,EAAI,SAAS,SAAS,CAAA,CAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,OAAA,EAAS,UAAU,MAAM,CAAA;AAC5D,IAAA,MAAM,KAAK,CAAA,KAAA,EAAQ,UAAA,GAAa,UAAA,CAAW,GAAA,EAAK,EAAE,CAAC,CAAA,CAAA;AACnD,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAE5C,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,MAAM,CAAA;AACzC,MAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,UAAA,CAAW,OAAA,EAAS,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA;AAC7E,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,2BAA2B,EAAE,EAAA,EAAI,SAAS,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAC9E,IAAA,MAAM,OAAA,CAAQ,KAAK,MAAA,EAAQ;AAAA,MACzB,MAAA,EAAQ,CAAC,KAAA,KAAU,eAAA,CAAgB,OAAO,KAAK,CAAA;AAAA,MAC/C,UAAA,EAAY,CAAC,OAAA,MAAa,EAAE,IAAA,EAAM,SAAS,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,KAAA,EAAO,IAAA,EAAK,CAAA;AAAA,MACxF,SAAA,EAAW,CAAC,KAAA,KACVC,SAAAA,CAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,KAAA,CAAM,IAAA,GAAO;AAAA,KACpE,CAAA;AAAA,EACH;AAEA,EAAA,eAAe,gBAAA,CACb,GAAA,EACA,GAAA,EACA,MAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAG,CAAA;AAC/B,IAAA,IAAI,CAACA,SAAAA,CAAS,IAAI,CAAA,IAAK,OAAO,KAAK,KAAA,KAAU,QAAA,IAAY,IAAA,CAAK,KAAA,KAAU,EAAA,EAAI;AAC1E,MAAA,MAAM,IAAI,kBAAA,CAAmB,GAAA,EAAK,qBAAA,EAAuB,eAAe,CAAA;AAAA,IAC1E;AACA,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA;AAChD,IAAA,KAAA,CAAM,SAAS,CAAA,EAAG,QAAA,CAAS,UAAU,CAAA,CAAA,EAAI,SAAS,SAAS,CAAA,CAAA;AAC3D,IAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,GAAA;AAAA,QACA,CAAA,qCAAA,EAAwC,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,QAC1D;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAG,QAAA,CAAS;AAAA,KACd;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,SAAS,MAAM,CAAA,CAAA;AAEtE,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAA,CAAO,QAAQ,KAAA,IAAS,UAAA,CAAW,OAAO,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,WAAA,CAAA,EAAe;AAAA,QAC3F,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,GAAG,MAAM,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,EAAA,EAAI,CAAA;AAAA,QAC1D;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,OAAO,OAAA,EAAS;AACpB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,GAAA;AAAA,QACA,CAAA,iCAAA,EAAoC,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AAAA,QACpD;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AACxD,IAAA,GAAA,CAAI,SAAA,CAAU,SAAS,MAAA,EAAQ;AAAA,MAC7B,cAAA,EAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,kBAAA;AAAA,MACxD,kBAAkB,OAAA,CAAQ;AAAA,KAC3B,CAAA;AACD,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AAAA,EACjB;AAEA,EAAA,eAAe,QAAA,CACb,GAAA,EACA,GAAA,EACA,MAAA,EACA,MACA,KAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,MAAM,SAAS,IAAI,CAAA;AACjD,IAAA,YAAA,CAAa,GAAG,CAAA;AAChB,IAAA,QAAQ,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAI,MAC/B,KAAK,gBAAA;AACH,QAAA,QAAA,CAAS,KAAK,GAAA,EAAK;AAAA,UACjB,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,WAAW,OAAA,CAAQ,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YAClD,IAAI,CAAA,CAAE,EAAA;AAAA,YACN,MAAA,EAAQ,OAAA;AAAA,YACR,OAAA,EAAS,CAAA;AAAA,YACT,UAAU,CAAA,CAAE;AAAA,WACd,CAAE;AAAA,SACH,CAAA;AACD,QAAA;AAAA,MACF,KAAK,2BAAA;AACH,QAAA,OAAO,UAAA,CAAW,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,MAC3C,KAAK,oBAAA;AACH,QAAA,OAAO,eAAA,CAAgB,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,MAChD,KAAK,qBAAA;AACH,QAAA,OAAO,gBAAA,CAAiB,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,MACjD;AACE,QAAA,MAAM,SAAS,IAAI,CAAA;AAAA;AACvB,EACF;AAEA,EAAA,eAAe,MAAA,CAAO,KAAsB,GAAA,EAAoC;AAC9E,IAAA,MAAM,OAAA,GAAU,YAAY,GAAA,EAAI;AAChC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AAGvC,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM;AACpB,MAAA,IAAI,CAAC,GAAA,CAAI,gBAAA,EAAkB,UAAA,CAAW,KAAA,EAAM;AAAA,IAC9C,CAAC,CAAA;AACD,IAAA,MAAM,QAAe,EAAC;AACtB,IAAA,IAAI,IAAA,GAAO,IAAI,GAAA,IAAO,GAAA;AACtB,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,YAAY,GAAG,CAAA;AACtB,MAAA,MAAM,SAAS,GAAA,EAAK,GAAA,EAAK,UAAA,CAAW,MAAA,EAAQ,MAAM,KAAK,CAAA;AAAA,IACzD,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,EAAE,eAAe,kBAAA,CAAA,EAAqB;AACxC,QAAA,GAAA;AAAA,UACE,CAAA,MAAA,EAAS,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,GAAA,YAAe,KAAA,GAAS,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,OAAA,GAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,SACjG;AAAA,MACF;AACA,MAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,IACpB,CAAA,SAAE;AACA,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,KAAQ,OAAO,CAAA;AACjD,MAAA,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,IAAU,GAAG,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI,EAAE,CAAA,EAAA,CAAI,CAAA;AAAA,IAC9E;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,CAAC,GAAA,EAAK,GAAA,KAAQ;AACxC,IAAA,KAAK,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,EACtB,CAAC,CAAA;AACD,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM,CAAA;AAC3B,IAAA,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,IAAQ,CAAA,EAAG,MAAM,MAAM;AAC3C,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,MAAM,CAAA;AAC1B,MAAA,OAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,EAAQ;AAC/B,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA,GAAM,IAAA;AACpD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,GAAA,CAAA;AAAA,IACvC,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,OAAO,MACL,IAAI,OAAA,CAAc,CAAC,SAAS,MAAA,KAAW;AACrC,MAAA,MAAA,CAAO,KAAA,CAAM,CAAC,GAAA,KAAS,GAAA,GAAM,OAAO,GAAG,CAAA,GAAI,SAAU,CAAA;AACrD,MAAA,MAAA,CAAO,mBAAA,IAAsB;AAAA,IAC/B,CAAC;AAAA,GACL;AACF;AAKA,eAAe,MAAA,GAA0D;AACvE,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,OAAO,uBAAuB,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,GAAA;AAAA,MACA,CAAA,kEAAA,EAAgE,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,MAChF,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAGA,eAAe,eAAe,OAAA,EAAuC;AACnE,EAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,QAAS,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAA,CAAG,CAAA;AACjF,EAAA,OAAQ,MAAM;AAAA;AAAA,IAA0B,6BAA6B,OAAO,CAAA;AAAA,GAAA;AAC9E;AAKA,eAAe,aACb,MAAA,EAC2B;AAC3B,EAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ,OAAO,KAAA,CAAM,OAAA;AACxC,IAAA,IAAI,MAAM,IAAA,KAAS,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,KAAK,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,IAAI,kBAAA;AAAA,IACR,GAAA;AAAA,IACA,wCAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,gBAAgB,OAAA,EAA+C;AACtE,EAAA,OAAO,IAAI,kBAAA;AAAA,IACT,GAAA;AAAA,IACA,OAAA,CAAQ,YAAA,IAAgB,CAAA,SAAA,EAAY,OAAA,CAAQ,UAAU,CAAA,CAAA;AAAA,IACtD;AAAA,GACF;AACF;AAkBA,eAAe,OAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EACe;AACf,EAAA,IAAI,GAAA;AACJ,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,KAAsB;AAC3C,IAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAM,GAAA,EAAK,KAAK,KAAA,EAAO,IAAA,CAAK,SAAA,GAAY,KAAK,CAAC,CAAA;AAAA,EAC5E,CAAA;AACA,EAAA,IAAI;AACF,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,IAAI,MAAM,IAAA,KAAS,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,KAAK,CAAA;AAC7D,QAAA,GAAA,GAAM,QAAQ,GAAG,CAAA;AAAA,MACnB;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,MAAM,OAAA,CAAQ,CAAC,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,YAAA,IAAgB,CAAA,SAAA,EAAY,KAAA,CAAM,MAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AACvF,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAClC;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,CAAC,KAAK,MAAM,GAAA;AAChB,IAAA,MAAM,OAAA,CAAQ,CAAC,IAAA,CAAK,UAAA,CAAW,UAAU,GAAG,CAAC,CAAC,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,CAAC,GAAA;AACH,IAAA,MAAM,IAAI,kBAAA,CAAmB,GAAA,EAAK,+BAAA,EAAiC,qBAAqB,CAAA;AAC1F,EAAA,IAAI,KAAK,UAAA,EAAY,MAAM,GAAA,CAAI,GAAA,CAAI,KAAK,UAAU,CAAA;AAClD,EAAA,GAAA,CAAI,GAAA,EAAI;AACV;AAOA,SAAS,QAAQ,GAAA,EAA0B;AACzC,EAAA,GAAA,CAAI,UAAU,GAAA,EAAK;AAAA,IACjB,cAAA,EAAgB,mBAAA;AAAA,IAChB,eAAA,EAAiB,UAAA;AAAA,IACjB,UAAA,EAAY;AAAA,GACb,CAAA;AACD,EAAA,GAAA,CAAI,YAAA,EAAa;AACjB,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,KAAgC;AACnD,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,aAAA,EAAe;AACxC,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,GAAA,CAAI,GAAA,CAAI,SAAS,IAAI,CAAA;AACrB,QAAA,GAAA,CAAI,GAAA,CAAI,SAAS,IAAI,CAAA;AACrB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA;AACtB,MAAA,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAC,KAAA,EAAO,SAAA,KACZ,MAAM,CAAA,EAAG,SAAA,GAAY,UAAU,SAAS;AAAA,CAAA,GAAO,EAAE,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC;;AAAA,CAAM,CAAA;AAAA,IACvF,GAAA,EAAK,CAAC,IAAA,KAAS,KAAA,CAAM,SAAS,IAAI;;AAAA,CAAM;AAAA,GAC1C;AACF;AAIA,SAAS,QAAA,CAAS,GAAA,EAAqB,MAAA,EAAgB,IAAA,EAAqB;AAC1E,EAAA,IAAI,IAAI,aAAA,EAAe;AACvB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACnC,EAAA,GAAA,CAAI,UAAU,MAAA,EAAQ;AAAA,IACpB,cAAA,EAAgB,kBAAA;AAAA,IAChB,gBAAA,EAAkB,MAAA,CAAO,UAAA,CAAW,OAAO;AAAA,GAC5C,CAAA;AACD,EAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACjB;AAEA,SAAS,SAAA,CAAU,KAAqB,GAAA,EAAoB;AAC1D,EAAA,IAAI,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,SAAA,EAAW;AACxC,EAAA,IAAI,IAAI,WAAA,EAAa;AACnB,IAAA,GAAA,CAAI,GAAA,EAAI;AACR,IAAA;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GACJ,eAAe,kBAAA,GACX,GAAA,GACA,IAAI,kBAAA,CAAmB,GAAA,EAAK,uBAAA,EAAyB,MAAA,EAAW,cAAc,CAAA;AACpF,EAAA,IAAI,QAAQ,MAAA,KAAW,GAAA,EAAK,GAAA,CAAI,SAAA,CAAU,cAAc,OAAO,CAAA;AAC/D,EAAA,QAAA,CAAS,GAAA,EAAK,QAAQ,MAAA,EAAQ;AAAA,IAC5B,KAAA,EAAO;AAAA,MACL,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC;AAC7D,GACD,CAAA;AACH;AAEA,SAAS,SAAS,IAAA,EAAkC;AAClD,EAAA,OAAO,IAAI,kBAAA,CAAmB,GAAA,EAAK,kBAAkB,IAAI,CAAA,CAAA,CAAA,EAAK,QAAW,uBAAuB,CAAA;AAClG;AAEA,SAAS,YAAY,GAAA,EAA8B;AACjD,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,IAAI,GAAA,IAAO,GAAA,EAAK,kBAAkB,CAAA,EAAG;AACrD,IAAA,MAAM,IAAI,kBAAA,CAAmB,GAAA,EAAK,wBAAwB,CAAA;AAAA,EAC5D;AACA,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,IAAI,GAAA,IAAO,GAAA,EAAK,kBAAkB,CAAA,CAAE,QAAA;AACzD,EAAA,OAAO,KAAK,MAAA,GAAS,CAAA,GAAI,KAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,GAAI,IAAA;AACtD;AAEA,eAAe,SAAS,GAAA,EAAwC;AAC9D,EAAA,MAAM,QAAA,GAAW,MACf,IAAI,kBAAA,CAAmB,KAAK,CAAA,qBAAA,EAAwB,cAAc,UAAU,gBAAgB,CAAA;AAC9F,EAAA,IAAI,MAAA,CAAO,IAAI,OAAA,CAAQ,gBAAgB,CAAC,CAAA,GAAI,cAAA,QAAsB,QAAA,EAAS;AAC3E,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,WAAA,MAAiBC,UAAS,GAAA,EAAK;AAC7B,IAAA,MAAM,MAAA,GAASA,MAAAA;AACf,IAAA,IAAA,IAAQ,MAAA,CAAO,MAAA;AACf,IAAA,IAAI,IAAA,GAAO,cAAA,EAAgB,MAAM,QAAA,EAAS;AAC1C,IAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,EACpB;AACA,EAAA,MAAM,OAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AAClD,EAAA,IAAI,IAAA,CAAK,MAAK,KAAM,EAAA,QAAU,IAAI,kBAAA,CAAmB,GAAA,EAAK,uBAAA,EAAyB,YAAY,CAAA;AAC/F,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,kBAAA,CAAmB,GAAA,EAAK,gCAAA,EAAkC,cAAc,CAAA;AAAA,EACpF;AACF;AAEA,SAAS,OAAO,KAAA,EAAuB;AACrC,EAAA,OAAO,WAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,KAAK,EAAE,MAAA,EAAO;AACnD;AAEA,SAASD,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACxD","file":"chunk-OKQXY6FS.js","sourcesContent":["/**\n * Shared types of the model endpoint.\n *\n * Only type-only imports from pi-ai live here (erased at build), so the\n * translators and the server can depend on this file without loading pi-ai.\n * pi-ai is an optional peer; it is loaded lazily per request.\n */\n\nimport type {\n Api,\n AssistantMessageEventStream,\n Model,\n StreamOptions,\n TranscriptContext,\n} from \"@earendil-works/pi-ai\";\nimport type { MergedAIProviderRegistry } from \"@skaile/workspaces/core/provider-registry\";\n\n/** Everything one upstream call needs. */\nexport interface ResolvedModel {\n /** Registry id of the entry the model routes to. */\n providerId: string;\n /** Model id the caller asked for, after `@role` / provider-prefix stripping. */\n logicalId: string;\n /** pi model: `api` = entry surface, `baseUrl` = pi-ready entry endpoint, `id` = provider-side id (`model_map`). */\n model: Model<Api>;\n /** Resolved credential; `undefined` only for entries with an ambient credential chain. */\n apiKey?: string;\n /** Static `entry.headers`. */\n headers?: Record<string, string>;\n}\n\n/** One request-log line sink. */\nexport type ModelEndpointLog = (line: string) => void;\n\n/** pi-ai's per-surface `stream`, widened to the shape the server calls. */\nexport type StreamFn = (\n model: Model<Api>,\n context: TranscriptContext,\n options?: StreamOptions & Record<string, unknown>,\n) => AssistantMessageEventStream;\n\n/** The parts of a pi-ai `api/<surface>` module the server calls. */\nexport interface PiApiModule {\n stream: StreamFn;\n streamSimple?: StreamFn;\n}\n\n/** Options of `startModelEndpoint`. */\nexport interface ModelEndpointOptions {\n /** Live registry view; read on every request so a `session_init` can swap it. */\n getRegistry(): MergedAIProviderRegistry;\n /** Env that credential refs and `SKAILE_AIP_<ID>_KEY` values resolve against; read per request. */\n getLookupEnv(): Record<string, string | undefined>;\n /** Roles table for `@role` selectors. */\n getRoles?(): Record<string, string> | undefined;\n /** Bearer token every request must present. */\n token: string;\n /** Bind address. Default `\"127.0.0.1\"`. */\n host?: string;\n /** Bind port. Default `0` (ephemeral). */\n port?: number;\n /** Request-log sink. */\n log?: ModelEndpointLog;\n /**\n * Test seam: override pi-ai api loading. Default: dynamic import of `@earendil-works/pi-ai/api/<surface>`.\n * `streamSimple` (every pi api module exports it) is used when the request asks for reasoning:\n * only it maps a provider-neutral thinking level onto the surface's own effort field.\n */\n loadApi?(surface: string): Promise<PiApiModule>;\n /** Test seam for the `/v1/embeddings` pass-through. Default `globalThis.fetch`. */\n fetch?: typeof fetch;\n}\n\n/** A running endpoint. */\nexport interface ModelEndpointHandle {\n /** `http://${host}:${port}/v1` — what an OpenAI SDK takes as `baseURL`. */\n url: string;\n port: number;\n token: string;\n close(): Promise<void>;\n}\n\n/** The OpenAI error `type` values the endpoint emits. */\nexport type ModelEndpointErrorType =\n | \"invalid_request_error\"\n | \"authentication_error\"\n | \"not_found_error\"\n | \"upstream_error\"\n | \"server_error\";\n\n/**\n * A failure with a defined HTTP shape. Translators and the resolver throw it\n * so the server can render the OpenAI-style `{ error: {...} }` body without\n * each call site knowing about HTTP.\n */\nexport class ModelEndpointError extends Error {\n readonly status: number;\n readonly type: ModelEndpointErrorType;\n readonly code?: string;\n\n constructor(status: number, message: string, code?: string, type?: ModelEndpointErrorType) {\n super(message);\n this.name = \"ModelEndpointError\";\n this.status = status;\n this.type = type ?? defaultErrorType(status);\n if (code !== undefined) this.code = code;\n }\n}\n\n/** Default OpenAI `type` for an HTTP status. */\nfunction defaultErrorType(status: number): ModelEndpointErrorType {\n if (status === 401 || status === 403) return \"authentication_error\";\n if (status === 404) return \"not_found_error\";\n if (status === 502 || status === 503 || status === 504) return \"upstream_error\";\n if (status >= 500 && status !== 501) return \"server_error\";\n return \"invalid_request_error\";\n}\n","/**\n * Registry → pi `Model` + request auth.\n *\n * Reuses the registry's own resolution (`parseModelRef`, `entrySurface`,\n * `entryBaseUrl`, `entryCredentialValue`) so the endpoint routes exactly like a\n * harness driver does; the only logic added here is the pi-specific base-URL\n * spelling and the \"unknown model\" check `parseModelRef` does not make.\n */\n\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport {\n type AIProviderLlmEntry,\n type AIProviderSurface,\n type MergedAIProviderRegistry,\n parseModelRef,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { entryCredentialValue } from \"../../bridge/src/provider-materialize/credential-env.js\";\nimport {\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n selectableEntries,\n} from \"../../bridge/src/provider-materialize/env-drivers.js\";\nimport { ModelEndpointError, type ResolvedModel } from \"./types.js\";\n\n/** What {@link resolveModel} reads from the live session. */\nexport interface ResolveDeps {\n registry: MergedAIProviderRegistry;\n lookupEnv: Record<string, string | undefined>;\n roles?: Record<string, string>;\n}\n\n/** Context window assumed when an entry declares no `capabilities`. */\nconst DEFAULT_CONTEXT_WINDOW = 128_000;\n/** pi requires a max-token figure; the caller's `max_tokens` overrides it per request. */\nconst DEFAULT_MAX_TOKENS = 8192;\n/** Placeholder for keyless entries: pi's OpenAI adapter refuses an empty key. */\nconst KEYLESS_PLACEHOLDER = \"unused\";\n\n/**\n * The `baseUrl` pi-ai wants for a registry endpoint — the registry's canonical\n * value, minus trailing slashes. Verified against pi-ai 1.3.0 `dist/api/*`:\n *\n * - `anthropic-messages`: `new Anthropic({ baseURL: model.baseUrl })`; the SDK\n * appends `/v1/messages`. The registry stores Anthropic as its host root\n * (`normalizeEntryBaseUrl` strips a trailing `/v1`), which is what the SDK needs.\n * - `openai-completions` / `openai-responses`: `new OpenAI({ baseURL })`; the SDK\n * appends `/chat/completions` / `/responses`. OpenAI-style presets already carry\n * their `/v1` (openai, groq, openrouter, mistral, xai); deepseek serves the\n * same paths at its host root.\n * - `google-generative-ai`: pi sets `apiVersion: \"\"` and expects the version in\n * `baseUrl`; the preset already ends in `/v1beta`.\n * - Other surfaces (azure, bedrock, vertex, codex) are passed through unverified.\n *\n * Trailing slashes are dropped because Google's client concatenates `baseUrl` and\n * the path without normalising.\n */\nfunction piBaseUrl(_surface: AIProviderSurface, registryBaseUrl: string): string {\n return registryBaseUrl.replace(/\\/+$/, \"\");\n}\n\n/**\n * Resolve a request's `model` selector to everything one upstream call needs.\n *\n * The selector is `<providerId>/<model>`, a bare model id, or `@role`\n * (see `parseModelRef`). An entry that declares models (`model_map` /\n * `capabilities`) is a closed list: ids outside it are 404, matching what\n * `/v1/models` advertises. An entry that declares none is open and forwards the\n * id to the provider unchanged (discovery-based presets).\n */\nexport function resolveModel(selector: string, deps: ResolveDeps): ResolvedModel {\n const ref = parseModelRef(selector, deps.registry, deps.roles);\n if (!ref || ref.modelId === undefined) {\n throw new ModelEndpointError(404, `model '${selector}' not found`, \"model_not_found\");\n }\n const found = selectableEntries(deps.registry).find(([id]) => id === ref.providerId);\n if (!found) {\n throw new ModelEndpointError(404, `model '${selector}' not found`, \"model_not_found\");\n }\n const [providerId, entry] = found;\n const logicalId = ref.modelId;\n\n const declared = entryModelIds(entry);\n if (declared.length > 0 && !declared.some(([id]) => id === logicalId)) {\n throw new ModelEndpointError(\n 404,\n `model '${logicalId}' is not declared by provider '${providerId}'`,\n \"model_not_found\",\n );\n }\n\n const surface = entrySurface(entry);\n const baseUrl = entryBaseUrl(entry);\n if (!surface || !baseUrl) {\n throw new ModelEndpointError(\n 502,\n `provider '${providerId}' is incomplete: it needs a surface and a base_url`,\n \"provider_incomplete\",\n );\n }\n\n const providerModelId = ref.providerModelId ?? logicalId;\n const caps = entry.capabilities?.[logicalId];\n const model: Model<Api> = {\n id: providerModelId,\n name: logicalId,\n api: surface,\n provider: providerId,\n baseUrl: piBaseUrl(surface, baseUrl),\n input: caps?.images === false ? [\"text\"] : [\"text\", \"image\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n reasoning: true,\n contextWindow: caps?.context_window ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: DEFAULT_MAX_TOKENS,\n ...(entry.headers ? { headers: entry.headers } : {}),\n };\n\n const apiKey =\n entryCredentialValue(providerId, entry, { env: deps.lookupEnv, allowCommand: false }) ??\n (isKeyless(entry) ? KEYLESS_PLACEHOLDER : undefined);\n\n return {\n providerId,\n logicalId,\n model,\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(entry.headers ? { headers: entry.headers } : {}),\n };\n}\n\n/** True when the entry names no credential at all (local runtimes such as Ollama). */\nfunction isKeyless(entry: AIProviderLlmEntry): boolean {\n return !entry.preset && (!entry.credential || entry.credential.kind === \"none\");\n}\n\n/**\n * Every model a caller can name, as `/v1/models` entries: ids are\n * `<providerId>/<logicalId>` so two providers serving the same logical id stay\n * distinguishable. Bare logical ids remain accepted on request.\n */\nexport function listModels(\n registry: MergedAIProviderRegistry,\n): Array<{ id: string; owned_by: string }> {\n return selectableEntries(registry).flatMap(([providerId, entry]) =>\n entryModelIds(entry).map(([logicalId]) => ({\n id: `${providerId}/${logicalId}`,\n owned_by: providerId,\n })),\n );\n}\n","import type {\n AssistantMessage,\n Context,\n ImageContent,\n JsonObject,\n Message,\n SamplingParams,\n ThinkingLevel,\n Tool,\n ToolResultMessage,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Model-call options both OpenAI surfaces translate into pi `stream()` options. */\nexport interface ModelRequestOptions {\n temperature?: number;\n maxTokens?: number;\n samplingParams?: SamplingParams;\n reasoning?: ThinkingLevel;\n}\n\n/**\n * Surface-independent result of parsing an OpenAI request. Both translators\n * return this so the server can drive pi without knowing which wire format\n * the caller spoke.\n */\nexport interface ParsedModelRequest {\n model: string;\n context: Context;\n options: ModelRequestOptions;\n stream: boolean;\n includeUsage: boolean;\n}\n\nconst THINKING_LEVELS: readonly ThinkingLevel[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n];\n\n/** `400 invalid_request_error` for malformed or unsupported caller input. */\nexport function badRequest(message: string): ModelEndpointError {\n return new ModelEndpointError(400, message);\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function requireModel(body: Record<string, unknown>): string {\n if (typeof body.model !== \"string\" || body.model.length === 0) {\n throw badRequest(\"model is required\");\n }\n return body.model;\n}\n\nexport function optionalBoolean(value: unknown, field: string): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value !== \"boolean\") throw badRequest(`${field} must be a boolean`);\n return value;\n}\n\nexport function optionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw badRequest(`${field} must be a number`);\n return value;\n}\n\nexport function optionalPositiveInt(value: unknown, field: string): number | undefined {\n const n = optionalNumber(value, field);\n if (n === undefined) return undefined;\n if (!Number.isInteger(n) || n <= 0) throw badRequest(`${field} must be a positive integer`);\n return n;\n}\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return (THINKING_LEVELS as readonly string[]).includes(value);\n}\n\n/** `none` (or absent) disables reasoning; anything else must be a pi thinking level. */\nexport function parseReasoningEffort(value: unknown, field: string): ThinkingLevel | undefined {\n if (value === undefined || value === null || value === \"none\") return undefined;\n if (typeof value === \"string\" && isThinkingLevel(value)) return value;\n throw badRequest(`${field} must be one of none, ${THINKING_LEVELS.join(\", \")}`);\n}\n\n/**\n * Copies request fields pi has no named option for (top_p, seed, stop, ...)\n * into `samplingParams`, which OpenAI-compatible pi adapters merge into the\n * upstream body as-is.\n */\nexport function pickSamplingParams(\n body: Record<string, unknown>,\n keys: readonly string[],\n): SamplingParams | undefined {\n const picked: SamplingParams = {};\n for (const key of keys) {\n const value = body[key];\n if (value === undefined || value === null) continue;\n const ok =\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value)) ||\n (Array.isArray(value) && value.every((v) => typeof v === \"string\"));\n if (!ok) throw badRequest(`${key} has an unsupported type`);\n picked[key] = value;\n }\n return Object.keys(picked).length > 0 ? picked : undefined;\n}\n\nexport function buildOptions(parts: {\n temperature: number | undefined;\n maxTokens: number | undefined;\n samplingParams: SamplingParams | undefined;\n reasoning: ThinkingLevel | undefined;\n}): ModelRequestOptions {\n const options: ModelRequestOptions = {};\n if (parts.temperature !== undefined) options.temperature = parts.temperature;\n if (parts.maxTokens !== undefined) options.maxTokens = parts.maxTokens;\n if (parts.samplingParams !== undefined) options.samplingParams = parts.samplingParams;\n if (parts.reasoning !== undefined) options.reasoning = parts.reasoning;\n return options;\n}\n\nconst DATA_URL = /^data:([^;,]+)(?:;[^;,]*)*;base64,(.*)$/s;\n\n/**\n * Decodes a `data:` image URL into pi `ImageContent`. Remote URLs are rejected\n * on purpose: fetching caller-supplied URLs from the runner would be an SSRF\n * vector and the endpoint has no business doing I/O during translation.\n */\nexport function imageFromUrl(url: unknown, field: string): ImageContent {\n if (typeof url !== \"string\" || url.length === 0)\n throw badRequest(`${field} must be a non-empty string`);\n const match = DATA_URL.exec(url);\n if (!match) {\n throw badRequest(\n `${field}: only base64 data: image URLs are supported; http(s) image URLs are not fetched`,\n );\n }\n const mimeType = match[1] as string;\n if (!mimeType.startsWith(\"image/\"))\n throw badRequest(`${field}: data URL is not an image (${mimeType})`);\n return { type: \"image\", data: match[2] as string, mimeType };\n}\n\n/**\n * Tool `arguments` arrive as a JSON string; pi wants an object. Invalid JSON or a\n * non-object value becomes `{}` so one malformed history entry cannot fail the call.\n */\nexport function parseToolArguments(value: unknown): JsonObject {\n if (isRecord(value)) return value as JsonObject;\n if (typeof value !== \"string\" || value.trim().length === 0) return {};\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? (parsed as JsonObject) : {};\n } catch {\n return {};\n }\n}\n\nexport const DEFAULT_TOOL_PARAMETERS = { type: \"object\", properties: {} } as const;\n\nexport function toPiTool(name: string, description: unknown, parameters: unknown): Tool {\n return {\n name,\n description: typeof description === \"string\" ? description : \"\",\n parameters: (isRecord(parameters) ? parameters : DEFAULT_TOOL_PARAMETERS) as Tool[\"parameters\"],\n };\n}\n\n/**\n * Applies OpenAI `tool_choice` to the tool list. pi's `stream()` has no\n * tool-choice option, so the choice is enforced by what we declare: `none`\n * declares nothing, a named function declares only that function.\n */\nexport function selectTools(\n tools: Tool[],\n choice: unknown,\n forcedName: (choice: Record<string, unknown>) => unknown,\n): Tool[] {\n if (choice === undefined || choice === null || choice === \"auto\" || choice === \"required\")\n return tools;\n if (choice === \"none\") return [];\n if (isRecord(choice)) {\n const name = forcedName(choice);\n const matched = tools.filter((tool) => tool.name === name);\n if (typeof name !== \"string\" || matched.length === 0) {\n throw badRequest(\"tool_choice references an unknown function\");\n }\n return matched;\n }\n throw badRequest(\"tool_choice is not supported\");\n}\n\nexport function buildContext(systemParts: string[], messages: Message[], tools: Tool[]): Context {\n const context: Context = { messages };\n if (systemParts.length > 0) context.systemPrompt = systemParts.join(\"\\n\\n\");\n if (tools.length > 0) context.tools = tools;\n return context;\n}\n\nexport function emptyUsage(): Usage {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\n/** OpenAI counts cache reads/writes as prompt tokens; pi reports them separately. */\nexport function promptTokens(usage: Usage): number {\n return usage.input + usage.cacheRead + usage.cacheWrite;\n}\n\nexport function totalTokens(usage: Usage): number {\n return usage.totalTokens > 0 ? usage.totalTokens : promptTokens(usage) + usage.output;\n}\n\n/**\n * An assistant turn replayed from the caller's history. It is stamped with a\n * foreign api/provider so pi treats it as cross-provider history (dropping\n * provider-specific signatures) rather than as its own output.\n */\nexport function historyAssistant(\n model: string,\n content: AssistantMessage[\"content\"],\n): AssistantMessage {\n return {\n role: \"assistant\",\n content,\n api: \"openai-completions\",\n provider: \"openai\",\n model,\n usage: emptyUsage(),\n stopReason: content.some((block) => block.type === \"toolCall\") ? \"toolUse\" : \"stop\",\n timestamp: Date.now(),\n };\n}\n\nexport function historyToolResult(\n toolCallId: string,\n toolName: string,\n text: string,\n): ToolResultMessage {\n return {\n role: \"toolResult\",\n toolCallId,\n toolName,\n content: [{ type: \"text\", text }],\n isError: false,\n timestamp: Date.now(),\n };\n}\n","import type {\n AssistantMessage,\n AssistantMessageEvent,\n ImageContent,\n Message,\n StopReason,\n TextContent,\n Tool,\n} from \"@earendil-works/pi-ai\";\nimport {\n badRequest,\n buildContext,\n buildOptions,\n historyAssistant,\n historyToolResult,\n imageFromUrl,\n isRecord,\n optionalBoolean,\n optionalNumber,\n optionalPositiveInt,\n type ParsedModelRequest,\n parseReasoningEffort,\n parseToolArguments,\n pickSamplingParams,\n promptTokens,\n requireModel,\n selectTools,\n toPiTool,\n totalTokens,\n} from \"./openai-shared.js\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Parsed `POST /v1/chat/completions` body, in pi terms. */\nexport type ChatCompletionRequest = ParsedModelRequest;\n\nexport type ChatFinishReason = \"stop\" | \"length\" | \"tool_calls\";\n\nexport interface ChatCompletionToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\nexport interface ChatCompletionMessage {\n role: \"assistant\";\n content: string | null;\n reasoning_content?: string;\n tool_calls?: ChatCompletionToolCall[];\n}\n\nexport interface ChatCompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details: { cached_tokens: number };\n completion_tokens_details?: { reasoning_tokens: number };\n}\n\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n choices: Array<{ index: 0; message: ChatCompletionMessage; finish_reason: ChatFinishReason }>;\n usage: ChatCompletionUsage;\n}\n\nexport interface ChatCompletionChunkDelta {\n role?: \"assistant\";\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<{ index: number } & ChatCompletionToolCall>;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: Array<{\n index: 0;\n delta: ChatCompletionChunkDelta;\n finish_reason: ChatFinishReason | null;\n }>;\n usage?: ChatCompletionUsage;\n}\n\nexport interface ChatResponseMeta {\n id: string;\n created: number;\n model: string;\n}\n\n// ── request ─────────────────────────────────────────────────────────────────\n\nfunction textOfParts(content: unknown, field: string, allowed: readonly string[]): string {\n if (content === undefined || content === null) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of text parts`);\n let text = \"\";\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n if (!isRecord(part) || typeof part.type !== \"string\" || !allowed.includes(part.type)) {\n throw badRequest(`${field}[${i}]: unsupported content part`);\n }\n const value = part.type === \"refusal\" ? part.refusal : part.text;\n if (typeof value !== \"string\")\n throw badRequest(\n `${field}[${i}].${part.type === \"refusal\" ? \"refusal\" : \"text\"} must be a string`,\n );\n text += value;\n }\n return text;\n}\n\nfunction parseUserContent(\n content: unknown,\n field: string,\n): string | (TextContent | ImageContent)[] {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of content parts`);\n const parts: (TextContent | ImageContent)[] = [];\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n const partField = `${field}[${i}]`;\n if (!isRecord(part)) throw badRequest(`${partField} must be an object`);\n if (part.type === \"text\") {\n if (typeof part.text !== \"string\") throw badRequest(`${partField}.text must be a string`);\n parts.push({ type: \"text\", text: part.text });\n } else if (part.type === \"image_url\") {\n const url = isRecord(part.image_url) ? part.image_url.url : part.image_url;\n parts.push(imageFromUrl(url, `${partField}.image_url.url`));\n } else {\n throw badRequest(`${partField}: unsupported content part type \"${String(part.type)}\"`);\n }\n }\n return parts;\n}\n\nfunction parseAssistantMessage(\n raw: Record<string, unknown>,\n field: string,\n model: string,\n toolNames: Map<string, string>,\n): AssistantMessage | undefined {\n const blocks: AssistantMessage[\"content\"] = [];\n const text = textOfParts(raw.content, `${field}.content`, [\"text\", \"refusal\"]);\n if (text.length > 0) blocks.push({ type: \"text\", text });\n if (raw.tool_calls !== undefined && raw.tool_calls !== null) {\n if (!Array.isArray(raw.tool_calls)) throw badRequest(`${field}.tool_calls must be an array`);\n for (let i = 0; i < raw.tool_calls.length; i++) {\n const call: unknown = raw.tool_calls[i];\n const callField = `${field}.tool_calls[${i}]`;\n if (!isRecord(call) || !isRecord(call.function))\n throw badRequest(`${callField} must be a function tool call`);\n if (call.type !== undefined && call.type !== \"function\")\n throw badRequest(`${callField}.type must be \"function\"`);\n if (typeof call.id !== \"string\" || call.id.length === 0)\n throw badRequest(`${callField}.id is required`);\n if (typeof call.function.name !== \"string\" || call.function.name.length === 0) {\n throw badRequest(`${callField}.function.name is required`);\n }\n toolNames.set(call.id, call.function.name);\n blocks.push({\n type: \"toolCall\",\n id: call.id,\n name: call.function.name,\n arguments: parseToolArguments(call.function.arguments),\n });\n }\n }\n // An empty assistant turn carries no information and some upstreams reject it.\n return blocks.length > 0 ? historyAssistant(model, blocks) : undefined;\n}\n\nfunction parseTools(value: unknown): Tool[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) throw badRequest(\"tools must be an array\");\n const tools: Tool[] = [];\n for (let i = 0; i < value.length; i++) {\n const tool: unknown = value[i];\n if (!isRecord(tool) || tool.type !== \"function\" || !isRecord(tool.function)) {\n throw badRequest(`tools[${i}] must be {type:\"function\", function:{...}}`);\n }\n const fn = tool.function;\n if (typeof fn.name !== \"string\" || fn.name.length === 0)\n throw badRequest(`tools[${i}].function.name is required`);\n tools.push(toPiTool(fn.name, fn.description, fn.parameters));\n }\n return tools;\n}\n\n/**\n * Validates an OpenAI chat-completions body and maps it to a pi `Context`.\n * System/developer messages collapse into `systemPrompt`; a tool message's\n * `toolName` is recovered from the earlier assistant `tool_calls` entry with the\n * same id because pi tool results carry the tool name and OpenAI's do not.\n * Unsupported features fail loudly with 400 instead of being silently dropped.\n */\nexport function parseChatCompletionRequest(body: unknown): ChatCompletionRequest {\n if (!isRecord(body)) throw badRequest(\"request body must be a JSON object\");\n const model = requireModel(body);\n if (!Array.isArray(body.messages) || body.messages.length === 0) {\n throw badRequest(\"messages must be a non-empty array\");\n }\n if (body.n !== undefined && body.n !== null && body.n !== 1) {\n throw badRequest(\"n must be 1; multiple choices are not supported\");\n }\n\n const systemParts: string[] = [];\n const messages: Message[] = [];\n const toolNames = new Map<string, string>();\n\n for (let i = 0; i < body.messages.length; i++) {\n const raw: unknown = body.messages[i];\n const field = `messages[${i}]`;\n if (!isRecord(raw)) throw badRequest(`${field} must be an object`);\n switch (raw.role) {\n case \"system\":\n case \"developer\": {\n const text = textOfParts(raw.content, `${field}.content`, [\"text\"]);\n if (text.length > 0) systemParts.push(text);\n break;\n }\n case \"user\":\n messages.push({\n role: \"user\",\n content: parseUserContent(raw.content, `${field}.content`),\n timestamp: Date.now(),\n });\n break;\n case \"assistant\": {\n const assistant = parseAssistantMessage(raw, field, model, toolNames);\n if (assistant) messages.push(assistant);\n break;\n }\n case \"tool\": {\n if (typeof raw.tool_call_id !== \"string\" || raw.tool_call_id.length === 0) {\n throw badRequest(`${field}.tool_call_id is required`);\n }\n const text = textOfParts(raw.content, `${field}.content`, [\"text\"]);\n messages.push(\n historyToolResult(raw.tool_call_id, toolNames.get(raw.tool_call_id) ?? \"\", text),\n );\n break;\n }\n default:\n throw badRequest(`${field}.role \"${String(raw.role)}\" is not supported`);\n }\n }\n\n const tools = selectTools(parseTools(body.tools), body.tool_choice, (choice) =>\n choice.type === \"function\" && isRecord(choice.function) ? choice.function.name : undefined,\n );\n\n const options = buildOptions({\n temperature: optionalNumber(body.temperature, \"temperature\"),\n maxTokens: optionalPositiveInt(\n body.max_completion_tokens ?? body.max_tokens,\n \"max_completion_tokens\",\n ),\n samplingParams: pickSamplingParams(body, [\n \"top_p\",\n \"frequency_penalty\",\n \"presence_penalty\",\n \"seed\",\n \"stop\",\n ]),\n reasoning: parseReasoningEffort(body.reasoning_effort, \"reasoning_effort\"),\n });\n\n return {\n model,\n context: buildContext(systemParts, messages, tools),\n options,\n stream: optionalBoolean(body.stream, \"stream\"),\n includeUsage: isRecord(body.stream_options) && body.stream_options.include_usage === true,\n };\n}\n\n// ── response ────────────────────────────────────────────────────────────────\n\nfunction finishReason(stopReason: StopReason, errorMessage: string | undefined): ChatFinishReason {\n switch (stopReason) {\n case \"length\":\n return \"length\";\n case \"toolUse\":\n return \"tool_calls\";\n case \"error\":\n case \"aborted\":\n throw new ModelEndpointError(502, errorMessage ?? `upstream request ${stopReason}`);\n default:\n return \"stop\";\n }\n}\n\nfunction toChatUsage(usage: AssistantMessage[\"usage\"]): ChatCompletionUsage {\n const prompt = promptTokens(usage);\n const result: ChatCompletionUsage = {\n prompt_tokens: prompt,\n completion_tokens: usage.output,\n total_tokens: totalTokens(usage),\n prompt_tokens_details: { cached_tokens: usage.cacheRead },\n };\n if (usage.reasoning !== undefined)\n result.completion_tokens_details = { reasoning_tokens: usage.reasoning };\n return result;\n}\n\n/**\n * Maps a finished pi message to a non-streaming chat completion. `error` /\n * `aborted` messages throw 502 so the caller sees an upstream failure rather\n * than an empty \"successful\" completion.\n */\nexport function toChatCompletion(\n message: AssistantMessage,\n meta: ChatResponseMeta,\n): ChatCompletion {\n const reason = finishReason(message.stopReason, message.errorMessage);\n let text = \"\";\n let thinking = \"\";\n const toolCalls: ChatCompletionToolCall[] = [];\n for (const block of message.content) {\n if (block.type === \"text\") text += block.text;\n else if (block.type === \"thinking\") thinking += block.thinking;\n else {\n toolCalls.push({\n id: block.id,\n type: \"function\",\n function: { name: block.name, arguments: JSON.stringify(block.arguments) },\n });\n }\n }\n const out: ChatCompletionMessage = { role: \"assistant\", content: text.length > 0 ? text : null };\n if (thinking.length > 0) out.reasoning_content = thinking;\n if (toolCalls.length > 0) out.tool_calls = toolCalls;\n return {\n id: meta.id,\n object: \"chat.completion\",\n created: meta.created,\n model: meta.model,\n choices: [{ index: 0, message: out, finish_reason: reason }],\n usage: toChatUsage(message.usage),\n };\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\n/** Mutable per-stream mapper state; `error` is set instead of emitting a chunk on upstream failure. */\nexport interface ChatStreamState {\n readonly id: string;\n readonly created: number;\n readonly model: string;\n readonly includeUsage: boolean;\n /** Set when pi reports `error`/`aborted`; the server turns it into an SSE error event. */\n error?: string;\n nextToolIndex: number;\n toolIndexByContent: Map<number, number>;\n}\n\nexport function createChatStreamState(init: {\n id: string;\n created: number;\n model: string;\n includeUsage: boolean;\n}): ChatStreamState {\n return { ...init, nextToolIndex: 0, toolIndexByContent: new Map() };\n}\n\nfunction chunk(\n state: ChatStreamState,\n delta: ChatCompletionChunkDelta,\n finish: ChatFinishReason | null = null,\n): ChatCompletionChunk {\n return {\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [{ index: 0, delta, finish_reason: finish }],\n };\n}\n\n/**\n * Stateful pi-event → OpenAI chunk mapper. Tool calls are buffered and emitted as\n * a single complete chunk at `toolcall_end` because pi only knows the call id and\n * name once the call is finished; OpenAI clients accept a whole call in one delta.\n */\nexport function chatCompletionChunks(\n event: AssistantMessageEvent,\n state: ChatStreamState,\n): ChatCompletionChunk[] {\n switch (event.type) {\n case \"start\":\n return [chunk(state, { role: \"assistant\", content: \"\" })];\n case \"text_delta\":\n return event.delta.length > 0 ? [chunk(state, { content: event.delta })] : [];\n case \"thinking_delta\":\n return event.delta.length > 0 ? [chunk(state, { reasoning_content: event.delta })] : [];\n case \"toolcall_start\":\n state.toolIndexByContent.set(event.contentIndex, state.nextToolIndex++);\n return [];\n case \"toolcall_end\": {\n let index = state.toolIndexByContent.get(event.contentIndex);\n if (index === undefined) {\n index = state.nextToolIndex++;\n state.toolIndexByContent.set(event.contentIndex, index);\n }\n return [\n chunk(state, {\n tool_calls: [\n {\n index,\n id: event.toolCall.id,\n type: \"function\",\n function: {\n name: event.toolCall.name,\n arguments: JSON.stringify(event.toolCall.arguments),\n },\n },\n ],\n }),\n ];\n }\n case \"done\": {\n const chunks = [chunk(state, {}, finishReason(event.reason, undefined))];\n if (state.includeUsage) {\n chunks.push({\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [],\n usage: toChatUsage(event.message.usage),\n });\n }\n return chunks;\n }\n case \"error\":\n state.error = event.error.errorMessage ?? `upstream request ${event.reason}`;\n return [];\n default:\n return [];\n }\n}\n","import type {\n AssistantMessage,\n AssistantMessageEvent,\n ImageContent,\n Message,\n TextContent,\n Tool,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport {\n badRequest,\n buildContext,\n buildOptions,\n historyAssistant,\n historyToolResult,\n imageFromUrl,\n isRecord,\n optionalBoolean,\n optionalNumber,\n optionalPositiveInt,\n type ParsedModelRequest,\n parseReasoningEffort,\n parseToolArguments,\n pickSamplingParams,\n promptTokens,\n requireModel,\n selectTools,\n toPiTool,\n totalTokens,\n} from \"./openai-shared.js\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Parsed `POST /v1/responses` body, in pi terms (`includeUsage` is always true: Responses always reports usage). */\nexport type ResponsesRequest = ParsedModelRequest;\n\nexport interface ResponseSummaryPart {\n type: \"summary_text\";\n text: string;\n}\n\nexport interface ResponseReasoningItem {\n type: \"reasoning\";\n id: string;\n summary: ResponseSummaryPart[];\n}\n\nexport interface ResponseMessageItem {\n type: \"message\";\n id: string;\n role: \"assistant\";\n status: \"in_progress\" | \"completed\";\n content: Array<{ type: \"output_text\"; text: string; annotations: never[] }>;\n}\n\nexport interface ResponseFunctionCallItem {\n type: \"function_call\";\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status: \"in_progress\" | \"completed\";\n}\n\nexport type ResponseOutputItem =\n | ResponseReasoningItem\n | ResponseMessageItem\n | ResponseFunctionCallItem;\n\nexport interface ResponseUsage {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n input_tokens_details: { cached_tokens: number };\n output_tokens_details: { reasoning_tokens: number };\n}\n\nexport interface ResponseObject {\n id: string;\n object: \"response\";\n created_at: number;\n model: string;\n status: \"in_progress\" | \"completed\" | \"incomplete\";\n incomplete_details: { reason: \"max_output_tokens\" } | null;\n error: null;\n output: ResponseOutputItem[];\n usage: ResponseUsage | null;\n}\n\nexport interface ResponsesMeta {\n id: string;\n created: number;\n model: string;\n}\n\n/** One SSE event; `sequence_number` increases by one per event within a response. */\nexport interface ResponsesStreamEvent {\n type: string;\n sequence_number: number;\n [key: string]: unknown;\n}\n\n// ── request ─────────────────────────────────────────────────────────────────\n\nfunction parseParts(\n content: unknown,\n field: string,\n role: \"user\" | \"system\" | \"assistant\",\n): string | (TextContent | ImageContent)[] {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of content parts`);\n const textTypes = role === \"assistant\" ? [\"output_text\", \"text\"] : [\"input_text\", \"text\"];\n const parts: (TextContent | ImageContent)[] = [];\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n const partField = `${field}[${i}]`;\n if (!isRecord(part) || typeof part.type !== \"string\")\n throw badRequest(`${partField} must be a content part`);\n if (textTypes.includes(part.type)) {\n if (typeof part.text !== \"string\") throw badRequest(`${partField}.text must be a string`);\n parts.push({ type: \"text\", text: part.text });\n } else if (\n part.type === \"refusal\" &&\n role === \"assistant\" &&\n typeof part.refusal === \"string\"\n ) {\n parts.push({ type: \"text\", text: part.refusal });\n } else if (part.type === \"input_image\" && role === \"user\") {\n if (part.file_id !== undefined && part.file_id !== null)\n throw badRequest(`${partField}.file_id is not supported`);\n const url = isRecord(part.image_url) ? part.image_url.url : part.image_url;\n parts.push(imageFromUrl(url, `${partField}.image_url`));\n } else {\n throw badRequest(`${partField}: unsupported content part type \"${part.type}\"`);\n }\n }\n return parts;\n}\n\nfunction joinText(parts: string | (TextContent | ImageContent)[]): string {\n if (typeof parts === \"string\") return parts;\n return parts.map((part) => (part.type === \"text\" ? part.text : \"\")).join(\"\");\n}\n\nfunction parseOutputText(output: unknown, field: string): string {\n if (typeof output === \"string\") return output;\n if (output === undefined || output === null) return \"\";\n return joinText(parseParts(output, field, \"user\"));\n}\n\nfunction parseInput(input: unknown, model: string, systemParts: string[]): Message[] {\n if (typeof input === \"string\") return [{ role: \"user\", content: input, timestamp: Date.now() }];\n if (!Array.isArray(input)) throw badRequest(\"input must be a string or an array of items\");\n const messages: Message[] = [];\n const toolNames = new Map<string, string>();\n\n for (let i = 0; i < input.length; i++) {\n const item: unknown = input[i];\n const field = `input[${i}]`;\n if (!isRecord(item)) throw badRequest(`${field} must be an object`);\n const type = item.type ?? \"message\";\n switch (type) {\n case \"message\": {\n const role = item.role;\n if (role === \"system\" || role === \"developer\") {\n const text = joinText(parseParts(item.content, `${field}.content`, \"system\"));\n if (text.length > 0) systemParts.push(text);\n } else if (role === \"user\") {\n messages.push({\n role: \"user\",\n content: parseParts(item.content, `${field}.content`, \"user\"),\n timestamp: Date.now(),\n });\n } else if (role === \"assistant\") {\n const text = joinText(parseParts(item.content, `${field}.content`, \"assistant\"));\n if (text.length > 0) messages.push(historyAssistant(model, [{ type: \"text\", text }]));\n } else {\n throw badRequest(`${field}.role \"${String(role)}\" is not supported`);\n }\n break;\n }\n case \"function_call\": {\n if (typeof item.call_id !== \"string\" || item.call_id.length === 0)\n throw badRequest(`${field}.call_id is required`);\n if (typeof item.name !== \"string\" || item.name.length === 0)\n throw badRequest(`${field}.name is required`);\n toolNames.set(item.call_id, item.name);\n const call = {\n type: \"toolCall\" as const,\n id: item.call_id,\n name: item.name,\n arguments: parseToolArguments(item.arguments),\n };\n // Parallel calls arrive as consecutive items and belong to one assistant turn.\n const last = messages.at(-1);\n if (last?.role === \"assistant\") {\n last.content.push(call);\n last.stopReason = \"toolUse\";\n } else {\n messages.push(historyAssistant(model, [call]));\n }\n break;\n }\n case \"function_call_output\": {\n if (typeof item.call_id !== \"string\" || item.call_id.length === 0)\n throw badRequest(`${field}.call_id is required`);\n messages.push(\n historyToolResult(\n item.call_id,\n toolNames.get(item.call_id) ?? \"\",\n parseOutputText(item.output, `${field}.output`),\n ),\n );\n break;\n }\n case \"reasoning\":\n // Encrypted/summary reasoning from earlier turns is not replayable across providers.\n break;\n default:\n throw badRequest(`${field}.type \"${String(type)}\" is not supported`);\n }\n }\n return messages;\n}\n\nfunction parseTools(value: unknown): Tool[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) throw badRequest(\"tools must be an array\");\n const tools: Tool[] = [];\n for (let i = 0; i < value.length; i++) {\n const tool: unknown = value[i];\n if (!isRecord(tool) || tool.type !== \"function\") {\n throw badRequest(`tools[${i}]: only function tools are supported`);\n }\n if (typeof tool.name !== \"string\" || tool.name.length === 0)\n throw badRequest(`tools[${i}].name is required`);\n tools.push(toPiTool(tool.name, tool.description, tool.parameters));\n }\n return tools;\n}\n\n/**\n * Validates an OpenAI Responses body (stateless subset) and maps it to a pi `Context`.\n * `previous_response_id` is rejected because the endpoint keeps no response state.\n */\nexport function parseResponsesRequest(body: unknown): ResponsesRequest {\n if (!isRecord(body)) throw badRequest(\"request body must be a JSON object\");\n const model = requireModel(body);\n if (body.input === undefined || body.input === null) throw badRequest(\"input is required\");\n if (body.previous_response_id !== undefined && body.previous_response_id !== null) {\n throw badRequest(\"previous_response_id is not supported; the endpoint is stateless\");\n }\n\n const systemParts: string[] = [];\n if (body.instructions !== undefined && body.instructions !== null) {\n if (typeof body.instructions !== \"string\") throw badRequest(\"instructions must be a string\");\n if (body.instructions.length > 0) systemParts.push(body.instructions);\n }\n\n const messages = parseInput(body.input, model, systemParts);\n if (messages.length === 0) throw badRequest(\"input must contain at least one message\");\n\n const tools = selectTools(parseTools(body.tools), body.tool_choice, (choice) =>\n choice.type === \"function\" ? choice.name : undefined,\n );\n\n const reasoning = isRecord(body.reasoning) ? body.reasoning.effort : undefined;\n const options = buildOptions({\n temperature: optionalNumber(body.temperature, \"temperature\"),\n maxTokens: optionalPositiveInt(body.max_output_tokens, \"max_output_tokens\"),\n samplingParams: pickSamplingParams(body, [\"top_p\"]),\n reasoning: parseReasoningEffort(reasoning, \"reasoning.effort\"),\n });\n\n return {\n model,\n context: buildContext(systemParts, messages, tools),\n options,\n stream: optionalBoolean(body.stream, \"stream\"),\n includeUsage: true,\n };\n}\n\n// ── response ────────────────────────────────────────────────────────────────\n\nfunction itemId(prefix: string, responseId: string, index: number): string {\n return `${prefix}_${responseId.replace(/^resp_/, \"\")}_${index}`;\n}\n\nfunction toResponseUsage(usage: Usage): ResponseUsage {\n return {\n input_tokens: promptTokens(usage),\n output_tokens: usage.output,\n total_tokens: totalTokens(usage),\n input_tokens_details: { cached_tokens: usage.cacheRead },\n output_tokens_details: { reasoning_tokens: usage.reasoning ?? 0 },\n };\n}\n\nfunction messageItem(\n id: string,\n text: string,\n status: \"in_progress\" | \"completed\",\n): ResponseMessageItem {\n return {\n type: \"message\",\n id,\n role: \"assistant\",\n status,\n content: status === \"completed\" ? [{ type: \"output_text\", text, annotations: [] }] : [],\n };\n}\n\nfunction buildOutput(message: AssistantMessage, responseId: string): ResponseOutputItem[] {\n const output: ResponseOutputItem[] = [];\n const summaries: ResponseSummaryPart[] = [];\n let text = \"\";\n const calls: ResponseFunctionCallItem[] = [];\n for (const block of message.content) {\n if (block.type === \"thinking\") {\n if (block.thinking.length > 0) summaries.push({ type: \"summary_text\", text: block.thinking });\n } else if (block.type === \"text\") {\n text += block.text;\n } else {\n calls.push({\n type: \"function_call\",\n id: \"\",\n call_id: block.id,\n name: block.name,\n arguments: JSON.stringify(block.arguments),\n status: \"completed\",\n });\n }\n }\n if (summaries.length > 0) {\n output.push({\n type: \"reasoning\",\n id: itemId(\"rs\", responseId, output.length),\n summary: summaries,\n });\n }\n if (text.length > 0) {\n output.push(messageItem(itemId(\"msg\", responseId, output.length), text, \"completed\"));\n }\n for (const call of calls) {\n call.id = itemId(\"fc\", responseId, output.length);\n output.push(call);\n }\n return output;\n}\n\nfunction responseObject(\n meta: ResponsesMeta,\n status: ResponseObject[\"status\"],\n output: ResponseOutputItem[],\n usage: Usage | undefined,\n): ResponseObject {\n return {\n id: meta.id,\n object: \"response\",\n created_at: meta.created,\n model: meta.model,\n status,\n incomplete_details: status === \"incomplete\" ? { reason: \"max_output_tokens\" } : null,\n error: null,\n output,\n usage: usage ? toResponseUsage(usage) : null,\n };\n}\n\n/**\n * Maps a finished pi message to a non-streaming Responses object. Output order is\n * reasoning, message, then function calls. `error`/`aborted` throw 502.\n */\nexport function toResponse(message: AssistantMessage, meta: ResponsesMeta): ResponseObject {\n if (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n throw new ModelEndpointError(\n 502,\n message.errorMessage ?? `upstream request ${message.stopReason}`,\n );\n }\n const status = message.stopReason === \"length\" ? \"incomplete\" : \"completed\";\n return responseObject(meta, status, buildOutput(message, meta.id), message.usage);\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\ninterface OpenBlock {\n kind: \"message\" | \"reasoning\";\n outputIndex: number;\n itemId: string;\n text: string;\n}\n\n/** Mutable per-stream mapper state; `error` is set instead of emitting an event on upstream failure. */\nexport interface ResponsesStreamState {\n readonly id: string;\n readonly created: number;\n readonly model: string;\n /** Set when pi reports `error`/`aborted`; the server turns it into an SSE `error` event. */\n error?: string;\n sequence: number;\n nextOutputIndex: number;\n open: Map<number, OpenBlock>;\n completed: Map<number, ResponseOutputItem>;\n}\n\nexport function createResponsesStreamState(init: ResponsesMeta): ResponsesStreamState {\n return {\n ...init,\n sequence: 0,\n nextOutputIndex: 0,\n open: new Map(),\n completed: new Map(),\n };\n}\n\nfunction ev(\n state: ResponsesStreamState,\n type: string,\n fields: Record<string, unknown>,\n): ResponsesStreamEvent {\n return { type, sequence_number: state.sequence++, ...fields };\n}\n\nfunction openBlock(\n state: ResponsesStreamState,\n contentIndex: number,\n kind: OpenBlock[\"kind\"],\n): { block: OpenBlock; events: ResponsesStreamEvent[] } {\n const existing = state.open.get(contentIndex);\n if (existing) return { block: existing, events: [] };\n const outputIndex = state.nextOutputIndex++;\n const block: OpenBlock = {\n kind,\n outputIndex,\n itemId: itemId(kind === \"message\" ? \"msg\" : \"rs\", state.id, outputIndex),\n text: \"\",\n };\n state.open.set(contentIndex, block);\n if (kind === \"message\") {\n return {\n block,\n events: [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: messageItem(block.itemId, \"\", \"in_progress\"),\n }),\n ev(state, \"response.content_part.added\", {\n item_id: block.itemId,\n output_index: outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: \"\", annotations: [] },\n }),\n ],\n };\n }\n return {\n block,\n events: [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: { type: \"reasoning\", id: block.itemId, summary: [] },\n }),\n ev(state, \"response.reasoning_summary_part.added\", {\n item_id: block.itemId,\n output_index: outputIndex,\n summary_index: 0,\n part: { type: \"summary_text\", text: \"\" },\n }),\n ],\n };\n}\n\nfunction closeBlock(\n state: ResponsesStreamState,\n contentIndex: number,\n kind: OpenBlock[\"kind\"],\n finalText: string,\n): ResponsesStreamEvent[] {\n const { block, events } = openBlock(state, contentIndex, kind);\n state.open.delete(contentIndex);\n if (kind === \"message\") {\n const item = messageItem(block.itemId, finalText, \"completed\");\n state.completed.set(block.outputIndex, item);\n events.push(\n ev(state, \"response.output_text.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n text: finalText,\n }),\n ev(state, \"response.content_part.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: finalText, annotations: [] },\n }),\n ev(state, \"response.output_item.done\", { output_index: block.outputIndex, item }),\n );\n return events;\n }\n const part: ResponseSummaryPart = { type: \"summary_text\", text: finalText };\n const item: ResponseReasoningItem = { type: \"reasoning\", id: block.itemId, summary: [part] };\n state.completed.set(block.outputIndex, item);\n events.push(\n ev(state, \"response.reasoning_summary_text.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n text: finalText,\n }),\n ev(state, \"response.reasoning_summary_part.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n part,\n }),\n ev(state, \"response.output_item.done\", { output_index: block.outputIndex, item }),\n );\n return events;\n}\n\n/**\n * Stateful pi-event → Responses SSE mapper. Function calls are buffered until\n * `toolcall_end` (pi only knows call id and name then) and then emitted as a\n * complete added/arguments/done sequence. A length stop ends with\n * `response.incomplete`, everything else with `response.completed`.\n */\nexport function responsesEvents(\n event: AssistantMessageEvent,\n state: ResponsesStreamState,\n): ResponsesStreamEvent[] {\n const meta: ResponsesMeta = { id: state.id, created: state.created, model: state.model };\n switch (event.type) {\n case \"start\": {\n const response = responseObject(meta, \"in_progress\", [], undefined);\n return [\n ev(state, \"response.created\", { response }),\n ev(state, \"response.in_progress\", { response }),\n ];\n }\n case \"text_start\":\n return openBlock(state, event.contentIndex, \"message\").events;\n case \"text_delta\": {\n const { block, events } = openBlock(state, event.contentIndex, \"message\");\n block.text += event.delta;\n events.push(\n ev(state, \"response.output_text.delta\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n delta: event.delta,\n }),\n );\n return events;\n }\n case \"text_end\":\n return closeBlock(state, event.contentIndex, \"message\", event.content);\n case \"thinking_start\":\n return openBlock(state, event.contentIndex, \"reasoning\").events;\n case \"thinking_delta\": {\n const { block, events } = openBlock(state, event.contentIndex, \"reasoning\");\n block.text += event.delta;\n events.push(\n ev(state, \"response.reasoning_summary_text.delta\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n delta: event.delta,\n }),\n );\n return events;\n }\n case \"thinking_end\":\n return closeBlock(state, event.contentIndex, \"reasoning\", event.content);\n case \"toolcall_end\": {\n const outputIndex = state.nextOutputIndex++;\n const id = itemId(\"fc\", state.id, outputIndex);\n const args = JSON.stringify(event.toolCall.arguments);\n const item: ResponseFunctionCallItem = {\n type: \"function_call\",\n id,\n call_id: event.toolCall.id,\n name: event.toolCall.name,\n arguments: args,\n status: \"completed\",\n };\n state.completed.set(outputIndex, item);\n return [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: { ...item, arguments: \"\", status: \"in_progress\" },\n }),\n ev(state, \"response.function_call_arguments.delta\", {\n item_id: id,\n output_index: outputIndex,\n delta: args,\n }),\n ev(state, \"response.function_call_arguments.done\", {\n item_id: id,\n output_index: outputIndex,\n name: item.name,\n arguments: args,\n }),\n ev(state, \"response.output_item.done\", { output_index: outputIndex, item }),\n ];\n }\n case \"done\": {\n const streamed = [...state.completed.entries()]\n .sort(([a], [b]) => a - b)\n .map(([, item]) => item);\n const output = streamed.length > 0 ? streamed : buildOutput(event.message, state.id);\n const incomplete = event.reason === \"length\";\n const response = responseObject(\n meta,\n incomplete ? \"incomplete\" : \"completed\",\n output,\n event.message.usage,\n );\n return [ev(state, incomplete ? \"response.incomplete\" : \"response.completed\", { response })];\n }\n case \"error\":\n state.error = event.error.errorMessage ?? `upstream request ${event.reason}`;\n return [];\n default:\n return [];\n }\n}\n","/**\n * The loopback OpenAI-compatible HTTP server.\n *\n * Plain `node:http` so it runs identically under Node and Bun. pi-ai is\n * imported lazily inside the handlers: the package is an optional peer, and\n * merely importing `@skaile/workspaces/model-endpoint` must not fail without it.\n */\n\nimport { createHash, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport type { AssistantMessage, AssistantMessageEvent } from \"@earendil-works/pi-ai\";\nimport {\n chatCompletionChunks,\n createChatStreamState,\n parseChatCompletionRequest,\n toChatCompletion,\n} from \"./openai-chat.js\";\nimport {\n createResponsesStreamState,\n parseResponsesRequest,\n responsesEvents,\n toResponse,\n} from \"./openai-responses.js\";\nimport { listModels, type ResolveDeps, resolveModel } from \"./resolve.js\";\nimport {\n ModelEndpointError,\n type ModelEndpointHandle,\n type ModelEndpointOptions,\n type PiApiModule,\n type ResolvedModel,\n} from \"./types.js\";\n\n/** Largest accepted request body. Chat transcripts with inline images get big. */\nconst MAX_BODY_BYTES = 10 * 1024 * 1024;\n/** Surfaces whose upstream serves `POST <base>/embeddings`. */\nconst EMBEDDING_SURFACES = new Set([\"openai-completions\", \"openai-responses\"]);\n\ntype GenerationRequest = ReturnType<typeof parseChatCompletionRequest>;\n\n/** Per-request facts the access log reports. */\ninterface Trace {\n target?: string;\n}\n\n/**\n * Start the endpoint. Resolves once the socket is listening.\n *\n * Registry, env and roles are read per request through the getters so a\n * session swap is visible immediately.\n */\nexport async function startModelEndpoint(\n options: ModelEndpointOptions,\n): Promise<ModelEndpointHandle> {\n if (!options.token) throw new Error(\"model endpoint requires a non-empty token\");\n const host = options.host ?? \"127.0.0.1\";\n const log = options.log ?? (() => {});\n const loadApi = options.loadApi ?? defaultLoadApi;\n const tokenDigest = digest(options.token);\n\n const deps = (): ResolveDeps => ({\n registry: options.getRegistry(),\n lookupEnv: options.getLookupEnv(),\n roles: options.getRoles?.(),\n });\n\n function authenticate(req: IncomingMessage): void {\n const match = /^Bearer\\s+(.+)$/i.exec(req.headers.authorization ?? \"\");\n // Hash both sides so the comparison is constant-time regardless of length.\n if (!match || !timingSafeEqual(digest(match[1] ?? \"\"), tokenDigest)) {\n throw new ModelEndpointError(401, \"invalid or missing bearer token\", \"invalid_api_key\");\n }\n }\n\n /** Start the upstream pi stream for a parsed chat/responses request. */\n async function startUpstream(\n request: GenerationRequest,\n resolved: ResolvedModel,\n signal: AbortSignal,\n ): Promise<AsyncIterable<AssistantMessageEvent>> {\n const pi = await loadPi();\n const surface = resolved.model.api;\n let api: PiApiModule;\n try {\n api = await loadApi(surface);\n } catch (cause) {\n throw new ModelEndpointError(\n 501,\n `surface '${surface}' is not supported by the installed pi-ai: ${errorText(cause)}`,\n \"surface_unsupported\",\n );\n }\n const { temperature, maxTokens, samplingParams, reasoning } = request.options;\n const common = {\n ...(resolved.apiKey !== undefined ? { apiKey: resolved.apiKey } : {}),\n ...(resolved.headers ? { headers: resolved.headers } : {}),\n signal,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n ...(samplingParams !== undefined ? { samplingParams } : {}),\n };\n const context = pi.normalizeContext(request.context);\n // Only `streamSimple` maps a provider-neutral thinking level onto the\n // surface's own effort field (`reasoning_effort`, Anthropic `effort`, …).\n if (reasoning !== undefined && api.streamSimple) {\n return api.streamSimple(resolved.model, context, { ...common, reasoning });\n }\n return api.stream(resolved.model, context, common);\n }\n\n async function handleChat(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const request = parseChatCompletionRequest(await readJson(req));\n const resolved = resolveModel(request.model, deps());\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n const events = await startUpstream(request, resolved, signal);\n const id = `chatcmpl-${randomUUID().replaceAll(\"-\", \"\")}`;\n const created = Math.floor(Date.now() / 1000);\n\n if (!request.stream) {\n const message = await collectFinal(events);\n sendJson(res, 200, toChatCompletion(message, { id, created, model: request.model }));\n return;\n }\n const state = createChatStreamState({\n id,\n created,\n model: request.model,\n includeUsage: request.includeUsage,\n });\n await pipeSse(res, events, {\n frames: (event) => chatCompletionChunks(event, state),\n errorFrame: (message) => ({ error: { message, type: \"upstream_error\" } }),\n terminator: \"[DONE]\",\n });\n }\n\n async function handleResponses(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const request = parseResponsesRequest(await readJson(req));\n const resolved = resolveModel(request.model, deps());\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n const events = await startUpstream(request, resolved, signal);\n const id = `resp_${randomUUID().replaceAll(\"-\", \"\")}`;\n const created = Math.floor(Date.now() / 1000);\n\n if (!request.stream) {\n const message = await collectFinal(events);\n sendJson(res, 200, toResponse(message, { id, created, model: request.model }));\n return;\n }\n const state = createResponsesStreamState({ id, created, model: request.model });\n await pipeSse(res, events, {\n frames: (event) => responsesEvents(event, state),\n errorFrame: (message) => ({ type: \"error\", code: \"upstream_error\", message, param: null }),\n eventName: (frame) =>\n isRecord(frame) && typeof frame.type === \"string\" ? frame.type : undefined,\n });\n }\n\n async function handleEmbeddings(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const body = await readJson(req);\n if (!isRecord(body) || typeof body.model !== \"string\" || body.model === \"\") {\n throw new ModelEndpointError(400, \"`model` is required\", \"missing_model\");\n }\n const resolved = resolveModel(body.model, deps());\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n if (!EMBEDDING_SURFACES.has(resolved.model.api)) {\n throw new ModelEndpointError(\n 501,\n `embeddings not supported for surface ${resolved.model.api}`,\n \"embeddings_unsupported\",\n );\n }\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n ...resolved.headers,\n };\n if (resolved.apiKey) headers.authorization = `Bearer ${resolved.apiKey}`;\n\n let upstream: Response;\n try {\n upstream = await (options.fetch ?? globalThis.fetch)(`${resolved.model.baseUrl}/embeddings`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...body, model: resolved.model.id }),\n signal,\n });\n } catch (cause) {\n if (signal.aborted) return;\n throw new ModelEndpointError(\n 502,\n `embeddings upstream unreachable: ${errorText(cause)}`,\n \"upstream_unreachable\",\n );\n }\n // fetch has already decoded the body, so content-encoding/length are not copied.\n const payload = Buffer.from(await upstream.arrayBuffer());\n res.writeHead(upstream.status, {\n \"content-type\": upstream.headers.get(\"content-type\") ?? \"application/json\",\n \"content-length\": payload.length,\n });\n res.end(payload);\n }\n\n async function dispatch(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n path: string,\n trace: Trace,\n ): Promise<void> {\n if (!path.startsWith(\"/v1/\")) throw notFound(path);\n authenticate(req);\n switch (`${req.method} ${path}`) {\n case \"GET /v1/models\":\n sendJson(res, 200, {\n object: \"list\",\n data: listModels(options.getRegistry()).map((m) => ({\n id: m.id,\n object: \"model\",\n created: 0,\n owned_by: m.owned_by,\n })),\n });\n return;\n case \"POST /v1/chat/completions\":\n return handleChat(req, res, signal, trace);\n case \"POST /v1/responses\":\n return handleResponses(req, res, signal, trace);\n case \"POST /v1/embeddings\":\n return handleEmbeddings(req, res, signal, trace);\n default:\n throw notFound(path);\n }\n }\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const started = performance.now();\n const controller = new AbortController();\n // `req` 'close' fires once the body is read; the response closing early is\n // the reliable \"client went away\" signal.\n res.on(\"close\", () => {\n if (!res.writableFinished) controller.abort();\n });\n const trace: Trace = {};\n let path = req.url ?? \"/\";\n try {\n path = requestPath(req);\n await dispatch(req, res, controller.signal, path, trace);\n } catch (err) {\n if (!(err instanceof ModelEndpointError)) {\n log(\n `error ${req.method} ${path}: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`,\n );\n }\n sendError(res, err);\n } finally {\n const ms = Math.round(performance.now() - started);\n log(`${req.method} ${path} ${trace.target ?? \"-\"} ${res.statusCode} ${ms}ms`);\n }\n }\n\n const server = createServer((req, res) => {\n void handle(req, res);\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port ?? 0, host, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address() as AddressInfo;\n const hostPart = host.includes(\":\") ? `[${host}]` : host;\n return {\n url: `http://${hostPart}:${address.port}/v1`,\n port: address.port,\n token: options.token,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n server.closeAllConnections?.();\n }),\n };\n}\n\n// ── pi-ai loading ───────────────────────────────────────────────────────────\n\n/** pi-ai root, loaded on first use; a missing peer becomes a clear 500. */\nasync function loadPi(): Promise<typeof import(\"@earendil-works/pi-ai\")> {\n try {\n return await import(\"@earendil-works/pi-ai\");\n } catch (cause) {\n throw new ModelEndpointError(\n 500,\n `the model endpoint needs @earendil-works/pi-ai — install it (${errorText(cause)})`,\n \"pi_ai_not_installed\",\n \"server_error\",\n );\n }\n}\n\n/** Default api loader: the surface is runtime-selected per entry and pi-ai is an optional peer. */\nasync function defaultLoadApi(surface: string): Promise<PiApiModule> {\n if (!/^[a-z0-9-]+$/.test(surface)) throw new Error(`invalid surface '${surface}'`);\n return (await import(/* @vite-ignore */ `@earendil-works/pi-ai/api/${surface}`)) as PiApiModule;\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\n/** Drain the stream to its final message; an `error` event becomes a 502. */\nasync function collectFinal(\n events: AsyncIterable<AssistantMessageEvent>,\n): Promise<AssistantMessage> {\n for await (const event of events) {\n if (event.type === \"done\") return event.message;\n if (event.type === \"error\") throw upstreamFailure(event.error);\n }\n throw new ModelEndpointError(\n 502,\n \"upstream ended without a final message\",\n \"upstream_incomplete\",\n );\n}\n\nfunction upstreamFailure(message: AssistantMessage): ModelEndpointError {\n return new ModelEndpointError(\n 502,\n message.errorMessage ?? `upstream ${message.stopReason}`,\n \"upstream_error\",\n );\n}\n\ninterface SsePipe {\n /** Map one pi event to wire frames. Never called with `error` events. */\n frames(event: AssistantMessageEvent): unknown[];\n /** Frame announcing a failure once the stream has started. */\n errorFrame(message: string): unknown;\n /** SSE `event:` name for a frame, when the protocol uses one. */\n eventName?(frame: unknown): string | undefined;\n /** Sentinel written after the last frame. */\n terminator?: \"[DONE]\";\n}\n\n/**\n * Relay pi events as SSE. Headers go out with the first event, not before: an\n * upstream failure that precedes it (bad credential, unknown model) then\n * surfaces as a real HTTP 502 instead of a 200 stream carrying an error.\n */\nasync function pipeSse(\n res: ServerResponse,\n events: AsyncIterable<AssistantMessageEvent>,\n pipe: SsePipe,\n): Promise<void> {\n let sse: Sse | undefined;\n const sendAll = async (frames: unknown[]) => {\n for (const frame of frames) await sse?.send(frame, pipe.eventName?.(frame));\n };\n try {\n for await (const event of events) {\n if (!sse) {\n if (event.type === \"error\") throw upstreamFailure(event.error);\n sse = openSse(res);\n }\n if (event.type === \"error\") {\n await sendAll([pipe.errorFrame(event.error.errorMessage ?? `upstream ${event.reason}`)]);\n break;\n }\n await sendAll(pipe.frames(event));\n }\n } catch (err) {\n if (!sse) throw err;\n await sendAll([pipe.errorFrame(errorText(err))]);\n }\n if (!sse)\n throw new ModelEndpointError(502, \"upstream ended without events\", \"upstream_incomplete\");\n if (pipe.terminator) await sse.raw(pipe.terminator);\n res.end();\n}\n\ninterface Sse {\n send(frame: unknown, eventName?: string): Promise<void>;\n raw(data: string): Promise<void>;\n}\n\nfunction openSse(res: ServerResponse): Sse {\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n });\n res.flushHeaders();\n const write = async (text: string): Promise<void> => {\n if (res.destroyed || res.writableEnded) return;\n if (res.write(text)) return;\n await new Promise<void>((resolve) => {\n const done = () => {\n res.off(\"drain\", done);\n res.off(\"close\", done);\n resolve();\n };\n res.once(\"drain\", done);\n res.once(\"close\", done);\n });\n };\n return {\n send: (frame, eventName) =>\n write(`${eventName ? `event: ${eventName}\\n` : \"\"}data: ${JSON.stringify(frame)}\\n\\n`),\n raw: (data) => write(`data: ${data}\\n\\n`),\n };\n}\n\n// ── HTTP plumbing ───────────────────────────────────────────────────────────\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n if (res.writableEnded) return;\n const payload = JSON.stringify(body);\n res.writeHead(status, {\n \"content-type\": \"application/json\",\n \"content-length\": Buffer.byteLength(payload),\n });\n res.end(payload);\n}\n\nfunction sendError(res: ServerResponse, err: unknown): void {\n if (res.writableEnded || res.destroyed) return;\n if (res.headersSent) {\n res.end();\n return;\n }\n const failure =\n err instanceof ModelEndpointError\n ? err\n : new ModelEndpointError(500, \"internal server error\", undefined, \"server_error\");\n if (failure.status === 413) res.setHeader(\"connection\", \"close\");\n sendJson(res, failure.status, {\n error: {\n message: failure.message,\n type: failure.type,\n ...(failure.code !== undefined ? { code: failure.code } : {}),\n },\n });\n}\n\nfunction notFound(path: string): ModelEndpointError {\n return new ModelEndpointError(404, `unknown route '${path}'`, undefined, \"invalid_request_error\");\n}\n\nfunction requestPath(req: IncomingMessage): string {\n if (!URL.canParse(req.url ?? \"/\", \"http://localhost\")) {\n throw new ModelEndpointError(400, \"invalid request target\");\n }\n const path = new URL(req.url ?? \"/\", \"http://localhost\").pathname;\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n}\n\nasync function readJson(req: IncomingMessage): Promise<unknown> {\n const tooLarge = () =>\n new ModelEndpointError(413, `request body exceeds ${MAX_BODY_BYTES} bytes`, \"body_too_large\");\n if (Number(req.headers[\"content-length\"]) > MAX_BODY_BYTES) throw tooLarge();\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of req) {\n const buffer = chunk as Buffer;\n size += buffer.length;\n if (size > MAX_BODY_BYTES) throw tooLarge();\n chunks.push(buffer);\n }\n const text = Buffer.concat(chunks).toString(\"utf8\");\n if (text.trim() === \"\") throw new ModelEndpointError(400, \"request body is empty\", \"empty_body\");\n try {\n return JSON.parse(text);\n } catch {\n throw new ModelEndpointError(400, \"request body is not valid JSON\", \"invalid_json\");\n }\n}\n\nfunction digest(value: string): Buffer {\n return createHash(\"sha256\").update(value).digest();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorText(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { factoryAssetRoots } from './chunk-
|
|
1
|
+
import { factoryAssetRoots } from './chunk-TYUJPQNX.js';
|
|
2
2
|
import { deployedBase } from './chunk-D54T2F54.js';
|
|
3
3
|
import { DEFAULT_DRIVER_ID } from './chunk-5BEFNLOR.js';
|
|
4
|
-
import { parseSourceEntries, resolveSkWorkspaceConfig } from './chunk-
|
|
4
|
+
import { parseSourceEntries, resolveSkWorkspaceConfig } from './chunk-CAPKENNF.js';
|
|
5
5
|
import { globalSkaileDir } from './chunk-L5VSIPQD.js';
|
|
6
6
|
import { driverTargetForDriver, SUPPORTED_DRIVER_TARGETS } from './chunk-IG5LZ3WU.js';
|
|
7
7
|
import { sha256Hex, compositeSha256, orderedAsset, ASSET_KEY_ORDER } from './chunk-IY5E7Y5W.js';
|
|
@@ -1189,5 +1189,5 @@ var WorkspaceYamlEditor = class _WorkspaceYamlEditor {
|
|
|
1189
1189
|
};
|
|
1190
1190
|
|
|
1191
1191
|
export { AGENT_PROMPT_SECTION_ORDER, GLOBAL_INSTALL_DIR_NAME, LOCK_SCHEMA_VERSION, ManifestYamlEditor, PROVIDERS_FILENAME, SETTINGS_DEFAULTS, WorkspaceYamlEditor, aiResourceRoots, applyPatch, buildAgentPromptSections, buildLibraryLockEntries, buildLockFile, capMemoryContent, checkAgentSkillConformance, computeHash, defaultLibraryDir, detectPackageManager, extractForPatch, generatePatch, globalInstallDir, globalSettingsPath, installCommand, installCommandFor, listPatches, loadProviderRegistry, loadProviderRegistryFile, loadSettings, mapLegacyFields, maskApiKey, mergeLockFile, migrateSettings, projectSettingsPath, readLock, readPatch, readPluginsLockSlice, renderMemorySection, resolveConfiguredDriverTarget, resolveLibraryDir, resolveSettings, resolveSettingsWithSources, savePatch, saveProviderRegistryFile, saveSettings, userProviderRegistryPath, verifyLock, verifyLockEntry, walkForSettings, workspaceProviderRegistryPath, writeLock, writePluginsLockSlice };
|
|
1192
|
-
//# sourceMappingURL=chunk-
|
|
1193
|
-
//# sourceMappingURL=chunk-
|
|
1192
|
+
//# sourceMappingURL=chunk-OX2W5YF3.js.map
|
|
1193
|
+
//# sourceMappingURL=chunk-OX2W5YF3.js.map
|