@arbidocs/blocks 0.4.27 → 0.4.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/agents/index.cjs +222 -210
- package/dist/agents/index.js +4 -4
- package/dist/agents/tasks/TaskRowMenu.d.ts +4 -1
- package/dist/agents/tasks/TaskRunsDialog.d.ts +3 -1
- package/dist/agents/tasks/taskRows.d.ts +2 -0
- package/dist/agents/workflows/WorkflowDocumentsField.d.ts +12 -0
- package/dist/agents/workflows/index.d.ts +2 -0
- package/dist/agents/workflows/workspaceScope.d.ts +18 -0
- package/dist/chat/ChatPage.d.ts +1 -1
- package/dist/chat/chat-page-types.d.ts +12 -1
- package/dist/chat/index.cjs +129 -129
- package/dist/chat/index.js +2 -2
- package/dist/{chunk-CQ6CYPV4.js → chunk-3NZR6PAG.js} +7 -119
- package/dist/chunk-3NZR6PAG.js.map +1 -0
- package/dist/chunk-4XJZ6AAY.js +407 -0
- package/dist/chunk-4XJZ6AAY.js.map +1 -0
- package/dist/{chunk-UOLMFC5K.js → chunk-6YVI74BC.js} +498 -108
- package/dist/chunk-6YVI74BC.js.map +1 -0
- package/dist/{chunk-ZEIOREJY.js → chunk-EHXSBH6U.js} +37 -6
- package/dist/chunk-EHXSBH6U.js.map +1 -0
- package/dist/chunk-EYPPB5CY.cjs +85 -0
- package/dist/chunk-EYPPB5CY.cjs.map +1 -0
- package/dist/{chunk-TL2DHSC5.cjs → chunk-FRRDPYBR.cjs} +5 -120
- package/dist/chunk-FRRDPYBR.cjs.map +1 -0
- package/dist/{chunk-557EU3G4.js → chunk-JLOYWXRB.js} +3 -3
- package/dist/{chunk-557EU3G4.js.map → chunk-JLOYWXRB.js.map} +1 -1
- package/dist/chunk-KF4EC5XU.js +68 -0
- package/dist/chunk-KF4EC5XU.js.map +1 -0
- package/dist/{chunk-3ZXXHROK.cjs → chunk-NSZAHL23.cjs} +156 -37
- package/dist/chunk-NSZAHL23.cjs.map +1 -0
- package/dist/{chunk-ENY6XXKR.js → chunk-QMUI2MGT.js} +153 -37
- package/dist/chunk-QMUI2MGT.js.map +1 -0
- package/dist/chunk-S5HZBXZA.cjs +430 -0
- package/dist/chunk-S5HZBXZA.cjs.map +1 -0
- package/dist/{chunk-JCVZKCXC.cjs → chunk-TLQQV7WW.cjs} +37 -6
- package/dist/chunk-TLQQV7WW.cjs.map +1 -0
- package/dist/{chunk-NNH7N62N.cjs → chunk-VMCOH3AY.cjs} +497 -105
- package/dist/chunk-VMCOH3AY.cjs.map +1 -0
- package/dist/{chunk-JLPYOPCX.js → chunk-WSJVHSGN.js} +225 -36
- package/dist/chunk-WSJVHSGN.js.map +1 -0
- package/dist/{chunk-DCEI37AX.cjs → chunk-YVIOCITQ.cjs} +3 -3
- package/dist/{chunk-DCEI37AX.cjs.map → chunk-YVIOCITQ.cjs.map} +1 -1
- package/dist/{chunk-J22DXUJY.cjs → chunk-ZHLMDJCO.cjs} +226 -34
- package/dist/chunk-ZHLMDJCO.cjs.map +1 -0
- package/dist/connect/docx.cjs +26 -8
- package/dist/connect/docx.cjs.map +1 -1
- package/dist/connect/docx.d.ts +1 -0
- package/dist/connect/docx.js +24 -7
- package/dist/connect/docx.js.map +1 -1
- package/dist/connect/index.cjs +303 -61
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +4 -0
- package/dist/connect/index.js +263 -25
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedAgentChatPanel.d.ts +7 -0
- package/dist/connection/ConnectedNativeDocxEditor.d.ts +2 -1
- package/dist/connection/ConnectedSkillUpload.d.ts +2 -0
- package/dist/connection/ConnectedStreamedWordArtifact.d.ts +4 -0
- package/dist/connection/ConnectedTaskAccessRequest.d.ts +4 -0
- package/dist/connection/ai.d.ts +4 -1
- package/dist/connection/useConnectedWorkNotifications.d.ts +21 -0
- package/dist/docx/DocxMentions.d.ts +9 -2
- package/dist/docx/NativeDocxEditor.d.ts +11 -3
- package/dist/docx/StreamedWordArtifact.d.ts +15 -0
- package/dist/docx/index.cjs +16 -8
- package/dist/docx/index.d.ts +3 -2
- package/dist/docx/index.js +2 -2
- package/dist/docx/streamWordDocument.d.ts +12 -0
- package/dist/files/index.cjs +2 -2
- package/dist/files/index.js +2 -2
- package/dist/index.cjs +444 -432
- package/dist/index.js +7 -7
- package/dist/settings/index.cjs +41 -231
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +6 -202
- package/dist/settings/index.js.map +1 -1
- package/dist/studio/index.cjs +6 -5
- package/dist/studio/index.cjs.map +1 -1
- package/dist/studio/index.js +4 -3
- package/dist/studio/index.js.map +1 -1
- package/dist/workspaces/index.cjs +2 -2
- package/dist/workspaces/index.js +2 -2
- package/package.json +3 -3
- package/src/docx/styles.css +13 -0
- package/dist/chunk-3ZXXHROK.cjs.map +0 -1
- package/dist/chunk-5TRALRWN.js +0 -42
- package/dist/chunk-5TRALRWN.js.map +0 -1
- package/dist/chunk-CQ6CYPV4.js.map +0 -1
- package/dist/chunk-CQCC7LE7.js +0 -210
- package/dist/chunk-CQCC7LE7.js.map +0 -1
- package/dist/chunk-ENY6XXKR.js.map +0 -1
- package/dist/chunk-EUOGPUMJ.cjs +0 -59
- package/dist/chunk-EUOGPUMJ.cjs.map +0 -1
- package/dist/chunk-J22DXUJY.cjs.map +0 -1
- package/dist/chunk-JCVZKCXC.cjs.map +0 -1
- package/dist/chunk-JLPYOPCX.js.map +0 -1
- package/dist/chunk-NNH7N62N.cjs.map +0 -1
- package/dist/chunk-RFIBUWLF.cjs +0 -232
- package/dist/chunk-RFIBUWLF.cjs.map +0 -1
- package/dist/chunk-TL2DHSC5.cjs.map +0 -1
- package/dist/chunk-UOLMFC5K.js.map +0 -1
- package/dist/chunk-ZEIOREJY.js.map +0 -1
package/dist/studio/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/studio/liveData.ts","../../src/studio/liveWidgetRuntime.tsx","../../src/studio/widgets.tsx","../../src/components/assetImage.tsx","../../src/studio/publish.ts","../../src/studio/StudioEditor.tsx","../../src/studio/PageRenderer.tsx","../../src/studio/persistence.ts","../../src/studio/aiFields.tsx","../../src/connection/useImageGen.ts","../../src/studio/imageFields.tsx","../../src/studio/Section.tsx","../../src/studio/blockKit.tsx","../../src/studio/websiteBlocks.tsx","../../src/studio/siteBlocks.tsx","../../src/studio/blocksConfig.tsx","../../src/builder/modules/registry.ts","../../src/builder/modules/store.ts","../../src/builder/agents/store.ts","../../src/builder/export.ts","../../src/builder/ModuleManager.tsx","../../src/builder/AgentsPanel.tsx","../../src/builder/VerticalBuilder.tsx"],"names":["jsx","useArbi","useEffect","persist","jsxs","useState","useKitWorkspaceDocs","useRef","Loader2","Sparkles","useCallback","useMemo","useDocuments","useThumbnails","name","FileText","Rocket","Tabs","emptySlot","cn","Card","id","a","b","create","toggle","Button","Badge","useQuery","Cpu","CardHeader","CardTitle","CardContent","Bot","Palette"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,IAAM,eAAA,GAAkB,cAAuB,KAAK,CAAA;AAGpD,SAAS,iBAAA,GAA6B;AAC3C,EAAA,OAAO,WAAW,eAAe,CAAA;AACnC;ACKO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA4B;AACtE,EAAA,2BAAQ,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EAAO,MAAO,QAAA,EAAS,CAAA;AAC1D;AAOO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,MAAM,IAAA,GAAO,QAAA;AAAA,EACb;AACF,CAAA,EAIG;AACD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qFAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,mGAAA,EACd,8BAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAS,CAAA,EAC3B,CAAA;AAAA,6BACC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACrD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAO,QAAA,EAAA,sBAAA,EAAiB;AAAA,SAAA,EAC1C;AAAA;AAAA;AAAA,GACF;AAEJ;AAIA,SAAS,oBAAA,GAA2C;AAClD,EAAA,MAAM,EAAE,WAAA,EAAa,mBAAA,EAAoB,GAAI,aAAA,EAAc;AAC3D,EAAA,OAAO,eAAe,mBAAA,IAAuB,MAAA;AAC/C;AAGA,SAAS,QAAQ,GAAA,EAAiC;AAChD,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,EAAE,OAAA,EAAQ;AACnC,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,IAAQ,GAAI,CAAC,CAAA;AAC5D,EAAA,IAAI,CAAA,GAAI,IAAI,OAAO,UAAA;AACnB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC3B,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,CAAA,EAAG,CAAC,CAAA,KAAA,CAAA;AACvB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC3B,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,CAAA,EAAG,CAAC,CAAA,KAAA,CAAA;AACvB,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAC,CAAA,KAAA,CAAA;AAC9B;AAEA,IAAM,cAAA,GAAiB;AAAA,EACrB,SAAA,EAAW,EAAE,KAAA,EAAO,WAAA,EAAa,MAAM,QAAA,EAAS;AAAA,EAChD,aAAA,EAAe,EAAE,KAAA,EAAO,eAAA,EAAiB,MAAM,GAAA;AACjD,CAAA;AAGA,IAAM,cAAA,GAAiB,CAAC,CAAA,KACtB,CAAA,IAAK,iBAAkB,CAAA,GAAqB,WAAA;AAS9C,SAAS,iBAAA,CAAkB;AAAA,EACzB,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,OAAO,oBAAA,EAAqB;AAClC,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,iBAAiB,IAAI,CAAA;AACjD,EAAA,MAAM,IAAA,GAAO,CAAC,GAAK,IAAA,IAAQ,EAAsB,CAAA,CAC9C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,IAAI,IAAA,CAAK,CAAA,CAAE,UAAA,IAAc,CAAC,CAAA,GAAI,CAAC,IAAI,IAAA,CAAK,CAAA,CAAE,UAAA,IAAc,CAAC,CAAC,CAAA,CAC1E,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAEjB,EAAA,4BACG,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAW,SAAA,EAAU,gBAAA,EAAiB,eAAa,MAAA,EAC/D,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,WAAU,8BAAA,EAA+B,CAAA;AAAA,sBAC9C,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAC9D,CAAA;AAAA,IACC,4BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,eAAa,CAAA,EAAG,MAAM,CAAA,QAAA,CAAA,EAAY,QAAA,EAAA,6BAAA,EAE/E,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,mBAClB,GAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAgC,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,MAAA,CAAA,EAAU,QAAA,EAAA,uBAAA,EAE7E,CAAA,mBAEA,GAAA,CAAC,QAAG,SAAA,EAAU,WAAA,EAAY,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA,EAC7C,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,qBACZ,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,yCAAA;AAAA,QACV,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA;AAAA,QAEhC,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kCAAA,EACd,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,cAAA,EAAA,EAAe,WAAU,yCAAA,EAA0C,CAAA;AAAA,4BACpE,GAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EACb,YAAE,KAAA,EAAO,IAAA,MAAU,iBAAA,EACtB;AAAA,WAAA,EACF,CAAA;AAAA,8BACC,MAAA,EAAA,EAAK,SAAA,EAAU,0CACb,QAAA,EAAA,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,EACvB;AAAA;AAAA,OAAA;AAAA,MAZK,EAAE,WAAA,IAAe;AAAA,KAczB,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,OAAO,oBAAA,EAAqB;AAClC,EAAA,MAAM,OAAO,YAAA,CAAa,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,KAAW,aAAa,CAAA;AACnE,EAAA,MAAM,SAAS,gBAAA,CAAiB,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,KAAW,iBAAiB,CAAA;AAC7E,EAAA,MAAM,KAAA,GAAQ,MAAA,KAAW,WAAA,GAAc,IAAA,GAAO,MAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA;AAC9D,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,CAAE,KAAA;AAAA,MACvC,KAAA,EAAO,KAAA,CAAM,SAAA,GAAY,QAAA,GAAM,OAAO,KAAK,CAAA;AAAA,MAC3C,MAAA;AAAA,MACA,IAAA,EAAM,cAAA,CAAe,MAAM,CAAA,CAAE,IAAA;AAAA,MAC7B;AAAA;AAAA,GACF;AAEJ;AAKO,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,OAAO,mBAAkB,mBACvB,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAc,OAAc,MAAA,EAAgB,CAAA,mBAE/D,GAAA,CAAC,iBAAA,EAAA,EAAkB,OAAO,MAAA,CAAO,KAAA,IAAS,gBAAgB,CAAA,EAAG,IAAA,EAAM,KAAK,MAAA,EAAgB,CAAA;AAE5F;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,GAAA,GAAM,eAAe,MAAM,CAAA;AACjC,EAAA,OAAO,iBAAA,qBACL,GAAA,CAAC,eAAA,EAAA,EAAgB,OAAc,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAgB,MAAA,EAAgB,CAAA,mBAE5E,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,OAAO,MAAA,CAAO,KAAA,IAAS,cAAA,CAAe,GAAG,EAAE,KAAK,CAAA;AAAA,MAChD,IAAA,EAAM,cAAA,CAAe,GAAG,CAAA,CAAE,IAAA;AAAA,MAC1B;AAAA;AAAA,GACF;AAEJ;ACpMO,SAAS,kBAAkB,GAAA,EAAgD;AAChF,EAAA,MAAM,EAAE,aAAY,GAAI,GAAA;AAExB,EAAA,MAAM,mBAAA,GAAuC;AAAA,IAC3C,KAAA,EAAO,uBAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA;AAAE,KACzD;AAAA,IACA,YAAA,EAAc,EAAE,KAAA,EAAO,uBAAA,EAAyB,OAAO,CAAA,EAAE;AAAA,IACzD,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,OAAO,KAAA,EAAM,qBAC1BA,GAAAA,CAAC,sBAAmB,KAAA,EAAc,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE7E;AAEA,EAAA,MAAM,gBAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,UACzC,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,eAAA;AAAgB;AACnD,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA;AAAU;AACvC;AACF,KACF;AAAA,IACA,cAAc,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,WAAA,EAAa,QAAQ,SAAA,EAAU;AAAA,IAClE,QAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,MAAA,EAAO,qBACnCA,GAAAA,CAAC,mBAAgB,KAAA,EAAc,MAAA,EAAgB,QAAgB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE5F;AAEA,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,mBAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AACF;AC1CO,SAAS,cAAc,KAAA,EAAmC;AAC/D,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,KAAW,aAAA,CAAc,CAAC,KAAK,CAAC,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAE5B,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,QAAA,CAAS;AAAA,IACnC,QAAA,EAAU,CAAC,MAAA,EAAQ,aAAA,EAAe,KAAK,CAAA;AAAA,IACvC,SAAS,YAAY;AACnB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,KAAK,CAAA;AAC/C,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,OAAO,GAAA,CAAI,gBAAgB,IAAI,CAAA;AAAA,IACjC,CAAA;AAAA;AAAA,IAEA,OAAA,EAAS,CAAC,CAAC,KAAA,IAAS,UAAU,IAAA,IAAQ,CAAC,SAAS,IAAA,CAAK,YAAA;AAAA,IACrD,WAAW,EAAA,GAAK;AAAA,GACjB,CAAA;AAGD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,SAAA,EAAW,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO,KAAA,IAAS,SAAA;AAClB;AAMO,SAAS,WAAW,EAAE,KAAA,EAAO,GAAA,EAAK,SAAA,EAAW,QAAO,EAAqB;AAC9E,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,GAAA,IAAO,MAAA,EAAW,GAAA,EAAK,GAAA,IAAO,EAAA,EAAI,SAAA,EAAsB,aAAA,EAAa,MAAA,EAAQ,CAAA;AAChG;;;AC5BA,SAAS,cAAc,IAAA,EAA6B;AAClD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAgB,CAAA;AACrD,IAAA,MAAA,CAAO,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC1C,IAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;AAOO,SAAS,sBAAA,CACd,IAAA,EACA,IAAA,GAA2B,EAAC,EACT;AACnB,EAAA,OAAO,OAAO,KAAA,KAAkB;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,KAAK,CAAA;AAC/C,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,IAAI,KAAK,YAAA,EAAc,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,OAAO,IAAI,CAAA;AACjE,MAAA,OAAO,MAAM,cAAc,IAAI,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAGA,SAAS,gBAAA,CAAiB,MAAe,GAAA,EAAwB;AAC/D,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG,GAAA,CAAI,IAAI,IAAI,CAAA;AAClC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,EAAM,gBAAA,CAAiB,KAAA,EAAO,GAAG,CAAA;AACrD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,KAAA,MAAW,SAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG,gBAAA,CAAiB,OAAO,GAAG,CAAA;AAAA,EACtE;AACF;AAGA,SAAS,gBAAA,CAAoB,MAAS,YAAA,EAAsC;AAC1E,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAQ,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,EACpC;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,UAAU,gBAAA,CAAiB,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,gBAAA,CAAiB,KAAA,EAAO,YAAY,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAOA,eAAsB,mBAAA,CACpB,MACA,WAAA,EACe;AACf,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAC3B,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAE5B,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,CAAC,GAAG,IAAI,CAAA,CAAE,GAAA,CAAI,OAAO,GAAA,KAAQ;AAC3B,MAAA,MAAM,GAAA,GAAM,MAAM,WAAA,CAAY,UAAA,CAAW,GAAG,CAAC,CAAA;AAC7C,MAAA,IAAI,GAAA,EAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAAA,IACpC,CAAC;AAAA,GACH;AACA,EAAA,IAAI,YAAA,CAAa,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,OAAO,gBAAA,CAAiB,MAAM,YAAY,CAAA;AAC5C;AC5FA,IAAM,aAAa,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AA6BpC,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,MAAA;AAAA,EACZ,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,QAAA;AAAA,EACf,YAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAsB;AACpB,EAAA,MAAM,OAAOC,OAAAA,EAAQ;AACrB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,MAAM,WAAA,GAAc,OAAA;AAAA,IAClB,MAAM,sBAAA,CAAuB,IAAA,EAAM,EAAE,cAAc,CAAA;AAAA,IACnD,CAAC,MAAM,YAAY;AAAA,GACrB;AAEA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,CAAiB,eAAe,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,IAAQ,MAAM,CAAA;AAChF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAe,UAAU,CAAA;AACjD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AAChC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAA4B,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAG1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,OAAa,UAAU,CAAA;AAGtC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAA,CAAU,MAAM,WAAA,CAAY,QAAA,CAAe,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA;AAAA,MAChE,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAM,OAAA,GAAU,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,yBAAA;AACjD,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,MAAA,CAAO,SAAS,OAAO,CAAA;AACvB,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAM,OAAO,MAAA,IAAU,UAAA;AACvB,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,MAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACnB,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAMf,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,CAAA,CAAE,oBAAoB,CAAC,CAAA,KAAM,YAAY,UAAA,CAAW,IAAA,EAAM,MAAM,CAAC,CAAA;AACjE,IAAA,OAAO,MAAM;AACX,MAAA,OAAO,CAAA,CAAE,iBAAA;AAAA,IACX,CAAA;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,WAAW,CAAC,CAAA;AAIvC,EAAA,MAAMC,QAAAA,GAAU,WAAA;AAAA,IACd,OAAO,MAAA,KAAiB;AACtB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,MAAM,WAAA,CAAY,SAAS,IAAA,EAAM,IAAA,EAAM,MAAM,MAAM,CAAA;AACjE,QAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB,MAAA,EAAQ,WAAW,CAAA;AAC/D,QAAA,MAAM,WAAA,CAAY,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,MAAM,SAAS,CAAA;AAC3D,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,SAAS,CAAA,EAAG;AACV,QAAA,MAAA,CAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,2BAA2B,OAAO,CAAA;AAAA,MAC5E,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAa,aAAa,MAAM;AAAA,GACrD;AAIA,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAA,CAAU,MAAM,WAAA,CAAY,SAAA,CAAuB,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA;AAAA,MAClE,SAAS,CAAA,EAAG;AACV,QAAA,MAAA,CAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,4BAA4B,OAAO,CAAA;AAC3E,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAA,IAAa,CAAC,MAAA,EAAQ;AAC1B,MAAA,WAAA,CAAY,SAAS,QAAA,CAAS;AAAA,QAC5B,QAAQ,EAAE,GAAG,aAAa,MAAA,EAAQ,GAAG,OAAO,MAAA,EAAO;AAAA,QACnD,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,YAAA,CAAa,KAAA;AAAA,QACpC,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,YAAA,CAAa,MAAA;AAAA,QACtC,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA,gBAAA,CAAiB,WAAW,CAAA;AAAA,IAC9B,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAGf,EAAA,MAAM,eAAA,GAAkB,YAAY,YAAY;AAC9C,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,CAAS,QAAA,GAAW,QAAA,EAAS;AAC1D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,WAAA,CAAY,SAAA,CAAU,IAAA,EAAM,MAAM,QAAQ,CAAA;AAAA,IACzD,SAAS,CAAA,EAAG;AACV,MAAA,MAAA,CAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,4BAA4B,OAAO,CAAA;AAC3E,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,MAAM,WAAA,EAAa,WAAA,EAAa,MAAM,CAAC,CAAA;AAEjD,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,eAAY,aAAA,EAErC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,kEAAA,EACf,QAAA,EAAA;AAAA,MAAA,QAAA,oBACCA,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,QAAA;AAAA,YACJ,SAAA,EAAU,wGAAA;AAAA,YACV,aAAA,EAAa,GAAG,YAAY,CAAA,KAAA,CAAA;AAAA,YAE5B,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SACpC;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB;AAAA,OAAA,EACvC,CAAA;AAAA,sBAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAsD,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,sBACjFA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACvC,SAAA,EAAU,8DAAA;AAAA,UACV,aAAA,EAAa,GAAG,YAAY,CAAA,KAAA,CAAA;AAAA,UAE3B,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,GAAAA,CAAC,QAAA,EAAA,EAAoB,KAAA,EAAO,CAAA,CAAE,IAAA,EAC3B,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EADQ,CAAA,CAAE,IAEf,CACD;AAAA;AAAA,OACH;AAAA,sBAEAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,QAAA,GAAA,oBACCA,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+BAAA;AAAA,YACV,aAAA,EAAa,GAAG,YAAY,CAAA,SAAA,CAAA;AAAA,YAC7B,QAAA,EAAA;AAAA,cAAA,YAAA;AAAA,cACY;AAAA;AAAA;AAAA,SACb;AAAA,wBAEFA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM,YAAA,CAAa,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,YACrC,SAAA,EAAU,0JAAA;AAAA,YACV,aAAA,EAAa,GAAG,YAAY,CAAA,aAAA,CAAA;AAAA,YAE5B,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SAChC;AAAA,wBACAI,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,KAAKD,QAAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,YAC1C,QAAA,EAAU,MAAA,IAAU,OAAA,IAAW,SAAA,KAAc,IAAA;AAAA,YAC7C,SAAA,EAAU,wJAAA;AAAA,YACV,aAAA,EAAa,GAAG,YAAY,CAAA,QAAA,CAAA;AAAA,YAE3B,QAAA,EAAA;AAAA,cAAA,MAAA,mBAASH,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,oBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,cAClF,SAAS,kBAAA,GAAgB;AAAA;AAAA;AAAA;AAC5B,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,sCACCA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,SAAA,EAAU,sEAAA;AAAA,UACV,aAAA,EAAa,GAAG,YAAY,CAAA,WAAA,CAAA;AAAA,UAE3B,QAAA,EAAA;AAAA;AAAA,OACH,GACE,0BACFI,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,uEAAA;AAAA,UACV,aAAA,EAAa,GAAG,YAAY,CAAA,QAAA,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA,4BAAAJ,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,YAAE,iBAAA;AAAA,YAAW,IAAA;AAAA,YAAK;AAAA;AAAA;AAAA,0BAGlEA,GAAAA,CAAC,qBAAA,EAAA,EAAsB,MAAA,EAAQ,YAC7B,QAAA,kBAAAA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,MAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,MAAA,CAAO,OAAA,GAAU,CAAA;AAAA,UACnB,CAAA;AAAA,UACA,SAAA,EAAW,CAAC,CAAA,KAAM,KAAKG,SAAQ,CAAC;AAAA,SAAA;AAAA,QAN3B,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,SAQvB,CAAA,EAEJ,CAAA;AAAA,MAEC,6BACCH,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sCAAA;AAAA,UACV,aAAA,EAAa,GAAG,YAAY,CAAA,aAAA,CAAA;AAAA,UAE5B,QAAA,kBAAAA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,WAAA;AAAA,cACR,OAAA,EAAQ,QAAA;AAAA,cACR,YAAA,EAAc,GAAG,YAAY,CAAA,MAAA,CAAA;AAAA,cAC7B,MAAA,EAAQ;AAAA;AAAA;AACV;AAAA;AACF,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;ACvPO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,EAAM,QAAA;AAAA,EACN,UAAA;AAAA,EACA,YAAA,GAAe,QAAA;AAAA,EACf,QAAA,GAAW,KAAA;AAAA,EACX,WAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,EAAsB;AACpB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,IAAA,GAAO,QAAA,IAAY,MAAA,CAAO,IAAA,IAAQ,MAAA;AACxC,EAAA,MAAM,OAAOC,OAAAA,EAAQ;AAErB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,QAAAA,CAAsB,eAAe,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,QAAAA,CAAS,CAAC,WAAW,CAAA;AACnD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAAH,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,CAAC,WAAW,CAAA;AACvB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AAGF,QAAA,MAAM,KAAA,GAAQ,cACT,MAAM,WAAA,CAAY,UAAuB,IAAA,EAAM,IAAI,GAAG,IAAA,GACvD,KAAA,CAAA;AACJ,QAAA,IAAI,SAAA,EAAW;AAGf,QAAA,MAAM,OACJ,WAAA,IAAA,CACC,MAAM,WAAA,CAAY,aAAA,CAAoB,MAAM,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA,IAAA,CACzD,MAAM,WAAA,CAAY,QAAA,CAAe,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA;AACvD,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,cAAA;AAAA,YACE,KAAA,GACI,EAAE,GAAG,YAAA,EAAc,GAAG,KAAA,EAAO,MAAA,EAAQ,EAAE,GAAG,aAAa,MAAA,EAAQ,GAAG,KAAA,CAAM,MAAA,IAAS,GACjF;AAAA,WACN;AAAA,QACF;AACA,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,QAAA,CAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,yBAAyB,CAAA;AACnE,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,WAAA,EAAa,YAAA,EAAc,WAAA,EAAa,UAAU,CAAC,CAAA;AAEzE,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEF,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,6EAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,eAAA,CAAA;AAAA,QAC7B,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAU,mEAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,aAAA,CAAA;AAAA,QAE3B,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtC,IAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,uBAAA;AACnC,IAAA,MAAM,IAAA,GAAO,UAAA,EAAY,IAAA,IAAQ,CAAA,kBAAA,EAAgB,IAAI,CAAA,2BAAA,CAAA;AACrD,IAAA,uBACEI,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0CAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,aAAA,CAAA;AAAA,QAE5B,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAC3EA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA;AAAA,KAC1D;AAAA,EAEJ;AAEA,EAAA,MAAM,QAAA,mBAAWA,GAAAA,CAAC,MAAA,EAAA,EAAO,QAAgB,IAAA,EAAY,CAAA;AACrD,EAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAa,CAAA,KAAA,EAAQ,YAAY,CAAA,OAAA,CAAA,EACpC,QAAA,EAAA,QAAA,mBAAWA,GAAAA,CAAC,gBAAA,EAAA,EAAkB,QAAA,EAAA,QAAA,EAAS,IAAsB,QAAA,EAChE,CAAA;AAEJ;;;AC5HO,IAAM,sBAAA,GAAN,cAAqC,KAAA,CAAM;AAAA,EAChD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AAAA,EACd;AACF;AAkCO,SAAS,wBAAwB,GAAA,EAAiD;AACvF,EAAA,MAAM,eAAe,GAAA,CAAI,WAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,MAAA;AAC7B,EAAA,MAAM,IAAA,GAA+B,IAAI,gBAAA,IAAoB,KAAA;AAG7D,EAAA,SAAS,OAAO,IAAA,EAAsB;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,IAAe;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,sBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,GAAG,GAAA,CAAI,aAAa,CAAA,EAAG,KAAK,IAAI,IAAI,CAAA,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAiB,MAAA,CAAO,IAAI,CAAA;AAC7C,EAAA,MAAM,eAAe,CAAC,IAAA,KAAiB,MAAA,CAAO,CAAA,UAAA,EAAa,IAAI,CAAA,CAAE,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAAI,mBAAmB,OAAO,CAAA;AAC5D,EAAA,MAAM,eAAe,CAAC,UAAA,KACpB,IAAA,KAAS,QAAA,IAAa,SAAS,UAAA,IAAc,UAAA;AAE/C,EAAA,SAAS,WAAA,CAAY,MAAc,KAAA,EAAyC;AAC1E,IAAA,OAAO,IAAI,sBAAA;AAAA,MACT,GAAG,IAAI,CAAA,8EAAA,CAAA;AAAA,MACP,EAAE,KAAA;AAAM,KACV;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,aAAA,IAAiB,YAAA;AACxC,EAAA,MAAM,WAAW,GAAA,CAAI,YAAA,KAAiB,CAAC,IAAA,KAAiB,GAAG,IAAI,CAAA,KAAA,CAAA,CAAA;AAC/D,EAAA,MAAM,gBAAgB,GAAA,CAAI,iBAAA,KAAsB,CAAC,IAAA,KAAiB,GAAG,IAAI,CAAA,eAAA,CAAA,CAAA;AAGzE,EAAA,SAAS,UAAA,CAAW,MAAmB,IAAA,EAA6B;AAClE,IAAA,OAAO,IAAA,IAAQ,CAAC,CAAC,IAAA;AAAA,EACnB;AAGA,EAAA,eAAe,UAAA,CAAW,IAAA,EAAY,QAAA,EAAkB,GAAA,EAA6B;AACnF,IAAA,MAAM,IAAA,CAAK,gBAAgB,YAAY,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,oBAAoB,CAAA;AAClF,IAAA,MAAM,IAAA,CAAK,UAAU,UAAA,CAAW,IAAA,EAAM,UAAU,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACpE;AAGA,EAAA,eAAe,YAAA,CAAgB,MAAY,QAAA,EAAqC;AAC9E,IAAA,MAAM,IAAA,CAAK,gBAAgB,YAAY,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK;AAEvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,SAAA,IAAa,EAAA,EAAI,QAAA,CAAS,QAAQ,CAAA,IAAA,CAAM,CAAA,CAAE,MAAA,IAAU,EAAA,EAAI,QAAA,CAAS,MAAM,CAAC,CAAA,CACzF,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAA,GAAa,CAAA,GAAI,EAAG,EAAE,CAAC,CAAA;AAC3D,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAGnB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,MAAM,WAAW,CAAA;AAC3D,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,GAAA,CAAI,MAAM,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,UAAU,gBAAA,CAAiB,KAAA,CAAM,aAAa,SAAS,CAAA;AACjF,MAAA,MAAM,GAAA,GAAM,OAAO,MAAA,EAAQ,OAAA,KAAY,WAAW,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACxF,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,SAAS,UAAA,CAAW,KAAa,IAAA,EAAqB;AACpD,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAChD,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,IAAI,sBAAA,CAAuB,kCAAA,EAAoC,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,IACnF;AAAA,EACF;AAGA,EAAA,eAAe,UACb,IAAA,EACA,IAAA,EACA,IAAA,EACA,QAAA,EACA,UACA,IAAA,EACqB;AACrB,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA,EAAG;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,CAAW,IAAA,EAAM,QAAA,EAAU,IAAI,CAAA;AACrC,QAAA,IAAI,aAAa,KAAK,CAAA,EAAG,UAAA,CAAW,QAAA,IAAY,IAAI,CAAA;AACpD,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAA,YAAa,wBAAwB,MAAM,CAAA;AAC/C,QAAA,OAAA,GAAU,CAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,CAAC,YAAA,CAAa,IAAI,CAAA,EAAG,MAAM,WAAA,CAAY,CAAA,YAAA,EAAe,IAAI,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AACvF,IAAA,UAAA,CAAW,QAAA,IAAY,IAAI,CAAA;AAC3B,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,eAAe,QAAA,CACb,IAAA,EACA,IAAA,EACA,QAAA,EACA,QAAA,EACwB;AACxB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA,EAAG;AAC1B,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAgB,IAAA,EAAM,QAAQ,CAAA;AACjD,QAAA,IAAI,IAAA,EAAM,OAAO,EAAE,IAAA,EAAM,KAAK,MAAA,EAAO;AAAA,MACvC,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,SAAS,KAAA,EAAO,MAAM,YAAY,CAAA,aAAA,EAAgB,QAAQ,KAAK,CAAC,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAI,WAAW,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAK,MAAA,EAAO;AAChD,MAAA,MAAM,WAAA,CAAY,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,SAAA,CAAa,UAAU,CAAA;AAAA,EAChC;AAEA,EAAA,SAAS,UAAa,GAAA,EAA4B;AAChD,IAAA,MAAM,GAAA,GAAM,aAAa,GAAG,CAAA;AAC5B,IAAA,OAAO,EAAE,MAAM,GAAA,GAAO,IAAA,CAAK,MAAM,GAAG,CAAA,GAAU,IAAA,EAAM,GAAA,EAAK,OAAA,EAAQ;AAAA,EACnE;AAGA,EAAA,SAAS,QAAA,CAAS,IAAA,EAAmB,IAAA,EAAe,IAAA,EAAc,IAAA,EAAe;AAC/E,IAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA,EAChF;AAEA,EAAA,SAAS,QAAA,CAAY,IAAA,EAAmB,IAAA,EAAe,IAAA,EAAc;AACnE,IAAA,OAAO,QAAA,CAAY,MAAM,IAAA,EAAM,MAAM,QAAQ,IAAI,CAAA,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,EACpE;AAGA,EAAA,SAAS,aAAA,CAAc,IAAA,EAAmB,IAAA,EAAe,IAAA,EAAc,IAAA,EAAe;AACpF,IAAA,OAAO,SAAA;AAAA,MACL,IAAA;AAAA,MACA,IAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAM,aAAa,IAAI,CAAA;AAAA,MACvB,cAAc,IAAI,CAAA;AAAA,MAClB;AAAA,KACF;AAAA,EACF;AAEA,EAAA,SAAS,aAAA,CAAiB,IAAA,EAAmB,IAAA,EAAe,IAAA,EAAc;AACxE,IAAA,OAAO,QAAA,CAAY,MAAM,IAAA,EAAM,MAAM,aAAa,IAAI,CAAA,EAAG,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,EAC9E;AAIA,EAAA,eAAe,UAAA,CAAW,IAAA,EAAmB,IAAA,EAAe,IAAA,EAA6B;AACvF,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAC,CAAA;AACrC,QAAA,YAAA,CAAa,UAAA,CAAW,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,MAC5C,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAA,YAAa,wBAAwB,MAAM,CAAA;AAAA,MAEjD;AAAA,IACF;AACA,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA,EAAG;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,gBAAgB,YAAY,CAAA;AACvC,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK;AACvC,MAAA,MAAM,QAAQ,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG,aAAA,CAAc,IAAI,CAAC,CAAA;AAClD,MAAA,MAAM,MAAM,IAAA,CACT,MAAA;AAAA,QACC,CAAC,CAAA,KAAA,CACE,CAAA,CAAE,MAAA,IAAU,EAAA,EAAI,SAAS,MAAM,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,aAAa,EAAA,EAAI,QAAA,CAAS,CAAC,CAAC;AAAA,OAC1F,CACC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC3B,MAAA,IAAI,IAAI,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,IACjD,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,IAAI,sBAAA,CAAuB,CAAA,kCAAA,EAAqC,IAAI,CAAA,WAAA,CAAA,EAAe;AAAA,QACvF,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,eAAe,SAAA,CAAU,IAAA,EAAmB,IAAA,EAAe,KAAA,EAAqC;AAC9F,IAAA,OAAO,UAAU,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,YAAY,KAAK,CAAA;AAAA,EACnE;AAGA,EAAA,eAAe,SAAA,CAAa,MAAmB,IAAA,EAAuC;AACpF,IAAA,OAAO,QAAA,CAAY,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AAAA,EACrD;AAEA,EAAA,SAAS,aAAa,GAAA,EAA4B;AAChD,IAAA,IAAI;AACF,MAAA,OAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,eAAe,aAAA,EAAe,UAAA,EAAY,WAAW,SAAA,EAAU;AAC9F;AC9NA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIM,gBAAA,CAAoB,WAAW,CAAA;AAClD,EAAA,MAAM,OAAO,SAAA,EAAU;AACvB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAYE,OAAO,KAAK,CAAA;AAG9B,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,UAAU,OAAA,IAAW,IAAA,CAAK,IAAA,EAAM,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAC,CAAA;AAExB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,CAAC,IAAA,CAAK,SAAA,EAAW;AAC7B,MAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,QAAQ,YAAY;AACxB,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,KAAA,IAAS,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA;AAAA,EAC3E,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,CAAA,EAAG,YAAY,UAAU,IAAI,CAAA;AAElD,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCJ,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oBAAA;AAAA,QACV,IAAA,EAAM,CAAA;AAAA,QACN,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,WAAA;AAAA,QACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,aAAA,EAAa;AAAA;AAAA,wBAGfA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oBAAA;AAAA,QACV,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,WAAA;AAAA,QACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,aAAA,EAAa;AAAA;AAAA,KACf;AAAA,oBAEFI,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,kBAAA;AAAA,QACV,OAAA,EAAS,MAAM,KAAK,KAAA,EAAM;AAAA,QAC1B,UAAU,IAAA,CAAK,SAAA;AAAA,QACf,aAAA,EAAa,GAAA,CAAI,CAAA,EAAG,YAAY,aAAa,IAAI,CAAA;AAAA,QACjD,KAAA,EAAM,+DAAA;AAAA,QAEL,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,SAAA,mBACJJ,GAAAA,CAACQ,OAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA,mBAEzCR,GAAAA,CAACS,QAAAA,EAAA,EAAS,WAAU,QAAA,EAAS,CAAA;AAAA,UAE9B,IAAA,CAAK,YAAY,eAAA,GAAa;AAAA;AAAA;AAAA;AACjC,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,eAAe,GAAA,EAA+B;AAC5D,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAI,GAAA;AACrC,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,IAAe,MAAA;AACvC,EAAA,MAAM,YAAA,GAAe,IAAI,YAAA,IAAgB,QAAA;AAGzC,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,EAAe,WAAA,MAA+C;AAAA,IAC5E,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,IAAA,uBAC1BT,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA,EAAM,WAAA;AAAA,QACN,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AAAA;AACF,GAEJ,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CACjB,KAAA,EACA,WAAA,EACA,OAAe,WAAA,MACU;AAAA,IACzB,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,IAAA,uBAC1BA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,SAAA,EAAS;AAAA;AAAA;AACX,GAEJ,CAAA;AAEA,EAAA,OAAO,EAAE,QAAQ,UAAA,EAAW;AAC9B;AC7JA,SAAS,iBAAiB,SAAA,EAAoD;AAC5E,EAAA,KAAA,IAAS,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC9C,IAAA,IAAI,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,KAAS,SAAS,OAAO,SAAA,CAAU,CAAC,CAAA,CAAE,UAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAA;AACT;AAuBO,SAAS,WAAA,GAA2B;AACzC,EAAA,MAAM,OAAO,kBAAA,EAAmB;AAChC,EAAA,MAAM,EAAE,KAAI,GAAI,IAAA;AAEhB,EAAA,MAAM,QAAA,GAAWU,WAAAA;AAAA,IACf,OAAO,MAAA,EAAgB,eAAA,GAA4B,EAAC,KAA8B;AAChF,MAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,MAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAMrB,MAAA,MAAM,SAAS,MAAM,GAAA,CAAI,CAAA,OAAA,EAAU,OAAO,IAAI,eAAe,CAAA;AAC7D,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,SAAA,IAAa,EAAE,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,MAAM,QAAA,GAAWC,OAAAA,CAAQ,MAAM,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA,EAAG,CAAC,IAAA,CAAK,SAAS,CAAC,CAAA;AAEjF,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,cAAc,IAAA,CAAK,SAAA;AAAA,IACnB,QAAA;AAAA,IACA,OAAO,IAAA,CAAK;AAAA,GACd;AACF;ACxCA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,GAAI,MAAA;AACxC;AA0BA,IAAM,SAAA,GAAY,mCAAA;AAElB,SAAS,iBAAA,CAAkB;AAAA,EACzB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIN,SAAe,OAAO,CAAA;AAC9C,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,SAAS,EAAE,CAAA;AACjC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAmB,EAAE,CAAA;AAEjD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,WAAW,CAAA;AACpD,EAAA,MAAM,OAAOJ,OAAAA,EAAQ;AACrB,EAAA,MAAM,MAAM,WAAA,EAAY;AACxB,EAAA,MAAM,cAAc,cAAA,EAAe;AAInC,EAAA,MAAM,iBAAA,GAAoB,cAAc,UAAA,CAAW,KAAK,IAAI,UAAA,CAAW,KAAK,IAAI,EAAE,CAAA;AAElF,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,KAA2B,GAAA,CAAI,GAAG,YAAY,CAAA,MAAA,CAAA,EAAU,IAAA,EAAM,GAAG,CAAC,CAAA;AAIjF,EAAA,MAAM,aAAA,GAAgB,MACpB,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,CAAC,MAAA,EAAQ,WAAA,EAAa,WAAW,CAAA,EAAG,CAAA;AAGhF,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAIW,aAAa,WAAW,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAYD,OAAAA;AAAA,IAChB,MAAA,CACG,IAAA,IAAQ,EAAC,EAAG,MAAA;AAAA,MACX,CAAC,CAAA,KAAqC,CAAA,CAAE,aAAa,SAAA,CAAU,IAAA,CAAK,EAAE,SAAS;AAAA,KACjF;AAAA,IACF,CAAC,IAAI;AAAA,GACP;AACA,EAAA,MAAM,QAAA,GAAWA,OAAAA;AAAA,IACf,MAAM,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAA+B,EAAE,WAAW,CAAA;AAAA,IACjE,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAIE,cAAc,QAAQ,CAAA;AAI/C,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAqC;AACrD,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,WAAA,CAAY,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAChC,IAAA,UAAA,CAAW,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC,CAAA;AACpC,IAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,WAAA,CAAY,aAAa,CAAA;AACzB,IAAA,UAAA,CAAW,iBAAiB,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,OAAO,IAAA,EAAYC,KAAAA,KAAiB;AAC5D,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,gBAAgB,WAAW,CAAA;AACtC,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAGA,KAAAA,EAAM,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AACvD,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,WAAW,IAAA,EAAMA,KAAAA,EAAM,EAAE,MAAA,EAAQ,CAAA;AAClE,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,GAAc,CAAC,CAAA;AAC9B,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,QAAA,CAAS,UAAA,CAAW,EAAE,CAAC,CAAA;AACvB,QAAA,KAAK,aAAA,EAAc;AAAA,MACrB;AAAA,IACF,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,KAAuB;AACnD,IAAA,MAAM,GAAA,GAAM,OAAA;AACZ,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAM,iBAAA,CAAkB,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AAC7C,IAAA,IAAI,KAAK,UAAA,CAAW,OAAO,CAAA,EAAG,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACvD,CAAA;AAGA,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KACjB,SAAA,CAAU,CAAC,IAAA,KAAU,IAAA,CAAK,SAAS,EAAE,CAAA,GAAI,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,EAAE,IAAI,CAAC,GAAG,IAAA,EAAM,EAAE,CAAE,CAAA;AAExF,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAK,IAAK,IAAI,YAAA,EAAc;AACxC,IAAA,MAAM,EAAA,GAAK,MAAM,GAAA,CAAI,QAAA,CAAS,QAAQ,MAAM,CAAA;AAC5C,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,QAAA,CAAS,UAAA,CAAW,EAAE,CAAC,CAAA;AACvB,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,KAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,KAAA,GAA6D;AAAA,IACjE,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,MAAM,SAAA,EAAU;AAAA,IACjD,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,MAAA,EAAO;AAAA,IAC/C,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,IACxC,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,MAAML,QAAAA;AAAS,GACvD;AAEA,EAAA,MAAM,UAAA,GACJ,wHAAA;AACF,EAAA,MAAM,WAAW,CAAC,EAAA,KAChB,CAAA,wEAAA,EACE,EAAA,GAAK,uCAAuC,6CAC9C,CAAA,CAAA;AAEF,EAAA,uBACEL,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAsB,aAAA,EAAa,IAAG,EACnD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,UAAA,EAAA,EAAW,GAAA,EAAK,KAAA,EAAO,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,IAAA,EAAK,MAAA,EAAQ,EAAA,CAAG,SAAS,CAAA,EAAG,CAAA;AAAA,MACzE,oCACCI,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,SAAA,EAAU,iLAAA;AAAA,UACV,aAAA,EAAa,GAAG,SAAS,CAAA;AAAA,UAEzB,QAAA,EAAA;AAAA,4BAAAJ,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA,OAC7B,GACE;AAAA,KAAA,EACN,CAAA;AAAA,oBAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVI,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,QAAA,CAAS,IAAA,KAAS,CAAA,CAAE,GAAG,CAAA;AAAA,QAClC,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA;AAAA,QAC5B,aAAA,EAAa,EAAA,CAAG,MAAA,EAAQ,CAAA,CAAE,GAAG,CAAA;AAAA,QAE7B,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,CAAA,CAAE,IAAA,EAAF,EAAO,WAAU,QAAA,EAAS,CAAA;AAAA,UAAE,GAAA;AAAA,UAAE,CAAA,CAAE;AAAA;AAAA,OAAA;AAAA,MAN5B,CAAA,CAAE;AAAA,KAQV,CAAA,EACH,CAAA;AAAA,IAEC,IAAA,KAAS,OAAA,oBACRI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iDAAA,EAAkD,aAAA,EAAa,EAAA,CAAG,QAAQ,CAAA,EACtF,QAAA,EAAA;AAAA,MAAA,SAAA,CAAU,WAAW,CAAA,oBACpBJ,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6DAA4D,QAAA,EAAA,oDAAA,EAEzE,CAAA;AAAA,MAED,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAA0D;AACxE,QAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,CAAA,CAAE,WAAW,CAAA;AACpC,QAAA,MAAM,QAAA,GAAW,KAAA,KAAU,UAAA,CAAW,CAAA,CAAE,WAAW,CAAA;AACnD,QAAA,uBACEA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM,QAAA,CAAS,UAAA,CAAW,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,YACjD,SAAA,EAAW,CAAA,+BAAA,EAAkC,QAAA,GAAW,oCAAA,GAAuC,eAAe,CAAA,CAAA;AAAA,YAC9G,KAAA,EAAO,EAAE,SAAA,IAAa,EAAA;AAAA,YACtB,aAAA,EAAa,EAAA,CAAG,OAAA,EAAS,CAAA,CAAE,WAAW,CAAA;AAAA,YAErC,kCACCA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,KAAA;AAAA,gBACL,GAAA,EAAK,EAAE,SAAA,IAAa,EAAA;AAAA,gBACpB,SAAA,EAAU;AAAA;AAAA,aACZ,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sFAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA,EAChC;AAAA,WAAA;AAAA,UAhBG,CAAA,CAAE;AAAA,SAkBT;AAAA,MAEJ,CAAC;AAAA,KAAA,EACH,CAAA;AAAA,IAGD,SAAS,QAAA,oBACRI,IAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,qHAAA,EACd,QAAA,EAAA;AAAA,MAAA,IAAA,mBAAOJ,GAAAA,CAACQ,OAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA,mBAAKR,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,MAChF,OAAO,iBAAA,GAAe,eAAA;AAAA,sBACvBA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAO,SAAA;AAAA,UACP,SAAA,EAAU,QAAA;AAAA,UACV,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU,CAAC,CAAA,KAAM,KAAK,SAAS,CAAC,CAAA;AAAA,UAChC,aAAA,EAAa,GAAG,QAAQ;AAAA;AAAA;AAC1B,KAAA,EACF,CAAA;AAAA,IAGD,SAAS,KAAA,oBACRI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,UAAA;AAAA,UACX,WAAA,EAAY,gBAAA;AAAA,UACZ,KAAA,EAAO,GAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACtC,aAAA,EAAa,GAAG,KAAK;AAAA;AAAA,OACvB;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,qGAAA;AAAA,UACV,QAAA,EAAU,CAAC,GAAA,CAAI,IAAA,EAAK;AAAA,UACpB,OAAA,EAAS,MAAM,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,UAClC,aAAA,EAAa,GAAG,WAAW,CAAA;AAAA,UAC5B,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAGD,SAAS,UAAA,oBACRI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAGZ,QAAA,EAAA;AAAA,MAAA,SAAA,CAAU,MAAA,GAAS,CAAA,oBAClBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAsB,aAAA,EAAa,EAAA,CAAG,MAAM,CAAA,EACzD,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,YAAA,kBAAA;AAAA,YAC7B,OAAO,MAAA,GAAS,CAAA,GAAI,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA,GAAM;AAAA,WAAA,EAC/D,CAAA;AAAA,UACC,UAAA,CAAW,KAAK,CAAA,oBACfJ,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,kDAAA;AAAA,cACV,OAAA,EAAS,MAAM,SAAA,CAAU,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,cAC1C,aAAA,EAAa,GAAG,cAAc,CAAA;AAAA,cAE7B,iBAAO,QAAA,CAAS,UAAA,CAAW,KAAK,CAAC,IAAI,iBAAA,GAAoB;AAAA;AAAA;AAC5D,SAAA,EAEJ,CAAA;AAAA,wBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAA0D;AACxE,UAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,CAAA,CAAE,WAAW,CAAA;AACpC,UAAA,MAAM,EAAA,GAAK,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,WAAW,CAAA;AACxC,UAAA,uBACEI,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,SAAA,CAAU,CAAA,CAAE,WAAW,CAAA;AAAA,cACtC,cAAA,EAAc,EAAA;AAAA,cACd,SAAA,EAAW,CAAA,wCAAA,EAA2C,EAAA,GAAK,oCAAA,GAAuC,eAAe,CAAA,CAAA;AAAA,cACjH,KAAA,EAAO,EAAE,SAAA,IAAa,EAAA;AAAA,cACtB,aAAA,EAAa,EAAA,CAAG,KAAA,EAAO,CAAA,CAAE,WAAW,CAAA;AAAA,cAEnC,QAAA,EAAA;AAAA,gBAAA,KAAA,mBACCJ,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,GAAA,EAAK,KAAA;AAAA,oBACL,GAAA,EAAK,EAAE,SAAA,IAAa,EAAA;AAAA,oBACpB,SAAA,EAAU;AAAA;AAAA,iBACZ,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sFAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,CAAA,EAClC,CAAA;AAAA,gBAED,EAAA,oBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kFAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,UAAA,EAAW,CAAA,EAC9B;AAAA;AAAA,aAAA;AAAA,YAtBG,CAAA,CAAE;AAAA,WAwBT;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAEFA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,UAAA;AAAA,UACX,IAAA,EAAM,CAAA;AAAA,UACN,WAAA,EAAa,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,kCAAA,GAAgC,0BAAA;AAAA,UACjE,KAAA,EAAO,MAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACzC,aAAA,EAAa,GAAG,QAAQ;AAAA;AAAA,OAC1B;AAAA,sBACAI,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,iJAAA;AAAA,UACV,QAAA,EAAU,CAAC,MAAA,CAAO,IAAA,MAAU,GAAA,CAAI,YAAA;AAAA,UAChC,OAAA,EAAS,MAAM,KAAK,UAAA,EAAW;AAAA,UAC/B,aAAA,EAAa,GAAG,UAAU,CAAA;AAAA,UAEzB,QAAA,EAAA;AAAA,YAAA,GAAA,CAAI,YAAA,mBACHJ,GAAAA,CAACQ,OAAAA,EAAA,EAAQ,SAAA,EAAU,uBAAA,EAAwB,CAAA,mBAE3CR,GAAAA,CAACS,QAAAA,EAAA,EAAS,WAAU,UAAA,EAAW,CAAA;AAAA,YAEhC,IAAI,YAAA,GACD,kBAAA,GACA,MAAA,CAAO,MAAA,GAAS,IACd,CAAA,cAAA,EAAiB,WAAA,CAAY,MAAA,CAAO,MAAA,EAAQ,EAAE,GAAA,EAAK,WAAA,EAAa,OAAO,YAAA,EAAc,CAAC,CAAA,CAAA,GACtF;AAAA;AAAA;AAAA,OACR;AAAA,MACC,GAAA,CAAI,KAAA,oBACHT,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0BAAA,EAA2B,IAAA,EAAK,OAAA,EAC7C,QAAA,EAAA,GAAA,CAAI,KAAA,EACP;AAAA,KAAA,EAEJ,CAAA;AAAA,IAGD,yBACCA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,gEAAA;AAAA,QACV,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA;AAAA,QAC1B,aAAA,EAAa,GAAG,OAAO,CAAA;AAAA,QACxB,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBAGFA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,CAAC,CAAC,OAAA;AAAA,QACR,KAAA,EAAO,OAAA;AAAA,QACP,KAAA,EAAM,kBAAA;AAAA,QACN,aAAA,EAAe,sBAAA;AAAA,QACf,SAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,QACxB,UAAA,EAAY,cAAA;AAAA,QACZ,QAAA,EAAU,MAAM,UAAA,CAAW,IAAI;AAAA;AAAA;AACjC,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,iBAAiB,GAAA,EAA0C;AACzE,EAAA,MAAM,EAAE,aAAY,GAAI,GAAA;AACxB,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,QAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,IAAI,YAAA,IAAgB,QAAA;AAEzC,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,MAAwC;AAAA,IAC1D,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,IAAA,uBAC1BA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA;AAAA;AACF,GAEJ,CAAA;AAEA,EAAA,OAAO,EAAE,UAAA,EAAW;AACtB;ACrYA,IAAM,aAAA,GAA+B;AAAA,EACnC,eAAA,EAAiB,wDAAA;AAAA,EACjB,cAAA,EAAgB,SAAA;AAAA,EAChB,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,OAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,EAAA;AAAA,EACN,EAAA,EAAI,eAAA;AAAA,EACJ,EAAA,EAAI,gBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,KAAA,GAAsC;AAAA,EAC1C,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,WAAA;AAAA,EACT,IAAA,EAAM,eAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAGA,IAAM,aAAA,GAA+B;AAAA,EACnC,CAAC,oBAA8B,GAAG,yBAAA;AAAA,EAClC,CAAC,oBAA8B,GAAG,yBAAA;AAAA,EAClC,CAAC,cAAwB,GAAG,uDAAA;AAAA,EAC5B,CAAC,eAAyB,GAAG,uDAAA;AAAA,EAC7B,CAAC,0BAAoC,GACnC,8DAAA;AAAA,EACF,CAAC,gBAA0B,GAAG,8DAAA;AAAA,EAC9B,CAAC,gBAA0B,GAAG;AAChC,CAAA;AAEO,SAAS,OAAA,CAAQ;AAAA,EACtB,QAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,OAAA,GAAU,IAAA;AAAA,EACV,QAAA,GAAW,SAAA;AAAA,EACX,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAiB;AACf,EAAA,MAAM,WAAW,IAAA,KAAS,KAAA;AAC1B,EAAA,MAAM,SAAA,GAAY,QAAA,GACd,+BAAA,GACA,IAAA,KAAS,UACP,mCAAA,GACA,EAAA;AACN,EAAA,uBACEI,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAAG,KAAA,EAAO,QAAA,GAAW,aAAA,GAAgB,MAAA,EAC9E,QAAA,EAAA;AAAA,IAAA,OAAA,oBACCJ,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAuC,KAAA,EAAO,aAAA,EAAe,eAAW,IAAA,EAAC,CAAA;AAAA,oBAE1FA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,+BAAA;AAAA,UACA,MAAM,QAAQ,CAAA;AAAA,UACd,QAAQ,OAAO,CAAA;AAAA,UACf;AAAA,SACF;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;ACxCO,IAAM,OAAA,GAAsC;AAAA,EACjD,QAAA,EAAAe,QAAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,EAAAN,QAAAA;AAAA;AAAA,EAEA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,EAAAO,MAAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,EAAA,EAAG;AAAA,EAC3B,GAAG,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,MAAK,CAAE;AACtE,CAAA;AA2BO,SAAS,cAAA,CACd,EAAA,EACA,KAAA,EACA,gBAAA,EACU;AACV,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,EAAO,WAAA,KACjB,KAAM,EAAA,CAAG,MAAA,CAAO,KAAA,EAAO,WAAW,CAAA,GAAc,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,IACrF,eAAe,CAAC,KAAA,EAAO,WAAA,EAAa,IAAA,KAClC,KACK,EAAA,CAAG,UAAA,CAAW,KAAA,EAAO,WAAA,EAAa,IAAI,CAAA,GACvC,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,WAAA,EAAY;AAAA,IAC7C,UAAA,EAAY,CAAC,KAAA,KAAW,KAAA,GAAQ,KAAA,CAAM,KAAK,CAAA,GAAI,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IACrE,SAAA,EAAW,CAAC,KAAA,MAAW;AAAA,MACrB,IAAA,EAAM,OAAA;AAAA,MACN,KAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,QAC5B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA;AAAK;AAC9B,KACF,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,GAAQ,MAAA,MAAY,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,YAAA,EAAa,CAAA;AAAA,IAC/E,aAAa,CAAC,IAAA,KAAU,IAAA,GAAO,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAAA,IAC/C,WAAA,EAAa,CAAC,EAAA,KAAO,GAAA,CAAI,cAAc,EAAE;AAAA,GAC3C;AACF;ACvGA,IAAM,YAAY,EAAC;AACnB,IAAM,UAAA,GAAa,CAAC,IAAA,KAA6B;AAC/C,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,EAAY,OAAO,IAAA;AACvC,EAAA,MAAM,IAAA,GAAO,IAAA;AACb,EAAA,uBAAOhB,IAAC,IAAA,EAAA,EAAK,CAAA;AACf,CAAA;AAEA,IAAM,SAAA,GAAmB;AAAA,EACvB,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,IACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,IACjC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA;AAAM;AAEjC,CAAA;AAGO,SAAS,oBAAoB,GAAA,EAAgD;AAClF,EAAA,MAAM,EAAE,WAAW,aAAA,EAAe,UAAA,EAAY,WAAW,SAAA,EAAW,WAAA,EAAa,aAAY,GAC3F,GAAA;AAEF,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,MAA0B;AAAA,IAC1C,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA;AAAO;AACtC,GACF,CAAA;AAGA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,CAAA,EAAE;AAAA,UACvB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,CAAA,EAAE;AAAA,UACvB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,CAAA;AAAE;AACzB,OACF;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,KAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA;AAAK;AAC5B,OACF;AAAA,MACA,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACrB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACrB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACrB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA;AAAO,KACvB;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,CAAA;AAAA,MACP,GAAA,EAAK,IAAA;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,KAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK,KAAM;AACtD,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA;AACnE,MAAA,uBAAOA,GAAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,CAAA,EAAgB,KAAU,OAAA,EAAkB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA;AAAA,IAC9F;AAAA,GACF;AAEA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA;AAAK;AAC7B;AACF,KACF;AAAA,IACA,YAAA,EAAc,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,IAC3B,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,IAAA,EAAK,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAY,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GACzE;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,UACnC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA;AAAK;AAC5B,OACF;AAAA,MACA,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA;AAAO,KAC3B;AAAA,IACA,cAAc,EAAE,KAAA,EAAO,WAAW,OAAA,EAAS,IAAA,EAAM,UAAU,SAAA,EAAU;AAAA,IACrE,QAAQ,CAAC,EAAE,IAAI,KAAA,EAAO,OAAA,EAAS,UAAS,qBACtCA,IAAC,SAAA,EAAA,EAAU,KAAA,EAAc,SAAkB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAC9D,QAAA,EAAA,UAAA,CAAW,QAAQ,CAAA,EACtB;AAAA,GAEJ;AAGA,EAAA,MAAM,SAAA,GAA6B;AAAA,IACjC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,iBAAA,EAAkB;AAAA,MACnD,QAAA,EAAU,aAAA,CAAc,UAAA,EAAY,MAAA,EAAW,MAAM,CAAA;AAAA,MACrD,UAAA,EAAY,SAAS,aAAa,CAAA;AAAA,MAClC,YAAA,EAAc,SAAS,eAAe,CAAA;AAAA,MACtC,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,WAAW,YAAY,CAAA;AAAA,MACjC,eAAA,EAAiB,WAAW,kBAAkB,CAAA;AAAA,MAC9C,OAAA,EAAS,UAAU,oBAAoB;AAAA,KACzC;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,aAAA;AAAA,MACT,KAAA,EAAO,iCAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MACV,QAAA,EACE,wGAAA;AAAA,MACF,UAAA,EAAY,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,GAAA,EAAI;AAAA,MAC9C,YAAA,EAAc,EAAE,KAAA,EAAO,YAAA,EAAc,MAAM,GAAA,EAAI;AAAA,MAC/C,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,EAAA;AAAA,MACV,eAAA,EAAiB,EAAA;AAAA,MACjB,OAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAQ,CAAC;AAAA,MACP,EAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,0BAEAA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA;AAAA,QACA,kBAAkB,GAAA,CAAI,gBAAA;AAAA,QACtB,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,gBAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,cAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,UACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA;AAAI;AAC3B,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,UAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,MAAM,SAAA,EAAU;AAAA,UAChB,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,WAAA,EAAa,cAAc,aAAa;AAAA,SAC1C;AAAA,QACA,gBAAA,EAAkB;AAAA,UAChB,IAAA,EAAM,UAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,KAAA;AAAA,UACN,KAAA,EAAO,iBAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,mBAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,YAAA;AAAA,UACP,WAAA,EAAa;AAAA;AACf;AACF,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,OAAM,KAAM;AAClC,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,GAAA;AAAA,QACzB,CAAC,EAAA,MAAgE;AAAA,UAC/D,GAAG,EAAA;AAAA,UACH,IAAA,EAAM,WAAA,CAAY,EAAA,CAAG,IAAI;AAAA,SAC3B;AAAA,OACF;AACA,MAAA,uBAAOA,IAAC,WAAA,EAAA,EAAY,OAAA,EAAkB,OAAO,IAAA,EAAM,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA;AAAA,IAC9E;AAAA,GACF;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,KAAA,EAAO,UAAU,OAAO;AAAA,SAC1B;AAAA,QACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,QACnD,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAe;AAAA,QACvC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,QAClC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,iBAAA,EAAkB;AAAA,QAC3C,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAA;AAAU;AACpC,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAM,qBAAMA,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAC/E;AAEA,EAAA,MAAM,gBAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,cAAc,OAAO,CAAA;AAAA,MAC5B,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,MAC1B,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,MACtB,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,YAAA;AAAa,KACjD;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,qEAAA;AAAA,MACP,MAAA,EAAQ,aAAA;AAAA,MACR,IAAA,EAAM,4BAAA;AAAA,MACN,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,OAAO,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU,qBAC5CA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,QAAA,EAAU,cAAc,UAAU,CAAA;AAAA,MAClC,GAAA,EAAK,SAAS,QAAQ,CAAA;AAAA,MACtB,IAAA,EAAM,SAAA;AAAA,MACN,eAAA,EAAiB,WAAW,kBAAkB,CAAA;AAAA,MAC9C,OAAA,EAAS,UAAU,oBAAoB;AAAA,KACzC;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,uBAAA;AAAA,MACP,QAAA,EAAU,mDAAA;AAAA,MACV,GAAA,EAAK,EAAE,KAAA,EAAO,kBAAA,EAAoB,MAAM,GAAA,EAAI;AAAA,MAC5C,IAAA,EAAM,SAAA;AAAA,MACN,eAAA,EAAiB,EAAA;AAAA,MACjB,OAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAQ,qBAClEA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa,EAAE,KAAA,EAAO,SAAA,CAAU,OAAO,CAAA,EAAE;AAAA,QACzC,gBAAA,EAAkB,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,QACnC,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,EAAE,OAAO,WAAA,EAAY;AAAA,QACrB,EAAE,OAAO,MAAA,EAAO;AAAA,QAChB,EAAE,OAAO,QAAA,EAAS;AAAA,QAClB,EAAE,OAAO,SAAA,EAAU;AAAA,QACnB,EAAE,OAAO,UAAA;AAAW;AACtB,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAM,qBAAMA,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAC/E;AAEA,EAAA,MAAM,QAAA,GAA4B;AAAA,IAChC,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,UAAU,UAAU,CAAA;AAAA,UAC9B,MAAA,EAAQ,cAAc,QAAQ;AAAA,SAChC;AAAA,QACA,gBAAA,EAAkB,EAAE,QAAA,EAAU,aAAA,EAAe,QAAQ,aAAA,EAAc;AAAA,QACnE,cAAA,EAAgB,CAAC,IAAA,KAAgC,IAAA,EAAM,QAAA,IAAY;AAAA;AACrE,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL;AAAA,UACE,QAAA,EAAU,+BAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACV;AAAA,QACA;AAAA,UACE,QAAA,EAAU,2BAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACV;AAAA,QACA;AAAA,UACE,QAAA,EAAU,uBAAA;AAAA,UACV,MAAA,EAAQ;AAAA;AACV;AACF,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAM,qBAAMA,GAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GACzE;AAOA,EAAA,MAAM,mBAAA,GAAuC;AAAA,IAC3C,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,MAAA,EAAO;AAAA,UACzC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,UACvC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ;AACnC,OACF;AAAA,MACA,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,aAAA,EAAe,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAK;AAAA,MACpE,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,WAAA,EAAa,cAAc,aAAa,CAAA;AAAA,UACxC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,oBAAA,EAAqB;AAAA,UACnD,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,4BAAA;AAA6B,SAC3D;AAAA,QACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,WAAA,EAAa,aAAa,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,GAAA,EAAK,EAAA,EAAG;AAAA,QAC5E,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL;AAAA,UACE,KAAA,EAAO,UAAA;AAAA,UACP,WAAA,EAAa,iBAAA;AAAA,UACb,KAAA,EAAO,YAAA;AAAA,UACP,GAAA,EAAK;AAAA,SACP;AAAA,QACA;AAAA,UACE,KAAA,EAAO,aAAA;AAAA,UACP,WAAA,EAAa,4BAAA;AAAA,UACb,KAAA,EAAO,YAAA;AAAA,UACP,GAAA,EAAK;AAAA,SACP;AAAA,QACA;AAAA,UACE,KAAA,EAAO,QAAA;AAAA,UACP,WAAA,EAAa,iBAAA;AAAA,UACb,KAAA,EAAO,YAAA;AAAA,UACP,GAAA,EAAK;AAAA;AACP;AACF,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,KAAA,EAAM,qBACjCA,GAAAA,CAAC,SAAI,KAAA,EAAO,EAAE,QAAQ,MAAA,IAAU,GAAA,IAC9B,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAA,CAAQ,KAAA,IAAS,EAAC,EACf,OAAO,CAAC,IAAA,KAA6B,CAAC,CAAC,MAAM,KAAK,CAAA,CAClD,GAAA,CAAI,CAAC,MAA0B,KAAA,MAAmB;AAAA,UACjD,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,UAClB,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,UACrB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,GAAA,EAAK,KAAK,GAAA,IAAO,MAAA;AAAA,UACjB,WAAA,EAAa,KAAK,WAAA,IAAe;AAAA,SACnC,CAAE,CAAA;AAAA,QACJ,IAAA,EAAM,IAAA,KAAS,MAAA,GAAS,MAAA,GAAa,IAAA;AAAA,QACrC,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA,KACxB,EACF;AAAA,GAEJ;AAEA,EAAA,MAAM,mBAAA,GAAuC;AAAA,IAC3C,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,aAAA,CAAc,SAAA,EAAW,MAAA,EAAW,MAAM;AAAA,KACrD;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EACE;AAAA,KACJ;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAQ,qBAAMA,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAkB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GACzF;AAEA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC,OACF;AAAA,MACA,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,IAAA,EAAM,cAAc,MAAM;AAAA,KAC5B;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,MAAA;AAAA,MACT,KAAA,EAAO,cAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,OAAO,IAAA,EAAK,qBAClCA,GAAAA,CAAC,WAAQ,OAAA,EAAkB,KAAA,EAAc,MAAY,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAElF;AAGA,EAAA,MAAM,UAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,GAAA,EAAK,WAAW,OAAO,CAAA;AAAA,MACvB,GAAA,EAAK,UAAU,UAAU,CAAA;AAAA,MACzB,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,MAAA,EAAQ,UAAU,QAAQ;AAAA,KAC5B;AAAA,IACA,YAAA,EAAc,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IACpF,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,GAAA,EAAK,KAAK,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAO,qBAC/CA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,GAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,iBAAA,GAAqC;AAAA,IACzC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,MACxC,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,MACtB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA;AAAK;AAC7B;AACF,KACF;AAAA,IACA,cAAc,EAAE,GAAA,EAAK,IAAI,IAAA,EAAM,UAAA,EAAY,MAAM,IAAA,EAAK;AAAA,IACtD,QAAQ,CAAC,EAAE,EAAA,EAAI,GAAA,EAAK,MAAM,IAAA,EAAK,qBAC7BA,GAAAA,CAAC,eAAY,GAAA,EAAU,IAAA,EAAY,MAAY,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE5E;AAGA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA;AAAO,SACtC;AAAA,QACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAM,GAAA,EAAI;AAAA,QAC7C,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA,OAC/D;AAAA,MACA,GAAA,EAAK,SAAS,KAAK;AAAA,KACrB;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA,EAAI;AAAA,QAC9B,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA,EAAI;AAAA,QAC9B,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AAAA,QAC5B,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA;AAAI,OAChC;AAAA,MACA,GAAA,EAAK,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,GAAA;AAAI,KACrC;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,GAAA,EAAI,qBAC/BA,GAAAA,CAAC,UAAO,KAAA,EAAc,KAAA,EAAc,KAAU,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE3E;AAEA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,UAC5B,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,OAAA;AAAA,YACP,WAAA,EAAa;AAAA,cACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,cACxB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA;AAAO,aACtC;AAAA,YACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAM,GAAA,EAAI;AAAA,YAC7C,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,SACF;AAAA,QACA,gBAAA,EAAkB,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,CAAA,EAAE;AAAA,QAC7E,cAAA,EAAgB,CAAC,IAAA,KAA+B,IAAA,EAAM,OAAA,IAAW;AAAA,OACnE;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA;AAAY,KAChD;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS;AAAA,QACP;AAAA,UACE,OAAA,EAAS,SAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,GAAA,EAAI;AAAA,YAC/B,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA;AAAI;AAChC,SACF;AAAA,QACA;AAAA,UACE,OAAA,EAAS,SAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AAAA,YAC5B,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA;AAAI;AAChC,SACF;AAAA,QACA;AAAA,UACE,OAAA,EAAS,WAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,YAC3B,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,GAAA;AAAI;AAC7B,SACF;AAAA,QACA;AAAA,UACE,OAAA,EAAS,OAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA,EAAI;AAAA,YAC9B,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA;AAAI;AAC9B;AACF,OACF;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,SAAA,EAAU,qBAChCA,GAAAA,CAAC,UAAO,OAAA,EAAkB,SAAA,EAAsB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE7E;AAGA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,CAAU,MAAM,CAAA,EAAE;AAAA,QACvC,gBAAA,EAAkB,EAAE,IAAA,EAAM,WAAA,EAAY;AAAA,QACtC,cAAA,EAAgB,CAAC,IAAA,KAA4B,IAAA,EAAM,IAAA,IAAQ;AAAA;AAC7D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,EAAE,IAAA,EAAM,aAAA,EAAc,EAAG,EAAE,IAAA,EAAM,cAAc;AAAA,KACjF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,KAAA,EAAM,qBAC5BA,GAAAA,CAAC,aAAU,OAAA,EAAkB,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAExE;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAA;AAAA,IACT,MAAA,EAAQ,WAAA;AAAA,IACR,SAAA,EAAW,cAAA;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,gBAAA;AAAA,IACb,SAAA,EAAW,cAAA;AAAA,IACX,WAAA,EAAa,gBAAA;AAAA,IACb,SAAA,EAAW,cAAA;AAAA,IACX,SAAA,EAAW,cAAA;AAAA,IACX,GAAA,EAAK,QAAA;AAAA,IACL,QAAA,EAAU,mBAAA;AAAA,IACV,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS,YAAA;AAAA,IACT,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ,iBAAA;AAAA,IACR,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AACF;AC3sBA,IAAM,QAAQ,CAAC,CAAA,KAAA,CACZ,CAAA,IAAK,EAAA,EACH,MAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AAEZ,SAAS,iBAAiB,GAAA,EAAgD;AAC/E,EAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAe,UAAA,EAAY,SAAA,EAAW,aAAY,GAAI,GAAA;AAEzE,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,MAA0B;AAAA,IAC1C,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA;AAAO;AACtC,GACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,MAA6B;AAAA,IACjD,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,CAAE;AAAA,GACrD,CAAA;AAGA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA4B,IAAA,EAAM,IAAA,IAAQ,MAAA;AAAA,QAC3D,gBAAA,EAAkB;AAAA,UAChB,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,WAAA,EAAa,EAAA;AAAA,UACb,QAAA,EAAU,0BAAA;AAAA,UACV,QAAA,EAAU,QAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,UACtB,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,UACtC,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,UACxC,WAAA,EAAa,cAAc,aAAa,CAAA;AAAA,UACxC,QAAA,EAAU,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,yBAAA,EAA0B;AAAA,UAC/D,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,cAAA,EAAe;AAAA,UAChD,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,aAAA,EAAc;AAAA,UAC9C,QAAA,EAAU,UAAU,UAAU;AAAA;AAChC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,WAAA,EAAa,sBAAA;AAAA,UACb,QAAA,EAAU,qCAAA;AAAA,UACV,QAAA,EAAU,aAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,IAAA,EAAM,KAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,WAAA,EAAa,oBAAA;AAAA,UACb,QAAA,EAAU,0DAAA;AAAA,UACV,QAAA,EAAU,kBAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,IAAA,EAAM,YAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,WAAA,EAAa,0BAAA;AAAA,UACb,QAAA,EAAU,4CAAA;AAAA,UACV,QAAA,EAAU,eAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU;AAAA;AACZ;AACF,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,uBACbA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,GAAA;AAAA,UACnB,CAAC,CAAA,MASM;AAAA,YACL,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,aAAa,CAAA,CAAE,WAAA;AAAA,YACf,QAAA,EAAU,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,YAC1B,KAAK,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,YAC1C,UAAU,CAAA,CAAE;AAAA,WACd;AAAA,SACF;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAGA,EAAA,MAAM,SAAA,GAA6B;AAAA,IACjC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS,KAAA;AAAA,QAC7D,gBAAA,EAAkB,EAAE,KAAA,EAAO,KAAA,EAAO,SAAS,cAAA,EAAe;AAAA,QAC1D,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,OAAA,EAAS,cAAc,SAAS;AAAA;AAClC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,mCAAA,EAAoC;AAAA,QAClE,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,4BAAA,EAA6B;AAAA,QAC1D,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,8BAAA;AAA+B;AAC1D,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAM,qBAAMA,GAAAA,CAACiB,MAAA,EAAA,EAAK,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAC1E;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,aAAA,EAAe,UAAU,qBAAqB,CAAA;AAAA,MAC9C,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS,MAAA;AAAA,QAC7D,gBAAA,EAAkB,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,kBAAA,EAAmB;AAAA,QAClE,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,OAAA,EAAS,cAAc,SAAS;AAAA;AAClC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,mBAAA,EAAqB,OAAA,EAAS,qCAAA,EAAsC;AAAA,QAC7E,EAAE,KAAA,EAAO,wBAAA,EAA0B,OAAA,EAAS,sCAAA;AAAuC;AACrF,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,eAAe,KAAA,EAAM,qBAClCjB,GAAAA,CAAC,aAAU,aAAA,EAA8B,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAEpF;AAGA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,SAAS,YAAA,CAAa,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,MACrC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA2B,IAAA,EAAM,GAAA,IAAO,OAAA;AAAA,QACzD,kBAAkB,EAAE,GAAA,EAAK,IAAI,GAAA,EAAK,OAAA,EAAS,SAAS,EAAA,EAAG;AAAA,QACvD,WAAA,EAAa;AAAA,UACX,GAAA,EAAK,WAAW,OAAO,CAAA;AAAA,UACvB,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,UACvC,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA;AAAU;AAC5C;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,GAAA;AAAA,MACT,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,WAAA,EAAa,SAAS,EAAA,EAAG;AAAA,QACzC,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,WAAA,EAAa,SAAS,EAAA,EAAG;AAAA,QACzC,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,aAAA,EAAe,SAAS,EAAA;AAAG;AAC7C,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,QAAQ,MAAA,EAAO,qBACrCA,GAAAA,CAAC,WAAQ,OAAA,EAAkB,MAAA,EAAgB,QAAgB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAExF;AAEA,EAAA,MAAM,UAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,wCAAA,EAAyC;AAAA,MACrE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA;AAAM;AAC/B,OACF;AAAA,MACA,OAAA,EAAS,UAAU,SAAS;AAAA,KAC9B;AAAA,IACA,YAAA,EAAc,EAAE,GAAA,EAAK,EAAA,EAAI,OAAO,EAAA,EAAI,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAK;AAAA,IAClE,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAK,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAQ,qBACzCA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAGA,EAAA,MAAM,gBAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,cAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,cAAA,EAAe;AAAA,MACnD,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,0BAAA,EAA2B;AAAA,MAC1D,cAAA,EAAgB,cAAc,iBAAiB,CAAA;AAAA,MAC/C,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS,OAAA;AAAA,QAC7D,gBAAA,EAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAM;AAAA,QACjF,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,gBAAA,EAAiB;AAAA,UAC9C,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS;AAAA,cACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,cAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,cACjC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,EAAM;AAAA,cAC/B,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,UAAA;AAAW;AAC3C,WACF;AAAA,UACA,QAAA,EAAU,UAAU,UAAU;AAAA;AAChC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,WAAA,EAAa,MAAA;AAAA,MACb,MAAA,EAAQ,EAAA;AAAA,MACR,cAAA,EAAgB,+CAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,QACN,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAC5D,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,QAC/D,EAAE,MAAM,SAAA,EAAW,KAAA,EAAO,WAAW,IAAA,EAAM,UAAA,EAAY,UAAU,IAAA;AAAK;AACxE,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,aAAa,MAAA,EAAQ,cAAA,EAAgB,MAAA,EAAO,qBACzDA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,WAAA;AAAA,QACA,QAAQ,MAAA,IAAU,MAAA;AAAA,QAClB,cAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAGA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,MACtB,GAAA,EAAK,SAAS,KAAK,CAAA;AAAA,MACnB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,UACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,KAAA;AAAM;AAChC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,gCAAA;AAAA,MACN,GAAA,EAAK,EAAE,KAAA,EAAO,WAAA,EAAa,MAAM,GAAA,EAAI;AAAA,MACrC,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,KAAK,IAAA,EAAK,qBAC7BA,GAAAA,CAAC,UAAO,IAAA,EAAY,GAAA,EAAU,MAAY,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAEvE;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,cAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,IAAA,EAAM,aAAA,CAAc,MAAA,EAAQ,MAAA,EAAW,MAAM,CAAA;AAAA,MAC7C,QAAA,EAAU,WAAW,OAAO,CAAA;AAAA,MAC5B,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ;AACnC,OACF;AAAA,MACA,GAAA,EAAK,SAAS,KAAK;AAAA,KACrB;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,EAAA;AAAA,MACT,KAAA,EAAO,8BAAA;AAAA,MACP,IAAA,EAAM,yGAAA;AAAA,MACN,QAAA,EAAU,EAAA;AAAA,MACV,SAAA,EAAW,MAAA;AAAA,MACX,GAAA,EAAK,EAAE,KAAA,EAAO,YAAA,EAAc,MAAM,GAAA;AAAI,KACxC;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,GAAA,EAAI,qBAC5DA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,aAAA,GAAiC;AAAA,IACrC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,SAAS,YAAA,CAAa,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,MACrC,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA4B,IAAA,EAAM,IAAA,IAAQ,QAAA;AAAA,QAC3D,gBAAA,EAAkB,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,MAAA,EAAQ,GAAA,EAAK,EAAA,EAAI,SAAA,EAAW,EAAA,EAAG;AAAA,QAC7E,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,UACtB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,UACpC,GAAA,EAAK,cAAc,KAAK,CAAA;AAAA,UACxB,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,YAAA;AAAa;AACjD;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,GAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,MAAM,aAAA,EAAe,IAAA,EAAM,iBAAiB,GAAA,EAAK,EAAA,EAAI,WAAW,EAAA,EAAG;AAAA,QACrE,EAAE,MAAM,YAAA,EAAc,IAAA,EAAM,mBAAmB,GAAA,EAAK,EAAA,EAAI,WAAW,EAAA,EAAG;AAAA,QACtE,EAAE,MAAM,YAAA,EAAc,IAAA,EAAM,iBAAiB,GAAA,EAAK,EAAA,EAAI,WAAW,EAAA;AAAG;AACtE,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,OAAA,EAAQ,qBAC9BA,GAAAA,CAAC,YAAS,OAAA,EAAkB,OAAA,EAAkB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE3E;AAEA,EAAA,MAAM,UAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,UACvC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA;AAAW;AACzC,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS,MAAA;AAAA,QAC7D,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,aAAa,qBAAA,EAAsB;AAAA,QACtE,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,WAAA,EAAa,cAAc,aAAa;AAAA;AAC1C;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,UAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,iCAAA,EAAkC;AAAA,QACnE,EAAE,KAAA,EAAO,WAAA,EAAa,WAAA,EAAa,uCAAA,EAAwC;AAAA,QAC3E,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,mCAAA;AAAoC;AACtE,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,KAAA,EAAM,qBAC5BA,GAAAA,CAAC,SAAM,OAAA,EAAkB,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAEpE;AAEA,EAAA,MAAM,oBAAA,GAAwC;AAAA,IAC5C,KAAA,EAAO,kBAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,YAAA,CAAa,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,MAChC,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA8B,IAAA,EAAM,MAAA,IAAU,aAAA;AAAA,QAC/D,gBAAA,EAAkB,EAAE,KAAA,EAAO,gBAAA,EAAkB,QAAQ,QAAA,EAAU,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,EAAA,EAAG;AAAA,QACvF,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,cAAc,OAAO,CAAA;AAAA,UAC5B,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,UAC1B,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,UACpC,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,YAAA;AAAa;AACjD;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL;AAAA,UACE,KAAA,EAAO,wCAAA;AAAA,UACP,MAAA,EAAQ,aAAA;AAAA,UACR,IAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAW;AAAA,SACb;AAAA,QACA;AAAA,UACE,KAAA,EAAO,qCAAA;AAAA,UACP,MAAA,EAAQ,YAAA;AAAA,UACR,IAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAW;AAAA,SACb;AAAA,QACA;AAAA,UACE,KAAA,EAAO,kCAAA;AAAA,UACP,MAAA,EAAQ,YAAA;AAAA,UACR,IAAA,EAAM,iBAAA;AAAA,UACN,SAAA,EAAW;AAAA;AACb;AACF,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,KAAA,EAAM,qBAC5BA,GAAAA,CAAC,mBAAgB,OAAA,EAAkB,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE9E;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,cAAA;AAAA,IACX,OAAA,EAAS,YAAA;AAAA,IACT,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ,WAAA;AAAA,IACR,SAAA,EAAW,cAAA;AAAA,IACX,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,eAAA,EAAiB;AAAA,GACnB;AACF;ACraA,IAAMkB,aAAY,EAAC;AAGnB,IAAM,WAAA,GAAsC;AAAA,EAC1C,GAAA,EAAK,gBAAA;AAAA,EACL,GAAA,EAAK,+BAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AACA,IAAM,aAAqC,EAAE,EAAA,EAAI,SAAS,EAAA,EAAI,OAAA,EAAS,IAAI,OAAA,EAAQ;AAG5E,SAAS,sBAAA,CAAuB,IAAA,GAAgC,EAAC,EAAW;AACjF,EAAA,MAAM,MAAM,cAAA,CAAe,IAAA,CAAK,UAAU,IAAA,CAAK,UAAA,EAAY,KAAK,gBAAgB,CAAA;AAChF,EAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAe,WAAW,SAAA,EAAW,WAAA,EAAa,aAAY,GAAI,GAAA;AAIrF,EAAA,MAAM,mBAAA,GAAuC;AAAA,IAC3C,KAAA,EAAO,iBAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,IAAA,EAAM,aAAA,CAAc,MAAA,EAAQ,MAAA,EAAW,MAAM,CAAA;AAAA,MAC7C,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC,OACF;AAAA,MACA,MAAA,EAAQ,UAAU,kBAAkB;AAAA,KACtC;AAAA,IACA,cAAc,EAAE,KAAA,EAAO,iBAAiB,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAM;AAAA,IACrE,QAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,IAAA,EAAM,KAAA,EAAO,MAAA,EAAO,qBACjDlB,GAAAA,CAAC,KAAA,EAAA,EAAI,eAAa,WAAA,CAAY,EAAE,GAC9B,QAAA,kBAAAA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,kBAAkB,GAAA,CAAI;AAAA;AAAA,KACxB,EACF;AAAA,GAEJ;AAEA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,WAAA,EAAa,aAAA,CAAc,aAAA,EAAe,MAAA,EAAW,aAAa,CAAA;AAAA;AAAA;AAAA,MAGlE,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAC,QAAA,EAAU,OAAO,CAAA;AAAE,KACtD;AAAA,IACA,YAAA,EAAc,EAAE,KAAA,EAAO,YAAA,EAAc,SAASkB,UAAAA,EAAU;AAAA,IACxD,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,WAAA,EAAa,OAAA,EAAS,OAAA,EAAQ,qBAC3DlB,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA,kBAASA,GAAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,yBAAA,EAA0B,CAAA;AAAA,QACtD,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,WAAA,EAAa,aAAA,CAAc,aAAA,EAAe,MAAA,EAAW,aAAa,CAAA;AAAA,MAClE,MAAM,SAAA,EAAU;AAAA;AAAA,MAEhB,QAAQ,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,CAAC,QAAQ,CAAA;AAAE,KAC5C;AAAA,IACA,YAAA,EAAc,EAAE,KAAA,EAAO,kBAAA,EAAoB,QAAQkB,UAAAA,EAAU;AAAA,IAC7D,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,aAAa,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO,qBACtDlB,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA,EAAM,YAAY,IAAI,CAAA;AAAA,QACtB,MAAA,kBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAO,CAAA;AAAA,QAChB,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MACpC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ;AACnC,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,YAAA,EAAc;AAAA,UACZ,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,UACtC,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,WAAA;AAAA,YACP,OAAA,EAAS;AAAA,cACP,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,cAC3B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,WACF;AAAA,UACA,IAAA,EAAM,UAAU,MAAM;AAAA;AACxB,OACF;AAAA,MACA,MAAM,SAAA;AAAU,KAClB;AAAA,IACA,cAAc,EAAE,KAAA,EAAO,UAAU,KAAA,EAAO,GAAA,EAAK,QAAQ,SAAA,EAAU;AAAA,IAC/D,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAK,qBACrDA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA,EAAM,YAAY,IAAI,CAAA;AAAA,QACtB,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAMA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,UACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,UACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA;AAAI;AAC3B,OACF;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,KAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA;AAAK;AAC5B,OACF;AAAA;AAAA,MAEA,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAC,YAAA,EAAc,YAAY,CAAA;AAAE,KAC7D;AAAA,IACA,cAAc,EAAE,OAAA,EAAS,KAAK,GAAA,EAAK,IAAA,EAAM,OAAOkB,UAAAA,EAAU;AAAA,IAC1D,QAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,KAAK,KAAA,EAAO,KAAA,EAAM,qBACxClB,IAAC,KAAA,EAAA,EAAI,aAAA,EAAa,WAAA,CAAY,EAAE,GAC9B,QAAA,kBAAAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWmB,EAAAA;AAAA,UACT,kBAAA;AAAA,UACA,WAAA,CAAY,OAAiB,CAAA,IAAK,WAAA,CAAY,GAAG,CAAA;AAAA,UACjD,UAAA,CAAW,GAAa,CAAA,IAAK,UAAA,CAAW;AAAA;AAC1C;AAAA,KACF,EACF;AAAA,GAEJ;AAQA,EAAA,MAAM,oBAAA,GAAwC;AAAA,IAC5C,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,UACxC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,UAC1C,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,OAAA;AAAA,YACP,OAAA,EAAS;AAAA,cACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,cAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,cACjC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC;AACF,SACF;AAAA,QACA,kBAAkB,EAAE,MAAA,EAAQ,UAAU,KAAA,EAAO,OAAA,EAAS,OAAO,MAAA,EAAO;AAAA,QACpE,cAAA,EAAgB,CAAC,IAAA,KAA+B,IAAA,EAAM,MAAA,IAAU;AAAA,OAClE;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,OAAA;AAAA,YACP,WAAA,EAAa;AAAA,cACX,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA;AAAQ,aACxC;AAAA,YACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,EAAA,EAAG;AAAA,YAC9B,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,SACF;AAAA,QACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,EAAA,EAAG,EAAG,EAAE,KAAA,EAAO,EAAA,EAAI,CAAA,EAAE;AAAA,QAC1D,gBAAgB,CAAC,KAAA,EAAgB,MAAe,CAAA,IAAA,EAAA,CAAQ,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,OACrE;AAAA,MACA,SAAA,EAAW,UAAU,YAAY;AAAA,KACnC;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS;AAAA,QACP,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,QAC/C,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,OAAO,MAAA;AAAO,OACrD;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAE,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,gBAAA,EAAiB,EAAG,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA,EAAE;AAAA,QAC5D,EAAE,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,gBAAA,EAAiB,EAAG,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA;AAAE,OAC9D;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,OAAA,EAAS,WAAU,KAAM;AACrD,MAAA,MAAM,IAAA,GAAQ,WAAW,EAAC;AAC1B,MAAA,MAAM,OAAA,GAAW,QAAQ,EAAC;AAE1B,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACtC,QAAA,MAAM,SAAiC,EAAC;AACxC,QAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3B,UAAA,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,IAAI,GAAA,CAAI,KAAA,GAAQ,KAAK,CAAA,EAAG,KAAA,IAAS,EAAA;AAAA,QACrE,CAAC,CAAA;AACD,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,KAAA,MAAW;AAAA,QAC/C,GAAG,GAAA;AAAA,QACH,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,CAAA,IAAA,EAAO,KAAK,CAAA;AAAA,OAClC,CAAE,CAAA;AACF,MAAA,uBACEnB,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,cAAA;AAAA,UACT,IAAA,EAAM,UAAA;AAAA,UACN,OAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA,OACxB;AAAA,IAEJ;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACzB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,UACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,KAAA;AAAM;AAChC,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA;AAAK;AAC5B,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,UACnC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,OAAA,EAAS,UAAU,SAAS;AAAA,KAC9B;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,KAAA;AAAA,MACT,UAAU;AAAC,KACb;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,QAAA,EAAS,qBAClEA,GAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAa,WAAA,CAAY,EAAE,CAAA,EAC9B,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,OAAA,EAAkB,QAAA,EAAoB,OAAA,EACzD,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,GACZ,CAAA,EACF;AAAA,GAEJ;AAEA,EAAA,MAAM,SAAA,GAA6B;AAAA,IACjC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA;AAAW;AACzC,OACF;AAAA,MACA,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA;AAAO,KAC3B;AAAA,IACA,cAAc,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,EAAC,EAA0B;AAAA,IACtE,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,QAAA,EAAU,QAAA,EAAS,qBACzCA,GAAAA,CAACoB,IAAAA,EAAA,EAAK,OAAA,EAAkB,SAAA,EAAU,OAAM,aAAA,EAAa,WAAA,CAAY,EAAE,CAAA,EACjE,QAAA,kBAAApB,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EACZ;AAAA,GAEJ;AAEA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACzC,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,UACnC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAA,EAAc;AAAA,UAC7C,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,UACzC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,UACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,IAAA,EAAK;AAAA,UAC9B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,IAAA,EAAK;AAAA,UAC9B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC;AACF,KACF;AAAA,IACA,cAAc,EAAE,OAAA,EAAS,WAAW,IAAA,EAAM,SAAA,EAAW,UAAU,QAAA,EAAS;AAAA,IACxE,QAAQ,CAAC,EAAE,EAAA,EAAI,QAAA,EAAU,SAAS,IAAA,EAAK,qBACrCA,GAAAA,CAAC,UAAO,OAAA,EAAkB,IAAA,EAAY,eAAa,WAAA,CAAY,EAAE,GAC9D,QAAA,EACH;AAAA,GAEJ;AAEA,EAAA,MAAM,UAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MACpC,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,UACnC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,UACzC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAA,EAAc;AAAA,UAC7C,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA;AAAU;AACvC;AACF,KACF;AAAA,IACA,YAAA,EAAc,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,IAClD,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,MAAM,OAAA,EAAQ,qBAC3BA,GAAAA,CAAC,SAAM,OAAA,EAAkB,aAAA,EAAa,WAAA,CAAY,EAAE,GACjD,QAAA,EAAA,IAAA,EACH;AAAA,GAEJ;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,WAAA;AAAA,IACP,QAAQ,EAAC;AAAA,IACT,cAAc,EAAC;AAAA,IACf,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAG,qBAAMA,GAAAA,CAAC,SAAA,EAAA,EAAU,aAAA,EAAa,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAC/D;AAEA,EAAA,MAAM,OAAA,GAAU,oBAAoB,GAAG,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,iBAAiB,GAAG,CAAA;AACjC,EAAA,MAAM,UAAU,IAAA,CAAK,WAAA,GAAc,iBAAA,CAAkB,GAAG,IAAI,EAAC;AAE7D,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,cAAA,EAAgB,mBAAA;AAAA,IAChB,UAAA,EAAY,eAAA;AAAA,IACZ,UAAA,EAAY,eAAA;AAAA,IACZ,UAAA,EAAY,eAAA;AAAA,IACZ,SAAA,EAAW,cAAA;AAAA,IACX,SAAA,EAAW,oBAAA;AAAA,IACX,OAAA,EAAS,YAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,SAAA,EAAW,cAAA;AAAA,IACX,GAAG,OAAA;AAAA,IACH,GAAG,IAAA;AAAA,IACH,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,MAAA,GAAiB;AAAA,IACrB,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,YAAY,CAAC,SAAA,EAAW,WAAA,EAAa,SAAA,EAAW,QAAQ,QAAQ;AAAA,OAClE;AAAA,MACA,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,WAAA;AAAA,QACP,UAAA,EAAY;AAAA,UACV,MAAA;AAAA,UACA,aAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,iBAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,KAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,SAAA;AAAA,QACP,YAAY,CAAC,gBAAA,EAAkB,cAAc,YAAA,EAAc,UAAA,EAAY,WAAW,MAAM;AAAA,OAC1F;AAAA,MACA,WAAA,EAAa,EAAE,KAAA,EAAO,aAAA,EAAe,YAAY,CAAC,MAAA,EAAQ,WAAW,CAAA,EAAE;AAAA,MACvE,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,CAAC,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,OAAO,CAAA,EAAE;AAAA,MAC7E,UAAU,EAAE,KAAA,EAAO,YAAY,UAAA,EAAY,CAAC,SAAS,CAAA,EAAE;AAAA,MACvD,OAAO,EAAE,KAAA,EAAO,SAAS,UAAA,EAAY,CAAC,aAAa,CAAA,EAAE;AAAA,MACrD,UAAA,EAAY,EAAE,KAAA,EAAO,YAAA,EAAc,YAAY,CAAC,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,MACpE,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,WAAA,EAAa,YAAA,EAAc,WAAA,EAAa,UAAU,CAAA,EAAE;AAAA,MACxF,GAAI,IAAA,CAAK,WAAA,GACL,EAAE,SAAS,EAAE,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,CAAC,eAAA,EAAiB,YAAY,CAAA,EAAE,KAC3E,EAAC;AAAA,MACL,UAAA,EAAY,EAAE,KAAA,EAAO,YAAA,EAAc,YAAY,CAAC,QAAA,EAAU,OAAA,EAAS,WAAW,CAAA;AAAE,KAClF;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,CAAC,EAAE,QAAA,uBACTA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWmB,EAAAA,CAAG,yCAAA,EAA2C,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,UAC7E,aAAA,EAAa,IAAA,CAAK,IAAA,EAAM,MAAA,IAAU,uBAAA;AAAA,UAEjC;AAAA;AAAA;AACH;AAEJ,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACliBO,SAAS,qBAAqB,MAAA,EAAyC;AAE5E,EAAA,MAAM,kBAAmC,MAAA,CAAO,OAAA;AAAA,IAAQ,CAAC,SAAS,IAAA,KAChE,OAAA,CAAQ,MAAM,GAAA,CAAI,CAAC,MAAM,IAAA,MAAU;AAAA,MACjC,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,IAAA,EAAM,KAAK,IAAA,IAAQ,KAAA;AAAA,MACnB,GAAA,EAAK,KAAK,GAAA,IAAO,KAAA;AAAA;AAAA,MAEjB,YAAA,EAAc,OAAO,GAAA,GAAM;AAAA,KAC7B,CAAE;AAAA,GACJ;AAGA,EAAA,MAAM,gBAA0B,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAG3D,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,MAAkC;AAAA,IACnD,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,IAAA,EAAM,EAAE,IAAA,IAAQ,MAAA;AAAA,IAChB,GAAA,EAAK,EAAE,GAAA,IAAO;AAAA,GAChB,CAAA;AAEA,EAAA,OAAO,EAAE,eAAA,EAAiB,aAAA,EAAe,SAAA,EAAU;AACrD;ACLO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA;AACF,CAAA,EAGsB;AACpB,EAAA,MAAM,EAAE,eAAA,EAAiB,aAAA,EAAe,SAAA,EAAU,GAAI,QAAA;AAGtD,EAAA,SAAS,SAAA,CAAU,WAA2CE,GAAAA,EAAqB;AACjF,IAAA,OAAO,SAAA,CAAUA,GAAE,CAAA,EAAG,OAAA,IAAW,IAAA;AAAA,EACnC;AAEA,EAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAqB,CAAA,CAAE,EAAA;AAGnC,EAAA,SAAS,OAAA,CAAQ,WAA2C,CAAA,EAA0B;AACpF,IAAA,OAAO,UAAU,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG,SAAS,CAAA,CAAE,YAAA;AAAA,EACtC;AAEA,EAAA,MAAM,iBAAiB,MAAA,EAAoB;AAAA,IACzC,OAAA;AAAA,MACE,CAAC,KAAK,GAAA,MAAS;AAAA,QACb,WAAW,EAAC;AAAA,QAEZ,MAAA,EAAQ,CAAC,QAAA,KAAa;AACpB,UAAA,MAAM,IAAI,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACvD,UAAA,IAAI,CAAC,CAAA,EAAG;AACR,UAAA,MAAM,GAAA,GAAM,KAAI,CAAE,SAAA;AAClB,UAAA,MAAM,IAAA,GAAO,IAAI,QAAQ,CAAA,IAAK,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,YAAA,EAAa;AACrE,UAAA,GAAA,CAAI;AAAA,YACF,WAAW,EAAE,GAAG,GAAA,EAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAA,EAAM,SAAS,CAAC,SAAA,CAAU,GAAA,EAAK,QAAQ,GAAE;AAAE,WAClF,CAAA;AAAA,QACH,CAAA;AAAA,QAEA,IAAA,EAAM,CAAC,QAAA,EAAU,GAAA,KAAQ;AACvB,UAAA,MAAM,GAAA,GAAM,KAAI,CAAE,SAAA;AAClB,UAAA,MAAM,SAAS,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC5D,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,UAAA,MAAM,QAAA,GAAW,gBAAgB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA;AAAA,YAC3E,CAACC,IAAGC,EAAAA,KAAM,OAAA,CAAQ,KAAKD,EAAC,CAAA,GAAI,OAAA,CAAQ,GAAA,EAAKC,EAAC;AAAA,WAC5C;AACA,UAAA,MAAM,MAAM,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACvD,UAAA,MAAM,OAAA,GAAU,GAAA,KAAQ,IAAA,GAAO,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA;AAC/C,UAAA,IAAI,OAAA,GAAU,CAAA,IAAK,OAAA,IAAW,QAAA,CAAS,MAAA,EAAQ;AAC/C,UAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,UAAA,MAAM,CAAA,GAAI,SAAS,OAAO,CAAA;AAC1B,UAAA,MAAM,IAAA,GAAO,EAAE,GAAG,GAAA,EAAI;AAEtB,UAAA,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA,GAAI,EAAE,SAAS,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,EAAE;AACrE,UAAA,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA,GAAI,EAAE,SAAS,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,EAAE;AACrE,UAAA,GAAA,CAAI,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,QACzB,CAAA;AAAA,QAEA,OAAO,MAAM,GAAA,CAAI,EAAE,SAAA,EAAW,IAAI;AAAA,OACpC,CAAA;AAAA,MACA,EAAE,MAAM,UAAA;AAAW;AACrB,GACF;AAGA,EAAA,SAAS,kBAAA,GAAuE;AAC9E,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACnD,IAAA,OAAOZ,QAAQ,MAAM;AACnB,MAAA,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,QACrC,OAAA;AAAA,QACA,OAAA,EAAS,eAAA,CAAgB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,OAAO,CAAA,CACzD,IAAI,CAAC,CAAA,MAAO,EAAE,GAAG,GAAG,OAAA,EAAS,SAAA,CAAU,SAAA,EAAW,CAAA,CAAE,EAAE,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA,EAAE,CAAE,CAAA,CACxF,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK;AAAA,OACrC,CAAE,CAAA;AAAA,IACJ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAAA,EAChB;AAOA,EAAA,SAAS,aAAA,GAAiC;AACxC,IAAA,MAAM,UAAU,kBAAA,EAAmB;AACnC,IAAA,OAAOA,OAAAA;AAAA,MACL,MACE,OAAA,CACG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACX,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,KAAA,EAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,CAAI,SAAS;AAAA,OACzD,CAAE,EACD,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MACrC,CAAC,OAAO;AAAA,KACV;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,cAAA,EAAgB,kBAAA,EAAoB,aAAA,EAAc;AAC7D;AC9GA,IAAM,SAAS,CAAC,IAAA,EAAgB,OAC9B,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,CAAA;AAE1D,SAAS,yBAAA,CAA0B;AAAA,EACxC;AACF,CAAA,EAEiD;AAC/C,EAAA,OAAOa,MAAAA,EAA4B;AAAA,IACjCrB,OAAAA;AAAA,MACE,CAAC,GAAA,MAAS;AAAA,QACR,WAAW,EAAC;AAAA,QACZ,UAAU,EAAC;AAAA,QACX,YAAA,EAAc,CAAC,EAAA,KAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,SAAA,EAAW,MAAA,CAAO,CAAA,CAAE,SAAA,EAAW,EAAE,GAAE,CAAE,CAAA;AAAA,QACzE,WAAA,EAAa,CAAC,EAAA,KAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,QAAA,EAAU,MAAA,CAAO,CAAA,CAAE,QAAA,EAAU,EAAE,GAAE,CAAE,CAAA;AAAA,QACtE,KAAA,EAAO,MAAM,GAAA,CAAI,EAAE,SAAA,EAAW,EAAC,EAAG,QAAA,EAAU,EAAC,EAAG;AAAA,OAClD,CAAA;AAAA,MACA,EAAE,MAAM,UAAA;AAAW;AACrB,GACF;AACF;;;ACZO,SAAS,qBAAqB,GAAA,EAA2C;AAC9E,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,UAAA,EAAY,UAAS,GAAI,GAAA;AACpE,EAAA,MAAM,EAAE,eAAA,EAAiB,aAAA,EAAc,GAAI,QAAA;AAG3C,EAAA,SAAS,mBAAA,GAAsC;AAC7C,IAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,GAAI,WAAW,QAAA,EAAS;AACtD,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,WAAA,CAAY,eAAe,QAAA,EAAS;AAC1D,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAS,GAAI,WAAW,QAAA,EAAS;AAEpD,IAAA,MAAM,OAAA,GAA4B,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC5D,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,OAAA,EAAS,SAAA,CAAU,CAAA,CAAE,EAAE,GAAG,OAAA,IAAW,IAAA;AAAA,MACrC,OAAO,SAAA,CAAU,CAAA,CAAE,EAAE,CAAA,EAAG,SAAS,CAAA,CAAE;AAAA,MACnC,CAAA,CAAE,IAAA;AAAA,MACF,CAAC,CAAA,EAAG,CAAA,KACF,aAAA,CAAc,QAAQ,CAAA,CAAE,OAAO,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA,CAAE,OAAO,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAA,CAAE;AAAA,KACvF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA;AAAA,MACT,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MACpC,QAAA;AAAA,MACA,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,MAC/B,OAAA;AAAA,MACA,MAAA,EAAQ,EAAE,SAAA,EAAW,QAAA;AAAS,KAChC;AAAA,EACF;AAGA,EAAA,SAAS,SAAA,CAAU,MAAA,GAAyB,mBAAA,EAAoB,EAAW;AACzE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EACvC;AAGA,EAAA,SAAS,QAAA,CAAS,MAAA,GAAyB,mBAAA,EAAoB,EAAS;AACtE,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,SAAA,CAAU,MAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AACvE,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,cAAA,CAAA;AACnC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,CAAA,CAAE,MAAA,EAAO;AACT,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,EAAE,mBAAA,EAAqB,SAAA,EAAW,QAAA,EAAS;AACpD;ACjEO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,YAAA,GAAe,WAAU,EAAuB;AACrF,EAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,EAAmB;AACzC,EAAA,MAAMsB,UAAS,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AACnD,EAAA,MAAM,OAAO,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC/C,EAAA,MAAM,QAAQ,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAEjD,EAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC9F,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAE9D,EAAA,uBACErB,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAY,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,QAAA,CAAA,EACrD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EACtE,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,QAAa,MAAA;AAAA,QAAK,KAAA;AAAA,QAAM;AAAA,OAAA,EAC3B,CAAA;AAAA,sBACAA,IAAAA;AAAA,QAACsB,MAAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,KAAA;AAAA,UACT,aAAA,EAAa,GAAG,YAAY,CAAA,cAAA,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA,4BAAA1B,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AACpC,KAAA,EACF,CAAA;AAAA,IAEC,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,qBACZI,IAAAA;AAAA,MAACgB,IAAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAQ,UAAA;AAAA,QACR,SAAA,EAAU,YAAA;AAAA,QACV,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,gBAAA,CAAA,EAAoB,MAAM,OAAO,CAAA;AAAA,QAEjE,QAAA,EAAA;AAAA,0BAAApB,GAAAA,CAAC,cACC,QAAA,kBAAAA,GAAAA,CAAC,aAAU,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA,EAClD,CAAA;AAAA,0BACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,aAAA,EACpB,gBAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,GAAA,KAAQ;AAC7B,YAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,YAAA,uBACEI,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,8EAAA;AAAA,gBACV,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,OAAA,CAAA,EAAW,EAAE,EAAE,CAAA;AAAA,gBAE/C,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,oCAAAJ,GAAAA;AAAA,sBAAC0B,MAAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,MAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,SAAA,EAAU,QAAA;AAAA,wBACV,UAAU,GAAA,KAAQ,CAAA;AAAA,wBAClB,OAAA,EAAS,MAAM,IAAA,CAAK,CAAA,CAAE,IAAI,IAAI,CAAA;AAAA,wBAC9B,YAAA,EAAY,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,GAAA,CAAA;AAAA,wBAC3B,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,UAAA,CAAA,EAAc,EAAE,EAAE,CAAA;AAAA,wBAElD,QAAA,kBAAA1B,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,qBAClC;AAAA,oCACAA,GAAAA;AAAA,sBAAC0B,MAAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,MAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,SAAA,EAAU,QAAA;AAAA,wBACV,QAAA,EAAU,GAAA,KAAQ,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,wBACzC,OAAA,EAAS,MAAM,IAAA,CAAK,CAAA,CAAE,IAAI,MAAM,CAAA;AAAA,wBAChC,YAAA,EAAY,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,KAAA,CAAA;AAAA,wBAC3B,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,YAAA,CAAA,EAAgB,EAAE,EAAE,CAAA;AAAA,wBAEpD,QAAA,kBAAA1B,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AACpC,mBAAA,EACF,CAAA;AAAA,kCACAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,kCACxDI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,oCAAAJ,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EAAgD,YAAE,KAAA,EAAM,CAAA;AAAA,oCACrEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EAAoD,YAAE,EAAA,EAAG;AAAA,mBAAA,EACxE,CAAA;AAAA,kBACC,CAAA,CAAE,wBACDI,IAAAA,CAACuB,OAAA,EAAM,OAAA,EAAQ,QAAA,EAAS,SAAA,EAAU,SAAA,EAChC,QAAA,EAAA;AAAA,oCAAA3B,GAAAA,CAACS,QAAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAAE;AAAA,mBAAA,EACjC,CAAA;AAAA,kCAEFT,GAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,SAAS,CAAA,CAAE,OAAA;AAAA,sBACX,eAAA,EAAiB,MAAMyB,OAAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,sBAClC,YAAA,EAAY,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,sBAC7B,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EAAkB,EAAE,EAAE;AAAA;AAAA;AACxD;AAAA,eAAA;AAAA,cA3CK,CAAA,CAAE;AAAA,aA4CT;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA;AAAA,OAAA;AAAA,MA5DK,KAAA,CAAM;AAAA,KA8Dd;AAAA,GAAA,EACH,CAAA;AAEJ;ACzFA,IAAM,YAAA,GAA6C;AAAA,EACjD,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAQA,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAU,YAAA,EAAa,EAA+C;AAChG,EAAA,MAAM,OAAOxB,OAAAA,EAAQ;AACrB,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,KAAY2B,QAAAA,CAAS;AAAA,IAC5C,QAAA,EAAU,CAAC,SAAA,EAAW,cAAA,EAAgB,QAAQ,CAAA;AAAA,IAC9C,OAAA,EAAS,aAAa,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI,QAAQ,GAAG,MAAA,CAAO,gBAAA;AAAA,IACnE,SAAA,EAAW;AAAA,GACZ,CAAA;AACD,EAAA,MAAM,OAAO,SAAA,GAAY,QAAA,GAAM,OAAA,IAAW,CAAC,OAAO,QAAA,GAAM,IAAA;AACxD,EAAA,uBACExB,IAAAA;AAAA,IAACuB,KAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,YAAA,CAAa,IAAI,CAAA,IAAK,WAAA;AAAA,MAC/B,aAAA,EAAa,GAAA,CAAI,CAAA,EAAG,YAAY,uBAAuB,QAAQ,CAAA;AAAA,MAE/D,QAAA,EAAA;AAAA,wBAAA3B,GAAAA,CAAC6B,GAAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE;AAAA;AAAA;AAAA,GAC9B;AAEJ;AAOO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,YAAA,GAAe,WAAU,EAAqB;AACjF,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,cAAA,KAAmB,UAAA,EAAW;AAChE,EAAA,MAAM,EAAE,MAAM,MAAA,GAAS,IAAI,SAAA,EAAW,aAAA,KAAkB,SAAA,EAAU;AAClE,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AACxC,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAE9C,EAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,EAAC;AAEvC,EAAA,uBACEzB,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAY,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,OAAA,CAAA,EAErD,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAACgB,IAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,UAAA;AAAA,QACR,SAAA,EAAU,YAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,eAAA,CAAA;AAAA,QAE5B,QAAA,EAAA;AAAA,0BAAApB,GAAAA,CAAC8B,YAAA,EACC,QAAA,kBAAA1B,KAAC2B,SAAAA,EAAA,EAAU,WAAU,mCAAA,EACnB,QAAA,EAAA;AAAA,4BAAA/B,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,YAAE,2BAAA;AAAA,4BAChDA,IAAC2B,KAAAA,EAAA,EAAM,SAAQ,WAAA,EAAY,SAAA,EAAU,MAAA,EAClC,QAAA,EAAA,QAAA,CAAS,MAAA,EACZ;AAAA,WAAA,EACF,CAAA,EACF,CAAA;AAAA,0BACAvB,IAAAA,CAAC4B,WAAAA,EAAA,EAAY,WAAU,aAAA,EACpB,QAAA,EAAA;AAAA,YAAA,cAAA,oBACChC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,8BAAA,EAAuB,CAAA;AAAA,YAErE,CAAC,cAAA,IAAkB,QAAA,CAAS,MAAA,KAAW,CAAA,oBACtCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,4CAAA,EAE7C,CAAA;AAAA,YAED,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACbI,IAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,6FAAA;AAAA,gBACV,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EAAkB,EAAE,WAAW,CAAA;AAAA,gBAE/D,QAAA,EAAA;AAAA,kCAAAJ,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,SAAA,CAAU,QAAA,CAAS,CAAA,CAAE,WAAW,CAAA;AAAA,sBACzC,eAAA,EAAiB,MAAM,YAAA,CAAa,CAAA,CAAE,WAAW,CAAA;AAAA,sBACjD,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,qBAAA,CAAA,EAAyB,EAAE,WAAW;AAAA;AAAA,mBACxE;AAAA,kCACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,oCAAAJ,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EACV,QAAA,EAAA,CAAA,CAAE,SAAS,oBAAA,EACd,CAAA;AAAA,oCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EAAoD,YAAE,WAAA,EAAY;AAAA,mBAAA,EACjF,CAAA;AAAA,kCACAA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,QAAA,EAAU,CAAA,CAAE,aAAa,YAAA,EAA4B;AAAA;AAAA,eAAA;AAAA,cAflE,CAAA,CAAE;AAAA,aAiBV;AAAA,WAAA,EACH;AAAA;AAAA;AAAA,KACF;AAAA,oBAGAI,IAAAA,CAACgB,IAAAA,EAAA,EAAK,OAAA,EAAQ,UAAA,EAAW,SAAA,EAAU,YAAA,EAAa,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EAC1E,QAAA,EAAA;AAAA,sBAAApB,GAAAA,CAAC8B,YAAA,EACC,QAAA,kBAAA1B,KAAC2B,SAAAA,EAAA,EAAU,WAAU,mCAAA,EACnB,QAAA,EAAA;AAAA,wBAAA/B,GAAAA,CAACiC,GAAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,QAAE,SAAA;AAAA,wBACvCjC,IAAC2B,KAAAA,EAAA,EAAM,SAAQ,WAAA,EAAY,SAAA,EAAU,MAAA,EAClC,QAAA,EAAA,MAAA,CAAO,MAAA,EACV;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAvB,IAAAA,CAAC4B,WAAAA,EAAA,EAAY,WAAU,aAAA,EACpB,QAAA,EAAA;AAAA,QAAA,aAAA,oBAAiBhC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,sBAAA,EAAe,CAAA;AAAA,QAC7E,CAAC,aAAA,IAAiB,MAAA,CAAO,MAAA,KAAW,CAAA,oBACnCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,QAEpE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACXI,IAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAU,6FAAA;AAAA,YACV,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,aAAA,CAAA,EAAiB,EAAE,WAAW,CAAA;AAAA,YAE9D,QAAA,EAAA;AAAA,8BAAAJ,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,WAAW,CAAA;AAAA,kBACxC,eAAA,EAAiB,MAAM,WAAA,CAAY,CAAA,CAAE,WAAW,CAAA;AAAA,kBAChD,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,oBAAA,CAAA,EAAwB,EAAE,WAAW;AAAA;AAAA,eACvE;AAAA,8BACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAJ,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EACT,QAAA,EAAA,CAAA,CAAA,CAAE,cAAc,OAAA,EAAS,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,EAC9C,CAAA;AAAA,gCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EAAoD,YAAE,WAAA,EAAY;AAAA,eAAA,EACjF;AAAA;AAAA,WAAA;AAAA,UAdK,CAAA,CAAE;AAAA,SAgBV;AAAA,OAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AClHA,SAAS,WAAA,CAAY;AAAA,EACnB,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AAED,EAAA,MAAM,KAAA,GAAQ,YAAY,QAAA,EAAS;AACnC,EAAA,MAAM,OAAA,GAAU,YAAY,cAAA,EAAe;AAC3C,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,IAAA,GAAOW,OAAAA,CAAQ,MAAM,QAAA,CAAS,SAAA,EAAU,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAEnF,EAAA,uBACEP,IAAAA,CAACgB,IAAAA,EAAA,EAAK,OAAA,EAAQ,UAAA,EAAW,SAAA,EAAU,YAAA,EAAa,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,aAAA,CAAA,EAC1E,QAAA,EAAA;AAAA,oBAAApB,GAAAA,CAAC8B,YAAA,EACC,QAAA,kBAAA1B,KAAC2B,SAAAA,EAAA,EAAU,WAAU,6CAAA,EACnB,QAAA,EAAA;AAAA,sBAAA3B,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,QAAE;AAAA,OAAA,EAC9C,CAAA;AAAA,sBACAI,IAAAA;AAAA,QAACsB,MAAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS,MAAM,QAAA,CAAS,QAAA,EAAS;AAAA,UACjC,aAAA,EAAa,GAAG,YAAY,CAAA,OAAA,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA,4BAAA1B,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AACjC,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAACgC,WAAAA,EAAA,EACC,QAAA,kBAAAhC,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,2HAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,eAAA,CAAA;AAAA,QAE3B,QAAA,EAAA;AAAA;AAAA,KACH,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAAyB;AACvB,EAAA,uBACEI,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAY,aAAA,EAAa,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAA,EACzD,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,oBAEDA,IAAAA,CAACa,IAAAA,EAAA,EAAK,cAAa,OAAA,EACjB,QAAA,EAAA;AAAA,sBAAAb,IAAAA,CAAC,QAAA,EAAA,EAAS,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,KAAA,CAAA,EACpC,QAAA,EAAA;AAAA,wBAAAA,KAAC,WAAA,EAAA,EAAY,KAAA,EAAM,SAAQ,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,UAAA,CAAA,EACrD,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAACkC,OAAAA,EAAA,EAAQ,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EAChC,CAAA;AAAA,wBACA9B,KAAC,WAAA,EAAA,EAAY,KAAA,EAAM,WAAU,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,YAAA,CAAA,EACvD,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EACnC,CAAA;AAAA,wBACAI,KAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UAAS,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,WAAA,CAAA,EACtD,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAACiC,GAAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EAC5B,CAAA;AAAA,wBACA7B,KAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UAAS,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,WAAA,CAAA,EACtD,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EACjC;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,SACjB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,WAAA;AAAA,UACR,OAAA,EAAQ,OAAA;AAAA,UACR,YAAA,EAAc,GAAG,YAAY,CAAA,MAAA,CAAA;AAAA,UAC7B,OAAA,EAAS;AAAA;AAAA,OACX,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,SAAA,EACjB,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,WAAA,EAAa,YAAA,EAA4B,CAAA,EACjE,CAAA;AAAA,sBACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,QAAA,EACjB,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,UAAA,EAAY,YAAA,EAA4B,CAAA,EAC9D,CAAA;AAAA,sBACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UACjB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,WAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA,OACF,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * Live-data gate for the widget seam (context + hook only — no components, so\n * this stays fast-refresh clean and can be imported by both the runtime scaffold\n * and the widget factory without a cycle).\n *\n * The flag is `true` ONLY inside an authenticated in-app renderer\n * (`PageRenderer liveData`), which is where live ARBI data may resolve. In the\n * Studio editor canvas and on the public site it stays `false`, so every live\n * widget renders a placeholder instead of hitting the backend. It is deliberately\n * separate from the asset resolver (which IS on in the editor, to preview\n * images): back-office data must never resolve on the marketing canvas.\n */\nimport { createContext, useContext } from 'react'\n\n/** True only where live widgets may resolve backend data (an authenticated app tree). */\nexport const LiveDataContext = createContext<boolean>(false)\n\n/** Whether live widgets may resolve backend data here (false in editor/public). */\nexport function useLiveDataActive(): boolean {\n return useContext(LiveDataContext)\n}\n","/**\n * Live-widget runtime: everything in the seam that RENDERS — the provider that\n * turns the live-data gate on for an authenticated app tree, the placeholder\n * shown everywhere else, and the widget block bodies themselves (each gates on\n * the live-data flag and renders live data or a placeholder).\n *\n * Components only — kept apart from the context/hook ({@link ./liveData}) and the\n * config factory ({@link ./widgets}) so every file in the seam is fast-refresh\n * clean (a file exports either components or non-components, never both, and a\n * non-component-export file defines no components).\n *\n * The widgets read the SHARED `@arbidocs/react` hooks and the package connection\n * (for the active workspace), so they are host-agnostic.\n */\nimport type { LucideIcon } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { Bot, FileText, MessagesSquare, Sparkles } from 'lucide-react'\nimport { useConversations, useDocuments } from '@arbidocs/react'\nimport { Card } from '@arbidocs/react/ui'\nimport { MetricCard } from '../components/MetricCard'\nimport { useConnection } from '../connection/ConnectionProvider'\nimport { LiveDataContext, useLiveDataActive } from './liveData'\n\n// ── Scaffolding ───────────────────────────────────────────────────────────────\n/** Marks the subtree as an authenticated app tree, so live widgets resolve data. */\nexport function LiveDataProvider({ children }: { children: ReactNode }) {\n return <LiveDataContext.Provider value={true}>{children}</LiveDataContext.Provider>\n}\n\n/**\n * What a live widget shows when it can't (or shouldn't) resolve data: a labelled,\n * dashed card. Used in the Studio canvas and the public renderer so authoring a\n * dashboard is WYSIWYG-ish without leaking live back-office data.\n */\nexport function WidgetPlaceholder({\n label,\n icon: Icon = Sparkles,\n testId,\n}: {\n label: string\n icon?: LucideIcon\n testId?: string\n}) {\n return (\n <div\n className=\"flex items-center gap-3 rounded-lg bg-muted px-5 py-6 text-sm text-muted-foreground\"\n data-testid={testId}\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-background text-muted-foreground\">\n <Icon className=\"size-4\" />\n </span>\n <span>\n <span className=\"font-medium text-foreground\">{label}</span>\n <span className=\"ml-1\">· live in the app</span>\n </span>\n </div>\n )\n}\n\n// ── Shared helpers ────────────────────────────────────────────────────────────\n/** Resolve the active workspace id from the package connection (host-agnostic). */\nfunction useActiveWorkspaceId(): string | undefined {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return workspaceId ?? fallbackWorkspaceId ?? undefined\n}\n\n/** Compact relative time (\"3h ago\") — self-contained so widgets need no host util. */\nfunction timeAgo(iso: string | undefined): string {\n if (!iso) return ''\n const then = new Date(iso).getTime()\n if (Number.isNaN(then)) return ''\n const s = Math.max(0, Math.round((Date.now() - then) / 1000))\n if (s < 60) return 'just now'\n const m = Math.round(s / 60)\n if (m < 60) return `${m}m ago`\n const h = Math.round(m / 60)\n if (h < 24) return `${h}h ago`\n return `${Math.round(h / 24)}d ago`\n}\n\nconst METRIC_SOURCES = {\n documents: { label: 'Documents', icon: FileText },\n conversations: { label: 'Agent threads', icon: Bot },\n} as const\ntype MetricSource = keyof typeof METRIC_SOURCES\n\nconst asMetricSource = (s: string): MetricSource =>\n s in METRIC_SOURCES ? (s as MetricSource) : 'documents'\n\ninterface Conversation {\n external_id?: string\n title?: string\n updated_at?: string\n}\n\n// ── Live inner bodies (only mounted where the gate is on) ─────────────────────\nfunction AgentActivityLive({\n title,\n limit,\n testId,\n}: {\n title: string\n limit: number\n testId: string\n}) {\n const wsId = useActiveWorkspaceId()\n const { data, isLoading } = useConversations(wsId)\n const rows = [...((data ?? []) as Conversation[])]\n .sort((a, b) => +new Date(b.updated_at ?? 0) - +new Date(a.updated_at ?? 0))\n .slice(0, limit)\n\n return (\n <Card variant=\"elevated\" className=\"rounded-lg p-5\" data-testid={testId}>\n <div className=\"mb-3 flex items-center gap-2\">\n <Bot className=\"size-4 text-muted-foreground\" />\n <p className=\"text-sm font-semibold text-foreground\">{title}</p>\n </div>\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testId}-loading`}>\n Loading agent threads…\n </p>\n ) : rows.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testId}-empty`}>\n No agent threads yet.\n </p>\n ) : (\n <ul className=\"space-y-2\" data-testid={`${testId}-list`}>\n {rows.map((c, i) => (\n <li\n key={c.external_id ?? i}\n className=\"flex items-center justify-between gap-3\"\n data-testid={`${testId}-item-${i}`}\n >\n <span className=\"flex items-center gap-2 truncate\">\n <MessagesSquare className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate text-sm text-foreground\">\n {c.title?.trim() || 'Untitled thread'}\n </span>\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {timeAgo(c.updated_at)}\n </span>\n </li>\n ))}\n </ul>\n )}\n </Card>\n )\n}\n\nfunction LiveMetricInner({\n label,\n source,\n accent,\n testId,\n}: {\n label: string\n source: MetricSource\n accent: string\n testId: string\n}) {\n const wsId = useActiveWorkspaceId()\n const docs = useDocuments(wsId, { enabled: source === 'documents' })\n const convos = useConversations(wsId, { enabled: source === 'conversations' })\n const query = source === 'documents' ? docs : convos\n const count = Array.isArray(query.data) ? query.data.length : 0\n return (\n <MetricCard\n label={label || METRIC_SOURCES[source].label}\n value={query.isLoading ? '—' : String(count)}\n accent={accent}\n icon={METRIC_SOURCES[source].icon}\n testId={testId}\n />\n )\n}\n\n// ── Widget block bodies (gate on the live flag) ───────────────────────────────\n// Named components (not the Puck `render` arrow) so the live-context hook is a\n// legit component-level hook — mirrors how BlockImage gates on the asset resolver.\nexport function AgentActivityBlock({\n title,\n limit,\n testId,\n}: {\n title: string\n limit: number\n testId: string\n}) {\n return useLiveDataActive() ? (\n <AgentActivityLive title={title} limit={limit} testId={testId} />\n ) : (\n <WidgetPlaceholder label={String(title || 'Agent activity')} icon={Bot} testId={testId} />\n )\n}\n\nexport function LiveMetricBlock({\n label,\n source,\n accent,\n testId,\n}: {\n label: string\n source: string\n accent: string\n testId: string\n}) {\n const src = asMetricSource(source)\n return useLiveDataActive() ? (\n <LiveMetricInner label={label} source={src} accent={accent} testId={testId} />\n ) : (\n <WidgetPlaceholder\n label={String(label || METRIC_SOURCES[src].label)}\n icon={METRIC_SOURCES[src].icon}\n testId={testId}\n />\n )\n}\n","/**\n * Live-widget block factory for @arbidocs/blocks.\n *\n * Mirrors the other `create*Blocks` factories: it only WIRES pre-built block\n * components (from {@link ./liveWidgetRuntime}) into Puck `ComponentConfig`s, so\n * it exports a single function and defines no components of its own — keeping it\n * fast-refresh clean. The blocks gate on the live-data flag ({@link ./liveData}),\n * rendering real ARBI data inside an authenticated app tree and a placeholder in\n * the editor/public. They read the SHARED `@arbidocs/react` hooks, so any client\n * with an ARBI workspace gets them; a client supplies only *composition* via\n * `createArbiBlocksConfig({ liveWidgets: true })`.\n */\nimport type { ComponentConfig } from '@measured/puck'\nimport { AgentActivityBlock, LiveMetricBlock } from './liveWidgetRuntime'\nimport type { BlockKit } from './blockKit'\n\n/**\n * Build the live-widget block set, closing over the shared {@link BlockKit} for\n * stable testids. Registered under a \"Widgets\" category when a consumer opts in\n * with `createArbiBlocksConfig({ liveWidgets: true })`.\n */\nexport function createLiveWidgets(kit: BlockKit): Record<string, ComponentConfig> {\n const { blockTestId } = kit\n\n const AgentActivityWidget: ComponentConfig = {\n label: 'Agent activity (live)',\n fields: {\n title: { type: 'text', label: 'Title' },\n limit: { type: 'number', label: 'Rows', min: 1, max: 8 },\n },\n defaultProps: { title: 'Recent agent activity', limit: 4 },\n render: ({ id, title, limit }) => (\n <AgentActivityBlock title={title} limit={limit} testId={blockTestId(id)} />\n ),\n }\n\n const LiveMetricWidget: ComponentConfig = {\n label: 'Live metric',\n fields: {\n label: { type: 'text', label: 'Label' },\n source: {\n type: 'select',\n label: 'Source',\n options: [\n { label: 'Documents', value: 'documents' },\n { label: 'Agent threads', value: 'conversations' },\n ],\n },\n accent: {\n type: 'radio',\n label: 'Accent',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Primary', value: 'primary' },\n { label: 'Success', value: 'success' },\n ],\n },\n },\n defaultProps: { label: '', source: 'documents', accent: 'primary' },\n render: ({ id, label, source, accent }) => (\n <LiveMetricBlock label={label} source={source} accent={accent} testId={blockTestId(id)} />\n ),\n }\n\n return {\n AgentActivity: AgentActivityWidget,\n LiveMetric: LiveMetricWidget,\n }\n}\n","/**\n * The SDK-backed half of asset resolution.\n *\n * Kept apart from `assetResolver.tsx` on purpose. `BlockImage` — and through it\n * every website block — must not reach the SDK, React Query or AG Grid, so that\n * `@arbidocs/blocks/site` can be imported by an unauthenticated marketing page.\n * A dead code path is not enough: neither kit package declares `sideEffects`, so\n * a bundler must keep whatever the module graph mentions. The resolver is\n * therefore *injected* (see `AssetResolverProvider`) rather than imported, and\n * only the authenticated Studio — which already depends on the SDK — hands this\n * module in.\n */\nimport { useEffect } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useArbi, useThumbnails } from '@arbidocs/react'\nimport type { AssetRenderProps } from './assetResolver'\n\n/**\n * Resolve an asset ext_id to a displayable image src.\n *\n * Prefer the cheap thumbnail endpoint, but fall back to downloading the actual\n * bytes as an object URL when there's no thumbnail — AI-generated (and freshly\n * uploaded) images have no thumbnail yet, so the thumbnail-only path renders a\n * broken `<img>`. The bytes always exist (it's a stored document), so the editor\n * shows the real image immediately instead of waiting on async thumbnailing.\n */\nexport function useAssetImage(docId: string): string | undefined {\n const arbi = useArbi()\n const { data: thumbs } = useThumbnails([docId])\n const thumb = thumbs?.[docId]\n\n const { data: objectUrl } = useQuery({\n queryKey: ['arbi', 'asset-image', docId],\n queryFn: async () => {\n const res = await arbi.documents.download(docId)\n const blob = await res.blob()\n return URL.createObjectURL(blob)\n },\n // Only download when the thumbnail is genuinely absent (not merely loading).\n enabled: !!docId && thumbs != null && !thumb && arbi.hasWorkspace,\n staleTime: 10 * 60_000,\n })\n\n // Release the object URL when the doc changes / unmounts.\n useEffect(() => {\n return () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl)\n }\n }, [objectUrl])\n\n return thumb ?? objectUrl\n}\n\n/**\n * Resolve a single asset ext_id and render it as an `<img>`. This is the\n * `AssetRenderer` the Studio injects; it satisfies `AssetRenderProps`.\n */\nexport function AssetThumb({ docId, alt, className, testId }: AssetRenderProps) {\n const src = useAssetImage(docId)\n return <img src={src ?? undefined} alt={alt ?? ''} className={className} data-testid={testId} />\n}\n","/**\n * Publish-time asset materialization.\n *\n * While authoring, an image is stored as a workspace **asset ref**\n * (`asset:<docId>`) — resolvable only inside the authenticated Studio. The\n * public marketing renderer has no auth token, so a published page must be\n * **self-contained**: every asset ref is replaced with a directly-renderable\n * source before the page is saved for the public.\n *\n * The default {@link createArbiMaterializer} downloads each asset once and\n * inlines it as a `data:` URI — the bytes travel *inside* the published JSON,\n * so nothing is fetched, served or auth-gated at render time (no backend). A\n * consumer that prefers a CDN/static host can pass a `publishAsset` hook that\n * uploads the bytes and returns a URL instead; that is purely a payload-size\n * optimization and keeps this package host- and backend-agnostic.\n */\nimport type { Data } from '@measured/puck'\nimport { assetRefId, isAssetRef } from '../components/assetResolver'\nimport type { Arbi } from './types'\n\n/** Resolve a workspace document ext_id to a public-renderable src, or null. */\nexport type AssetMaterializer = (docId: string) => Promise<string | null>\n\nexport interface MaterializeOptions {\n /**\n * Optional sink: given a doc id + its bytes, store them somewhere public and\n * return the URL. When omitted, bytes are inlined as a `data:` URI (no backend).\n */\n publishAsset?: (docId: string, blob: Blob) => Promise<string>\n}\n\n/** Read a Blob as a `data:<mime>;base64,…` URI. */\nfunction blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(blob)\n })\n}\n\n/**\n * A materializer backed by the authenticated Arbi client: download the asset,\n * then either hand it to `publishAsset` or inline it as a data URI. Any failure\n * resolves to `null` so a single broken asset never fails the whole publish.\n */\nexport function createArbiMaterializer(\n arbi: Arbi,\n opts: MaterializeOptions = {}\n): AssetMaterializer {\n return async (docId: string) => {\n try {\n const res = await arbi.documents.download(docId)\n const blob = await res.blob()\n if (opts.publishAsset) return await opts.publishAsset(docId, blob)\n return await blobToDataUrl(blob)\n } catch {\n return null\n }\n }\n}\n\n/** Depth-first collect every distinct asset ref (`asset:…`) in a JSON value. */\nfunction collectAssetRefs(node: unknown, acc: Set<string>): void {\n if (typeof node === 'string') {\n if (isAssetRef(node)) acc.add(node)\n return\n }\n if (Array.isArray(node)) {\n for (const child of node) collectAssetRefs(child, acc)\n return\n }\n if (node && typeof node === 'object') {\n for (const value of Object.values(node)) collectAssetRefs(value, acc)\n }\n}\n\n/** Deep-clone a JSON value, swapping any string found in `replacements`. */\nfunction replaceAssetRefs<T>(node: T, replacements: Map<string, string>): T {\n if (typeof node === 'string') {\n return (replacements.get(node) ?? node) as T\n }\n if (Array.isArray(node)) {\n return node.map((child) => replaceAssetRefs(child, replacements)) as unknown as T\n }\n if (node && typeof node === 'object') {\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(node)) {\n out[key] = replaceAssetRefs(value, replacements)\n }\n return out as T\n }\n return node\n}\n\n/**\n * Return a copy of `data` with every `asset:<docId>` ref replaced by its\n * materialized source. Each distinct ref is resolved exactly once; a ref that\n * fails to resolve is left untouched (it simply won't paint for the public).\n */\nexport async function materializePageData(\n data: Data,\n materialize: AssetMaterializer\n): Promise<Data> {\n const refs = new Set<string>()\n collectAssetRefs(data, refs)\n if (refs.size === 0) return data\n\n const replacements = new Map<string, string>()\n await Promise.all(\n [...refs].map(async (ref) => {\n const src = await materialize(assetRefId(ref))\n if (src) replacements.set(ref, src)\n })\n )\n if (replacements.size === 0) return data\n return replaceAssetRefs(data, replacements)\n}\n","/**\n * StudioEditor — the WYSIWYG marketing-site builder.\n *\n * Wraps Puck's <Puck> with a host-supplied block config, a slim brand toolbar\n * (page picker, theme drawer, publish) and injected persistence. Data is loaded\n * per page slug on mount / slug change and saved on publish. The theme editor\n * rides in a slide-over so token changes preview live against the canvas.\n *\n * Firm-agnostic: the block config, page list, persistence, theme bundle/defaults\n * and brand labels all arrive as props; `live` is passed in (never read from env).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Link } from 'react-router-dom'\nimport { Puck, type Config, type Data } from '@measured/puck'\nimport { ArrowLeft, Loader2, Palette, Rocket } from 'lucide-react'\nimport { useArbi } from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { ThemeEditor } from '../theme/ThemeEditor'\nimport { AssetResolverProvider } from '../components/assetResolver'\nimport { AssetThumb } from '../components/assetImage'\nimport { applyStoredTheme, type ThemeBundle } from '../theme/store'\nimport type { ThemeTokens } from '../theme/tokens'\nimport { createArbiMaterializer, materializePageData, type MaterializeOptions } from './publish'\nimport type { StudioPageMeta, StudioPersistence, PersistVia } from './types'\n\nconst EMPTY_DATA = { content: [], root: {} } as Data\n\nexport interface StudioEditorProps {\n config: Config\n pages: readonly StudioPageMeta[]\n persistence: StudioPersistence\n themeBundle: ThemeBundle\n defaultTheme: ThemeTokens\n brandLabel: string\n backHref?: string\n backLabel?: string\n live: boolean\n initialSlug?: string\n testIdPrefix?: string\n /**\n * Install a DEV-only `window.__studioResetSlug(slug)` hook that clears a slug's\n * stored page so a fresh seed governs the canvas. For tests/demos only — it can\n * delete pages, so keep it off in production (pass `import.meta.env.DEV`). The\n * package stays env-agnostic; the consumer owns the flag.\n */\n resetSeam?: boolean\n /**\n * Optional sink for published image bytes. When omitted, publishing inlines\n * each asset as a `data:` URI (self-contained, no backend). Provide this to\n * upload bytes to a CDN/static host and return a URL instead.\n */\n publishAsset?: MaterializeOptions['publishAsset']\n}\n\nexport function StudioEditor({\n config,\n pages,\n persistence,\n themeBundle,\n defaultTheme,\n brandLabel,\n backHref,\n backLabel = 'Back',\n live,\n initialSlug,\n testIdPrefix = 'studio',\n publishAsset,\n resetSeam = false,\n}: StudioEditorProps) {\n const arbi = useArbi()\n const { notify } = useBlocksEnvironment()\n const materialize = useMemo(\n () => createArbiMaterializer(arbi, { publishAsset }),\n [arbi, publishAsset]\n )\n\n const [slug, setSlug] = useState<string>(initialSlug ?? pages[0]?.slug ?? 'home')\n const [data, setData] = useState<Data>(EMPTY_DATA)\n const [rev, setRev] = useState(0) // bump to force-remount Puck on (re)load\n const [loading, setLoading] = useState(true)\n const [themeOpen, setThemeOpen] = useState(false)\n const [via, setVia] = useState<PersistVia | null>(null)\n const [saving, setSaving] = useState(false)\n // A failed load must not fall through to an empty canvas: publishing it would overwrite\n // whatever is stored. Show the failure instead and keep Publish disabled.\n const [loadError, setLoadError] = useState<string | null>(null)\n const latest = useRef<Data>(EMPTY_DATA)\n\n // (Re)load the page's stored layout whenever the slug changes.\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n void (async () => {\n let loaded: Data | null\n try {\n loaded = (await persistence.loadPage<Data>(arbi, live, slug)).data\n } catch (e) {\n if (cancelled) return\n const message = e instanceof Error ? e.message : 'Could not load the page'\n setLoadError(message)\n notify(message, 'error')\n setLoading(false)\n return\n }\n if (cancelled) return\n const next = loaded ?? EMPTY_DATA\n setData(next)\n latest.current = next\n setRev((r) => r + 1)\n setLoading(false)\n })()\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slug, live])\n\n // DEV-only reset seam: clear a slug's stored page so a fresh seed governs the\n // canvas (backend content otherwise wins over localStorage). Lives in the\n // builder so EVERY client's studio gets deterministic test/demo resets for\n // free — no per-client wiring.\n useEffect(() => {\n if (!resetSeam) return\n const w = window as unknown as { __studioResetSlug?: (slug: string) => Promise<void> }\n w.__studioResetSlug = (s) => persistence.deletePage(arbi, live, s)\n return () => {\n delete w.__studioResetSlug\n }\n }, [resetSeam, arbi, live, persistence])\n\n // Publish = save the authoring layout (asset refs preserved, reusable) AND a\n // materialized copy (refs → data: URIs) the unauthenticated public can render.\n const persist = useCallback(\n async (toSave: Data) => {\n setSaving(true)\n try {\n const where = await persistence.savePage(arbi, live, slug, toSave)\n const published = await materializePageData(toSave, materialize)\n await persistence.savePublished(arbi, live, slug, published)\n setVia(where)\n } catch (e) {\n notify(e instanceof Error ? e.message : 'Could not save the page', 'error')\n } finally {\n setSaving(false)\n }\n },\n [arbi, live, slug, persistence, materialize, notify]\n )\n\n // Hydrate the shared theme store from any persisted theme, then preview it live\n // so the canvas is painted exactly as a published page will render.\n useEffect(() => {\n let cancelled = false\n void (async () => {\n let stored: ThemeTokens | null\n try {\n stored = (await persistence.loadTheme<ThemeTokens>(arbi, live)).data\n } catch (e) {\n notify(e instanceof Error ? e.message : 'Could not load the theme', 'error')\n return\n }\n if (cancelled || !stored) return\n themeBundle.useStore.setState({\n colors: { ...defaultTheme.colors, ...stored.colors },\n fonts: stored.fonts ?? defaultTheme.fonts,\n radius: stored.radius ?? defaultTheme.radius,\n activePresetId: null,\n })\n applyStoredTheme(themeBundle)\n })()\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [arbi, live])\n\n // Persist the current theme so PageRenderer can paint published pages.\n const saveThemeToArbi = useCallback(async () => {\n const snapshot = themeBundle.useStore.getState().snapshot()\n try {\n return await persistence.saveTheme(arbi, live, snapshot)\n } catch (e) {\n notify(e instanceof Error ? e.message : 'Could not save the theme', 'error')\n throw e\n }\n }, [arbi, live, persistence, themeBundle, notify])\n\n return (\n <div className=\"al-studio\" data-testid=\"page-studio\">\n {/* Brand toolbar */}\n <header className=\"flex items-center gap-3 border-b border-border bg-card px-4 py-2\">\n {backHref && (\n <>\n <Link\n to={backHref}\n className=\"inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-sm text-muted-foreground hover:text-primary\"\n data-testid={`${testIdPrefix}-back`}\n >\n <ArrowLeft className=\"size-4\" /> {backLabel}\n </Link>\n <span className=\"h-4 w-px bg-border\" />\n </>\n )}\n <span className=\"font-display text-sm font-semibold text-foreground\">{brandLabel}</span>\n <select\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"rounded border border-border bg-background px-2 py-1 text-sm\"\n data-testid={`${testIdPrefix}-slug`}\n >\n {pages.map((p) => (\n <option key={p.slug} value={p.slug}>\n {p.label}\n </option>\n ))}\n </select>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {via && (\n <span\n className=\"text-xs text-muted-foreground\"\n data-testid={`${testIdPrefix}-save-via`}\n >\n saved via {via}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => setThemeOpen((o) => !o)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-1.5 text-sm font-medium text-foreground hover:border-primary hover:text-primary\"\n data-testid={`${testIdPrefix}-theme-toggle`}\n >\n <Palette className=\"size-4\" /> Theme\n </button>\n <button\n type=\"button\"\n onClick={() => void persist(latest.current)}\n disabled={saving || loading || loadError !== null}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-60\"\n data-testid={`${testIdPrefix}-publish`}\n >\n {saving ? <Loader2 className=\"size-4 animate-spin\" /> : <Rocket className=\"size-4\" />}\n {saving ? 'Publishing…' : 'Publish'}\n </button>\n </div>\n </header>\n\n {/* Editor + theme drawer */}\n <div className=\"al-studio__puck relative flex\">\n <div className=\"min-w-0 flex-1\">\n {loadError ? (\n <div\n role=\"alert\"\n className=\"flex h-full items-center justify-center p-6 text-sm text-destructive\"\n data-testid={`${testIdPrefix}-load-error`}\n >\n {loadError}\n </div>\n ) : loading ? (\n <div\n className=\"flex h-full items-center justify-center text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-loading`}\n >\n <Loader2 className=\"mr-2 size-4 animate-spin\" /> Loading “{slug}”…\n </div>\n ) : (\n <AssetResolverProvider render={AssetThumb}>\n <Puck\n key={`${slug}-${rev}`}\n config={config}\n data={data}\n onChange={(d) => {\n latest.current = d\n }}\n onPublish={(d) => void persist(d)}\n />\n </AssetResolverProvider>\n )}\n </div>\n\n {themeOpen && (\n <aside\n className=\"w-80 shrink-0 border-l border-border\"\n data-testid={`${testIdPrefix}-theme-drawer`}\n >\n <ThemeEditor\n bundle={themeBundle}\n variant=\"drawer\"\n testIdPrefix={`${testIdPrefix}-theme`}\n onSave={saveThemeToArbi}\n />\n </aside>\n )}\n </div>\n </div>\n )\n}\n","/**\n * PageRenderer — the public, read-only renderer for a studio-authored page.\n *\n * Loads the **published** Puck `data` for a slug (ARBI → localStorage) and paints\n * it with <Render>. The published copy is self-contained — its image refs were\n * materialized to `data:` URIs at publish — so this renders with no auth (no asset\n * resolver). Falls back to the authoring layout for pages saved before publish.\n * Also applies any persisted theme so a published page looks exactly as it did in\n * the editor. Intended to be mounted at a public route.\n *\n * Firm-agnostic: the block config, persistence, theme defaults and empty-state\n * copy arrive as props; `live` is passed in (never read from env).\n */\nimport { useEffect, useState } from 'react'\nimport { useParams } from 'react-router-dom'\nimport { Render, type Config, type Data } from '@measured/puck'\nimport { useArbi } from '@arbidocs/react'\nimport { applyThemeVars, type ThemeTokens } from '../theme/tokens'\nimport { LiveDataProvider } from './liveWidgetRuntime'\nimport type { StudioPersistence } from './types'\n\nexport interface PageRendererProps {\n config: Config\n persistence: StudioPersistence\n defaultTheme: ThemeTokens\n live: boolean\n slug?: string\n emptyState?: { title: string; body: string }\n testIdPrefix?: string\n /**\n * Render inside a {@link LiveDataProvider}, so live-widget blocks resolve real\n * ARBI data. Only pass this when mounting the renderer INSIDE the authenticated\n * app tree (providers + a selected workspace present); on the public site leave\n * it off and widgets render placeholders.\n */\n liveData?: boolean\n /**\n * Render this page verbatim instead of loading a slug from persistence — for an\n * in-code page (e.g. a config-authored in-app board) that isn't a published\n * studio document. The slug is ignored.\n */\n initialData?: Data\n /**\n * Apply the persisted studio theme to the document (default true). Turn OFF for\n * an in-app renderer so it keeps the ambient app theme instead of repainting the\n * whole document with the marketing palette.\n */\n applyTheme?: boolean\n}\n\nexport function PageRenderer({\n config,\n persistence,\n defaultTheme,\n live,\n slug: slugProp,\n emptyState,\n testIdPrefix = 'studio',\n liveData = false,\n initialData,\n applyTheme = true,\n}: PageRendererProps) {\n const params = useParams()\n const slug = slugProp ?? params.slug ?? 'home'\n const arbi = useArbi()\n\n const [data, setData] = useState<Data | null>(initialData ?? null)\n const [loading, setLoading] = useState(!initialData)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n setLoading(!initialData)\n setError(null)\n void (async () => {\n try {\n // Optionally load + apply the studio theme (off for an in-app renderer, so\n // it keeps the ambient app palette instead of the marketing one).\n const theme = applyTheme\n ? (await persistence.loadTheme<ThemeTokens>(arbi, live)).data\n : undefined\n if (cancelled) return\n // An in-code page renders verbatim; otherwise load the published layout\n // (falling back to the authoring layout for pages that predate a publish).\n const page =\n initialData ??\n (await persistence.loadPublished<Data>(arbi, live, slug)).data ??\n (await persistence.loadPage<Data>(arbi, live, slug)).data\n if (cancelled) return\n if (applyTheme) {\n applyThemeVars(\n theme\n ? { ...defaultTheme, ...theme, colors: { ...defaultTheme.colors, ...theme.colors } }\n : defaultTheme\n )\n }\n setData(page)\n setLoading(false)\n } catch (e) {\n if (cancelled) return\n setError(e instanceof Error ? e.message : 'Could not load the page')\n setLoading(false)\n }\n })()\n return () => {\n cancelled = true\n }\n }, [arbi, live, slug, persistence, defaultTheme, initialData, applyTheme])\n\n if (loading) {\n return (\n <div\n className=\"flex min-h-[60vh] items-center justify-center text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-render-loading`}\n >\n Loading page…\n </div>\n )\n }\n\n if (error) {\n return (\n <div\n role=\"alert\"\n className=\"mx-auto max-w-2xl px-5 py-24 text-center text-sm text-destructive\"\n data-testid={`${testIdPrefix}-render-error`}\n >\n {error}\n </div>\n )\n }\n\n if (!data || data.content.length === 0) {\n const title = emptyState?.title ?? 'Nothing published yet'\n const body = emptyState?.body ?? `Publish the “${slug}” page to see it here.`\n return (\n <div\n className=\"mx-auto max-w-2xl px-5 py-24 text-center\"\n data-testid={`${testIdPrefix}-render-empty`}\n >\n <h1 className=\"font-display text-2xl font-semibold text-foreground\">{title}</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">{body}</p>\n </div>\n )\n }\n\n const rendered = <Render config={config} data={data} />\n return (\n <main data-testid={`page-${testIdPrefix}-render`}>\n {liveData ? <LiveDataProvider>{rendered}</LiveDataProvider> : rendered}\n </main>\n )\n}\n","/**\n * Studio persistence — save/load the Puck page `data` (and the theme) to a\n * host's public marketing workspace.\n *\n * Contract:\n * - Pages are stored as JSON documents named `<slug>.json` in the `site/`\n * folder of the configured workspace.\n * - The theme is stored as `theme.json` in the same folder.\n * - Whichever path is taken (\"arbi\" | \"local\") is returned, so the UI can show\n * where the content lives.\n * - Authored content is NEVER written to localStorage unless the host opts in\n * with `localStorageMode` (default \"off\"), because it would sit there as\n * plaintext next to a zero-knowledge store. When opted in, keys are scoped by\n * `storageScope()` (user + workspace) so two users or workspaces on one\n * browser never read each other's content. Without an ARBI session (or when\n * the ARBI call fails) and without that opt-in, calls REJECT with a\n * {@link StudioPersistenceError}; nothing is silently kept locally.\n *\n * Firm-agnostic: {@link createStudioPersistence} closes the workspace, folder\n * and storage-key constants over a config, returning a {@link StudioPersistence}.\n */\nimport type { useArbi } from '@arbidocs/react'\nimport type { LoadResult, PersistVia, StudioPersistence } from './types'\n\n/** The Arbi instance type, borrowed from the hook so we don't import internals. */\ntype Arbi = ReturnType<typeof useArbi>\n\n/** Thrown instead of silently degrading to plaintext local storage. */\nexport class StudioPersistenceError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'StudioPersistenceError'\n }\n}\n\n/**\n * - `off` (default): never touch localStorage; ARBI failures reject.\n * - `fallback`: use localStorage only when ARBI is unavailable or fails.\n * - `always`: additionally mirror every successful ARBI save locally.\n */\nexport type StudioLocalStorageMode = 'off' | 'fallback' | 'always'\n\nexport interface StudioPersistenceConfig {\n /** The public marketing workspace that backs the site builder. */\n workspaceId: string\n /** Folder inside the workspace where studio artefacts live. */\n folder?: string\n /** Prefix for the localStorage keys (e.g. \"studio-\"); only used when local storage is on. */\n storagePrefix: string\n /** Opt-in plaintext local storage (default \"off\"). */\n localStorageMode?: StudioLocalStorageMode\n /**\n * Isolation scope inserted into every local key, evaluated per call so it follows the\n * current user and workspace (e.g. `${userId}:${workspaceId}`). Required when\n * `localStorageMode` is not \"off\"; without a scope local access rejects.\n */\n storageScope?: () => string | null | undefined\n /** localStorage key for the theme mirror (default `${storagePrefix}theme`). */\n themeStorageKey?: string\n /** File name for the persisted theme document (default \"theme.json\"). */\n themeFileName?: string\n /** File name for a page's persisted document (default `${slug}.json`). */\n pageFileName?: (slug: string) => string\n /** File name for a page's published document (default `${slug}.published.json`). */\n publishedFileName?: (slug: string) => string\n}\n\nexport function createStudioPersistence(cfg: StudioPersistenceConfig): StudioPersistence {\n const WORKSPACE_ID = cfg.workspaceId\n const FOLDER = cfg.folder ?? 'site'\n const MODE: StudioLocalStorageMode = cfg.localStorageMode ?? 'off'\n\n /** Scoped key, or a loud error: an unscoped key would leak across users/workspaces. */\n function scoped(name: string): string {\n const scope = cfg.storageScope?.()\n if (!scope) {\n throw new StudioPersistenceError(\n 'Studio local storage needs a user/workspace scope (storageScope) before it can be used'\n )\n }\n return `${cfg.storagePrefix}${scope}:${name}`\n }\n const pageKey = (slug: string) => scoped(slug)\n const publishedKey = (slug: string) => scoped(`published-${slug}`)\n const themeKey = () => scoped(cfg.themeStorageKey ?? 'theme')\n const localAllowed = (arbiFailed: boolean) =>\n MODE === 'always' || (MODE === 'fallback' && arbiFailed)\n\n function unavailable(what: string, cause?: unknown): StudioPersistenceError {\n return new StudioPersistenceError(\n `${what}: no ARBI session or the ARBI request failed, and local storage is not enabled`,\n { cause }\n )\n }\n const THEME_FILE = cfg.themeFileName ?? 'theme.json'\n const pageFile = cfg.pageFileName ?? ((slug: string) => `${slug}.json`)\n const publishedFile = cfg.publishedFileName ?? ((slug: string) => `${slug}.published.json`)\n\n /** Should we even attempt the live backend? Demo sessions have no real store. */\n function canUseArbi(arbi: Arbi | null, live: boolean): arbi is Arbi {\n return live && !!arbi\n }\n\n /** Write JSON to the workspace as a named document; throws on failure. */\n async function uploadJson(arbi: Arbi, fileName: string, obj: unknown): Promise<void> {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const blob = new Blob([JSON.stringify(obj, null, 2)], { type: 'application/json' })\n await arbi.documents.uploadFile(blob, fileName, { folder: FOLDER })\n }\n\n /** Read + parse the most recent `site/<fileName>` document, or null if absent. */\n async function downloadJson<T>(arbi: Arbi, fileName: string): Promise<T | null> {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const docs = await arbi.documents.list()\n // Newest wins if the same name was uploaded more than once.\n const match = docs\n .filter((d) => (d.file_name ?? '').endsWith(fileName) && (d.folder ?? '').includes(FOLDER))\n .sort((a, b) => (a.created_at < b.created_at ? 1 : -1))[0]\n if (!match) return null\n\n // Prefer the raw bytes (round-trips JSON exactly); fall back to parsed content.\n try {\n const res = await arbi.documents.download(match.external_id)\n return JSON.parse(await res.text()) as T\n } catch {\n const parsed = await arbi.documents.getParsedContent(match.external_id, 'content')\n const raw = typeof parsed?.content === 'string' ? parsed.content : JSON.stringify(parsed)\n return JSON.parse(raw) as T\n }\n }\n\n function writeLocal(key: string, data: unknown): void {\n try {\n localStorage.setItem(key, JSON.stringify(data))\n } catch (e) {\n throw new StudioPersistenceError('Could not write to local storage', { cause: e })\n }\n }\n\n /** Persist a page-shaped artifact (authoring or published). */\n async function writePage(\n arbi: Arbi | null,\n live: boolean,\n kind: string,\n localKey: () => string,\n fileName: string,\n data: unknown\n ): Promise<PersistVia> {\n let failure: unknown\n if (canUseArbi(arbi, live)) {\n try {\n await uploadJson(arbi, fileName, data)\n if (localAllowed(false)) writeLocal(localKey(), data)\n return 'arbi'\n } catch (e) {\n if (e instanceof StudioPersistenceError) throw e\n failure = e\n }\n }\n if (!localAllowed(true)) throw unavailable(`Cannot save ${kind} \"${fileName}\"`, failure)\n writeLocal(localKey(), data)\n return 'local'\n }\n\n /** Load a page-shaped artifact from ARBI (and, only when opted in, localStorage). */\n async function readPage<T>(\n arbi: Arbi | null,\n live: boolean,\n localKey: () => string,\n fileName: string\n ): Promise<LoadResult<T>> {\n let arbiTried = false\n if (canUseArbi(arbi, live)) {\n arbiTried = true\n try {\n const data = await downloadJson<T>(arbi, fileName)\n if (data) return { data, via: 'arbi' }\n } catch (e) {\n if (MODE === 'off') throw unavailable(`Cannot load \"${fileName}\"`, e)\n }\n }\n if (MODE === 'off') {\n if (arbiTried) return { data: null, via: 'arbi' }\n throw unavailable(`Cannot load \"${fileName}\"`)\n }\n return readLocal<T>(localKey())\n }\n\n function readLocal<T>(key: string): LoadResult<T> {\n const raw = safeLocalGet(key)\n return { data: raw ? (JSON.parse(raw) as T) : null, via: 'local' }\n }\n\n /** Persist a page's authoring layout (image values stay `asset:` refs). */\n function savePage(arbi: Arbi | null, live: boolean, slug: string, data: unknown) {\n return writePage(arbi, live, 'page', () => pageKey(slug), pageFile(slug), data)\n }\n\n function loadPage<T>(arbi: Arbi | null, live: boolean, slug: string) {\n return readPage<T>(arbi, live, () => pageKey(slug), pageFile(slug))\n }\n\n /** Persist a page's published (materialized) layout, read by the public renderer. */\n function savePublished(arbi: Arbi | null, live: boolean, slug: string, data: unknown) {\n return writePage(\n arbi,\n live,\n 'published page',\n () => publishedKey(slug),\n publishedFile(slug),\n data\n )\n }\n\n function loadPublished<T>(arbi: Arbi | null, live: boolean, slug: string) {\n return readPage<T>(arbi, live, () => publishedKey(slug), publishedFile(slug))\n }\n\n /** Delete a slug's stored pages (authoring + published) from the backend and\n * the localStorage mirror, so the page resets to empty / a fresh seed governs. */\n async function deletePage(arbi: Arbi | null, live: boolean, slug: string): Promise<void> {\n if (MODE !== 'off') {\n try {\n localStorage.removeItem(pageKey(slug))\n localStorage.removeItem(publishedKey(slug))\n } catch (e) {\n if (e instanceof StudioPersistenceError) throw e\n /* storage may be unavailable */\n }\n }\n if (!canUseArbi(arbi, live)) return\n try {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const docs = await arbi.documents.list()\n const names = [pageFile(slug), publishedFile(slug)]\n const ids = docs\n .filter(\n (d) =>\n (d.folder ?? '').includes(FOLDER) && names.some((n) => (d.file_name ?? '').endsWith(n))\n )\n .map((d) => d.external_id)\n if (ids.length) await arbi.documents.delete(ids)\n } catch (e) {\n throw new StudioPersistenceError(`Could not delete the stored page \"${slug}\" from ARBI`, {\n cause: e,\n })\n }\n }\n\n /** Persist the theme token set. */\n async function saveTheme(arbi: Arbi | null, live: boolean, theme: unknown): Promise<PersistVia> {\n return writePage(arbi, live, 'theme', themeKey, THEME_FILE, theme)\n }\n\n /** Load the theme token set. */\n async function loadTheme<T>(arbi: Arbi | null, live: boolean): Promise<LoadResult<T>> {\n return readPage<T>(arbi, live, themeKey, THEME_FILE)\n }\n\n function safeLocalGet(key: string): string | null {\n try {\n return localStorage.getItem(key)\n } catch {\n return null\n }\n }\n\n return { savePage, loadPage, savePublished, loadPublished, deletePage, saveTheme, loadTheme }\n}\n","/**\n * \"Write with AI\" fields — custom Puck fields that render a text input/area plus\n * a control that drafts copy grounded in a host's marketing workspace documents\n * (via the AI kit's `useAiTask`).\n *\n * The generation is non-blocking: the button shows a spinner while streaming and\n * the field fills live as tokens arrive. \"AI proposes\" — the editor still edits\n * and publishes the copy themselves. Firm-agnostic: {@link createAiFields} closes\n * the workspace id, prompt voice and testid prefix over a config.\n */\nimport { useEffect, useRef, useState } from 'react'\nimport { Loader2, Sparkles } from 'lucide-react'\nimport type { CustomField } from '@measured/puck'\nimport { useAiTask, useWorkspaceDocs as useKitWorkspaceDocs } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { BuildPrompt } from './types'\n\nexport interface AiFieldsConfig {\n /** The marketing workspace the AI grounds on. */\n workspaceId: string\n /** Turns a field's kind/label/current text into an instruction. */\n buildPrompt: BuildPrompt\n /** Default prompt kind when a field does not specify one. */\n defaultKind?: string\n /** Testid namespace for the field + write button. */\n testIdPrefix?: string\n}\n\nexport interface AiFields {\n aiText: (label: string, placeholder?: string) => CustomField<string>\n aiTextarea: (label: string, placeholder?: string, kind?: string) => CustomField<string>\n}\n\ninterface AiTextFieldProps {\n value: string\n onChange: (v: string) => void\n name: string\n label: string\n multiline?: boolean\n placeholder?: string\n kind: string\n workspaceId: string\n buildPrompt: BuildPrompt\n testIdPrefix: string\n}\n\nfunction AiTextField({\n value,\n onChange,\n name,\n label,\n multiline,\n placeholder,\n kind,\n workspaceId,\n buildPrompt,\n testIdPrefix,\n}: AiTextFieldProps) {\n const { docIds } = useKitWorkspaceDocs(workspaceId)\n const task = useAiTask()\n const [active, setActive] = useState(false)\n const activeRef = useRef(false)\n\n // Stream tokens straight into the field while a generation is in flight.\n useEffect(() => {\n if (activeRef.current && task.text) onChange(task.text)\n }, [task.text, onChange])\n\n useEffect(() => {\n if (active && !task.isRunning) {\n activeRef.current = false\n setActive(false)\n }\n }, [active, task.isRunning])\n\n const write = async () => {\n if (task.isRunning) return\n activeRef.current = true\n setActive(true)\n await task.run(buildPrompt({ kind, label, current: value ?? '' }), docIds)\n }\n\n const inputTid = tid(`${testIdPrefix}-field`, name)\n\n return (\n <div className=\"al-ai-field\">\n {multiline ? (\n <textarea\n className=\"al-ai-field__input\"\n rows={5}\n value={value ?? ''}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n data-testid={inputTid}\n />\n ) : (\n <input\n className=\"al-ai-field__input\"\n value={value ?? ''}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n data-testid={inputTid}\n />\n )}\n <button\n type=\"button\"\n className=\"al-ai-field__btn\"\n onClick={() => void write()}\n disabled={task.isRunning}\n data-testid={tid(`${testIdPrefix}-ai-write`, name)}\n title=\"Draft this field with AI, grounded in the marketing workspace\"\n >\n {task.isRunning ? (\n <Loader2 className=\"size-3 animate-spin\" />\n ) : (\n <Sparkles className=\"size-3\" />\n )}\n {task.isRunning ? 'Writing…' : 'Write with AI'}\n </button>\n </div>\n )\n}\n\nexport function createAiFields(cfg: AiFieldsConfig): AiFields {\n const { workspaceId, buildPrompt } = cfg\n const defaultKind = cfg.defaultKind ?? 'copy'\n const testIdPrefix = cfg.testIdPrefix ?? 'studio'\n\n /** An AI-authorable single-line text field. */\n const aiText = (label: string, placeholder?: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <AiTextField\n value={value ?? ''}\n onChange={onChange}\n name={name}\n label={label}\n placeholder={placeholder}\n kind={defaultKind}\n workspaceId={workspaceId}\n buildPrompt={buildPrompt}\n testIdPrefix={testIdPrefix}\n />\n ),\n })\n\n /** An AI-authorable multi-line text field. */\n const aiTextarea = (\n label: string,\n placeholder?: string,\n kind: string = defaultKind\n ): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <AiTextField\n value={value ?? ''}\n onChange={onChange}\n name={name}\n label={label}\n placeholder={placeholder}\n kind={kind}\n workspaceId={workspaceId}\n buildPrompt={buildPrompt}\n testIdPrefix={testIdPrefix}\n multiline\n />\n ),\n })\n\n return { aiText, aiTextarea }\n}\n","/**\n * useImageGen — the typed capability hook behind image generation.\n *\n * Wraps the connected AI task with the `/image` slash-command contract so callers\n * never hand-assemble the command string or dig the generated document out of\n * the artifact stream. `/image <prompt>` runs the normal agent loop with the\n * image tool force-enabled (backend `create_image`); the produced PNG arrives\n * as an `ArtifactEvent` with `mode: 'image'` carrying the workspace document\n * ext_id — which is what gets stored as the asset reference.\n */\nimport { useCallback, useMemo } from 'react'\nimport type { AiTaskStatus, ArtifactEvent } from './ai'\nimport { useConnectedAiTask } from './ai'\n\n/** ext_id of the newest image artifact in a list, or null if there is none. */\nfunction latestImageDocId(artifacts: readonly ArtifactEvent[]): string | null {\n for (let i = artifacts.length - 1; i >= 0; i--) {\n if (artifacts[i].mode === 'image') return artifacts[i].doc_ext_id\n }\n return null\n}\n\nexport interface UseImageGen {\n /** ext_id of the most recently generated image document (null until one exists). */\n docExtId: string | null\n /** Underlying task status: 'idle' | 'running' | 'done' | 'error'. */\n status: AiTaskStatus\n /** Human-readable failure message, or null. */\n error: string | null\n /** True while a generation is in flight. */\n isGenerating: boolean\n /**\n * Generate an image from a prompt, optionally editing / drawing on one or\n * more reference images already in the workspace. Pass the reference images'\n * document ext_ids in `referenceDocIds` (omit or `[]` for plain text→image).\n * Resolves with the new image document's ext_id, or null when the prompt is\n * empty or no image was produced.\n */\n generate: (prompt: string, referenceDocIds?: string[]) => Promise<string | null>\n /** Clear the current result and error. */\n reset: () => void\n}\n\nexport function useImageGen(): UseImageGen {\n const task = useConnectedAiTask()\n const { run } = task\n\n const generate = useCallback(\n async (prompt: string, referenceDocIds: string[] = []): Promise<string | null> => {\n const trimmed = prompt.trim()\n if (!trimmed) return null\n // `/image` rides the agent pipeline; the backend resolves the active\n // workspace from the session. Reference images are *grounded* on the task\n // (second arg) — they land in the agent's document index (typed as images\n // via its Type column), so the create_image tool picks them up as\n // `input_image_doc_ids`. Empty → plain text→image.\n const result = await run(`/image ${trimmed}`, referenceDocIds)\n return latestImageDocId(result?.artifacts ?? [])\n },\n [run]\n )\n\n const docExtId = useMemo(() => latestImageDocId(task.artifacts), [task.artifacts])\n\n return {\n docExtId,\n status: task.status,\n error: task.error,\n isGenerating: task.isRunning,\n generate,\n reset: task.reset,\n }\n}\n","/**\n * The image field — a custom Puck field for choosing an image any of the ways an\n * author expects: pick an existing **workspace asset**, **upload** from the\n * computer, paste a **URL**, or **generate** one with AI. Upload and generate both\n * save a workspace document, so every image lands in the reusable asset library.\n *\n * The stored value is a workspace **asset ref** (`asset:<docId>`) for asset /\n * upload / generate, or a plain URL for the URL mode. The editor previews a ref\n * via its thumbnail (see {@link AssetResolverProvider}); at publish the ref is\n * inlined to a `data:` URI (see the studio publish step). Firm-agnostic:\n * {@link createImageField} closes the workspace id and testid prefix over a config.\n */\nimport { useMemo, useState, type ChangeEvent } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { Check, Crop, ImagePlus, Link2, Loader2, Sparkles, Upload } from 'lucide-react'\nimport type { CustomField } from '@measured/puck'\nimport {\n useArbi,\n useDocuments,\n useThumbnails,\n ImageCropModal,\n DEFAULT_ASPECT_OPTIONS,\n type CropResult,\n} from '@arbidocs/react'\nimport { asAssetRef, assetRefId, isAssetRef } from '../components/assetResolver'\nimport { useAssetImage } from '../components/assetImage'\nimport { BlockImage } from '../components/BlockImage'\nimport { useImageGen } from '../connection/useImageGen'\nimport { tid } from '../lib/testid'\nimport { formatCount } from '../lib/format'\n\n/** Force a JPEG extension on a crop-exported filename. */\nfunction toJpgName(name: string): string {\n return name.replace(/\\.[^.]+$/, '') + '.jpg'\n}\n\nexport interface ImageFieldConfig {\n /** The workspace uploads/generations are saved to, and assets are picked from. */\n workspaceId: string\n /** Folder for uploaded/authored assets. Default \"assets\". */\n folder?: string\n /** Testid namespace. Default \"studio\". */\n testIdPrefix?: string\n}\n\nexport interface ImageFieldFactory {\n imageField: (label: string) => CustomField<string>\n}\n\ntype Mode = 'asset' | 'upload' | 'url' | 'generate'\n\ninterface ControlProps {\n value: string\n onChange: (v: string) => void\n name: string\n workspaceId: string\n folder: string\n testIdPrefix: string\n}\n\nconst IMAGE_EXT = /\\.(png|jpe?g|webp|gif|avif|svg)$/i\n\nfunction ImageFieldControl({\n value,\n onChange,\n name,\n workspaceId,\n folder,\n testIdPrefix,\n}: ControlProps) {\n const [mode, setMode] = useState<Mode>('asset')\n const [url, setUrl] = useState('')\n const [prompt, setPrompt] = useState('')\n const [busy, setBusy] = useState(false)\n // Reference images (doc ext_ids) to edit / draw on when generating. Empty is a\n // plain text→image; one or more turns it into an edit / variation.\n const [refIds, setRefIds] = useState<string[]>([])\n // Crop workflow: the image being framed + the filename to save it under.\n const [cropSrc, setCropSrc] = useState<string | null>(null)\n const [cropName, setCropName] = useState('image.jpg')\n const arbi = useArbi()\n const gen = useImageGen()\n const queryClient = useQueryClient()\n\n // Resolved image for the current asset value — lets us reframe an already\n // uploaded OR generated image (both are asset refs). Empty id → undefined.\n const currentAssetImage = useAssetImage(isAssetRef(value) ? assetRefId(value) : '')\n\n const tp = (...q: (string | number)[]) => tid(`${testIdPrefix}-image`, name, ...q)\n\n // A freshly uploaded/generated asset must appear in the picker grid at once —\n // refresh the workspace document list (and its thumbnails) so it's selectable.\n const refreshAssets = () =>\n queryClient.invalidateQueries({ queryKey: ['arbi', 'documents', workspaceId] })\n\n // Workspace image documents, for the \"pick an existing asset\" grid.\n const { data: docs } = useDocuments(workspaceId)\n const imageDocs = useMemo(\n () =>\n (docs ?? []).filter(\n (d: { file_name?: string | null }) => d.file_name && IMAGE_EXT.test(d.file_name)\n ),\n [docs]\n )\n const imageIds = useMemo(\n () => imageDocs.map((d: { external_id: string }) => d.external_id),\n [imageDocs]\n )\n const { data: thumbs } = useThumbnails(imageIds)\n\n // Uploading and reframing both route through the crop modal, then save the\n // framed result as a workspace asset — one path, whatever the source.\n const onUpload = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n setCropName(toJpgName(file.name))\n setCropSrc(URL.createObjectURL(file))\n e.target.value = '' // allow re-picking the same file\n }\n\n const openReframe = () => {\n if (!currentAssetImage) return\n setCropName('reframe.jpg')\n setCropSrc(currentAssetImage)\n }\n\n const uploadBlobAsAsset = async (blob: Blob, name: string) => {\n setBusy(true)\n try {\n await arbi.selectWorkspace(workspaceId)\n const file = new File([blob], name, { type: blob.type })\n const res = await arbi.documents.uploadFile(file, name, { folder })\n const id = res.doc_ext_ids?.[0]\n if (id) {\n onChange(asAssetRef(id))\n void refreshAssets()\n }\n } finally {\n setBusy(false)\n }\n }\n\n const onCropComplete = async (result: CropResult) => {\n const src = cropSrc\n setCropSrc(null)\n await uploadBlobAsAsset(result.blob, cropName)\n if (src?.startsWith('blob:')) URL.revokeObjectURL(src)\n }\n\n // Toggle a workspace image doc in/out of the reference set.\n const toggleRef = (id: string) =>\n setRefIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]))\n\n const onGenerate = async () => {\n if (!prompt.trim() || gen.isGenerating) return\n const id = await gen.generate(prompt, refIds)\n if (id) {\n onChange(asAssetRef(id))\n setRefIds([]) // fresh slate for the next generation\n void refreshAssets()\n }\n }\n\n const MODES: { key: Mode; label: string; icon: typeof Upload }[] = [\n { key: 'asset', label: 'Assets', icon: ImagePlus },\n { key: 'upload', label: 'Upload', icon: Upload },\n { key: 'url', label: 'URL', icon: Link2 },\n { key: 'generate', label: 'Generate', icon: Sparkles },\n ]\n\n const inputClass =\n 'w-full rounded-md border border-border bg-card px-2.5 py-1.5 text-sm text-foreground outline-none focus:border-primary'\n const tabClass = (on: boolean) =>\n `inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium ${\n on ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'\n }`\n\n return (\n <div className=\"flex flex-col gap-2\" data-testid={tp()}>\n <div className=\"relative\">\n <BlockImage src={value} aspect=\"16:9\" rounded=\"md\" testId={tp('preview')} />\n {currentAssetImage ? (\n <button\n type=\"button\"\n onClick={openReframe}\n className=\"absolute right-1.5 top-1.5 inline-flex items-center gap-1 rounded-md bg-background/85 px-2 py-1 text-xs font-medium text-foreground shadow-sm backdrop-blur hover:bg-background\"\n data-testid={tp('reframe')}\n >\n <Crop className=\"size-3\" /> Crop\n </button>\n ) : null}\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {MODES.map((m) => (\n <button\n key={m.key}\n type=\"button\"\n className={tabClass(mode === m.key)}\n onClick={() => setMode(m.key)}\n data-testid={tp('mode', m.key)}\n >\n <m.icon className=\"size-3\" /> {m.label}\n </button>\n ))}\n </div>\n\n {mode === 'asset' && (\n <div className=\"grid max-h-48 grid-cols-3 gap-1.5 overflow-auto\" data-testid={tp('assets')}>\n {imageDocs.length === 0 && (\n <p className=\"col-span-3 py-3 text-center text-xs text-muted-foreground\">\n No image assets yet — upload or generate one.\n </p>\n )}\n {imageDocs.map((d: { external_id: string; file_name?: string | null }) => {\n const thumb = thumbs?.[d.external_id]\n const selected = value === asAssetRef(d.external_id)\n return (\n <button\n key={d.external_id}\n type=\"button\"\n onClick={() => onChange(asAssetRef(d.external_id))}\n className={`overflow-hidden rounded border ${selected ? 'border-primary ring-1 ring-primary' : 'border-border'}`}\n title={d.file_name ?? ''}\n data-testid={tp('asset', d.external_id)}\n >\n {thumb ? (\n <img\n src={thumb}\n alt={d.file_name ?? ''}\n className=\"aspect-square w-full bg-muted object-contain\"\n />\n ) : (\n <span className=\"flex aspect-square w-full items-center justify-center bg-muted text-muted-foreground\">\n <ImagePlus className=\"size-4\" />\n </span>\n )}\n </button>\n )\n })}\n </div>\n )}\n\n {mode === 'upload' && (\n <label className=\"inline-flex cursor-pointer items-center gap-2 rounded-md border border-border px-2.5 py-1.5 text-sm text-foreground\">\n {busy ? <Loader2 className=\"size-4 animate-spin\" /> : <Upload className=\"size-4\" />}\n {busy ? 'Uploading…' : 'Choose a file'}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n disabled={busy}\n onChange={(e) => void onUpload(e)}\n data-testid={tp('upload')}\n />\n </label>\n )}\n\n {mode === 'url' && (\n <div className=\"flex gap-1.5\">\n <input\n className={inputClass}\n placeholder=\"https://…\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n data-testid={tp('url')}\n />\n <button\n type=\"button\"\n className=\"rounded-md bg-primary px-2.5 py-1.5 text-sm font-medium text-primary-foreground disabled:opacity-50\"\n disabled={!url.trim()}\n onClick={() => onChange(url.trim())}\n data-testid={tp('url-apply')}\n >\n Use\n </button>\n </div>\n )}\n\n {mode === 'generate' && (\n <div className=\"flex flex-col gap-1.5\">\n {/* Reference images (optional): edit or draw on existing workspace\n images. Multi-select — the backend accepts one or more. */}\n {imageDocs.length > 0 && (\n <div className=\"flex flex-col gap-1\" data-testid={tp('refs')}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">\n Reference images{refIds.length > 0 ? ` (${refIds.length})` : ' (optional)'}\n </span>\n {isAssetRef(value) && (\n <button\n type=\"button\"\n className=\"text-xs font-medium text-primary hover:underline\"\n onClick={() => toggleRef(assetRefId(value))}\n data-testid={tp('vary-current')}\n >\n {refIds.includes(assetRefId(value)) ? 'Varying current' : 'Vary current image'}\n </button>\n )}\n </div>\n <div className=\"grid max-h-28 grid-cols-4 gap-1.5 overflow-auto\">\n {imageDocs.map((d: { external_id: string; file_name?: string | null }) => {\n const thumb = thumbs?.[d.external_id]\n const on = refIds.includes(d.external_id)\n return (\n <button\n key={d.external_id}\n type=\"button\"\n onClick={() => toggleRef(d.external_id)}\n aria-pressed={on}\n className={`relative overflow-hidden rounded border ${on ? 'border-primary ring-1 ring-primary' : 'border-border'}`}\n title={d.file_name ?? ''}\n data-testid={tp('ref', d.external_id)}\n >\n {thumb ? (\n <img\n src={thumb}\n alt={d.file_name ?? ''}\n className=\"aspect-square w-full bg-muted object-contain\"\n />\n ) : (\n <span className=\"flex aspect-square w-full items-center justify-center bg-muted text-muted-foreground\">\n <ImagePlus className=\"size-3.5\" />\n </span>\n )}\n {on && (\n <span className=\"absolute right-0.5 top-0.5 rounded-full bg-primary p-0.5 text-primary-foreground\">\n <Check className=\"size-2.5\" />\n </span>\n )}\n </button>\n )\n })}\n </div>\n </div>\n )}\n <textarea\n className={inputClass}\n rows={2}\n placeholder={refIds.length > 0 ? 'Describe the edit to apply…' : 'Describe the image…'}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n data-testid={tp('prompt')}\n />\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 self-start rounded-md bg-primary px-2.5 py-1.5 text-sm font-medium text-primary-foreground disabled:opacity-50\"\n disabled={!prompt.trim() || gen.isGenerating}\n onClick={() => void onGenerate()}\n data-testid={tp('generate')}\n >\n {gen.isGenerating ? (\n <Loader2 className=\"size-3.5 animate-spin\" />\n ) : (\n <Sparkles className=\"size-3.5\" />\n )}\n {gen.isGenerating\n ? 'Generating…'\n : refIds.length > 0\n ? `Generate from ${formatCount(refIds.length, { one: 'reference', other: 'references' })}`\n : 'Generate'}\n </button>\n {gen.error && (\n <span className=\"text-xs text-destructive\" role=\"alert\">\n {gen.error}\n </span>\n )}\n </div>\n )}\n\n {value && (\n <button\n type=\"button\"\n className=\"self-start text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => onChange('')}\n data-testid={tp('clear')}\n >\n Clear\n </button>\n )}\n\n <ImageCropModal\n open={!!cropSrc}\n image={cropSrc}\n title=\"Frame your image\"\n aspectOptions={DEFAULT_ASPECT_OPTIONS}\n cropShape=\"rect\"\n output={{ maxSize: 1600 }}\n onComplete={onCropComplete}\n onCancel={() => setCropSrc(null)}\n />\n </div>\n )\n}\n\n/** Build the image field, closing over the host's workspace + testid prefix. */\nexport function createImageField(cfg: ImageFieldConfig): ImageFieldFactory {\n const { workspaceId } = cfg\n const folder = cfg.folder ?? 'assets'\n const testIdPrefix = cfg.testIdPrefix ?? 'studio'\n\n const imageField = (label: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <ImageFieldControl\n value={value ?? ''}\n onChange={onChange}\n name={name}\n workspaceId={workspaceId}\n folder={folder}\n testIdPrefix={testIdPrefix}\n />\n ),\n })\n\n return { imageField }\n}\n","/**\n * Standard section shell — max-width, padding and an optional tone. Token-only so\n * it themes to whatever app consumes it; shared by blocks that echo a page's\n * section rhythm.\n *\n * The `ink` tone is a true **dark island**: it scopes a full inverted `--color-*`\n * context (background↔foreground swapped, card/muted/border derived), so any child\n * block that uses semantic tokens renders correctly on a dark surface. This lets a\n * single page mix genuinely light and dark sections.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport type SectionTone = 'default' | 'muted' | 'ink'\nexport type SectionPadding = 'none' | 'sm' | 'md' | 'lg'\nexport type SectionWidth = 'narrow' | 'default' | 'wide' | 'full'\n\nexport interface SectionProps {\n children: ReactNode\n tone?: SectionTone\n padding?: SectionPadding\n maxWidth?: SectionWidth\n /** Subtle grain/texture overlay in the current text colour (editorial surfaces). */\n texture?: boolean\n className?: string\n}\n\n/** A dependency-free micro-dot grain in `currentColor`, kept very faint. */\nconst TEXTURE_STYLE: CSSProperties = {\n backgroundImage: 'radial-gradient(currentColor 0.5px, transparent 0.5px)',\n backgroundSize: '4px 4px',\n opacity: 0.04,\n}\n\nconst PADDING: Record<SectionPadding, string> = {\n none: '',\n sm: 'py-8 lg:py-10',\n md: 'py-16 lg:py-20',\n lg: 'py-24 lg:py-28',\n}\n\nconst WIDTH: Record<SectionWidth, string> = {\n narrow: 'max-w-3xl',\n default: 'max-w-7xl',\n wide: 'max-w-[90rem]',\n full: 'max-w-none',\n}\n\n/** A scoped inverted token context — the \"dark island\". */\nconst INVERTED_VARS: CSSProperties = {\n ['--color-background' as string]: 'var(--color-foreground)',\n ['--color-foreground' as string]: 'var(--color-background)',\n ['--color-card' as string]: 'color-mix(in srgb, var(--color-foreground) 92%, #fff)',\n ['--color-muted' as string]: 'color-mix(in srgb, var(--color-foreground) 85%, #fff)',\n ['--color-muted-foreground' as string]:\n 'color-mix(in srgb, var(--color-background) 60%, transparent)',\n ['--color-border' as string]: 'color-mix(in srgb, var(--color-background) 18%, transparent)',\n ['--color-accent' as string]: 'color-mix(in srgb, var(--color-foreground) 80%, #fff)',\n}\n\nexport function Section({\n children,\n tone = 'default',\n padding = 'md',\n maxWidth = 'default',\n texture,\n className = '',\n}: SectionProps) {\n const inverted = tone === 'ink'\n const toneClass = inverted\n ? 'bg-background text-foreground'\n : tone === 'muted'\n ? 'border-y border-border bg-card/40'\n : ''\n return (\n <section className={cn('relative', toneClass)} style={inverted ? INVERTED_VARS : undefined}>\n {texture && (\n <div className=\"pointer-events-none absolute inset-0\" style={TEXTURE_STYLE} aria-hidden />\n )}\n <div\n className={cn(\n 'relative mx-auto px-5 lg:px-8',\n WIDTH[maxWidth],\n PADDING[padding],\n className\n )}\n >\n {children}\n </div>\n </section>\n )\n}\n","/**\n * Shared field helpers for the block registry. Every block config — the built-ins\n * in {@link createArbiBlocksConfig} and the website blocks in\n * {@link file://./websiteBlocks.tsx} — builds its Puck fields from this one kit so\n * the AI-or-plain copy fallback, the icon `select`, the tone/bool radios and the\n * stable render-time testid are declared once.\n */\nimport type { Field } from '@measured/puck'\nimport type { LucideIcon } from 'lucide-react'\nimport {\n Activity,\n AlertCircle,\n Award,\n BarChart3,\n Bell,\n Briefcase,\n Calendar,\n CheckCircle,\n Clock,\n Cloud,\n Code,\n Cpu,\n DollarSign,\n FileText,\n Folder,\n Gavel,\n Globe,\n Heart,\n Info,\n Layers,\n Lock,\n Mail,\n MapPin,\n MessageSquare,\n Phone,\n Rocket,\n Scale,\n Shield,\n Sparkles,\n Star,\n Target,\n TrendingUp,\n Users,\n Zap,\n} from 'lucide-react'\nimport { tid } from '../lib/testid'\nimport type { AiFields } from './aiFields'\n\n// ── Icon registry ─────────────────────────────────────────────────────────────\n// A curated set of common back-office + marketing icons exposed as a `select`. The\n// editor picks a name; {@link BlockKit.resolveIcon} maps it back to the component.\nexport const iconMap: Record<string, LucideIcon> = {\n FileText,\n Folder,\n Users,\n Briefcase,\n Calendar,\n Clock,\n CheckCircle,\n AlertCircle,\n Info,\n TrendingUp,\n DollarSign,\n BarChart3,\n Activity,\n Bell,\n Scale,\n Gavel,\n Sparkles,\n // Marketing set\n Zap,\n Shield,\n Rocket,\n Star,\n Heart,\n Globe,\n Lock,\n Mail,\n Phone,\n MapPin,\n Award,\n Target,\n Layers,\n Cloud,\n Code,\n Cpu,\n MessageSquare,\n}\n\nconst ICON_OPTIONS = [\n { label: 'None', value: '' },\n ...Object.keys(iconMap).map((name) => ({ label: name, value: name })),\n]\n\n/** The bundle of field helpers a block config needs. */\nexport interface BlockKit {\n /** Single-line copy: AI-authorable when a host supplies aiFields, else plain text. */\n textField: (label: string, placeholder?: string) => Field\n /** Multi-line copy: AI-authorable when a host supplies aiFields, else plain textarea. */\n textareaField: (label: string, placeholder?: string, kind?: string) => Field\n /** Image source: a workspace-asset picker when a host supplies imageField, else a URL input. */\n imageField: (label: string) => Field\n /** A Yes/No radio. */\n boolRadio: (label: string) => Field\n /** A `select` over {@link iconMap} names. */\n iconField: (label?: string) => Field\n /** Resolve an icon name to its Lucide component. */\n resolveIcon: (name?: string) => LucideIcon | undefined\n /** Stable, e2e-locatable testid derived from a block's Puck id. */\n blockTestId: (id: string) => string\n /**\n * Optional host override for the eyebrow style on heading-bearing blocks\n * (Hero, Section heading). Lets a consumer render a brand accent (e.g. a brass\n * eyebrow) without forking the blocks. Undefined → the default token classes.\n */\n eyebrowClassName?: string\n}\n\n/** Build the shared field helpers, closing over the host's optional AI + image fields. */\nexport function createBlockKit(\n ai?: AiFields,\n image?: (label: string) => Field,\n eyebrowClassName?: string\n): BlockKit {\n return {\n eyebrowClassName,\n textField: (label, placeholder) =>\n ai ? (ai.aiText(label, placeholder) as Field) : { type: 'text', label, placeholder },\n textareaField: (label, placeholder, kind) =>\n ai\n ? (ai.aiTextarea(label, placeholder, kind) as Field)\n : { type: 'textarea', label, placeholder },\n imageField: (label) => (image ? image(label) : { type: 'text', label }),\n boolRadio: (label) => ({\n type: 'radio',\n label,\n options: [\n { label: 'No', value: false },\n { label: 'Yes', value: true },\n ],\n }),\n iconField: (label = 'Icon') => ({ type: 'select', label, options: ICON_OPTIONS }),\n resolveIcon: (name) => (name ? iconMap[name] : undefined),\n blockTestId: (id) => tid('arbi-block', id),\n }\n}\n","/**\n * Website-building blocks for the shared registry — the marketing vocabulary a user\n * drags to design a full site: heroes, feature grids, stats, testimonials, CTAs,\n * FAQs, navigation, media and layout primitives.\n *\n * Every block is serializable-only (text/textarea/number/radio/select/array/object/\n * slot/custom-AI — no function/ReactNode props), token-clean (semantic tokens so D1\n * live-theming recolours it), routes copy through the shared AI-or-plain fields, has\n * a stable render-time `data-testid`, and ships sensible defaults so it looks good\n * the moment it is dropped.\n */\nimport type { ComponentType, ReactNode } from 'react'\nimport type { ComponentConfig, Field } from '@measured/puck'\nimport type { BlockKit } from './blockKit'\nimport { Hero } from '../components/Hero'\nimport { FeatureGrid } from '../components/FeatureGrid'\nimport { StatGroup } from '../components/StatGroup'\nimport { Testimonial } from '../components/Testimonial'\nimport { CTABanner } from '../components/CTABanner'\nimport { LogoCloud } from '../components/LogoCloud'\nimport { FAQ } from '../components/FAQ'\nimport { RichTextBlock } from '../components/RichTextBlock'\nimport { Callout } from '../components/Callout'\nimport { BlockImage } from '../components/BlockImage'\nimport { AvatarBlock } from '../components/AvatarBlock'\nimport { Navbar } from '../components/Navbar'\nimport { Footer } from '../components/Footer'\nimport { ListBlock } from '../components/ListBlock'\nimport { Columns } from '../components/Columns'\nimport { Spacer } from '../components/Spacer'\nimport { Container } from '../components/Container'\nimport { Timeline, type TimelineViewMode } from '../timeline'\n\n/** One editor row of the Timeline block's `items` array. */\ninterface TimelineEntryProps {\n label?: string\n description?: string\n start: string\n end?: string\n}\n\n// Puck injects a component for each slot at render; default to an empty array.\nconst emptySlot = [] as unknown as ReactNode\nconst renderSlot = (slot: unknown): ReactNode => {\n if (typeof slot !== 'function') return null\n const Slot = slot as ComponentType\n return <Slot />\n}\n\nconst toneField: Field = {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Muted', value: 'muted' },\n { label: 'Ink', value: 'ink' },\n ],\n}\n\n/** Build every website block, closing over the shared field {@link BlockKit}. */\nexport function createWebsiteBlocks(kit: BlockKit): Record<string, ComponentConfig> {\n const { textField, textareaField, imageField, boolRadio, iconField, resolveIcon, blockTestId } =\n kit\n\n const ctaField = (label: string): Field => ({\n type: 'object',\n label,\n objectFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n })\n\n // ── Layout ──────────────────────────────────────────────────────────────────\n const ColumnsBlock: ComponentConfig = {\n label: 'Columns',\n fields: {\n count: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: 2 },\n { label: '3', value: 3 },\n { label: '4', value: 4 },\n ],\n },\n gap: {\n type: 'radio',\n label: 'Gap',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n col1: { type: 'slot' },\n col2: { type: 'slot' },\n col3: { type: 'slot' },\n col4: { type: 'slot' },\n },\n defaultProps: {\n count: 3,\n gap: 'md',\n col1: emptySlot,\n col2: emptySlot,\n col3: emptySlot,\n col4: emptySlot,\n },\n render: ({ id, count, gap, col1, col2, col3, col4 }) => {\n const n = Number(count) || 3\n const columns = [col1, col2, col3, col4].slice(0, n).map(renderSlot)\n return <Columns count={n as 2 | 3 | 4} gap={gap} columns={columns} testId={blockTestId(id)} />\n },\n }\n\n const SpacerBlock: ComponentConfig = {\n label: 'Spacer',\n fields: {\n size: {\n type: 'radio',\n label: 'Size',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'XL', value: 'xl' },\n ],\n },\n },\n defaultProps: { size: 'md' },\n render: ({ id, size }) => <Spacer size={size} testId={blockTestId(id)} />,\n }\n\n const ContainerBlock: ComponentConfig = {\n label: 'Container',\n fields: {\n width: {\n type: 'radio',\n label: 'Width',\n options: [\n { label: 'Narrow', value: 'narrow' },\n { label: 'Default', value: 'default' },\n { label: 'Wide', value: 'wide' },\n { label: 'Full', value: 'full' },\n ],\n },\n padding: {\n type: 'radio',\n label: 'Padding',\n options: [\n { label: 'None', value: 'none' },\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n children: { type: 'slot' },\n },\n defaultProps: { width: 'default', padding: 'md', children: emptySlot },\n render: ({ id, width, padding, children }) => (\n <Container width={width} padding={padding} testId={blockTestId(id)}>\n {renderSlot(children)}\n </Container>\n ),\n }\n\n // ── Marketing ───────────────────────────────────────────────────────────────\n const HeroBlock: ComponentConfig = {\n label: 'Hero',\n fields: {\n eyebrow: textField('Eyebrow'),\n title: textField('Title'),\n emphasis: { type: 'text', label: 'Emphasised word' },\n subtitle: textareaField('Subtitle', undefined, 'lead'),\n primaryCta: ctaField('Primary CTA'),\n secondaryCta: ctaField('Secondary CTA'),\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n ],\n },\n tone: toneField,\n imageUrl: imageField('Side image'),\n backgroundImage: imageField('Background image'),\n overlay: boolRadio('Background overlay'),\n },\n defaultProps: {\n eyebrow: 'Introducing',\n title: 'Build a better website, faster.',\n emphasis: '',\n subtitle:\n 'A flexible platform that helps your team ship polished, on-brand pages without waiting on engineering.',\n primaryCta: { label: 'Get started', href: '#' },\n secondaryCta: { label: 'Learn more', href: '#' },\n align: 'left',\n tone: 'default',\n imageUrl: '',\n backgroundImage: '',\n overlay: true,\n },\n render: ({\n id,\n eyebrow,\n title,\n emphasis,\n subtitle,\n primaryCta,\n secondaryCta,\n align,\n tone,\n imageUrl,\n backgroundImage,\n overlay,\n }) => (\n <Hero\n eyebrow={eyebrow}\n title={title}\n emphasis={emphasis}\n subtitle={subtitle}\n primaryCta={primaryCta}\n secondaryCta={secondaryCta}\n align={align}\n tone={tone}\n imageUrl={imageUrl}\n backgroundImage={backgroundImage}\n overlay={overlay}\n eyebrowClassName={kit.eyebrowClassName}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const FeatureGridBlock: ComponentConfig = {\n label: 'Feature grid',\n fields: {\n columns: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: '2' },\n { label: '3', value: '3' },\n ],\n },\n items: {\n type: 'array',\n label: 'Features',\n arrayFields: {\n icon: iconField(),\n title: textField('Title'),\n description: textareaField('Description'),\n },\n defaultItemProps: {\n icon: 'Sparkles',\n title: 'Feature',\n description: 'Describe this feature.',\n },\n getItemSummary: (item: { title?: string }) => item?.title || 'Feature',\n },\n },\n defaultProps: {\n columns: '3',\n items: [\n {\n icon: 'Zap',\n title: 'Fast by default',\n description: 'Ship pages in minutes with sensible, on-brand defaults.',\n },\n {\n icon: 'Shield',\n title: 'Secure & reliable',\n description: 'Enterprise-grade security baked into every layer.',\n },\n {\n icon: 'Layers',\n title: 'Composable',\n description: 'Mix and match blocks to build any layout you need.',\n },\n ],\n },\n render: ({ id, columns, items }) => {\n const list = (items ?? []).map(\n (it: { icon?: string; title: string; description?: string }) => ({\n ...it,\n icon: resolveIcon(it.icon),\n })\n )\n return <FeatureGrid columns={columns} items={list} testId={blockTestId(id)} />\n },\n }\n\n const StatGroupBlock: ComponentConfig = {\n label: 'Stat group',\n fields: {\n items: {\n type: 'array',\n label: 'Stats',\n arrayFields: {\n value: textField('Value'),\n label: textField('Label'),\n },\n defaultItemProps: { value: '100%', label: 'Metric' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Stat',\n },\n },\n defaultProps: {\n items: [\n { value: '10k+', label: 'Active users' },\n { value: '99.9%', label: 'Uptime' },\n { value: '4.9/5', label: 'Customer rating' },\n { value: '24/7', label: 'Support' },\n ],\n },\n render: ({ id, items }) => <StatGroup items={items} testId={blockTestId(id)} />,\n }\n\n const TestimonialBlock: ComponentConfig = {\n label: 'Testimonial',\n fields: {\n quote: textareaField('Quote'),\n author: textField('Author'),\n role: textField('Role'),\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n defaultProps: {\n quote: 'This is the best tool our team has adopted in years. It just works.',\n author: 'Alex Morgan',\n role: 'Head of Product, Northwind',\n avatarUrl: '',\n },\n render: ({ id, quote, author, role, avatarUrl }) => (\n <Testimonial\n quote={quote}\n author={author}\n role={role}\n avatarUrl={avatarUrl}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const CTABannerBlock: ComponentConfig = {\n label: 'CTA banner',\n fields: {\n title: textField('Title'),\n subtitle: textareaField('Subtitle'),\n cta: ctaField('Button'),\n tone: toneField,\n backgroundImage: imageField('Background image'),\n overlay: boolRadio('Background overlay'),\n },\n defaultProps: {\n title: 'Ready to get started?',\n subtitle: 'Join thousands of teams already building with us.',\n cta: { label: 'Start free trial', href: '#' },\n tone: 'default',\n backgroundImage: '',\n overlay: true,\n },\n render: ({ id, title, subtitle, cta, tone, backgroundImage, overlay }) => (\n <CTABanner\n title={title}\n subtitle={subtitle}\n cta={cta}\n tone={tone}\n backgroundImage={backgroundImage}\n overlay={overlay}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const LogoCloudBlock: ComponentConfig = {\n label: 'Logo cloud',\n fields: {\n items: {\n type: 'array',\n label: 'Logos',\n arrayFields: { label: textField('Label') },\n defaultItemProps: { label: 'Brand' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Logo',\n },\n },\n defaultProps: {\n items: [\n { label: 'Northwind' },\n { label: 'Acme' },\n { label: 'Globex' },\n { label: 'Initech' },\n { label: 'Umbrella' },\n ],\n },\n render: ({ id, items }) => <LogoCloud items={items} testId={blockTestId(id)} />,\n }\n\n const FAQBlock: ComponentConfig = {\n label: 'FAQ',\n fields: {\n items: {\n type: 'array',\n label: 'Questions',\n arrayFields: {\n question: textField('Question'),\n answer: textareaField('Answer'),\n },\n defaultItemProps: { question: 'A question?', answer: 'The answer.' },\n getItemSummary: (item: { question?: string }) => item?.question || 'Question',\n },\n },\n defaultProps: {\n items: [\n {\n question: 'How does the free trial work?',\n answer: 'You get full access for 14 days, no credit card required.',\n },\n {\n question: 'Can I change plans later?',\n answer: 'Yes — upgrade or downgrade at any time from your dashboard.',\n },\n {\n question: 'Do you offer support?',\n answer: 'Every plan includes 24/7 support from our team.',\n },\n ],\n },\n render: ({ id, items }) => <FAQ items={items} testId={blockTestId(id)} />,\n }\n\n /** A dated chronology on a page — key dates, a project plan, a hearing timetable.\n *\n * Dates are typed as ISO text (`2026-03-01`, or a full timestamp) because that\n * is what a span needs and what every backend already returns. An item without\n * an end is an instant; give it one and it becomes a bar covering that stretch. */\n const TimelineBlockConfig: ComponentConfig = {\n label: 'Timeline',\n fields: {\n view: {\n type: 'radio',\n label: 'View',\n options: [\n { label: 'Reader chooses', value: 'both' },\n { label: 'Calendar', value: 'calendar' },\n { label: 'Gantt', value: 'gantt' },\n ],\n },\n height: { type: 'number', label: 'Height (px)', min: 200, max: 1200 },\n items: {\n type: 'array',\n label: 'Entries',\n arrayFields: {\n label: textField('Label'),\n description: textareaField('Description'),\n start: { type: 'text', label: 'Start (YYYY-MM-DD)' },\n end: { type: 'text', label: 'End (YYYY-MM-DD, optional)' },\n },\n defaultItemProps: { label: 'Milestone', description: '', start: '', end: '' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Entry',\n },\n },\n defaultProps: {\n view: 'both',\n height: 520,\n items: [\n {\n label: 'Kick-off',\n description: 'Project starts.',\n start: '2026-01-12',\n end: '',\n },\n {\n label: 'Build phase',\n description: 'Design and implementation.',\n start: '2026-01-19',\n end: '2026-03-13',\n },\n {\n label: 'Launch',\n description: 'Public release.',\n start: '2026-03-30',\n end: '',\n },\n ],\n },\n render: ({ id, view, height, items }) => (\n <div style={{ height: height ?? 520 }}>\n <Timeline\n items={(items ?? [])\n .filter((item: { start?: string }) => !!item?.start)\n .map((item: TimelineEntryProps, index: number) => ({\n id: `${id}-${index}`,\n label: item.label ?? '',\n start: item.start,\n end: item.end || undefined,\n description: item.description || undefined,\n }))}\n view={view === 'both' ? undefined : (view as TimelineViewMode)}\n testId={blockTestId(id)}\n />\n </div>\n ),\n }\n\n const RichTextBlockConfig: ComponentConfig = {\n label: 'Rich text',\n fields: {\n content: textareaField('Content', undefined, 'body'),\n },\n defaultProps: {\n content:\n '## About us\\n\\nWe build tools that help teams do their best work. Our platform combines **power** and _simplicity_ so you can focus on what matters.\\n\\n- Fast to learn\\n- Easy to scale\\n- Loved by teams',\n },\n render: ({ id, content }) => <RichTextBlock content={content} testId={blockTestId(id)} />,\n }\n\n const CalloutBlock: ComponentConfig = {\n label: 'Callout',\n fields: {\n variant: {\n type: 'radio',\n label: 'Variant',\n options: [\n { label: 'Info', value: 'info' },\n { label: 'Success', value: 'success' },\n { label: 'Warning', value: 'warning' },\n { label: 'Danger', value: 'danger' },\n ],\n },\n title: textField('Title'),\n body: textareaField('Body'),\n },\n defaultProps: {\n variant: 'info',\n title: 'Good to know',\n body: 'This is a helpful note that draws attention to important information.',\n },\n render: ({ id, variant, title, body }) => (\n <Callout variant={variant} title={title} body={body} testId={blockTestId(id)} />\n ),\n }\n\n // ── Media ───────────────────────────────────────────────────────────────────\n const ImageBlock: ComponentConfig = {\n label: 'Image',\n fields: {\n src: imageField('Image'),\n alt: textField('Alt text'),\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '16:9', value: '16:9' },\n { label: '4:3', value: '4:3' },\n { label: '1:1', value: '1:1' },\n { label: '21:9', value: '21:9' },\n ],\n },\n rounded: {\n type: 'radio',\n label: 'Rounded',\n options: [\n { label: 'None', value: 'none' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'Full', value: 'full' },\n ],\n },\n framed: boolRadio('Framed'),\n },\n defaultProps: { src: '', alt: 'Image', aspect: '16:9', rounded: 'lg', framed: false },\n render: ({ id, src, alt, aspect, rounded, framed }) => (\n <BlockImage\n src={src}\n alt={alt}\n aspect={aspect}\n rounded={rounded}\n framed={framed}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const AvatarBlockConfig: ComponentConfig = {\n label: 'Avatar',\n fields: {\n src: { type: 'text', label: 'Image URL' },\n name: textField('Name'),\n size: {\n type: 'radio',\n label: 'Size',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'XL', value: 'xl' },\n ],\n },\n },\n defaultProps: { src: '', name: 'Jane Doe', size: 'md' },\n render: ({ id, src, name, size }) => (\n <AvatarBlock src={src} name={name} size={size} testId={blockTestId(id)} />\n ),\n }\n\n // ── Navigation ──────────────────────────────────────────────────────────────\n const NavbarBlock: ComponentConfig = {\n label: 'Navbar',\n fields: {\n brand: textField('Brand'),\n links: {\n type: 'array',\n label: 'Links',\n arrayFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n defaultItemProps: { label: 'Link', href: '#' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Link',\n },\n cta: ctaField('CTA'),\n },\n defaultProps: {\n brand: 'Acme',\n links: [\n { label: 'Product', href: '#' },\n { label: 'Pricing', href: '#' },\n { label: 'About', href: '#' },\n { label: 'Contact', href: '#' },\n ],\n cta: { label: 'Sign up', href: '#' },\n },\n render: ({ id, brand, links, cta }) => (\n <Navbar brand={brand} links={links} cta={cta} testId={blockTestId(id)} />\n ),\n }\n\n const FooterBlock: ComponentConfig = {\n label: 'Footer',\n fields: {\n columns: {\n type: 'array',\n label: 'Columns',\n arrayFields: {\n heading: textField('Heading'),\n links: {\n type: 'array',\n label: 'Links',\n arrayFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n defaultItemProps: { label: 'Link', href: '#' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Link',\n },\n },\n defaultItemProps: { heading: 'Column', links: [{ label: 'Link', href: '#' }] },\n getItemSummary: (item: { heading?: string }) => item?.heading || 'Column',\n },\n copyright: { type: 'text', label: 'Copyright' },\n },\n defaultProps: {\n columns: [\n {\n heading: 'Product',\n links: [\n { label: 'Features', href: '#' },\n { label: 'Pricing', href: '#' },\n ],\n },\n {\n heading: 'Company',\n links: [\n { label: 'About', href: '#' },\n { label: 'Careers', href: '#' },\n ],\n },\n {\n heading: 'Resources',\n links: [\n { label: 'Blog', href: '#' },\n { label: 'Docs', href: '#' },\n ],\n },\n {\n heading: 'Legal',\n links: [\n { label: 'Privacy', href: '#' },\n { label: 'Terms', href: '#' },\n ],\n },\n ],\n copyright: '© 2026 Acme, Inc. All rights reserved.',\n },\n render: ({ id, columns, copyright }) => (\n <Footer columns={columns} copyright={copyright} testId={blockTestId(id)} />\n ),\n }\n\n // ── Content ─────────────────────────────────────────────────────────────────\n const ListBlockConfig: ComponentConfig = {\n label: 'List',\n fields: {\n ordered: boolRadio('Ordered'),\n items: {\n type: 'array',\n label: 'Items',\n arrayFields: { text: textField('Text') },\n defaultItemProps: { text: 'List item' },\n getItemSummary: (item: { text?: string }) => item?.text || 'Item',\n },\n },\n defaultProps: {\n ordered: false,\n items: [{ text: 'First item' }, { text: 'Second item' }, { text: 'Third item' }],\n },\n render: ({ id, ordered, items }) => (\n <ListBlock ordered={ordered} items={items} testId={blockTestId(id)} />\n ),\n }\n\n return {\n Columns: ColumnsBlock,\n Spacer: SpacerBlock,\n Container: ContainerBlock,\n Hero: HeroBlock,\n FeatureGrid: FeatureGridBlock,\n StatGroup: StatGroupBlock,\n Testimonial: TestimonialBlock,\n CTABanner: CTABannerBlock,\n LogoCloud: LogoCloudBlock,\n FAQ: FAQBlock,\n Timeline: TimelineBlockConfig,\n RichText: RichTextBlockConfig,\n Callout: CalloutBlock,\n Image: ImageBlock,\n Avatar: AvatarBlockConfig,\n Navbar: NavbarBlock,\n Footer: FooterBlock,\n List: ListBlockConfig,\n }\n}\n","/**\n * The extended site-building block set — the richer vocabulary a builder needs to\n * assemble arbitrary sites beyond the marketing basics: pricing, tabs, accordion,\n * gallery, video, contact form, banner, split media, team, steps and a\n * multi-testimonial grid.\n *\n * Same contract as {@link createWebsiteBlocks}: serializable-only props, semantic\n * tokens (themes with the host), a stable render-time `data-testid`, and sensible\n * defaults so each block looks right the moment it is dropped. Copy props route\n * through the shared {@link BlockKit} AI-or-plain fields.\n */\nimport type { ComponentConfig, Field } from '@measured/puck'\nimport type { BlockKit } from './blockKit'\nimport { PricingTable } from '../components/PricingTable'\nimport { Tabs } from '../components/Tabs'\nimport { Accordion } from '../components/Accordion'\nimport { Gallery } from '../components/Gallery'\nimport { VideoEmbed } from '../components/VideoEmbed'\nimport { ContactForm } from '../components/ContactForm'\nimport { Banner } from '../components/Banner'\nimport { MediaText } from '../components/MediaText'\nimport { TeamGrid } from '../components/TeamGrid'\nimport { Steps } from '../components/Steps'\nimport { TestimonialGrid } from '../components/TestimonialGrid'\n\n/** Split a newline-authored textarea into a trimmed, non-empty string list. */\nconst lines = (s: string | undefined): string[] =>\n (s ?? '')\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n\nexport function createSiteBlocks(kit: BlockKit): Record<string, ComponentConfig> {\n const { textField, textareaField, imageField, boolRadio, blockTestId } = kit\n\n const ctaField = (label: string): Field => ({\n type: 'object',\n label,\n objectFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n })\n\n const columnsField = (values: string[]): Field => ({\n type: 'radio',\n label: 'Columns',\n options: values.map((v) => ({ label: v, value: v })),\n })\n\n // ── Commerce ──────────────────────────────────────────────────────────────────\n const PricingBlock: ComponentConfig = {\n label: 'Pricing',\n fields: {\n plans: {\n type: 'array',\n label: 'Plans',\n getItemSummary: (item: { name?: string }) => item?.name || 'Plan',\n defaultItemProps: {\n name: 'Plan',\n price: '£0',\n period: 'mo',\n description: '',\n features: 'Feature one\\nFeature two',\n ctaLabel: 'Choose',\n ctaHref: '#',\n featured: false,\n },\n arrayFields: {\n name: textField('Name'),\n price: { type: 'text', label: 'Price' },\n period: { type: 'text', label: 'Period' },\n description: textareaField('Description'),\n features: { type: 'textarea', label: 'Features (one per line)' },\n ctaLabel: { type: 'text', label: 'Button label' },\n ctaHref: { type: 'text', label: 'Button link' },\n featured: boolRadio('Featured'),\n },\n },\n },\n defaultProps: {\n plans: [\n {\n name: 'Starter',\n price: '£0',\n period: 'mo',\n description: 'For getting started.',\n features: 'Up to 3 projects\\nCommunity support',\n ctaLabel: 'Get started',\n ctaHref: '#',\n featured: false,\n },\n {\n name: 'Pro',\n price: '£29',\n period: 'mo',\n description: 'For growing teams.',\n features: 'Unlimited projects\\nPriority support\\nAdvanced analytics',\n ctaLabel: 'Start free trial',\n ctaHref: '#',\n featured: true,\n },\n {\n name: 'Enterprise',\n price: 'Custom',\n period: '',\n description: 'For large organisations.',\n features: 'SSO & SAML\\nDedicated success manager\\nSLA',\n ctaLabel: 'Contact sales',\n ctaHref: '#',\n featured: false,\n },\n ],\n },\n render: ({ id, plans }) => (\n <PricingTable\n plans={(plans ?? []).map(\n (p: {\n name: string\n price: string\n period?: string\n description?: string\n features?: string\n ctaLabel?: string\n ctaHref?: string\n featured?: boolean\n }) => ({\n name: p.name,\n price: p.price,\n period: p.period,\n description: p.description,\n features: lines(p.features),\n cta: { label: p.ctaLabel, href: p.ctaHref },\n featured: p.featured,\n })\n )}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Interactive ───────────────────────────────────────────────────────────────\n const TabsBlock: ComponentConfig = {\n label: 'Tabs',\n fields: {\n items: {\n type: 'array',\n label: 'Tabs',\n getItemSummary: (item: { label?: string }) => item?.label || 'Tab',\n defaultItemProps: { label: 'Tab', content: 'Tab content.' },\n arrayFields: {\n label: textField('Label'),\n content: textareaField('Content'),\n },\n },\n },\n defaultProps: {\n items: [\n { label: 'Overview', content: 'A quick overview of this section.' },\n { label: 'Details', content: 'The finer details go here.' },\n { label: 'FAQ', content: 'Answers to common questions.' },\n ],\n },\n render: ({ id, items }) => <Tabs items={items} testId={blockTestId(id)} />,\n }\n\n const AccordionBlock: ComponentConfig = {\n label: 'Accordion',\n fields: {\n allowMultiple: boolRadio('Allow multiple open'),\n items: {\n type: 'array',\n label: 'Items',\n getItemSummary: (item: { title?: string }) => item?.title || 'Item',\n defaultItemProps: { title: 'Section', content: 'Section content.' },\n arrayFields: {\n title: textField('Title'),\n content: textareaField('Content'),\n },\n },\n },\n defaultProps: {\n allowMultiple: false,\n items: [\n { title: 'What is included?', content: 'Everything you need to get started.' },\n { title: 'How does billing work?', content: 'Monthly or annually, cancel anytime.' },\n ],\n },\n render: ({ id, allowMultiple, items }) => (\n <Accordion allowMultiple={allowMultiple} items={items} testId={blockTestId(id)} />\n ),\n }\n\n // ── Media ───────────────────────────────────────────────────────────────────\n const GalleryBlock: ComponentConfig = {\n label: 'Gallery',\n fields: {\n columns: columnsField(['2', '3', '4']),\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '1:1', value: '1:1' },\n { label: '4:3', value: '4:3' },\n { label: '16:9', value: '16:9' },\n ],\n },\n images: {\n type: 'array',\n label: 'Images',\n getItemSummary: (item: { alt?: string }) => item?.alt || 'Image',\n defaultItemProps: { src: '', alt: 'Image', caption: '' },\n arrayFields: {\n src: imageField('Image'),\n alt: { type: 'text', label: 'Alt text' },\n caption: { type: 'text', label: 'Caption' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n aspect: '1:1',\n images: [\n { src: '', alt: 'Image one', caption: '' },\n { src: '', alt: 'Image two', caption: '' },\n { src: '', alt: 'Image three', caption: '' },\n ],\n },\n render: ({ id, columns, aspect, images }) => (\n <Gallery columns={columns} aspect={aspect} images={images} testId={blockTestId(id)} />\n ),\n }\n\n const VideoBlock: ComponentConfig = {\n label: 'Video',\n fields: {\n url: { type: 'text', label: 'Video URL (YouTube/Vimeo/Loom or file)' },\n title: { type: 'text', label: 'Title' },\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '16:9', value: '16:9' },\n { label: '4:3', value: '4:3' },\n { label: '1:1', value: '1:1' },\n ],\n },\n rounded: boolRadio('Rounded'),\n },\n defaultProps: { url: '', title: '', aspect: '16:9', rounded: true },\n render: ({ id, url, title, aspect, rounded }) => (\n <VideoEmbed\n url={url}\n title={title}\n aspect={aspect}\n rounded={rounded}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Forms ───────────────────────────────────────────────────────────────────\n const ContactFormBlock: ComponentConfig = {\n label: 'Contact form',\n fields: {\n submitLabel: { type: 'text', label: 'Submit label' },\n action: { type: 'text', label: 'POST endpoint (optional)' },\n successMessage: textareaField('Success message'),\n fields: {\n type: 'array',\n label: 'Fields',\n getItemSummary: (item: { label?: string }) => item?.label || 'Field',\n defaultItemProps: { name: 'field', label: 'Field', type: 'text', required: false },\n arrayFields: {\n name: { type: 'text', label: 'Name attribute' },\n label: textField('Label'),\n type: {\n type: 'select',\n label: 'Type',\n options: [\n { label: 'Text', value: 'text' },\n { label: 'Email', value: 'email' },\n { label: 'Phone', value: 'tel' },\n { label: 'Multi-line', value: 'textarea' },\n ],\n },\n required: boolRadio('Required'),\n },\n },\n },\n defaultProps: {\n submitLabel: 'Send',\n action: '',\n successMessage: 'Thanks — we’ll be in touch shortly.',\n fields: [\n { name: 'name', label: 'Name', type: 'text', required: true },\n { name: 'email', label: 'Email', type: 'email', required: true },\n { name: 'message', label: 'Message', type: 'textarea', required: true },\n ],\n },\n render: ({ id, submitLabel, action, successMessage, fields }) => (\n <ContactForm\n submitLabel={submitLabel}\n action={action || undefined}\n successMessage={successMessage}\n fields={fields}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Marketing (extended) ──────────────────────────────────────────────────────\n const BannerBlock: ComponentConfig = {\n label: 'Banner',\n fields: {\n text: textField('Text'),\n cta: ctaField('CTA'),\n tone: {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Primary', value: 'primary' },\n { label: 'Muted', value: 'muted' },\n { label: 'Dark', value: 'ink' },\n ],\n },\n },\n defaultProps: {\n text: 'We just shipped something new.',\n cta: { label: 'Read more', href: '#' },\n tone: 'primary',\n },\n render: ({ id, text, cta, tone }) => (\n <Banner text={text} cta={cta} tone={tone} testId={blockTestId(id)} />\n ),\n }\n\n const MediaTextBlock: ComponentConfig = {\n label: 'Media & text',\n fields: {\n eyebrow: textField('Eyebrow'),\n title: textField('Title'),\n body: textareaField('Body', undefined, 'lead'),\n imageUrl: imageField('Image'),\n mediaSide: {\n type: 'radio',\n label: 'Media side',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Right', value: 'right' },\n ],\n },\n cta: ctaField('CTA'),\n },\n defaultProps: {\n eyebrow: '',\n title: 'A closer look at what we do.',\n body: 'Pair a compelling visual with the copy that explains it — the classic split section, on any theme.',\n imageUrl: '',\n mediaSide: 'left',\n cta: { label: 'Learn more', href: '#' },\n },\n render: ({ id, eyebrow, title, body, imageUrl, mediaSide, cta }) => (\n <MediaText\n eyebrow={eyebrow}\n title={title}\n body={body}\n imageUrl={imageUrl}\n mediaSide={mediaSide}\n cta={cta}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const TeamGridBlock: ComponentConfig = {\n label: 'Team',\n fields: {\n columns: columnsField(['2', '3', '4']),\n members: {\n type: 'array',\n label: 'Members',\n getItemSummary: (item: { name?: string }) => item?.name || 'Member',\n defaultItemProps: { name: 'New member', role: 'Role', bio: '', avatarUrl: '' },\n arrayFields: {\n name: textField('Name'),\n role: { type: 'text', label: 'Role' },\n bio: textareaField('Bio'),\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n members: [\n { name: 'Alex Morgan', role: 'Founder & CEO', bio: '', avatarUrl: '' },\n { name: 'Sam Rivera', role: 'Head of Product', bio: '', avatarUrl: '' },\n { name: 'Jordan Lee', role: 'Lead Engineer', bio: '', avatarUrl: '' },\n ],\n },\n render: ({ id, columns, members }) => (\n <TeamGrid columns={columns} members={members} testId={blockTestId(id)} />\n ),\n }\n\n const StepsBlock: ComponentConfig = {\n label: 'Steps',\n fields: {\n variant: {\n type: 'radio',\n label: 'Style',\n options: [\n { label: 'Numbered', value: 'numbered' },\n { label: 'Timeline', value: 'timeline' },\n ],\n },\n steps: {\n type: 'array',\n label: 'Steps',\n getItemSummary: (item: { title?: string }) => item?.title || 'Step',\n defaultItemProps: { title: 'Step', description: 'Describe this step.' },\n arrayFields: {\n title: textField('Title'),\n description: textareaField('Description'),\n },\n },\n },\n defaultProps: {\n variant: 'numbered',\n steps: [\n { title: 'Sign up', description: 'Create your account in seconds.' },\n { title: 'Configure', description: 'Set things up to match your workflow.' },\n { title: 'Launch', description: 'Go live and start seeing results.' },\n ],\n },\n render: ({ id, variant, steps }) => (\n <Steps variant={variant} steps={steps} testId={blockTestId(id)} />\n ),\n }\n\n const TestimonialGridBlock: ComponentConfig = {\n label: 'Testimonial grid',\n fields: {\n columns: columnsField(['2', '3']),\n items: {\n type: 'array',\n label: 'Testimonials',\n getItemSummary: (item: { author?: string }) => item?.author || 'Testimonial',\n defaultItemProps: { quote: 'A great quote.', author: 'Author', role: '', avatarUrl: '' },\n arrayFields: {\n quote: textareaField('Quote'),\n author: textField('Author'),\n role: { type: 'text', label: 'Role' },\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n items: [\n {\n quote: 'This changed how our whole team works.',\n author: 'Alex Morgan',\n role: 'CTO, Northwind',\n avatarUrl: '',\n },\n {\n quote: 'The best tool we adopted this year.',\n author: 'Sam Rivera',\n role: 'Ops Lead, Acme',\n avatarUrl: '',\n },\n {\n quote: 'Simple, fast, and it just works.',\n author: 'Jordan Lee',\n role: 'Founder, Globex',\n avatarUrl: '',\n },\n ],\n },\n render: ({ id, columns, items }) => (\n <TestimonialGrid columns={columns} items={items} testId={blockTestId(id)} />\n ),\n }\n\n return {\n Pricing: PricingBlock,\n Tabs: TabsBlock,\n Accordion: AccordionBlock,\n Gallery: GalleryBlock,\n Video: VideoBlock,\n ContactForm: ContactFormBlock,\n Banner: BannerBlock,\n MediaText: MediaTextBlock,\n Team: TeamGridBlock,\n Steps: StepsBlock,\n TestimonialGrid: TestimonialGridBlock,\n }\n}\n","/**\n * Shared Puck block registry for @arbidocs/blocks.\n *\n * {@link createArbiBlocksConfig} turns the package's shared components into a\n * single draggable builder palette (a Puck `Config`) so every consuming app gets\n * one shared block set instead of hand-rolling its own. It spans a full\n * website-building vocabulary: back-office data/content blocks plus marketing,\n * media, navigation and layout blocks (see {@link createWebsiteBlocks}).\n *\n * Cross-cutting rules baked in here:\n * - Copy props (\"title\", \"lead\", …) use the host's AI \"Write with AI\" fields when\n * `opts.aiFields` is provided, else fall back to Puck's built-in text/textarea —\n * so the config works with or without an AI-configured host.\n * - Icon props are a curated {@link iconMap} exposed as a `select`; the name is\n * resolved to a Lucide component at render.\n * - `className`/`testId` are never editor fields. A stable `data-testid` is derived\n * from each block's Puck id at render, so e2e locates by testid, never copy text.\n * - Container blocks (Section, Card, Columns, Container) expose children as Puck slots.\n */\nimport type { ReactNode } from 'react'\nimport type { ComponentConfig, Config, Field } from '@measured/puck'\nimport { Badge, Button, Card, Separator, cn } from '@arbidocs/react/ui'\nimport { SectionHeading } from '../components/SectionHeading'\nimport { PageHeader } from '../components/PageHeader'\nimport { EmptyState } from '../components/EmptyState'\nimport { MetricCard } from '../components/MetricCard'\nimport { DataTableBlock, type DataTableBlockColumn } from '../components/DataTableBlock'\nimport { Section } from './Section'\nimport { createBlockKit, iconMap } from './blockKit'\nimport { createWebsiteBlocks } from './websiteBlocks'\nimport { createSiteBlocks } from './siteBlocks'\nimport { createLiveWidgets } from './widgets'\nimport type { AiFields } from './aiFields'\n\nexport interface ArbiBlocksConfigOptions {\n /**\n * Firm AI fields from {@link createAiFields}. When present, every string copy\n * prop becomes an AI-authorable field; when absent, plain Puck text inputs.\n */\n aiFields?: AiFields\n /**\n * Firm image field from {@link createImageField}. When present, image props\n * become a workspace-asset picker (pick / upload / URL / generate); when absent,\n * a plain URL text input.\n */\n imageField?: (label: string) => Field\n /**\n * Page canvas overrides. The builder paints every page inside this root; a\n * consumer sets e.g. a dark editorial canvas without forking the package.\n * Defaults to `bg-background text-foreground font-sans` on a neutral wrapper.\n */\n root?: {\n /** Extra classes appended to (and able to override) the default canvas classes. */\n className?: string\n /** testid for the page root wrapper. Defaults to `arbi-blocks-page-root`. */\n testId?: string\n }\n /**\n * Firm override for the eyebrow style on heading-bearing blocks (Hero, Section\n * heading) — e.g. a brand accent like a brass eyebrow. Undefined → token default.\n */\n eyebrowClassName?: string\n /**\n * Register the live-widget blocks (a \"Widgets\" category) that read shared ARBI\n * hooks — Agent activity, Live metric. They render placeholders in the editor\n * and on the public site, resolving real data only inside an authenticated\n * in-app renderer (`PageRenderer liveData`). Opt-in so a pure marketing builder\n * doesn't surface back-office widgets.\n */\n liveWidgets?: boolean\n}\n\n// Re-exported so consumers keep importing the icon registry from here.\nexport { iconMap }\n\n// Puck injects a component for each `slot` field at render; its default value is\n// an empty array. Shared here so slot-bearing blocks default to an empty drop zone.\nconst emptySlot = [] as unknown as ReactNode\n\n// Responsive grid presets for the MetricRow KPI band (keyed by authored column count).\nconst METRIC_COLS: Record<string, string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n '4': 'sm:grid-cols-2 lg:grid-cols-4',\n}\nconst METRIC_GAP: Record<string, string> = { sm: 'gap-3', md: 'gap-4', lg: 'gap-6' }\n\n// ── Factory ───────────────────────────────────────────────────────────────────\nexport function createArbiBlocksConfig(opts: ArbiBlocksConfigOptions = {}): Config {\n const kit = createBlockKit(opts.aiFields, opts.imageField, opts.eyebrowClassName)\n const { textField, textareaField, boolRadio, iconField, resolveIcon, blockTestId } = kit\n\n // Each block is declared with explicit prop typing so render args stay checked.\n\n const SectionHeadingBlock: ComponentConfig = {\n label: 'Section heading',\n fields: {\n title: textField('Title'),\n eyebrow: textField('Eyebrow'),\n lead: textareaField('Lead', undefined, 'lead'),\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n ],\n },\n invert: boolRadio('Invert (on dark)'),\n },\n defaultProps: { title: 'Section title', align: 'left', invert: false },\n render: ({ id, title, eyebrow, lead, align, invert }) => (\n <div data-testid={blockTestId(id)}>\n <SectionHeading\n title={title}\n eyebrow={eyebrow}\n lead={lead}\n align={align}\n invert={invert}\n eyebrowClassName={kit.eyebrowClassName}\n />\n </div>\n ),\n }\n\n const PageHeaderBlock: ComponentConfig = {\n label: 'Page header',\n fields: {\n title: textField('Title'),\n eyebrow: textField('Eyebrow'),\n description: textareaField('Description', undefined, 'description'),\n // `actions` is a slot so the top band can host real buttons/badges authored\n // as blocks (drop a Button in), while the interactive body stays bespoke.\n actions: { type: 'slot', allow: ['Button', 'Badge'] },\n },\n defaultProps: { title: 'Page title', actions: emptySlot },\n render: ({ id, title, eyebrow, description, actions: Actions }) => (\n <PageHeader\n title={title}\n eyebrow={eyebrow}\n description={description}\n actions={<Actions className=\"flex items-center gap-2\" />}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const EmptyStateBlock: ComponentConfig = {\n label: 'Empty state',\n fields: {\n title: textField('Title'),\n description: textareaField('Description', undefined, 'description'),\n icon: iconField(),\n // `action` is a slot so an empty state can offer a real call-to-action button.\n action: { type: 'slot', allow: ['Button'] },\n },\n defaultProps: { title: 'Nothing here yet', action: emptySlot },\n render: ({ id, title, description, icon, action: Action }) => (\n <EmptyState\n title={title}\n description={description}\n icon={resolveIcon(icon)}\n action={<Action />}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const MetricCardBlock: ComponentConfig = {\n label: 'Metric card',\n fields: {\n label: { type: 'text', label: 'Label' },\n value: { type: 'text', label: 'Value' },\n hint: { type: 'text', label: 'Hint' },\n accent: {\n type: 'radio',\n label: 'Accent',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Primary', value: 'primary' },\n { label: 'Success', value: 'success' },\n { label: 'Muted', value: 'muted' },\n ],\n },\n delta: {\n type: 'object',\n label: 'Delta',\n objectFields: {\n value: { type: 'text', label: 'Value' },\n direction: {\n type: 'radio',\n label: 'Direction',\n options: [\n { label: 'Up', value: 'up' },\n { label: 'Down', value: 'down' },\n ],\n },\n good: boolRadio('Good'),\n },\n },\n icon: iconField(),\n },\n defaultProps: { label: 'Metric', value: '0', accent: 'default' },\n render: ({ id, label, value, hint, accent, delta, icon }) => (\n <MetricCard\n label={label}\n value={value}\n hint={hint}\n accent={accent}\n delta={delta}\n icon={resolveIcon(icon)}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // A KPI band: a responsive grid whose cells are MetricCard blocks, so the top\n // of a page (dashboard/module header) is authored as config while the live body\n // stays bespoke. Slot-based (not a self-contained array) so it reuses the\n // MetricCard block verbatim — every card keeps its delta/icon/accent options.\n const MetricRowBlock: ComponentConfig = {\n label: 'Metric row',\n fields: {\n columns: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: '2' },\n { label: '3', value: '3' },\n { label: '4', value: '4' },\n ],\n },\n gap: {\n type: 'radio',\n label: 'Gap',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n // Static KPI tiles and (when registered) live metric widgets both belong in a band.\n items: { type: 'slot', allow: ['MetricCard', 'LiveMetric'] },\n },\n defaultProps: { columns: '3', gap: 'md', items: emptySlot },\n render: ({ id, columns, gap, items: Items }) => (\n <div data-testid={blockTestId(id)}>\n <Items\n className={cn(\n 'grid grid-cols-1',\n METRIC_COLS[columns as string] ?? METRIC_COLS['3'],\n METRIC_GAP[gap as string] ?? METRIC_GAP.md\n )}\n />\n </div>\n ),\n }\n\n // Serializable table. `columns` is a flat schema (header/field/align). `rows` is a\n // Puck array of rows, each holding a nested array of string `cells` — genuinely\n // per-cell authorable and decoupled from column count (Puck objectFields are\n // static, so keying rows by an author-chosen `field` is impossible). Cells map to\n // columns by position at render, where they're rekeyed to the field-keyed records\n // {@link DataTableBlock} expects.\n const DataTableBlockConfig: ComponentConfig = {\n label: 'Data table',\n fields: {\n caption: textField('Caption'),\n columns: {\n type: 'array',\n label: 'Columns',\n arrayFields: {\n header: { type: 'text', label: 'Header' },\n field: { type: 'text', label: 'Field key' },\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Right', value: 'right' },\n { label: 'Center', value: 'center' },\n ],\n },\n },\n defaultItemProps: { header: 'Column', field: 'field', align: 'left' },\n getItemSummary: (item: DataTableBlockColumn) => item?.header || 'Column',\n },\n rows: {\n type: 'array',\n label: 'Rows',\n arrayFields: {\n cells: {\n type: 'array',\n label: 'Cells',\n arrayFields: {\n value: { type: 'text', label: 'Value' },\n },\n defaultItemProps: { value: '' },\n getItemSummary: (item: { value?: string }) => item?.value || 'Cell',\n },\n },\n defaultItemProps: { cells: [{ value: '' }, { value: '' }] },\n getItemSummary: (_item: unknown, i?: number) => `Row ${(i ?? 0) + 1}`,\n },\n emptyText: textField('Empty text'),\n },\n defaultProps: {\n columns: [\n { header: 'Item', field: 'item', align: 'left' },\n { header: 'Status', field: 'status', align: 'left' },\n ],\n rows: [\n { cells: [{ value: 'Acme v. Globex' }, { value: 'Active' }] },\n { cells: [{ value: 'Initech Merger' }, { value: 'Closed' }] },\n ],\n emptyText: 'No rows yet',\n },\n render: ({ id, columns, rows, caption, emptyText }) => {\n const cols = (columns ?? []) as DataTableBlockColumn[]\n const rawRows = (rows ?? []) as Array<{ cells?: Array<{ value?: string }> }>\n // Positional cells → field-keyed record, so DataTableBlock can look cells up by column field.\n const recordRows = rawRows.map((row) => {\n const record: Record<string, string> = {}\n cols.forEach((col, index) => {\n record[col.field || `col-${index}`] = row.cells?.[index]?.value ?? ''\n })\n return record\n })\n const normalisedCols = cols.map((col, index) => ({\n ...col,\n field: col.field || `col-${index}`,\n }))\n return (\n <DataTableBlock\n columns={normalisedCols}\n rows={recordRows}\n caption={caption}\n emptyText={emptyText}\n testId={blockTestId(id)}\n />\n )\n },\n }\n\n const SectionBlock: ComponentConfig = {\n label: 'Section',\n fields: {\n children: { type: 'slot' },\n tone: {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Muted', value: 'muted' },\n { label: 'Dark', value: 'ink' },\n ],\n },\n padding: {\n type: 'radio',\n label: 'Padding',\n options: [\n { label: 'None', value: 'none' },\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n maxWidth: {\n type: 'radio',\n label: 'Width',\n options: [\n { label: 'Narrow', value: 'narrow' },\n { label: 'Default', value: 'default' },\n { label: 'Wide', value: 'wide' },\n { label: 'Full', value: 'full' },\n ],\n },\n texture: boolRadio('Texture'),\n },\n defaultProps: {\n tone: 'default',\n padding: 'md',\n maxWidth: 'default',\n texture: false,\n children: [] as unknown as ReactNode,\n },\n render: ({ id, tone, padding, maxWidth, texture, children: Children }) => (\n <div data-testid={blockTestId(id)}>\n <Section tone={tone} padding={padding} maxWidth={maxWidth} texture={texture}>\n <Children />\n </Section>\n </div>\n ),\n }\n\n const CardBlock: ComponentConfig = {\n label: 'Card',\n fields: {\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Flat', value: 'flat' },\n { label: 'Outline', value: 'outline' },\n { label: 'Elevated', value: 'elevated' },\n ],\n },\n children: { type: 'slot' },\n },\n defaultProps: { variant: 'flat', children: [] as unknown as ReactNode },\n render: ({ id, variant, children: Children }) => (\n <Card variant={variant} className=\"p-5\" data-testid={blockTestId(id)}>\n <Children />\n </Card>\n ),\n }\n\n const ButtonBlock: ComponentConfig = {\n label: 'Button',\n fields: {\n children: { type: 'text', label: 'Label' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Accent', value: 'accent' },\n { label: 'Destructive', value: 'destructive' },\n { label: 'Outline', value: 'outline' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Ghost', value: 'ghost' },\n { label: 'Link', value: 'link' },\n ],\n },\n size: {\n type: 'select',\n label: 'Size',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Small', value: 'sm' },\n { label: 'Large', value: 'lg' },\n { label: 'Icon', value: 'icon' },\n ],\n },\n },\n defaultProps: { variant: 'default', size: 'default', children: 'Button' },\n render: ({ id, children, variant, size }) => (\n <Button variant={variant} size={size} data-testid={blockTestId(id)}>\n {children}\n </Button>\n ),\n }\n\n const BadgeBlock: ComponentConfig = {\n label: 'Badge',\n fields: {\n text: { type: 'text', label: 'Text' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Accent', value: 'accent' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Destructive', value: 'destructive' },\n { label: 'Outline', value: 'outline' },\n ],\n },\n },\n defaultProps: { text: 'Badge', variant: 'default' },\n render: ({ id, text, variant }) => (\n <Badge variant={variant} data-testid={blockTestId(id)}>\n {text}\n </Badge>\n ),\n }\n\n const SeparatorBlock: ComponentConfig = {\n label: 'Separator',\n fields: {},\n defaultProps: {},\n render: ({ id }) => <Separator data-testid={blockTestId(id)} />,\n }\n\n const website = createWebsiteBlocks(kit)\n const site = createSiteBlocks(kit)\n const widgets = opts.liveWidgets ? createLiveWidgets(kit) : {}\n\n const components = {\n SectionHeading: SectionHeadingBlock,\n PageHeader: PageHeaderBlock,\n EmptyState: EmptyStateBlock,\n MetricCard: MetricCardBlock,\n MetricRow: MetricRowBlock,\n DataTable: DataTableBlockConfig,\n Section: SectionBlock,\n Card: CardBlock,\n Button: ButtonBlock,\n Badge: BadgeBlock,\n Separator: SeparatorBlock,\n ...website,\n ...site,\n ...widgets,\n }\n\n const config: Config = {\n categories: {\n Layout: {\n title: 'Layout',\n components: ['Section', 'Container', 'Columns', 'Card', 'Spacer'],\n },\n Marketing: {\n title: 'Marketing',\n components: [\n 'Hero',\n 'FeatureGrid',\n 'StatGroup',\n 'Testimonial',\n 'TestimonialGrid',\n 'CTABanner',\n 'Banner',\n 'LogoCloud',\n 'FAQ',\n 'MediaText',\n 'Steps',\n 'Team',\n ],\n },\n Content: {\n title: 'Content',\n components: ['SectionHeading', 'PageHeader', 'EmptyState', 'RichText', 'Callout', 'List'],\n },\n Interactive: { title: 'Interactive', components: ['Tabs', 'Accordion'] },\n Media: { title: 'Media', components: ['Image', 'Avatar', 'Gallery', 'Video'] },\n Commerce: { title: 'Commerce', components: ['Pricing'] },\n Forms: { title: 'Forms', components: ['ContactForm'] },\n Navigation: { title: 'Navigation', components: ['Navbar', 'Footer'] },\n Data: { title: 'Data', components: ['MetricRow', 'MetricCard', 'DataTable', 'Timeline'] },\n ...(opts.liveWidgets\n ? { Widgets: { title: 'Widgets', components: ['AgentActivity', 'LiveMetric'] } }\n : {}),\n Primitives: { title: 'Primitives', components: ['Button', 'Badge', 'Separator'] },\n },\n components: components as Config['components'],\n root: {\n render: ({ children }: { children?: ReactNode }) => (\n <div\n className={cn('bg-background text-foreground font-sans', opts.root?.className)}\n data-testid={opts.root?.testId ?? 'arbi-blocks-page-root'}\n >\n {children}\n </div>\n ),\n },\n }\n\n return config\n}\n","/**\n * Module registry — a typed model of the back-office modules derived from a\n * host's canonical nav. We read the nav rather than re-declaring it so the\n * registry can never drift from the shipped nav (DRY). The builder\n * toggles/reorders these; the sidebar can consume the result via the module\n * store's `useEnabledNav()` without any nav data being duplicated here.\n */\nimport type { AppNavItem, AppNavSection } from '../../nav/types'\nimport type { BuilderModule, ModuleRegistry } from './types'\n\n/** Build a registry from a host's nav manifest. */\nexport function createModuleRegistry(appNav: AppNavSection[]): ModuleRegistry {\n /** Flattened, ordered registry built once from appNav. */\n const DEFAULT_MODULES: BuilderModule[] = appNav.flatMap((section, sIdx) =>\n section.items.map((item, iIdx) => ({\n id: item.id,\n label: item.label,\n section: section.heading,\n icon: item.icon,\n to: item.to,\n arbi: item.arbi ?? false,\n end: item.end ?? false,\n // Global order that preserves section grouping then in-section order.\n defaultOrder: sIdx * 100 + iIdx,\n }))\n )\n\n /** Section headings in their canonical order. */\n const SECTION_ORDER: string[] = appNav.map((s) => s.heading)\n\n /** Rebuild an AppNavItem from a registry entry (shape the sidebar consumes). */\n const toNavItem = (m: BuilderModule): AppNavItem => ({\n to: m.to,\n label: m.label,\n icon: m.icon,\n id: m.id,\n arbi: m.arbi || undefined,\n end: m.end || undefined,\n })\n\n return { DEFAULT_MODULES, SECTION_ORDER, toNavItem }\n}\n","/**\n * Module toggle/order store — pure config state (which modules the vertical\n * ships, and in what order), persisted to localStorage. Defaults are empty so\n * every existing module stays enabled in its canonical position — nothing in\n * the app breaks until an admin opts to change it.\n *\n * Firm-agnostic: {@link createModuleStore} closes the store + hooks over an\n * injected registry and storage key.\n */\nimport { useMemo } from 'react'\nimport { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport type { AppNavSection } from '../../nav/types'\nimport type { BuilderModule, ModuleRegistry, ResolvedModule } from './types'\n\ninterface ModuleOverride {\n enabled: boolean\n /** Effective order within the section. */\n order: number\n}\n\ninterface ModuleStore {\n /** Sparse overrides keyed by module id; absent → registry default. */\n overrides: Record<string, ModuleOverride>\n toggle: (id: string) => void\n /** Move a module up/down among its enabled+disabled section siblings. */\n move: (id: string, dir: 'up' | 'down') => void\n reset: () => void\n}\n\nexport interface ModuleStoreBundle {\n useModuleStore: UseBoundStore<StoreApi<ModuleStore>>\n useResolvedModules: () => { section: string; modules: ResolvedModule[] }[]\n useEnabledNav: () => AppNavSection[]\n}\n\nexport function createModuleStore({\n registry,\n storageKey,\n}: {\n registry: ModuleRegistry\n storageKey: string\n}): ModuleStoreBundle {\n const { DEFAULT_MODULES, SECTION_ORDER, toNavItem } = registry\n\n /** Effective enabled flag for a module given the current overrides. */\n function isEnabled(overrides: Record<string, ModuleOverride>, id: string): boolean {\n return overrides[id]?.enabled ?? true\n }\n\n const id = (m: BuilderModule) => m.id\n\n /** Effective order for a module (override wins, else its default position). */\n function orderOf(overrides: Record<string, ModuleOverride>, m: BuilderModule): number {\n return overrides[id(m)]?.order ?? m.defaultOrder\n }\n\n const useModuleStore = create<ModuleStore>()(\n persist(\n (set, get) => ({\n overrides: {},\n\n toggle: (moduleId) => {\n const m = DEFAULT_MODULES.find((x) => x.id === moduleId)\n if (!m) return\n const cur = get().overrides\n const prev = cur[moduleId] ?? { enabled: true, order: m.defaultOrder }\n set({\n overrides: { ...cur, [moduleId]: { ...prev, enabled: !isEnabled(cur, moduleId) } },\n })\n },\n\n move: (moduleId, dir) => {\n const cur = get().overrides\n const target = DEFAULT_MODULES.find((x) => x.id === moduleId)\n if (!target) return\n // Siblings in the same section, in current effective order.\n const siblings = DEFAULT_MODULES.filter((x) => x.section === target.section).sort(\n (a, b) => orderOf(cur, a) - orderOf(cur, b)\n )\n const idx = siblings.findIndex((x) => x.id === moduleId)\n const swapIdx = dir === 'up' ? idx - 1 : idx + 1\n if (swapIdx < 0 || swapIdx >= siblings.length) return\n const a = siblings[idx]\n const b = siblings[swapIdx]\n const next = { ...cur }\n // Persist both siblings' effective orders, swapped.\n next[a.id] = { enabled: isEnabled(cur, a.id), order: orderOf(cur, b) }\n next[b.id] = { enabled: isEnabled(cur, b.id), order: orderOf(cur, a) }\n set({ overrides: next })\n },\n\n reset: () => set({ overrides: {} }),\n }),\n { name: storageKey }\n )\n )\n\n /** The full registry resolved against overrides, grouped + sorted by section. */\n function useResolvedModules(): { section: string; modules: ResolvedModule[] }[] {\n const overrides = useModuleStore((s) => s.overrides)\n return useMemo(() => {\n return SECTION_ORDER.map((section) => ({\n section,\n modules: DEFAULT_MODULES.filter((m) => m.section === section)\n .map((m) => ({ ...m, enabled: isEnabled(overrides, m.id), order: orderOf(overrides, m) }))\n .sort((a, b) => a.order - b.order),\n }))\n }, [overrides])\n }\n\n /**\n * The filtered/ordered nav the sidebar COULD consume — same shape as `appNav`.\n * One-line integration in AppSidebar: `const nav = useEnabledNav()` then map\n * over `nav` instead of the imported `appNav`.\n */\n function useEnabledNav(): AppNavSection[] {\n const grouped = useResolvedModules()\n return useMemo(\n () =>\n grouped\n .map((g) => ({\n heading: g.section,\n items: g.modules.filter((m) => m.enabled).map(toNavItem),\n }))\n .filter((s) => s.items.length > 0),\n [grouped]\n )\n }\n\n return { useModuleStore, useResolvedModules, useEnabledNav }\n}\n","/**\n * Agent-selection store — which ARBI behaviour configurations and agents the\n * host marks \"active\" for this vertical. Pure selection state (the configs and\n * agents themselves come live from ARBI via React Query), persisted so the\n * choice seeds the exported vertical config.\n *\n * Firm-agnostic: {@link createAgentSelectionStore} parameterises the persist key.\n */\nimport { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nexport interface AgentSelectionStore {\n /** Configuration ext_ids marked active. */\n configIds: string[]\n /** Agent ext_ids marked active. */\n agentIds: string[]\n toggleConfig: (id: string) => void\n toggleAgent: (id: string) => void\n clear: () => void\n}\n\nconst toggle = (list: string[], id: string) =>\n list.includes(id) ? list.filter((x) => x !== id) : [...list, id]\n\nexport function createAgentSelectionStore({\n storageKey,\n}: {\n storageKey: string\n}): UseBoundStore<StoreApi<AgentSelectionStore>> {\n return create<AgentSelectionStore>()(\n persist(\n (set) => ({\n configIds: [],\n agentIds: [],\n toggleConfig: (id) => set((s) => ({ configIds: toggle(s.configIds, id) })),\n toggleAgent: (id) => set((s) => ({ agentIds: toggle(s.agentIds, id) })),\n clear: () => set({ configIds: [], agentIds: [] }),\n }),\n { name: storageKey }\n )\n )\n}\n","/**\n * Vertical-config export — combine the configured theme, enabled/ordered\n * modules and selected ARBI agent configs into one JSON document. This is the\n * seed a generator would consume to stamp out a new vertical app.\n *\n * Firm-agnostic: {@link createVerticalExport} closes over the theme/module/agent\n * stores and the module registry.\n */\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport type { ThemeState } from '../theme/store'\nimport type { ModuleRegistry } from './modules/types'\nimport type { ModuleStoreBundle } from './modules/store'\nimport type { AgentSelectionStore } from './agents/store'\nimport type { ExportedModule, VerticalConfig } from './types'\n\nexport interface VerticalExportConfig {\n vertical: { name: string; key: string }\n themeStore: UseBoundStore<StoreApi<ThemeState>>\n moduleStore: ModuleStoreBundle\n agentStore: UseBoundStore<StoreApi<AgentSelectionStore>>\n registry: ModuleRegistry\n}\n\nexport interface VerticalExport {\n buildVerticalConfig: () => VerticalConfig\n serialize: (cfg?: VerticalConfig) => string\n download: (cfg?: VerticalConfig) => void\n}\n\nexport function createVerticalExport(cfg: VerticalExportConfig): VerticalExport {\n const { vertical, themeStore, moduleStore, agentStore, registry } = cfg\n const { DEFAULT_MODULES, SECTION_ORDER } = registry\n\n /** Build the export payload from current store state (pure, side-effect free). */\n function buildVerticalConfig(): VerticalConfig {\n const { colors, fonts, radius } = themeStore.getState()\n const { overrides } = moduleStore.useModuleStore.getState()\n const { configIds, agentIds } = agentStore.getState()\n\n const modules: ExportedModule[] = DEFAULT_MODULES.map((m) => ({\n id: m.id,\n label: m.label,\n section: m.section,\n to: m.to,\n arbi: m.arbi,\n enabled: overrides[m.id]?.enabled ?? true,\n order: overrides[m.id]?.order ?? m.defaultOrder,\n })).sort(\n (a, b) =>\n SECTION_ORDER.indexOf(a.section) - SECTION_ORDER.indexOf(b.section) || a.order - b.order\n )\n\n return {\n version: 1,\n generatedAt: new Date().toISOString(),\n vertical,\n theme: { colors, fonts, radius },\n modules,\n agents: { configIds, agentIds },\n }\n }\n\n /** Serialise the export as pretty JSON. */\n function serialize(config: VerticalConfig = buildVerticalConfig()): string {\n return JSON.stringify(config, null, 2)\n }\n\n /** Trigger a browser download of the vertical config JSON. */\n function download(config: VerticalConfig = buildVerticalConfig()): void {\n const blob = new Blob([serialize(config)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${config.vertical.key}-vertical.json`\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n }\n\n return { buildVerticalConfig, serialize, download }\n}\n","/**\n * Module registry UI — enable/disable and reorder the vertical's modules.\n * Firm-agnostic: consumes an injected module-store bundle instead of a\n * singleton, so every host app drives its own registry through the same UI.\n */\nimport { ChevronUp, ChevronDown, RotateCcw, Sparkles } from 'lucide-react'\nimport { Card, CardContent, CardHeader, CardTitle, Button, Badge } from '@arbidocs/react/ui'\nimport { Switch } from '@arbidocs/react/ui'\nimport { tid } from '../lib/testid'\nimport type { ModuleStoreBundle } from './modules/store'\n\nexport interface ModuleManagerProps {\n store: ModuleStoreBundle\n testIdPrefix?: string\n}\n\nexport function ModuleManager({ store, testIdPrefix = 'builder' }: ModuleManagerProps) {\n const grouped = store.useResolvedModules()\n const toggle = store.useModuleStore((s) => s.toggle)\n const move = store.useModuleStore((s) => s.move)\n const reset = store.useModuleStore((s) => s.reset)\n\n const enabledCount = grouped.reduce((n, g) => n + g.modules.filter((m) => m.enabled).length, 0)\n const total = grouped.reduce((n, g) => n + g.modules.length, 0)\n\n return (\n <div className=\"space-y-5\" data-testid={`${testIdPrefix}-modules`}>\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testIdPrefix}-modules-count`}>\n {enabledCount} of {total} modules enabled\n </p>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={reset}\n data-testid={`${testIdPrefix}-modules-reset`}\n >\n <RotateCcw className=\"size-3.5\" /> Reset\n </Button>\n </div>\n\n {grouped.map((group) => (\n <Card\n key={group.section}\n variant=\"elevated\"\n className=\"rounded-lg\"\n data-testid={tid(`${testIdPrefix}-modules-section`, group.section)}\n >\n <CardHeader>\n <CardTitle className=\"text-base\">{group.section}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {group.modules.map((m, idx) => {\n const Icon = m.icon\n return (\n <div\n key={m.id}\n className=\"flex items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-module`, m.id)}\n >\n <div className=\"flex flex-col\">\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-6\"\n disabled={idx === 0}\n onClick={() => move(m.id, 'up')}\n aria-label={`Move ${m.label} up`}\n data-testid={tid(`${testIdPrefix}-module-up`, m.id)}\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-6\"\n disabled={idx === group.modules.length - 1}\n onClick={() => move(m.id, 'down')}\n aria-label={`Move ${m.label} down`}\n data-testid={tid(`${testIdPrefix}-module-down`, m.id)}\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </div>\n <Icon className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">{m.label}</p>\n <p className=\"truncate font-mono text-xs text-muted-foreground\">{m.to}</p>\n </div>\n {m.arbi && (\n <Badge variant=\"accent\" className=\"text-xs\">\n <Sparkles className=\"size-3\" /> ARBI\n </Badge>\n )}\n <Switch\n checked={m.enabled}\n onCheckedChange={() => toggle(m.id)}\n aria-label={`Enable ${m.label}`}\n data-testid={tid(`${testIdPrefix}-module-toggle`, m.id)}\n />\n </div>\n )\n })}\n </CardContent>\n </Card>\n ))}\n </div>\n )\n}\n","/**\n * Agent/behaviour surface — select which ARBI configs and agents are active for\n * the vertical. Firm-agnostic: consumes an injected agent-selection store; the\n * configs and agents themselves come live from ARBI via React Query.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport { useArbi, useAgents, useConfigs } from '@arbidocs/react'\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@arbidocs/react/ui'\nimport { Bot, BrainCircuit, Cpu } from 'lucide-react'\nimport { Checkbox } from '@arbidocs/react/ui'\nimport { tid } from '../lib/testid'\nimport type { AgentSelectionStore } from './agents/store'\n\ntype AgentStore = UseBoundStore<StoreApi<AgentSelectionStore>>\n\ntype BadgeVariant = 'default' | 'accent' | 'secondary'\n\n/** Colour the model tier so Premium/Wise read at a glance. */\nconst TIER_VARIANT: Record<string, BadgeVariant> = {\n Premium: 'default',\n Wise: 'accent',\n Fast: 'secondary',\n auto: 'secondary',\n}\n\n/**\n * The model tier lives inside a configuration's `Agents.AGENT_MODEL_NAME`\n * (auto|Fast|Wise|Premium) — NOT the list response — so we fetch the config\n * detail lazily. This is the tier, distinct from the assistant query `model`\n * field (which carries a configuration ext_id, not a tier).\n */\nfunction ConfigModelBadge({ configId, testIdPrefix }: { configId: string; testIdPrefix: string }) {\n const arbi = useArbi()\n const { data, isLoading, isError } = useQuery({\n queryKey: ['builder', 'config-model', configId],\n queryFn: async () => (await arbi.agentConfig.get(configId)).Agents.AGENT_MODEL_NAME,\n staleTime: 60_000,\n })\n const tier = isLoading ? '…' : isError || !data ? '—' : data\n return (\n <Badge\n variant={TIER_VARIANT[tier] ?? 'secondary'}\n data-testid={tid(`${testIdPrefix}-agents-config-tier`, configId)}\n >\n <Cpu className=\"size-3\" /> {tier}\n </Badge>\n )\n}\n\nexport interface AgentsPanelProps {\n store: AgentStore\n testIdPrefix?: string\n}\n\nexport function AgentsPanel({ store, testIdPrefix = 'builder' }: AgentsPanelProps) {\n const { data: configs, isLoading: configsLoading } = useConfigs()\n const { data: agents = [], isLoading: agentsLoading } = useAgents()\n const configIds = store((s) => s.configIds)\n const agentIds = store((s) => s.agentIds)\n const toggleConfig = store((s) => s.toggleConfig)\n const toggleAgent = store((s) => s.toggleAgent)\n\n const versions = configs?.versions ?? []\n\n return (\n <div className=\"space-y-6\" data-testid={`${testIdPrefix}-agents`}>\n {/* Behaviour configurations */}\n <Card\n variant=\"elevated\"\n className=\"rounded-lg\"\n data-testid={`${testIdPrefix}-agents-configs`}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <BrainCircuit className=\"size-4 text-primary\" /> Behaviour configurations\n <Badge variant=\"secondary\" className=\"ml-1\">\n {versions.length}\n </Badge>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {configsLoading && (\n <p className=\"text-sm text-muted-foreground\">Loading configurations…</p>\n )}\n {!configsLoading && versions.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n No configurations found on this workspace.\n </p>\n )}\n {versions.map((v) => (\n <label\n key={v.external_id}\n className=\"flex cursor-pointer items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-agents-config`, v.external_id)}\n >\n <Checkbox\n checked={configIds.includes(v.external_id)}\n onCheckedChange={() => toggleConfig(v.external_id)}\n data-testid={tid(`${testIdPrefix}-agents-config-toggle`, v.external_id)}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {v.title ?? 'Untitled behaviour'}\n </p>\n <p className=\"truncate font-mono text-xs text-muted-foreground\">{v.external_id}</p>\n </div>\n <ConfigModelBadge configId={v.external_id} testIdPrefix={testIdPrefix} />\n </label>\n ))}\n </CardContent>\n </Card>\n\n {/* Agents */}\n <Card variant=\"elevated\" className=\"rounded-lg\" data-testid={`${testIdPrefix}-agents-agents`}>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Bot className=\"size-4 text-primary\" /> Agents\n <Badge variant=\"secondary\" className=\"ml-1\">\n {agents.length}\n </Badge>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {agentsLoading && <p className=\"text-sm text-muted-foreground\">Loading agents…</p>}\n {!agentsLoading && agents.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No agents provisioned.</p>\n )}\n {agents.map((a) => (\n <label\n key={a.external_id}\n className=\"flex cursor-pointer items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-agents-agent`, a.external_id)}\n >\n <Checkbox\n checked={agentIds.includes(a.external_id)}\n onCheckedChange={() => toggleAgent(a.external_id)}\n data-testid={tid(`${testIdPrefix}-agents-agent-toggle`, a.external_id)}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {(a.given_name ?? 'Agent').replace(/-/g, ' ')}\n </p>\n <p className=\"truncate font-mono text-xs text-muted-foreground\">{a.external_id}</p>\n </div>\n </label>\n ))}\n </CardContent>\n </Card>\n </div>\n )\n}\n","/**\n * VerticalBuilder — the back-office surface that configures a host's vertical:\n * theme tokens, which modules ship (and in what order) and which ARBI\n * behaviours/agents are active. Not a page builder — it produces a\n * vertical-config seed.\n *\n * Firm-agnostic: the theme bundle, module/agent stores and exporter arrive as\n * props; the host supplies its own `header` (PageHeader + links + badges) so\n * app-specific routing stays in the app.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport { Download, Palette, LayoutGrid, Bot, FileJson } from 'lucide-react'\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport { Card, CardContent, CardHeader, CardTitle, Button } from '@arbidocs/react/ui'\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@arbidocs/react/ui'\nimport { ThemeEditor } from '../theme/ThemeEditor'\nimport type { ThemeBundle } from '../theme/store'\nimport { ModuleManager } from './ModuleManager'\nimport { AgentsPanel } from './AgentsPanel'\nimport type { ModuleStoreBundle } from './modules/store'\nimport type { AgentSelectionStore } from './agents/store'\nimport type { VerticalExport } from './export'\n\ntype AgentStore = UseBoundStore<StoreApi<AgentSelectionStore>>\n\nexport interface VerticalBuilderProps {\n themeBundle: ThemeBundle\n moduleStore: ModuleStoreBundle\n agentStore: AgentStore\n exporter: VerticalExport\n themePreview: { title: string; subtitle?: string }\n header?: ReactNode\n studioHref?: string\n testIdPrefix?: string\n}\n\n/** Export tab — a live JSON preview of the combined vertical config + download. */\nfunction ExportPanel({\n themeBundle,\n moduleStore,\n agentStore,\n exporter,\n testIdPrefix,\n}: {\n themeBundle: ThemeBundle\n moduleStore: ModuleStoreBundle\n agentStore: AgentStore\n exporter: VerticalExport\n testIdPrefix: string\n}) {\n // Subscribe to each store so the preview recomputes as the admin edits.\n const theme = themeBundle.useStore()\n const modules = moduleStore.useModuleStore()\n const agents = agentStore()\n const json = useMemo(() => exporter.serialize(), [theme, modules, agents, exporter])\n\n return (\n <Card variant=\"elevated\" className=\"rounded-xl\" data-testid={`${testIdPrefix}-export-panel`}>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between text-base\">\n <span className=\"flex items-center gap-2\">\n <FileJson className=\"size-4 text-primary\" /> Vertical config\n </span>\n <Button\n size=\"sm\"\n variant=\"accent\"\n onClick={() => exporter.download()}\n data-testid={`${testIdPrefix}-export`}\n >\n <Download className=\"size-4\" /> Download JSON\n </Button>\n </CardTitle>\n </CardHeader>\n <CardContent>\n <pre\n className=\"scrollbar-slim max-h-[520px] overflow-auto rounded-md bg-foreground p-4 font-mono text-xs leading-relaxed text-background\"\n data-testid={`${testIdPrefix}-export-preview`}\n >\n {json}\n </pre>\n </CardContent>\n </Card>\n )\n}\n\nexport function VerticalBuilder({\n themeBundle,\n moduleStore,\n agentStore,\n exporter,\n themePreview,\n header,\n testIdPrefix = 'builder',\n}: VerticalBuilderProps) {\n return (\n <div className=\"space-y-6\" data-testid={`page-${testIdPrefix}`}>\n {header}\n\n <Tabs defaultValue=\"theme\">\n <TabsList data-testid={`${testIdPrefix}-tabs`}>\n <TabsTrigger value=\"theme\" data-testid={`${testIdPrefix}-tab-theme`}>\n <Palette className=\"size-4\" /> Theme\n </TabsTrigger>\n <TabsTrigger value=\"modules\" data-testid={`${testIdPrefix}-tab-modules`}>\n <LayoutGrid className=\"size-4\" /> Modules\n </TabsTrigger>\n <TabsTrigger value=\"agents\" data-testid={`${testIdPrefix}-tab-agents`}>\n <Bot className=\"size-4\" /> Agents\n </TabsTrigger>\n <TabsTrigger value=\"export\" data-testid={`${testIdPrefix}-tab-export`}>\n <FileJson className=\"size-4\" /> Export\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"theme\">\n <ThemeEditor\n bundle={themeBundle}\n variant=\"panel\"\n testIdPrefix={`${testIdPrefix}-theme`}\n preview={themePreview}\n />\n </TabsContent>\n <TabsContent value=\"modules\">\n <ModuleManager store={moduleStore} testIdPrefix={testIdPrefix} />\n </TabsContent>\n <TabsContent value=\"agents\">\n <AgentsPanel store={agentStore} testIdPrefix={testIdPrefix} />\n </TabsContent>\n <TabsContent value=\"export\">\n <ExportPanel\n themeBundle={themeBundle}\n moduleStore={moduleStore}\n agentStore={agentStore}\n exporter={exporter}\n testIdPrefix={testIdPrefix}\n />\n </TabsContent>\n </Tabs>\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/studio/liveData.ts","../../src/studio/liveWidgetRuntime.tsx","../../src/studio/widgets.tsx","../../src/components/assetImage.tsx","../../src/studio/publish.ts","../../src/studio/StudioEditor.tsx","../../src/studio/PageRenderer.tsx","../../src/studio/persistence.ts","../../src/studio/aiFields.tsx","../../src/connection/useImageGen.ts","../../src/studio/imageFields.tsx","../../src/studio/Section.tsx","../../src/studio/blockKit.tsx","../../src/studio/websiteBlocks.tsx","../../src/studio/siteBlocks.tsx","../../src/studio/blocksConfig.tsx","../../src/builder/modules/registry.ts","../../src/builder/modules/store.ts","../../src/builder/agents/store.ts","../../src/builder/export.ts","../../src/builder/ModuleManager.tsx","../../src/builder/AgentsPanel.tsx","../../src/builder/VerticalBuilder.tsx"],"names":["jsx","useArbi","useEffect","persist","jsxs","useState","useKitWorkspaceDocs","useRef","Loader2","Sparkles","useCallback","useMemo","useDocuments","useThumbnails","name","FileText","Rocket","Tabs","emptySlot","cn","Card","id","a","b","create","toggle","Button","Badge","useQuery","Cpu","CardHeader","CardTitle","CardContent","Bot","Palette"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,IAAM,eAAA,GAAkB,cAAuB,KAAK,CAAA;AAGpD,SAAS,iBAAA,GAA6B;AAC3C,EAAA,OAAO,WAAW,eAAe,CAAA;AACnC;ACKO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA4B;AACtE,EAAA,2BAAQ,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EAAO,MAAO,QAAA,EAAS,CAAA;AAC1D;AAOO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,MAAM,IAAA,GAAO,QAAA;AAAA,EACb;AACF,CAAA,EAIG;AACD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qFAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,mGAAA,EACd,8BAAC,IAAA,EAAA,EAAK,SAAA,EAAU,UAAS,CAAA,EAC3B,CAAA;AAAA,6BACC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACrD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAO,QAAA,EAAA,sBAAA,EAAiB;AAAA,SAAA,EAC1C;AAAA;AAAA;AAAA,GACF;AAEJ;AAIA,SAAS,oBAAA,GAA2C;AAClD,EAAA,MAAM,EAAE,WAAA,EAAa,mBAAA,EAAoB,GAAI,aAAA,EAAc;AAC3D,EAAA,OAAO,eAAe,mBAAA,IAAuB,MAAA;AAC/C;AAGA,SAAS,QAAQ,GAAA,EAAiC;AAChD,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,EAAE,OAAA,EAAQ;AACnC,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,IAAQ,GAAI,CAAC,CAAA;AAC5D,EAAA,IAAI,CAAA,GAAI,IAAI,OAAO,UAAA;AACnB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC3B,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,CAAA,EAAG,CAAC,CAAA,KAAA,CAAA;AACvB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC3B,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,CAAA,EAAG,CAAC,CAAA,KAAA,CAAA;AACvB,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAC,CAAA,KAAA,CAAA;AAC9B;AAEA,IAAM,cAAA,GAAiB;AAAA,EACrB,SAAA,EAAW,EAAE,KAAA,EAAO,WAAA,EAAa,MAAM,QAAA,EAAS;AAAA,EAChD,aAAA,EAAe,EAAE,KAAA,EAAO,eAAA,EAAiB,MAAM,GAAA;AACjD,CAAA;AAGA,IAAM,cAAA,GAAiB,CAAC,CAAA,KACtB,CAAA,IAAK,iBAAkB,CAAA,GAAqB,WAAA;AAS9C,SAAS,iBAAA,CAAkB;AAAA,EACzB,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,OAAO,oBAAA,EAAqB;AAClC,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,iBAAiB,IAAI,CAAA;AACjD,EAAA,MAAM,IAAA,GAAO,CAAC,GAAK,IAAA,IAAQ,EAAsB,CAAA,CAC9C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,IAAI,IAAA,CAAK,CAAA,CAAE,UAAA,IAAc,CAAC,CAAA,GAAI,CAAC,IAAI,IAAA,CAAK,CAAA,CAAE,UAAA,IAAc,CAAC,CAAC,CAAA,CAC1E,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAEjB,EAAA,4BACG,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAW,SAAA,EAAU,gBAAA,EAAiB,eAAa,MAAA,EAC/D,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,WAAU,8BAAA,EAA+B,CAAA;AAAA,sBAC9C,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EAC9D,CAAA;AAAA,IACC,4BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,eAAa,CAAA,EAAG,MAAM,CAAA,QAAA,CAAA,EAAY,QAAA,EAAA,6BAAA,EAE/E,IACE,IAAA,CAAK,MAAA,KAAW,CAAA,mBAClB,GAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAgC,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,MAAA,CAAA,EAAU,QAAA,EAAA,uBAAA,EAE7E,CAAA,mBAEA,GAAA,CAAC,QAAG,SAAA,EAAU,WAAA,EAAY,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA,EAC7C,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,qBACZ,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,yCAAA;AAAA,QACV,aAAA,EAAa,CAAA,EAAG,MAAM,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA;AAAA,QAEhC,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kCAAA,EACd,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,cAAA,EAAA,EAAe,WAAU,yCAAA,EAA0C,CAAA;AAAA,4BACpE,GAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EACb,YAAE,KAAA,EAAO,IAAA,MAAU,iBAAA,EACtB;AAAA,WAAA,EACF,CAAA;AAAA,8BACC,MAAA,EAAA,EAAK,SAAA,EAAU,0CACb,QAAA,EAAA,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,EACvB;AAAA;AAAA,OAAA;AAAA,MAZK,EAAE,WAAA,IAAe;AAAA,KAczB,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,OAAO,oBAAA,EAAqB;AAClC,EAAA,MAAM,OAAO,YAAA,CAAa,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,KAAW,aAAa,CAAA;AACnE,EAAA,MAAM,SAAS,gBAAA,CAAiB,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,KAAW,iBAAiB,CAAA;AAC7E,EAAA,MAAM,KAAA,GAAQ,MAAA,KAAW,WAAA,GAAc,IAAA,GAAO,MAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA;AAC9D,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,CAAE,KAAA;AAAA,MACvC,KAAA,EAAO,KAAA,CAAM,SAAA,GAAY,QAAA,GAAM,OAAO,KAAK,CAAA;AAAA,MAC3C,MAAA;AAAA,MACA,IAAA,EAAM,cAAA,CAAe,MAAM,CAAA,CAAE,IAAA;AAAA,MAC7B;AAAA;AAAA,GACF;AAEJ;AAKO,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,OAAO,mBAAkB,mBACvB,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAc,OAAc,MAAA,EAAgB,CAAA,mBAE/D,GAAA,CAAC,iBAAA,EAAA,EAAkB,OAAO,MAAA,CAAO,KAAA,IAAS,gBAAgB,CAAA,EAAG,IAAA,EAAM,KAAK,MAAA,EAAgB,CAAA;AAE5F;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,GAAA,GAAM,eAAe,MAAM,CAAA;AACjC,EAAA,OAAO,iBAAA,qBACL,GAAA,CAAC,eAAA,EAAA,EAAgB,OAAc,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAgB,MAAA,EAAgB,CAAA,mBAE5E,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,OAAO,MAAA,CAAO,KAAA,IAAS,cAAA,CAAe,GAAG,EAAE,KAAK,CAAA;AAAA,MAChD,IAAA,EAAM,cAAA,CAAe,GAAG,CAAA,CAAE,IAAA;AAAA,MAC1B;AAAA;AAAA,GACF;AAEJ;ACpMO,SAAS,kBAAkB,GAAA,EAAgD;AAChF,EAAA,MAAM,EAAE,aAAY,GAAI,GAAA;AAExB,EAAA,MAAM,mBAAA,GAAuC;AAAA,IAC3C,KAAA,EAAO,uBAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA;AAAE,KACzD;AAAA,IACA,YAAA,EAAc,EAAE,KAAA,EAAO,uBAAA,EAAyB,OAAO,CAAA,EAAE;AAAA,IACzD,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,OAAO,KAAA,EAAM,qBAC1BA,GAAAA,CAAC,sBAAmB,KAAA,EAAc,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE7E;AAEA,EAAA,MAAM,gBAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,UACzC,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,eAAA;AAAgB;AACnD,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA;AAAU;AACvC;AACF,KACF;AAAA,IACA,cAAc,EAAE,KAAA,EAAO,IAAI,MAAA,EAAQ,WAAA,EAAa,QAAQ,SAAA,EAAU;AAAA,IAClE,QAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,MAAA,EAAO,qBACnCA,GAAAA,CAAC,mBAAgB,KAAA,EAAc,MAAA,EAAgB,QAAgB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE5F;AAEA,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,mBAAA;AAAA,IACf,UAAA,EAAY;AAAA,GACd;AACF;AC1CO,SAAS,cAAc,KAAA,EAAmC;AAC/D,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,KAAW,aAAA,CAAc,CAAC,KAAK,CAAC,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAE5B,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,QAAA,CAAS;AAAA,IACnC,QAAA,EAAU,CAAC,MAAA,EAAQ,aAAA,EAAe,KAAK,CAAA;AAAA,IACvC,SAAS,YAAY;AACnB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,KAAK,CAAA;AAC/C,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,OAAO,GAAA,CAAI,gBAAgB,IAAI,CAAA;AAAA,IACjC,CAAA;AAAA;AAAA,IAEA,OAAA,EAAS,CAAC,CAAC,KAAA,IAAS,UAAU,IAAA,IAAQ,CAAC,SAAS,IAAA,CAAK,YAAA;AAAA,IACrD,WAAW,EAAA,GAAK;AAAA,GACjB,CAAA;AAGD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,SAAA,EAAW,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO,KAAA,IAAS,SAAA;AAClB;AAMO,SAAS,WAAW,EAAE,KAAA,EAAO,GAAA,EAAK,SAAA,EAAW,QAAO,EAAqB;AAC9E,EAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,GAAA,IAAO,MAAA,EAAW,GAAA,EAAK,GAAA,IAAO,EAAA,EAAI,SAAA,EAAsB,aAAA,EAAa,MAAA,EAAQ,CAAA;AAChG;;;AC5BA,SAAS,cAAc,IAAA,EAA6B;AAClD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAgB,CAAA;AACrD,IAAA,MAAA,CAAO,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC1C,IAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;AAOO,SAAS,sBAAA,CACd,IAAA,EACA,IAAA,GAA2B,EAAC,EACT;AACnB,EAAA,OAAO,OAAO,KAAA,KAAkB;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,KAAK,CAAA;AAC/C,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,IAAI,KAAK,YAAA,EAAc,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,OAAO,IAAI,CAAA;AACjE,MAAA,OAAO,MAAM,cAAc,IAAI,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAGA,SAAS,gBAAA,CAAiB,MAAe,GAAA,EAAwB;AAC/D,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG,GAAA,CAAI,IAAI,IAAI,CAAA;AAClC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,EAAM,gBAAA,CAAiB,KAAA,EAAO,GAAG,CAAA;AACrD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,KAAA,MAAW,SAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG,gBAAA,CAAiB,OAAO,GAAG,CAAA;AAAA,EACtE;AACF;AAGA,SAAS,gBAAA,CAAoB,MAAS,YAAA,EAAsC;AAC1E,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAQ,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,EACpC;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,UAAU,gBAAA,CAAiB,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,gBAAA,CAAiB,KAAA,EAAO,YAAY,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAOA,eAAsB,mBAAA,CACpB,MACA,WAAA,EACe;AACf,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAC3B,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAE5B,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,CAAC,GAAG,IAAI,CAAA,CAAE,GAAA,CAAI,OAAO,GAAA,KAAQ;AAC3B,MAAA,MAAM,GAAA,GAAM,MAAM,WAAA,CAAY,UAAA,CAAW,GAAG,CAAC,CAAA;AAC7C,MAAA,IAAI,GAAA,EAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAAA,IACpC,CAAC;AAAA,GACH;AACA,EAAA,IAAI,YAAA,CAAa,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,OAAO,gBAAA,CAAiB,MAAM,YAAY,CAAA;AAC5C;AC5FA,IAAM,aAAa,EAAE,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAE;AA6BpC,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,MAAA;AAAA,EACZ,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,QAAA;AAAA,EACf,YAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAsB;AACpB,EAAA,MAAM,OAAOC,OAAAA,EAAQ;AACrB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,oBAAA,EAAqB;AACxC,EAAA,MAAM,WAAA,GAAc,OAAA;AAAA,IAClB,MAAM,sBAAA,CAAuB,IAAA,EAAM,EAAE,cAAc,CAAA;AAAA,IACnD,CAAC,MAAM,YAAY;AAAA,GACrB;AAEA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,CAAiB,eAAe,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,IAAQ,MAAM,CAAA;AAChF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAe,UAAU,CAAA;AACjD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AAChC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAA4B,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAG1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,OAAa,UAAU,CAAA;AAGtC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAA,CAAU,MAAM,WAAA,CAAY,QAAA,CAAe,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA;AAAA,MAChE,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAM,OAAA,GAAU,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,yBAAA;AACjD,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,MAAA,CAAO,SAAS,OAAO,CAAA;AACvB,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAM,OAAO,MAAA,IAAU,UAAA;AACvB,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,MAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACnB,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAMf,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,CAAA,CAAE,oBAAoB,CAAC,CAAA,KAAM,YAAY,UAAA,CAAW,IAAA,EAAM,MAAM,CAAC,CAAA;AACjE,IAAA,OAAO,MAAM;AACX,MAAA,OAAO,CAAA,CAAE,iBAAA;AAAA,IACX,CAAA;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,WAAW,CAAC,CAAA;AAIvC,EAAA,MAAMC,QAAAA,GAAU,WAAA;AAAA,IACd,OAAO,MAAA,KAAiB;AACtB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,MAAM,WAAA,CAAY,SAAS,IAAA,EAAM,IAAA,EAAM,MAAM,MAAM,CAAA;AACjE,QAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB,MAAA,EAAQ,WAAW,CAAA;AAC/D,QAAA,MAAM,WAAA,CAAY,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,MAAM,SAAS,CAAA;AAC3D,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,SAAS,CAAA,EAAG;AACV,QAAA,MAAA,CAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,2BAA2B,OAAO,CAAA;AAAA,MAC5E,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAa,aAAa,MAAM;AAAA,GACrD;AAIA,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAA,CAAU,MAAM,WAAA,CAAY,SAAA,CAAuB,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA;AAAA,MAClE,SAAS,CAAA,EAAG;AACV,QAAA,MAAA,CAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,4BAA4B,OAAO,CAAA;AAC3E,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAA,IAAa,CAAC,MAAA,EAAQ;AAC1B,MAAA,WAAA,CAAY,SAAS,QAAA,CAAS;AAAA,QAC5B,QAAQ,EAAE,GAAG,aAAa,MAAA,EAAQ,GAAG,OAAO,MAAA,EAAO;AAAA,QACnD,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,YAAA,CAAa,KAAA;AAAA,QACpC,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,YAAA,CAAa,MAAA;AAAA,QACtC,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA,gBAAA,CAAiB,WAAW,CAAA;AAAA,IAC9B,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAGf,EAAA,MAAM,eAAA,GAAkB,YAAY,YAAY;AAC9C,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,CAAS,QAAA,GAAW,QAAA,EAAS;AAC1D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,WAAA,CAAY,SAAA,CAAU,IAAA,EAAM,MAAM,QAAQ,CAAA;AAAA,IACzD,SAAS,CAAA,EAAG;AACV,MAAA,MAAA,CAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,4BAA4B,OAAO,CAAA;AAC3E,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,MAAM,WAAA,EAAa,WAAA,EAAa,MAAM,CAAC,CAAA;AAEjD,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,eAAY,aAAA,EAErC,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,kEAAA,EACf,QAAA,EAAA;AAAA,MAAA,QAAA,oBACCA,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,QAAA;AAAA,YACJ,SAAA,EAAU,wGAAA;AAAA,YACV,aAAA,EAAa,GAAG,YAAY,CAAA,KAAA,CAAA;AAAA,YAE5B,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,cAAE,GAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SACpC;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB;AAAA,OAAA,EACvC,CAAA;AAAA,sBAEFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAsD,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,sBACjFA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACvC,SAAA,EAAU,8DAAA;AAAA,UACV,aAAA,EAAa,GAAG,YAAY,CAAA,KAAA,CAAA;AAAA,UAE3B,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,GAAAA,CAAC,QAAA,EAAA,EAAoB,KAAA,EAAO,CAAA,CAAE,IAAA,EAC3B,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EADQ,CAAA,CAAE,IAEf,CACD;AAAA;AAAA,OACH;AAAA,sBAEAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,QAAA,GAAA,oBACCA,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+BAAA;AAAA,YACV,aAAA,EAAa,GAAG,YAAY,CAAA,SAAA,CAAA;AAAA,YAC7B,QAAA,EAAA;AAAA,cAAA,YAAA;AAAA,cACY;AAAA;AAAA;AAAA,SACb;AAAA,wBAEFA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM,YAAA,CAAa,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,YACrC,SAAA,EAAU,0JAAA;AAAA,YACV,aAAA,EAAa,GAAG,YAAY,CAAA,aAAA,CAAA;AAAA,YAE5B,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA,SAChC;AAAA,wBACAI,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,KAAKD,QAAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,YAC1C,QAAA,EAAU,MAAA,IAAU,OAAA,IAAW,SAAA,KAAc,IAAA;AAAA,YAC7C,SAAA,EAAU,wJAAA;AAAA,YACV,aAAA,EAAa,GAAG,YAAY,CAAA,QAAA,CAAA;AAAA,YAE3B,QAAA,EAAA;AAAA,cAAA,MAAA,mBAASH,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,oBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,cAClF,SAAS,kBAAA,GAAgB;AAAA;AAAA;AAAA;AAC5B,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,sCACCA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,SAAA,EAAU,sEAAA;AAAA,UACV,aAAA,EAAa,GAAG,YAAY,CAAA,WAAA,CAAA;AAAA,UAE3B,QAAA,EAAA;AAAA;AAAA,OACH,GACE,0BACFI,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,uEAAA;AAAA,UACV,aAAA,EAAa,GAAG,YAAY,CAAA,QAAA,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA,4BAAAJ,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,YAAE,iBAAA;AAAA,YAAW,IAAA;AAAA,YAAK;AAAA;AAAA;AAAA,0BAGlEA,GAAAA,CAAC,qBAAA,EAAA,EAAsB,MAAA,EAAQ,YAC7B,QAAA,kBAAAA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,MAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,MAAA,CAAO,OAAA,GAAU,CAAA;AAAA,UACnB,CAAA;AAAA,UACA,SAAA,EAAW,CAAC,CAAA,KAAM,KAAKG,SAAQ,CAAC;AAAA,SAAA;AAAA,QAN3B,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA;AAAA,SAQvB,CAAA,EAEJ,CAAA;AAAA,MAEC,6BACCH,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sCAAA;AAAA,UACV,aAAA,EAAa,GAAG,YAAY,CAAA,aAAA,CAAA;AAAA,UAE5B,QAAA,kBAAAA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,WAAA;AAAA,cACR,OAAA,EAAQ,QAAA;AAAA,cACR,YAAA,EAAc,GAAG,YAAY,CAAA,MAAA,CAAA;AAAA,cAC7B,MAAA,EAAQ;AAAA;AAAA;AACV;AAAA;AACF,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;ACvPO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,EAAM,QAAA;AAAA,EACN,UAAA;AAAA,EACA,YAAA,GAAe,QAAA;AAAA,EACf,QAAA,GAAW,KAAA;AAAA,EACX,WAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,EAAsB;AACpB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,IAAA,GAAO,QAAA,IAAY,MAAA,CAAO,IAAA,IAAQ,MAAA;AACxC,EAAA,MAAM,OAAOC,OAAAA,EAAQ;AAErB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,QAAAA,CAAsB,eAAe,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,QAAAA,CAAS,CAAC,WAAW,CAAA;AACnD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAAH,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,CAAC,WAAW,CAAA;AACvB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AAGF,QAAA,MAAM,KAAA,GAAQ,cACT,MAAM,WAAA,CAAY,UAAuB,IAAA,EAAM,IAAI,GAAG,IAAA,GACvD,KAAA,CAAA;AACJ,QAAA,IAAI,SAAA,EAAW;AAGf,QAAA,MAAM,OACJ,WAAA,IAAA,CACC,MAAM,WAAA,CAAY,aAAA,CAAoB,MAAM,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA,IAAA,CACzD,MAAM,WAAA,CAAY,QAAA,CAAe,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA;AACvD,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,cAAA;AAAA,YACE,KAAA,GACI,EAAE,GAAG,YAAA,EAAc,GAAG,KAAA,EAAO,MAAA,EAAQ,EAAE,GAAG,aAAa,MAAA,EAAQ,GAAG,KAAA,CAAM,MAAA,IAAS,GACjF;AAAA,WACN;AAAA,QACF;AACA,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,QAAA,CAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,yBAAyB,CAAA;AACnE,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,WAAA,EAAa,YAAA,EAAc,WAAA,EAAa,UAAU,CAAC,CAAA;AAEzE,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEF,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,6EAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,eAAA,CAAA;AAAA,QAC7B,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAU,mEAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,aAAA,CAAA;AAAA,QAE3B,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtC,IAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,uBAAA;AACnC,IAAA,MAAM,IAAA,GAAO,UAAA,EAAY,IAAA,IAAQ,CAAA,kBAAA,EAAgB,IAAI,CAAA,2BAAA,CAAA;AACrD,IAAA,uBACEI,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0CAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,aAAA,CAAA;AAAA,QAE5B,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAC3EA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA;AAAA,KAC1D;AAAA,EAEJ;AAEA,EAAA,MAAM,QAAA,mBAAWA,GAAAA,CAAC,MAAA,EAAA,EAAO,QAAgB,IAAA,EAAY,CAAA;AACrD,EAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAa,CAAA,KAAA,EAAQ,YAAY,CAAA,OAAA,CAAA,EACpC,QAAA,EAAA,QAAA,mBAAWA,GAAAA,CAAC,gBAAA,EAAA,EAAkB,QAAA,EAAA,QAAA,EAAS,IAAsB,QAAA,EAChE,CAAA;AAEJ;;;AC5HO,IAAM,sBAAA,GAAN,cAAqC,KAAA,CAAM;AAAA,EAChD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AAAA,EACd;AACF;AAkCO,SAAS,wBAAwB,GAAA,EAAiD;AACvF,EAAA,MAAM,eAAe,GAAA,CAAI,WAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,MAAA;AAC7B,EAAA,MAAM,IAAA,GAA+B,IAAI,gBAAA,IAAoB,KAAA;AAG7D,EAAA,SAAS,OAAO,IAAA,EAAsB;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,IAAe;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,sBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,GAAG,GAAA,CAAI,aAAa,CAAA,EAAG,KAAK,IAAI,IAAI,CAAA,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAiB,MAAA,CAAO,IAAI,CAAA;AAC7C,EAAA,MAAM,eAAe,CAAC,IAAA,KAAiB,MAAA,CAAO,CAAA,UAAA,EAAa,IAAI,CAAA,CAAE,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAAI,mBAAmB,OAAO,CAAA;AAC5D,EAAA,MAAM,eAAe,CAAC,UAAA,KACpB,IAAA,KAAS,QAAA,IAAa,SAAS,UAAA,IAAc,UAAA;AAE/C,EAAA,SAAS,WAAA,CAAY,MAAc,KAAA,EAAyC;AAC1E,IAAA,OAAO,IAAI,sBAAA;AAAA,MACT,GAAG,IAAI,CAAA,8EAAA,CAAA;AAAA,MACP,EAAE,KAAA;AAAM,KACV;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,aAAA,IAAiB,YAAA;AACxC,EAAA,MAAM,WAAW,GAAA,CAAI,YAAA,KAAiB,CAAC,IAAA,KAAiB,GAAG,IAAI,CAAA,KAAA,CAAA,CAAA;AAC/D,EAAA,MAAM,gBAAgB,GAAA,CAAI,iBAAA,KAAsB,CAAC,IAAA,KAAiB,GAAG,IAAI,CAAA,eAAA,CAAA,CAAA;AAGzE,EAAA,SAAS,UAAA,CAAW,MAAmB,IAAA,EAA6B;AAClE,IAAA,OAAO,IAAA,IAAQ,CAAC,CAAC,IAAA;AAAA,EACnB;AAGA,EAAA,eAAe,UAAA,CAAW,IAAA,EAAY,QAAA,EAAkB,GAAA,EAA6B;AACnF,IAAA,MAAM,IAAA,CAAK,gBAAgB,YAAY,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,CAAC,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,oBAAoB,CAAA;AAClF,IAAA,MAAM,IAAA,CAAK,UAAU,UAAA,CAAW,IAAA,EAAM,UAAU,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACpE;AAGA,EAAA,eAAe,YAAA,CAAgB,MAAY,QAAA,EAAqC;AAC9E,IAAA,MAAM,IAAA,CAAK,gBAAgB,YAAY,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK;AAEvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,SAAA,IAAa,EAAA,EAAI,QAAA,CAAS,QAAQ,CAAA,IAAA,CAAM,CAAA,CAAE,MAAA,IAAU,EAAA,EAAI,QAAA,CAAS,MAAM,CAAC,CAAA,CACzF,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAA,GAAa,CAAA,GAAI,EAAG,EAAE,CAAC,CAAA;AAC3D,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAGnB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,MAAM,WAAW,CAAA;AAC3D,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,GAAA,CAAI,MAAM,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,UAAU,gBAAA,CAAiB,KAAA,CAAM,aAAa,SAAS,CAAA;AACjF,MAAA,MAAM,GAAA,GAAM,OAAO,MAAA,EAAQ,OAAA,KAAY,WAAW,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACxF,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,SAAS,UAAA,CAAW,KAAa,IAAA,EAAqB;AACpD,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAChD,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,IAAI,sBAAA,CAAuB,kCAAA,EAAoC,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,IACnF;AAAA,EACF;AAGA,EAAA,eAAe,UACb,IAAA,EACA,IAAA,EACA,IAAA,EACA,QAAA,EACA,UACA,IAAA,EACqB;AACrB,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA,EAAG;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,CAAW,IAAA,EAAM,QAAA,EAAU,IAAI,CAAA;AACrC,QAAA,IAAI,aAAa,KAAK,CAAA,EAAG,UAAA,CAAW,QAAA,IAAY,IAAI,CAAA;AACpD,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAA,YAAa,wBAAwB,MAAM,CAAA;AAC/C,QAAA,OAAA,GAAU,CAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,IAAI,CAAC,YAAA,CAAa,IAAI,CAAA,EAAG,MAAM,WAAA,CAAY,CAAA,YAAA,EAAe,IAAI,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AACvF,IAAA,UAAA,CAAW,QAAA,IAAY,IAAI,CAAA;AAC3B,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,eAAe,QAAA,CACb,IAAA,EACA,IAAA,EACA,QAAA,EACA,QAAA,EACwB;AACxB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA,EAAG;AAC1B,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAgB,IAAA,EAAM,QAAQ,CAAA;AACjD,QAAA,IAAI,IAAA,EAAM,OAAO,EAAE,IAAA,EAAM,KAAK,MAAA,EAAO;AAAA,MACvC,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,SAAS,KAAA,EAAO,MAAM,YAAY,CAAA,aAAA,EAAgB,QAAQ,KAAK,CAAC,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAI,WAAW,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAK,MAAA,EAAO;AAChD,MAAA,MAAM,WAAA,CAAY,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,SAAA,CAAa,UAAU,CAAA;AAAA,EAChC;AAEA,EAAA,SAAS,UAAa,GAAA,EAA4B;AAChD,IAAA,MAAM,GAAA,GAAM,aAAa,GAAG,CAAA;AAC5B,IAAA,OAAO,EAAE,MAAM,GAAA,GAAO,IAAA,CAAK,MAAM,GAAG,CAAA,GAAU,IAAA,EAAM,GAAA,EAAK,OAAA,EAAQ;AAAA,EACnE;AAGA,EAAA,SAAS,QAAA,CAAS,IAAA,EAAmB,IAAA,EAAe,IAAA,EAAc,IAAA,EAAe;AAC/E,IAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA,EAChF;AAEA,EAAA,SAAS,QAAA,CAAY,IAAA,EAAmB,IAAA,EAAe,IAAA,EAAc;AACnE,IAAA,OAAO,QAAA,CAAY,MAAM,IAAA,EAAM,MAAM,QAAQ,IAAI,CAAA,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,EACpE;AAGA,EAAA,SAAS,aAAA,CAAc,IAAA,EAAmB,IAAA,EAAe,IAAA,EAAc,IAAA,EAAe;AACpF,IAAA,OAAO,SAAA;AAAA,MACL,IAAA;AAAA,MACA,IAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAM,aAAa,IAAI,CAAA;AAAA,MACvB,cAAc,IAAI,CAAA;AAAA,MAClB;AAAA,KACF;AAAA,EACF;AAEA,EAAA,SAAS,aAAA,CAAiB,IAAA,EAAmB,IAAA,EAAe,IAAA,EAAc;AACxE,IAAA,OAAO,QAAA,CAAY,MAAM,IAAA,EAAM,MAAM,aAAa,IAAI,CAAA,EAAG,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,EAC9E;AAIA,EAAA,eAAe,UAAA,CAAW,IAAA,EAAmB,IAAA,EAAe,IAAA,EAA6B;AACvF,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAC,CAAA;AACrC,QAAA,YAAA,CAAa,UAAA,CAAW,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,MAC5C,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAA,YAAa,wBAAwB,MAAM,CAAA;AAAA,MAEjD;AAAA,IACF;AACA,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA,EAAG;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,gBAAgB,YAAY,CAAA;AACvC,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK;AACvC,MAAA,MAAM,QAAQ,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG,aAAA,CAAc,IAAI,CAAC,CAAA;AAClD,MAAA,MAAM,MAAM,IAAA,CACT,MAAA;AAAA,QACC,CAAC,CAAA,KAAA,CACE,CAAA,CAAE,MAAA,IAAU,EAAA,EAAI,SAAS,MAAM,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,aAAa,EAAA,EAAI,QAAA,CAAS,CAAC,CAAC;AAAA,OAC1F,CACC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC3B,MAAA,IAAI,IAAI,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,IACjD,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,IAAI,sBAAA,CAAuB,CAAA,kCAAA,EAAqC,IAAI,CAAA,WAAA,CAAA,EAAe;AAAA,QACvF,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,eAAe,SAAA,CAAU,IAAA,EAAmB,IAAA,EAAe,KAAA,EAAqC;AAC9F,IAAA,OAAO,UAAU,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,YAAY,KAAK,CAAA;AAAA,EACnE;AAGA,EAAA,eAAe,SAAA,CAAa,MAAmB,IAAA,EAAuC;AACpF,IAAA,OAAO,QAAA,CAAY,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AAAA,EACrD;AAEA,EAAA,SAAS,aAAa,GAAA,EAA4B;AAChD,IAAA,IAAI;AACF,MAAA,OAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,eAAe,aAAA,EAAe,UAAA,EAAY,WAAW,SAAA,EAAU;AAC9F;AC9NA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIM,gBAAA,CAAoB,WAAW,CAAA;AAClD,EAAA,MAAM,OAAO,SAAA,EAAU;AACvB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAYE,OAAO,KAAK,CAAA;AAG9B,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,UAAU,OAAA,IAAW,IAAA,CAAK,IAAA,EAAM,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAC,CAAA;AAExB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,CAAC,IAAA,CAAK,SAAA,EAAW;AAC7B,MAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,QAAQ,YAAY;AACxB,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,KAAA,IAAS,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA;AAAA,EAC3E,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,CAAA,EAAG,YAAY,UAAU,IAAI,CAAA;AAElD,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,mBACCJ,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oBAAA;AAAA,QACV,IAAA,EAAM,CAAA;AAAA,QACN,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,WAAA;AAAA,QACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,aAAA,EAAa;AAAA;AAAA,wBAGfA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oBAAA;AAAA,QACV,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,WAAA;AAAA,QACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,aAAA,EAAa;AAAA;AAAA,KACf;AAAA,oBAEFI,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,kBAAA;AAAA,QACV,OAAA,EAAS,MAAM,KAAK,KAAA,EAAM;AAAA,QAC1B,UAAU,IAAA,CAAK,SAAA;AAAA,QACf,aAAA,EAAa,GAAA,CAAI,CAAA,EAAG,YAAY,aAAa,IAAI,CAAA;AAAA,QACjD,KAAA,EAAM,+DAAA;AAAA,QAEL,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,SAAA,mBACJJ,GAAAA,CAACQ,OAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA,mBAEzCR,GAAAA,CAACS,QAAAA,EAAA,EAAS,WAAU,QAAA,EAAS,CAAA;AAAA,UAE9B,IAAA,CAAK,YAAY,eAAA,GAAa;AAAA;AAAA;AAAA;AACjC,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,eAAe,GAAA,EAA+B;AAC5D,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAI,GAAA;AACrC,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,IAAe,MAAA;AACvC,EAAA,MAAM,YAAA,GAAe,IAAI,YAAA,IAAgB,QAAA;AAGzC,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,EAAe,WAAA,MAA+C;AAAA,IAC5E,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,IAAA,uBAC1BT,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA,EAAM,WAAA;AAAA,QACN,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AAAA;AACF,GAEJ,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CACjB,KAAA,EACA,WAAA,EACA,OAAe,WAAA,MACU;AAAA,IACzB,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,IAAA,uBAC1BA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,SAAA,EAAS;AAAA;AAAA;AACX,GAEJ,CAAA;AAEA,EAAA,OAAO,EAAE,QAAQ,UAAA,EAAW;AAC9B;AC7JA,SAAS,iBAAiB,SAAA,EAAoD;AAC5E,EAAA,KAAA,IAAS,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC9C,IAAA,IAAI,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,KAAS,SAAS,OAAO,SAAA,CAAU,CAAC,CAAA,CAAE,UAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAA;AACT;AAuBO,SAAS,WAAA,GAA2B;AACzC,EAAA,MAAM,OAAO,kBAAA,EAAmB;AAChC,EAAA,MAAM,EAAE,KAAI,GAAI,IAAA;AAEhB,EAAA,MAAM,QAAA,GAAWU,WAAAA;AAAA,IACf,OAAO,MAAA,EAAgB,eAAA,GAA4B,EAAC,KAA8B;AAChF,MAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,MAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAMrB,MAAA,MAAM,SAAS,MAAM,GAAA,CAAI,CAAA,OAAA,EAAU,OAAO,IAAI,eAAe,CAAA;AAC7D,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,SAAA,IAAa,EAAE,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,MAAM,QAAA,GAAWC,OAAAA,CAAQ,MAAM,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA,EAAG,CAAC,IAAA,CAAK,SAAS,CAAC,CAAA;AAEjF,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,cAAc,IAAA,CAAK,SAAA;AAAA,IACnB,QAAA;AAAA,IACA,OAAO,IAAA,CAAK;AAAA,GACd;AACF;ACxCA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,GAAI,MAAA;AACxC;AA0BA,IAAM,SAAA,GAAY,mCAAA;AAElB,SAAS,iBAAA,CAAkB;AAAA,EACzB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIN,SAAe,OAAO,CAAA;AAC9C,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,SAAS,EAAE,CAAA;AACjC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAmB,EAAE,CAAA;AAEjD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,WAAW,CAAA;AACpD,EAAA,MAAM,OAAOJ,OAAAA,EAAQ;AACrB,EAAA,MAAM,MAAM,WAAA,EAAY;AACxB,EAAA,MAAM,cAAc,cAAA,EAAe;AAInC,EAAA,MAAM,iBAAA,GAAoB,cAAc,UAAA,CAAW,KAAK,IAAI,UAAA,CAAW,KAAK,IAAI,EAAE,CAAA;AAElF,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,KAA2B,GAAA,CAAI,GAAG,YAAY,CAAA,MAAA,CAAA,EAAU,IAAA,EAAM,GAAG,CAAC,CAAA;AAIjF,EAAA,MAAM,aAAA,GAAgB,MACpB,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,CAAC,MAAA,EAAQ,WAAA,EAAa,WAAW,CAAA,EAAG,CAAA;AAGhF,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAIW,aAAa,WAAW,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAYD,OAAAA;AAAA,IAChB,MAAA,CACG,IAAA,IAAQ,EAAC,EAAG,MAAA;AAAA,MACX,CAAC,CAAA,KAAqC,CAAA,CAAE,aAAa,SAAA,CAAU,IAAA,CAAK,EAAE,SAAS;AAAA,KACjF;AAAA,IACF,CAAC,IAAI;AAAA,GACP;AACA,EAAA,MAAM,QAAA,GAAWA,OAAAA;AAAA,IACf,MAAM,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAA+B,EAAE,WAAW,CAAA;AAAA,IACjE,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAIE,cAAc,QAAQ,CAAA;AAI/C,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAqC;AACrD,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,WAAA,CAAY,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAChC,IAAA,UAAA,CAAW,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC,CAAA;AACpC,IAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,WAAA,CAAY,aAAa,CAAA;AACzB,IAAA,UAAA,CAAW,iBAAiB,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,OAAO,IAAA,EAAYC,KAAAA,KAAiB;AAC5D,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,gBAAgB,WAAW,CAAA;AACtC,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAGA,KAAAA,EAAM,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AACvD,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,WAAW,IAAA,EAAMA,KAAAA,EAAM,EAAE,MAAA,EAAQ,CAAA;AAClE,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,GAAc,CAAC,CAAA;AAC9B,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,QAAA,CAAS,UAAA,CAAW,EAAE,CAAC,CAAA;AACvB,QAAA,KAAK,aAAA,EAAc;AAAA,MACrB;AAAA,IACF,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,KAAuB;AACnD,IAAA,MAAM,GAAA,GAAM,OAAA;AACZ,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAM,iBAAA,CAAkB,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AAC7C,IAAA,IAAI,KAAK,UAAA,CAAW,OAAO,CAAA,EAAG,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACvD,CAAA;AAGA,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KACjB,SAAA,CAAU,CAAC,IAAA,KAAU,IAAA,CAAK,SAAS,EAAE,CAAA,GAAI,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,EAAE,IAAI,CAAC,GAAG,IAAA,EAAM,EAAE,CAAE,CAAA;AAExF,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAK,IAAK,IAAI,YAAA,EAAc;AACxC,IAAA,MAAM,EAAA,GAAK,MAAM,GAAA,CAAI,QAAA,CAAS,QAAQ,MAAM,CAAA;AAC5C,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,QAAA,CAAS,UAAA,CAAW,EAAE,CAAC,CAAA;AACvB,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,KAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,KAAA,GAA6D;AAAA,IACjE,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,MAAM,SAAA,EAAU;AAAA,IACjD,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,MAAA,EAAO;AAAA,IAC/C,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,IACxC,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,MAAML,QAAAA;AAAS,GACvD;AAEA,EAAA,MAAM,UAAA,GACJ,wHAAA;AACF,EAAA,MAAM,WAAW,CAAC,EAAA,KAChB,CAAA,wEAAA,EACE,EAAA,GAAK,uCAAuC,6CAC9C,CAAA,CAAA;AAEF,EAAA,uBACEL,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAsB,aAAA,EAAa,IAAG,EACnD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,UAAA,EAAA,EAAW,GAAA,EAAK,KAAA,EAAO,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,IAAA,EAAK,MAAA,EAAQ,EAAA,CAAG,SAAS,CAAA,EAAG,CAAA;AAAA,MACzE,oCACCI,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,SAAA,EAAU,iLAAA;AAAA,UACV,aAAA,EAAa,GAAG,SAAS,CAAA;AAAA,UAEzB,QAAA,EAAA;AAAA,4BAAAJ,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA,OAC7B,GACE;AAAA,KAAA,EACN,CAAA;AAAA,oBAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVI,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,QAAA,CAAS,IAAA,KAAS,CAAA,CAAE,GAAG,CAAA;AAAA,QAClC,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA;AAAA,QAC5B,aAAA,EAAa,EAAA,CAAG,MAAA,EAAQ,CAAA,CAAE,GAAG,CAAA;AAAA,QAE7B,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,CAAA,CAAE,IAAA,EAAF,EAAO,WAAU,QAAA,EAAS,CAAA;AAAA,UAAE,GAAA;AAAA,UAAE,CAAA,CAAE;AAAA;AAAA,OAAA;AAAA,MAN5B,CAAA,CAAE;AAAA,KAQV,CAAA,EACH,CAAA;AAAA,IAEC,IAAA,KAAS,OAAA,oBACRI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iDAAA,EAAkD,aAAA,EAAa,EAAA,CAAG,QAAQ,CAAA,EACtF,QAAA,EAAA;AAAA,MAAA,SAAA,CAAU,WAAW,CAAA,oBACpBJ,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6DAA4D,QAAA,EAAA,oDAAA,EAEzE,CAAA;AAAA,MAED,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAA0D;AACxE,QAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,CAAA,CAAE,WAAW,CAAA;AACpC,QAAA,MAAM,QAAA,GAAW,KAAA,KAAU,UAAA,CAAW,CAAA,CAAE,WAAW,CAAA;AACnD,QAAA,uBACEA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM,QAAA,CAAS,UAAA,CAAW,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,YACjD,SAAA,EAAW,CAAA,+BAAA,EAAkC,QAAA,GAAW,oCAAA,GAAuC,eAAe,CAAA,CAAA;AAAA,YAC9G,KAAA,EAAO,EAAE,SAAA,IAAa,EAAA;AAAA,YACtB,aAAA,EAAa,EAAA,CAAG,OAAA,EAAS,CAAA,CAAE,WAAW,CAAA;AAAA,YAErC,kCACCA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,KAAA;AAAA,gBACL,GAAA,EAAK,EAAE,SAAA,IAAa,EAAA;AAAA,gBACpB,SAAA,EAAU;AAAA;AAAA,aACZ,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sFAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA,EAChC;AAAA,WAAA;AAAA,UAhBG,CAAA,CAAE;AAAA,SAkBT;AAAA,MAEJ,CAAC;AAAA,KAAA,EACH,CAAA;AAAA,IAGD,SAAS,QAAA,oBACRI,IAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,qHAAA,EACd,QAAA,EAAA;AAAA,MAAA,IAAA,mBAAOJ,GAAAA,CAACQ,OAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,CAAA,mBAAKR,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,MAChF,OAAO,iBAAA,GAAe,eAAA;AAAA,sBACvBA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAO,SAAA;AAAA,UACP,SAAA,EAAU,QAAA;AAAA,UACV,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU,CAAC,CAAA,KAAM,KAAK,SAAS,CAAC,CAAA;AAAA,UAChC,aAAA,EAAa,GAAG,QAAQ;AAAA;AAAA;AAC1B,KAAA,EACF,CAAA;AAAA,IAGD,SAAS,KAAA,oBACRI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACb,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,UAAA;AAAA,UACX,WAAA,EAAY,gBAAA;AAAA,UACZ,KAAA,EAAO,GAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACtC,aAAA,EAAa,GAAG,KAAK;AAAA;AAAA,OACvB;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,qGAAA;AAAA,UACV,QAAA,EAAU,CAAC,GAAA,CAAI,IAAA,EAAK;AAAA,UACpB,OAAA,EAAS,MAAM,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,UAClC,aAAA,EAAa,GAAG,WAAW,CAAA;AAAA,UAC5B,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,IAGD,SAAS,UAAA,oBACRI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAGZ,QAAA,EAAA;AAAA,MAAA,SAAA,CAAU,MAAA,GAAS,CAAA,oBAClBA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAsB,aAAA,EAAa,EAAA,CAAG,MAAM,CAAA,EACzD,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,YAAA,kBAAA;AAAA,YAC7B,OAAO,MAAA,GAAS,CAAA,GAAI,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA,GAAM;AAAA,WAAA,EAC/D,CAAA;AAAA,UACC,UAAA,CAAW,KAAK,CAAA,oBACfJ,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,kDAAA;AAAA,cACV,OAAA,EAAS,MAAM,SAAA,CAAU,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,cAC1C,aAAA,EAAa,GAAG,cAAc,CAAA;AAAA,cAE7B,iBAAO,QAAA,CAAS,UAAA,CAAW,KAAK,CAAC,IAAI,iBAAA,GAAoB;AAAA;AAAA;AAC5D,SAAA,EAEJ,CAAA;AAAA,wBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAA0D;AACxE,UAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,CAAA,CAAE,WAAW,CAAA;AACpC,UAAA,MAAM,EAAA,GAAK,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,WAAW,CAAA;AACxC,UAAA,uBACEI,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,SAAA,CAAU,CAAA,CAAE,WAAW,CAAA;AAAA,cACtC,cAAA,EAAc,EAAA;AAAA,cACd,SAAA,EAAW,CAAA,wCAAA,EAA2C,EAAA,GAAK,oCAAA,GAAuC,eAAe,CAAA,CAAA;AAAA,cACjH,KAAA,EAAO,EAAE,SAAA,IAAa,EAAA;AAAA,cACtB,aAAA,EAAa,EAAA,CAAG,KAAA,EAAO,CAAA,CAAE,WAAW,CAAA;AAAA,cAEnC,QAAA,EAAA;AAAA,gBAAA,KAAA,mBACCJ,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,GAAA,EAAK,KAAA;AAAA,oBACL,GAAA,EAAK,EAAE,SAAA,IAAa,EAAA;AAAA,oBACpB,SAAA,EAAU;AAAA;AAAA,iBACZ,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sFAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,CAAA,EAClC,CAAA;AAAA,gBAED,EAAA,oBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kFAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,UAAA,EAAW,CAAA,EAC9B;AAAA;AAAA,aAAA;AAAA,YAtBG,CAAA,CAAE;AAAA,WAwBT;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAEFA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,UAAA;AAAA,UACX,IAAA,EAAM,CAAA;AAAA,UACN,WAAA,EAAa,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,kCAAA,GAAgC,0BAAA;AAAA,UACjE,KAAA,EAAO,MAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACzC,aAAA,EAAa,GAAG,QAAQ;AAAA;AAAA,OAC1B;AAAA,sBACAI,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,iJAAA;AAAA,UACV,QAAA,EAAU,CAAC,MAAA,CAAO,IAAA,MAAU,GAAA,CAAI,YAAA;AAAA,UAChC,OAAA,EAAS,MAAM,KAAK,UAAA,EAAW;AAAA,UAC/B,aAAA,EAAa,GAAG,UAAU,CAAA;AAAA,UAEzB,QAAA,EAAA;AAAA,YAAA,GAAA,CAAI,YAAA,mBACHJ,GAAAA,CAACQ,OAAAA,EAAA,EAAQ,SAAA,EAAU,uBAAA,EAAwB,CAAA,mBAE3CR,GAAAA,CAACS,QAAAA,EAAA,EAAS,WAAU,UAAA,EAAW,CAAA;AAAA,YAEhC,IAAI,YAAA,GACD,kBAAA,GACA,MAAA,CAAO,MAAA,GAAS,IACd,CAAA,cAAA,EAAiB,WAAA,CAAY,MAAA,CAAO,MAAA,EAAQ,EAAE,GAAA,EAAK,WAAA,EAAa,OAAO,YAAA,EAAc,CAAC,CAAA,CAAA,GACtF;AAAA;AAAA;AAAA,OACR;AAAA,MACC,GAAA,CAAI,KAAA,oBACHT,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0BAAA,EAA2B,IAAA,EAAK,OAAA,EAC7C,QAAA,EAAA,GAAA,CAAI,KAAA,EACP;AAAA,KAAA,EAEJ,CAAA;AAAA,IAGD,yBACCA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,gEAAA;AAAA,QACV,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA;AAAA,QAC1B,aAAA,EAAa,GAAG,OAAO,CAAA;AAAA,QACxB,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBAGFA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,CAAC,CAAC,OAAA;AAAA,QACR,KAAA,EAAO,OAAA;AAAA,QACP,KAAA,EAAM,kBAAA;AAAA,QACN,aAAA,EAAe,sBAAA;AAAA,QACf,SAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,QACxB,UAAA,EAAY,cAAA;AAAA,QACZ,QAAA,EAAU,MAAM,UAAA,CAAW,IAAI;AAAA;AAAA;AACjC,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,iBAAiB,GAAA,EAA0C;AACzE,EAAA,MAAM,EAAE,aAAY,GAAI,GAAA;AACxB,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,QAAA;AAC7B,EAAA,MAAM,YAAA,GAAe,IAAI,YAAA,IAAgB,QAAA;AAEzC,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,MAAwC;AAAA,IAC1D,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,IAAA,uBAC1BA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA;AAAA;AACF,GAEJ,CAAA;AAEA,EAAA,OAAO,EAAE,UAAA,EAAW;AACtB;ACrYA,IAAM,aAAA,GAA+B;AAAA,EACnC,eAAA,EAAiB,wDAAA;AAAA,EACjB,cAAA,EAAgB,SAAA;AAAA,EAChB,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,OAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,EAAA;AAAA,EACN,EAAA,EAAI,eAAA;AAAA,EACJ,EAAA,EAAI,gBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,KAAA,GAAsC;AAAA,EAC1C,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,WAAA;AAAA,EACT,IAAA,EAAM,eAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAGA,IAAM,aAAA,GAA+B;AAAA,EACnC,CAAC,oBAA8B,GAAG,yBAAA;AAAA,EAClC,CAAC,oBAA8B,GAAG,yBAAA;AAAA,EAClC,CAAC,cAAwB,GAAG,uDAAA;AAAA,EAC5B,CAAC,eAAyB,GAAG,uDAAA;AAAA,EAC7B,CAAC,0BAAoC,GACnC,8DAAA;AAAA,EACF,CAAC,gBAA0B,GAAG,8DAAA;AAAA,EAC9B,CAAC,gBAA0B,GAAG;AAChC,CAAA;AAEO,SAAS,OAAA,CAAQ;AAAA,EACtB,QAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,OAAA,GAAU,IAAA;AAAA,EACV,QAAA,GAAW,SAAA;AAAA,EACX,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAiB;AACf,EAAA,MAAM,WAAW,IAAA,KAAS,KAAA;AAC1B,EAAA,MAAM,SAAA,GAAY,QAAA,GACd,+BAAA,GACA,IAAA,KAAS,UACP,mCAAA,GACA,EAAA;AACN,EAAA,uBACEI,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAAG,KAAA,EAAO,QAAA,GAAW,aAAA,GAAgB,MAAA,EAC9E,QAAA,EAAA;AAAA,IAAA,OAAA,oBACCJ,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAuC,KAAA,EAAO,aAAA,EAAe,eAAW,IAAA,EAAC,CAAA;AAAA,oBAE1FA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,+BAAA;AAAA,UACA,MAAM,QAAQ,CAAA;AAAA,UACd,QAAQ,OAAO,CAAA;AAAA,UACf;AAAA,SACF;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;ACxCO,IAAM,OAAA,GAAsC;AAAA,EACjD,QAAA,EAAAe,QAAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,EAAAN,QAAAA;AAAA;AAAA,EAEA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,EAAAO,MAAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,EAAA,EAAG;AAAA,EAC3B,GAAG,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,MAAK,CAAE;AACtE,CAAA;AA2BO,SAAS,cAAA,CACd,EAAA,EACA,KAAA,EACA,gBAAA,EACU;AACV,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,EAAO,WAAA,KACjB,KAAM,EAAA,CAAG,MAAA,CAAO,KAAA,EAAO,WAAW,CAAA,GAAc,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,IACrF,eAAe,CAAC,KAAA,EAAO,WAAA,EAAa,IAAA,KAClC,KACK,EAAA,CAAG,UAAA,CAAW,KAAA,EAAO,WAAA,EAAa,IAAI,CAAA,GACvC,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,WAAA,EAAY;AAAA,IAC7C,UAAA,EAAY,CAAC,KAAA,KAAW,KAAA,GAAQ,KAAA,CAAM,KAAK,CAAA,GAAI,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IACrE,SAAA,EAAW,CAAC,KAAA,MAAW;AAAA,MACrB,IAAA,EAAM,OAAA;AAAA,MACN,KAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,QAC5B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA;AAAK;AAC9B,KACF,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,GAAQ,MAAA,MAAY,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,YAAA,EAAa,CAAA;AAAA,IAC/E,aAAa,CAAC,IAAA,KAAU,IAAA,GAAO,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAAA,IAC/C,WAAA,EAAa,CAAC,EAAA,KAAO,GAAA,CAAI,cAAc,EAAE;AAAA,GAC3C;AACF;ACvGA,IAAM,YAAY,EAAC;AACnB,IAAM,UAAA,GAAa,CAAC,IAAA,KAA6B;AAC/C,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,EAAY,OAAO,IAAA;AACvC,EAAA,MAAM,IAAA,GAAO,IAAA;AACb,EAAA,uBAAOhB,IAAC,IAAA,EAAA,EAAK,CAAA;AACf,CAAA;AAEA,IAAM,SAAA,GAAmB;AAAA,EACvB,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS;AAAA,IACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,IACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,IACjC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA;AAAM;AAEjC,CAAA;AAGO,SAAS,oBAAoB,GAAA,EAAgD;AAClF,EAAA,MAAM,EAAE,WAAW,aAAA,EAAe,UAAA,EAAY,WAAW,SAAA,EAAW,WAAA,EAAa,aAAY,GAC3F,GAAA;AAEF,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,MAA0B;AAAA,IAC1C,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA;AAAO;AACtC,GACF,CAAA;AAGA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,CAAA,EAAE;AAAA,UACvB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,CAAA,EAAE;AAAA,UACvB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,CAAA;AAAE;AACzB,OACF;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,KAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA;AAAK;AAC5B,OACF;AAAA,MACA,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACrB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACrB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACrB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA;AAAO,KACvB;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,CAAA;AAAA,MACP,GAAA,EAAK,IAAA;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,KAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK,KAAM;AACtD,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA;AACnE,MAAA,uBAAOA,GAAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,CAAA,EAAgB,KAAU,OAAA,EAAkB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA;AAAA,IAC9F;AAAA,GACF;AAEA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA;AAAK;AAC7B;AACF,KACF;AAAA,IACA,YAAA,EAAc,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,IAC3B,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,IAAA,EAAK,qBAAMA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAY,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GACzE;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,UACnC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA;AAAK;AAC5B,OACF;AAAA,MACA,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA;AAAO,KAC3B;AAAA,IACA,cAAc,EAAE,KAAA,EAAO,WAAW,OAAA,EAAS,IAAA,EAAM,UAAU,SAAA,EAAU;AAAA,IACrE,QAAQ,CAAC,EAAE,IAAI,KAAA,EAAO,OAAA,EAAS,UAAS,qBACtCA,IAAC,SAAA,EAAA,EAAU,KAAA,EAAc,SAAkB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAC9D,QAAA,EAAA,UAAA,CAAW,QAAQ,CAAA,EACtB;AAAA,GAEJ;AAGA,EAAA,MAAM,SAAA,GAA6B;AAAA,IACjC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,iBAAA,EAAkB;AAAA,MACnD,QAAA,EAAU,aAAA,CAAc,UAAA,EAAY,MAAA,EAAW,MAAM,CAAA;AAAA,MACrD,UAAA,EAAY,SAAS,aAAa,CAAA;AAAA,MAClC,YAAA,EAAc,SAAS,eAAe,CAAA;AAAA,MACtC,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC,OACF;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,WAAW,YAAY,CAAA;AAAA,MACjC,eAAA,EAAiB,WAAW,kBAAkB,CAAA;AAAA,MAC9C,OAAA,EAAS,UAAU,oBAAoB;AAAA,KACzC;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,aAAA;AAAA,MACT,KAAA,EAAO,iCAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MACV,QAAA,EACE,wGAAA;AAAA,MACF,UAAA,EAAY,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,GAAA,EAAI;AAAA,MAC9C,YAAA,EAAc,EAAE,KAAA,EAAO,YAAA,EAAc,MAAM,GAAA,EAAI;AAAA,MAC/C,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,EAAA;AAAA,MACV,eAAA,EAAiB,EAAA;AAAA,MACjB,OAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAQ,CAAC;AAAA,MACP,EAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,0BAEAA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA;AAAA,QACA,kBAAkB,GAAA,CAAI,gBAAA;AAAA,QACtB,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,gBAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,cAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,UACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA;AAAI;AAC3B,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,UAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,MAAM,SAAA,EAAU;AAAA,UAChB,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,WAAA,EAAa,cAAc,aAAa;AAAA,SAC1C;AAAA,QACA,gBAAA,EAAkB;AAAA,UAChB,IAAA,EAAM,UAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,KAAA;AAAA,UACN,KAAA,EAAO,iBAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,mBAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,YAAA;AAAA,UACP,WAAA,EAAa;AAAA;AACf;AACF,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,OAAM,KAAM;AAClC,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,GAAA;AAAA,QACzB,CAAC,EAAA,MAAgE;AAAA,UAC/D,GAAG,EAAA;AAAA,UACH,IAAA,EAAM,WAAA,CAAY,EAAA,CAAG,IAAI;AAAA,SAC3B;AAAA,OACF;AACA,MAAA,uBAAOA,IAAC,WAAA,EAAA,EAAY,OAAA,EAAkB,OAAO,IAAA,EAAM,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA;AAAA,IAC9E;AAAA,GACF;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,KAAA,EAAO,UAAU,OAAO;AAAA,SAC1B;AAAA,QACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,QACnD,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAe;AAAA,QACvC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,QAClC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,iBAAA,EAAkB;AAAA,QAC3C,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAA;AAAU;AACpC,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAM,qBAAMA,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAC/E;AAEA,EAAA,MAAM,gBAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,cAAc,OAAO,CAAA;AAAA,MAC5B,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,MAC1B,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,MACtB,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,YAAA;AAAa,KACjD;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,qEAAA;AAAA,MACP,MAAA,EAAQ,aAAA;AAAA,MACR,IAAA,EAAM,4BAAA;AAAA,MACN,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,OAAO,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU,qBAC5CA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,QAAA,EAAU,cAAc,UAAU,CAAA;AAAA,MAClC,GAAA,EAAK,SAAS,QAAQ,CAAA;AAAA,MACtB,IAAA,EAAM,SAAA;AAAA,MACN,eAAA,EAAiB,WAAW,kBAAkB,CAAA;AAAA,MAC9C,OAAA,EAAS,UAAU,oBAAoB;AAAA,KACzC;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,uBAAA;AAAA,MACP,QAAA,EAAU,mDAAA;AAAA,MACV,GAAA,EAAK,EAAE,KAAA,EAAO,kBAAA,EAAoB,MAAM,GAAA,EAAI;AAAA,MAC5C,IAAA,EAAM,SAAA;AAAA,MACN,eAAA,EAAiB,EAAA;AAAA,MACjB,OAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAQ,qBAClEA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa,EAAE,KAAA,EAAO,SAAA,CAAU,OAAO,CAAA,EAAE;AAAA,QACzC,gBAAA,EAAkB,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,QACnC,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,EAAE,OAAO,WAAA,EAAY;AAAA,QACrB,EAAE,OAAO,MAAA,EAAO;AAAA,QAChB,EAAE,OAAO,QAAA,EAAS;AAAA,QAClB,EAAE,OAAO,SAAA,EAAU;AAAA,QACnB,EAAE,OAAO,UAAA;AAAW;AACtB,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAM,qBAAMA,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAC/E;AAEA,EAAA,MAAM,QAAA,GAA4B;AAAA,IAChC,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,WAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,UAAU,UAAU,CAAA;AAAA,UAC9B,MAAA,EAAQ,cAAc,QAAQ;AAAA,SAChC;AAAA,QACA,gBAAA,EAAkB,EAAE,QAAA,EAAU,aAAA,EAAe,QAAQ,aAAA,EAAc;AAAA,QACnE,cAAA,EAAgB,CAAC,IAAA,KAAgC,IAAA,EAAM,QAAA,IAAY;AAAA;AACrE,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL;AAAA,UACE,QAAA,EAAU,+BAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACV;AAAA,QACA;AAAA,UACE,QAAA,EAAU,2BAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACV;AAAA,QACA;AAAA,UACE,QAAA,EAAU,uBAAA;AAAA,UACV,MAAA,EAAQ;AAAA;AACV;AACF,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAM,qBAAMA,GAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GACzE;AAOA,EAAA,MAAM,mBAAA,GAAuC;AAAA,IAC3C,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,MAAA,EAAO;AAAA,UACzC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,UACvC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ;AACnC,OACF;AAAA,MACA,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,aAAA,EAAe,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAK;AAAA,MACpE,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,WAAA,EAAa,cAAc,aAAa,CAAA;AAAA,UACxC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,oBAAA,EAAqB;AAAA,UACnD,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,4BAAA;AAA6B,SAC3D;AAAA,QACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,WAAA,EAAa,aAAa,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,GAAA,EAAK,EAAA,EAAG;AAAA,QAC5E,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL;AAAA,UACE,KAAA,EAAO,UAAA;AAAA,UACP,WAAA,EAAa,iBAAA;AAAA,UACb,KAAA,EAAO,YAAA;AAAA,UACP,GAAA,EAAK;AAAA,SACP;AAAA,QACA;AAAA,UACE,KAAA,EAAO,aAAA;AAAA,UACP,WAAA,EAAa,4BAAA;AAAA,UACb,KAAA,EAAO,YAAA;AAAA,UACP,GAAA,EAAK;AAAA,SACP;AAAA,QACA;AAAA,UACE,KAAA,EAAO,QAAA;AAAA,UACP,WAAA,EAAa,iBAAA;AAAA,UACb,KAAA,EAAO,YAAA;AAAA,UACP,GAAA,EAAK;AAAA;AACP;AACF,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,KAAA,EAAM,qBACjCA,GAAAA,CAAC,SAAI,KAAA,EAAO,EAAE,QAAQ,MAAA,IAAU,GAAA,IAC9B,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAA,CAAQ,KAAA,IAAS,EAAC,EACf,OAAO,CAAC,IAAA,KAA6B,CAAC,CAAC,MAAM,KAAK,CAAA,CAClD,GAAA,CAAI,CAAC,MAA0B,KAAA,MAAmB;AAAA,UACjD,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,UAClB,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,UACrB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,GAAA,EAAK,KAAK,GAAA,IAAO,MAAA;AAAA,UACjB,WAAA,EAAa,KAAK,WAAA,IAAe;AAAA,SACnC,CAAE,CAAA;AAAA,QACJ,IAAA,EAAM,IAAA,KAAS,MAAA,GAAS,MAAA,GAAa,IAAA;AAAA,QACrC,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA,KACxB,EACF;AAAA,GAEJ;AAEA,EAAA,MAAM,mBAAA,GAAuC;AAAA,IAC3C,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,aAAA,CAAc,SAAA,EAAW,MAAA,EAAW,MAAM;AAAA,KACrD;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EACE;AAAA,KACJ;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAQ,qBAAMA,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAkB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GACzF;AAEA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC,OACF;AAAA,MACA,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,IAAA,EAAM,cAAc,MAAM;AAAA,KAC5B;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,MAAA;AAAA,MACT,KAAA,EAAO,cAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,OAAO,IAAA,EAAK,qBAClCA,GAAAA,CAAC,WAAQ,OAAA,EAAkB,KAAA,EAAc,MAAY,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAElF;AAGA,EAAA,MAAM,UAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,GAAA,EAAK,WAAW,OAAO,CAAA;AAAA,MACvB,GAAA,EAAK,UAAU,UAAU,CAAA;AAAA,MACzB,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,MAAA,EAAQ,UAAU,QAAQ;AAAA,KAC5B;AAAA,IACA,YAAA,EAAc,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IACpF,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,GAAA,EAAK,KAAK,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAO,qBAC/CA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,GAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,iBAAA,GAAqC;AAAA,IACzC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,MACxC,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,MACtB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA;AAAK;AAC7B;AACF,KACF;AAAA,IACA,cAAc,EAAE,GAAA,EAAK,IAAI,IAAA,EAAM,UAAA,EAAY,MAAM,IAAA,EAAK;AAAA,IACtD,QAAQ,CAAC,EAAE,EAAA,EAAI,GAAA,EAAK,MAAM,IAAA,EAAK,qBAC7BA,GAAAA,CAAC,eAAY,GAAA,EAAU,IAAA,EAAY,MAAY,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE5E;AAGA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA;AAAO,SACtC;AAAA,QACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAM,GAAA,EAAI;AAAA,QAC7C,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA,OAC/D;AAAA,MACA,GAAA,EAAK,SAAS,KAAK;AAAA,KACrB;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,MAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA,EAAI;AAAA,QAC9B,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA,EAAI;AAAA,QAC9B,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AAAA,QAC5B,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA;AAAI,OAChC;AAAA,MACA,GAAA,EAAK,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,GAAA;AAAI,KACrC;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,GAAA,EAAI,qBAC/BA,GAAAA,CAAC,UAAO,KAAA,EAAc,KAAA,EAAc,KAAU,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE3E;AAEA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,UAC5B,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,OAAA;AAAA,YACP,WAAA,EAAa;AAAA,cACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,cACxB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA;AAAO,aACtC;AAAA,YACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAM,GAAA,EAAI;AAAA,YAC7C,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,SACF;AAAA,QACA,gBAAA,EAAkB,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,CAAA,EAAE;AAAA,QAC7E,cAAA,EAAgB,CAAC,IAAA,KAA+B,IAAA,EAAM,OAAA,IAAW;AAAA,OACnE;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA;AAAY,KAChD;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS;AAAA,QACP;AAAA,UACE,OAAA,EAAS,SAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,EAAE,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,GAAA,EAAI;AAAA,YAC/B,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA;AAAI;AAChC,SACF;AAAA,QACA;AAAA,UACE,OAAA,EAAS,SAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AAAA,YAC5B,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA;AAAI;AAChC,SACF;AAAA,QACA;AAAA,UACE,OAAA,EAAS,WAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAI;AAAA,YAC3B,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,GAAA;AAAI;AAC7B,SACF;AAAA,QACA;AAAA,UACE,OAAA,EAAS,OAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA,EAAI;AAAA,YAC9B,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA;AAAI;AAC9B;AACF,OACF;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,SAAA,EAAU,qBAChCA,GAAAA,CAAC,UAAO,OAAA,EAAkB,SAAA,EAAsB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE7E;AAGA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,CAAU,MAAM,CAAA,EAAE;AAAA,QACvC,gBAAA,EAAkB,EAAE,IAAA,EAAM,WAAA,EAAY;AAAA,QACtC,cAAA,EAAgB,CAAC,IAAA,KAA4B,IAAA,EAAM,IAAA,IAAQ;AAAA;AAC7D,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,EAAE,IAAA,EAAM,aAAA,EAAc,EAAG,EAAE,IAAA,EAAM,cAAc;AAAA,KACjF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,KAAA,EAAM,qBAC5BA,GAAAA,CAAC,aAAU,OAAA,EAAkB,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAExE;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAA;AAAA,IACT,MAAA,EAAQ,WAAA;AAAA,IACR,SAAA,EAAW,cAAA;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,gBAAA;AAAA,IACb,SAAA,EAAW,cAAA;AAAA,IACX,WAAA,EAAa,gBAAA;AAAA,IACb,SAAA,EAAW,cAAA;AAAA,IACX,SAAA,EAAW,cAAA;AAAA,IACX,GAAA,EAAK,QAAA;AAAA,IACL,QAAA,EAAU,mBAAA;AAAA,IACV,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS,YAAA;AAAA,IACT,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ,iBAAA;AAAA,IACR,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AACF;AC3sBA,IAAM,QAAQ,CAAC,CAAA,KAAA,CACZ,CAAA,IAAK,EAAA,EACH,MAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AAEZ,SAAS,iBAAiB,GAAA,EAAgD;AAC/E,EAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAe,UAAA,EAAY,SAAA,EAAW,aAAY,GAAI,GAAA;AAEzE,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,MAA0B;AAAA,IAC1C,IAAA,EAAM,QAAA;AAAA,IACN,KAAA;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA;AAAO;AACtC,GACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,MAA6B;AAAA,IACjD,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,CAAE;AAAA,GACrD,CAAA;AAGA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA4B,IAAA,EAAM,IAAA,IAAQ,MAAA;AAAA,QAC3D,gBAAA,EAAkB;AAAA,UAChB,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,WAAA,EAAa,EAAA;AAAA,UACb,QAAA,EAAU,0BAAA;AAAA,UACV,QAAA,EAAU,QAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU;AAAA,SACZ;AAAA,QACA,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,UACtB,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,UACtC,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,UACxC,WAAA,EAAa,cAAc,aAAa,CAAA;AAAA,UACxC,QAAA,EAAU,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,yBAAA,EAA0B;AAAA,UAC/D,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,cAAA,EAAe;AAAA,UAChD,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,aAAA,EAAc;AAAA,UAC9C,QAAA,EAAU,UAAU,UAAU;AAAA;AAChC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,WAAA,EAAa,sBAAA;AAAA,UACb,QAAA,EAAU,qCAAA;AAAA,UACV,QAAA,EAAU,aAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,IAAA,EAAM,KAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,WAAA,EAAa,oBAAA;AAAA,UACb,QAAA,EAAU,0DAAA;AAAA,UACV,QAAA,EAAU,kBAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU;AAAA,SACZ;AAAA,QACA;AAAA,UACE,IAAA,EAAM,YAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,WAAA,EAAa,0BAAA;AAAA,UACb,QAAA,EAAU,4CAAA;AAAA,UACV,QAAA,EAAU,eAAA;AAAA,UACV,OAAA,EAAS,GAAA;AAAA,UACT,QAAA,EAAU;AAAA;AACZ;AACF,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,uBACbA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,GAAA;AAAA,UACnB,CAAC,CAAA,MASM;AAAA,YACL,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,aAAa,CAAA,CAAE,WAAA;AAAA,YACf,QAAA,EAAU,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,YAC1B,KAAK,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,YAC1C,UAAU,CAAA,CAAE;AAAA,WACd;AAAA,SACF;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAGA,EAAA,MAAM,SAAA,GAA6B;AAAA,IACjC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS,KAAA;AAAA,QAC7D,gBAAA,EAAkB,EAAE,KAAA,EAAO,KAAA,EAAO,SAAS,cAAA,EAAe;AAAA,QAC1D,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,OAAA,EAAS,cAAc,SAAS;AAAA;AAClC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,mCAAA,EAAoC;AAAA,QAClE,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,4BAAA,EAA6B;AAAA,QAC1D,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,8BAAA;AAA+B;AAC1D,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAM,qBAAMA,GAAAA,CAACiB,MAAA,EAAA,EAAK,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAC1E;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,aAAA,EAAe,UAAU,qBAAqB,CAAA;AAAA,MAC9C,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS,MAAA;AAAA,QAC7D,gBAAA,EAAkB,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,kBAAA,EAAmB;AAAA,QAClE,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,OAAA,EAAS,cAAc,SAAS;AAAA;AAClC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,aAAA,EAAe,KAAA;AAAA,MACf,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,mBAAA,EAAqB,OAAA,EAAS,qCAAA,EAAsC;AAAA,QAC7E,EAAE,KAAA,EAAO,wBAAA,EAA0B,OAAA,EAAS,sCAAA;AAAuC;AACrF,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,eAAe,KAAA,EAAM,qBAClCjB,GAAAA,CAAC,aAAU,aAAA,EAA8B,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAEpF;AAGA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,SAAS,YAAA,CAAa,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,MACrC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA2B,IAAA,EAAM,GAAA,IAAO,OAAA;AAAA,QACzD,kBAAkB,EAAE,GAAA,EAAK,IAAI,GAAA,EAAK,OAAA,EAAS,SAAS,EAAA,EAAG;AAAA,QACvD,WAAA,EAAa;AAAA,UACX,GAAA,EAAK,WAAW,OAAO,CAAA;AAAA,UACvB,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,UAAA,EAAW;AAAA,UACvC,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA;AAAU;AAC5C;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,GAAA;AAAA,MACT,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,WAAA,EAAa,SAAS,EAAA,EAAG;AAAA,QACzC,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,WAAA,EAAa,SAAS,EAAA,EAAG;AAAA,QACzC,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,aAAA,EAAe,SAAS,EAAA;AAAG;AAC7C,KACF;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,QAAQ,MAAA,EAAO,qBACrCA,GAAAA,CAAC,WAAQ,OAAA,EAAkB,MAAA,EAAgB,QAAgB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAExF;AAEA,EAAA,MAAM,UAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,GAAA,EAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,wCAAA,EAAyC;AAAA,MACrE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,UAC7B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA;AAAM;AAC/B,OACF;AAAA,MACA,OAAA,EAAS,UAAU,SAAS;AAAA,KAC9B;AAAA,IACA,YAAA,EAAc,EAAE,GAAA,EAAK,EAAA,EAAI,OAAO,EAAA,EAAI,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAK;AAAA,IAClE,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAK,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAQ,qBACzCA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAGA,EAAA,MAAM,gBAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,cAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,cAAA,EAAe;AAAA,MACnD,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,0BAAA,EAA2B;AAAA,MAC1D,cAAA,EAAgB,cAAc,iBAAiB,CAAA;AAAA,MAC/C,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS,OAAA;AAAA,QAC7D,gBAAA,EAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAM;AAAA,QACjF,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,gBAAA,EAAiB;AAAA,UAC9C,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS;AAAA,cACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,cAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,cACjC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,EAAM;AAAA,cAC/B,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,UAAA;AAAW;AAC3C,WACF;AAAA,UACA,QAAA,EAAU,UAAU,UAAU;AAAA;AAChC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,WAAA,EAAa,MAAA;AAAA,MACb,MAAA,EAAQ,EAAA;AAAA,MACR,cAAA,EAAgB,+CAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,QACN,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAC5D,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,SAAS,IAAA,EAAM,OAAA,EAAS,UAAU,IAAA,EAAK;AAAA,QAC/D,EAAE,MAAM,SAAA,EAAW,KAAA,EAAO,WAAW,IAAA,EAAM,UAAA,EAAY,UAAU,IAAA;AAAK;AACxE,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,aAAa,MAAA,EAAQ,cAAA,EAAgB,MAAA,EAAO,qBACzDA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,WAAA;AAAA,QACA,QAAQ,MAAA,IAAU,MAAA;AAAA,QAClB,cAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAGA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,MACtB,GAAA,EAAK,SAAS,KAAK,CAAA;AAAA,MACnB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,UACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,KAAA;AAAM;AAChC;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,gCAAA;AAAA,MACN,GAAA,EAAK,EAAE,KAAA,EAAO,WAAA,EAAa,MAAM,GAAA,EAAI;AAAA,MACrC,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAQ,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,KAAK,IAAA,EAAK,qBAC7BA,GAAAA,CAAC,UAAO,IAAA,EAAY,GAAA,EAAU,MAAY,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAEvE;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,cAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,IAAA,EAAM,aAAA,CAAc,MAAA,EAAQ,MAAA,EAAW,MAAM,CAAA;AAAA,MAC7C,QAAA,EAAU,WAAW,OAAO,CAAA;AAAA,MAC5B,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ;AACnC,OACF;AAAA,MACA,GAAA,EAAK,SAAS,KAAK;AAAA,KACrB;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,EAAA;AAAA,MACT,KAAA,EAAO,8BAAA;AAAA,MACP,IAAA,EAAM,yGAAA;AAAA,MACN,QAAA,EAAU,EAAA;AAAA,MACV,SAAA,EAAW,MAAA;AAAA,MACX,GAAA,EAAK,EAAE,KAAA,EAAO,YAAA,EAAc,MAAM,GAAA;AAAI,KACxC;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,GAAA,EAAI,qBAC5DA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA;AAAA,QACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,aAAA,GAAiC;AAAA,IACrC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,SAAS,YAAA,CAAa,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,MACrC,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA4B,IAAA,EAAM,IAAA,IAAQ,QAAA;AAAA,QAC3D,gBAAA,EAAkB,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,MAAA,EAAQ,GAAA,EAAK,EAAA,EAAI,SAAA,EAAW,EAAA,EAAG;AAAA,QAC7E,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,UACtB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,UACpC,GAAA,EAAK,cAAc,KAAK,CAAA;AAAA,UACxB,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,YAAA;AAAa;AACjD;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,GAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,MAAM,aAAA,EAAe,IAAA,EAAM,iBAAiB,GAAA,EAAK,EAAA,EAAI,WAAW,EAAA,EAAG;AAAA,QACrE,EAAE,MAAM,YAAA,EAAc,IAAA,EAAM,mBAAmB,GAAA,EAAK,EAAA,EAAI,WAAW,EAAA,EAAG;AAAA,QACtE,EAAE,MAAM,YAAA,EAAc,IAAA,EAAM,iBAAiB,GAAA,EAAK,EAAA,EAAI,WAAW,EAAA;AAAG;AACtE,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,OAAA,EAAQ,qBAC9BA,GAAAA,CAAC,YAAS,OAAA,EAAkB,OAAA,EAAkB,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE3E;AAEA,EAAA,MAAM,UAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,UACvC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA;AAAW;AACzC,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS,MAAA;AAAA,QAC7D,gBAAA,EAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,aAAa,qBAAA,EAAsB;AAAA,QACtE,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,UACxB,WAAA,EAAa,cAAc,aAAa;AAAA;AAC1C;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,UAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL,EAAE,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,iCAAA,EAAkC;AAAA,QACnE,EAAE,KAAA,EAAO,WAAA,EAAa,WAAA,EAAa,uCAAA,EAAwC;AAAA,QAC3E,EAAE,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,mCAAA;AAAoC;AACtE,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,KAAA,EAAM,qBAC5BA,GAAAA,CAAC,SAAM,OAAA,EAAkB,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAEpE;AAEA,EAAA,MAAM,oBAAA,GAAwC;AAAA,IAC5C,KAAA,EAAO,kBAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,YAAA,CAAa,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,MAChC,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,cAAA,EAAgB,CAAC,IAAA,KAA8B,IAAA,EAAM,MAAA,IAAU,aAAA;AAAA,QAC/D,gBAAA,EAAkB,EAAE,KAAA,EAAO,gBAAA,EAAkB,QAAQ,QAAA,EAAU,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,EAAA,EAAG;AAAA,QACvF,WAAA,EAAa;AAAA,UACX,KAAA,EAAO,cAAc,OAAO,CAAA;AAAA,UAC5B,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,UAC1B,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,UACpC,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,YAAA;AAAa;AACjD;AACF,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL;AAAA,UACE,KAAA,EAAO,wCAAA;AAAA,UACP,MAAA,EAAQ,aAAA;AAAA,UACR,IAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAW;AAAA,SACb;AAAA,QACA;AAAA,UACE,KAAA,EAAO,qCAAA;AAAA,UACP,MAAA,EAAQ,YAAA;AAAA,UACR,IAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAW;AAAA,SACb;AAAA,QACA;AAAA,UACE,KAAA,EAAO,kCAAA;AAAA,UACP,MAAA,EAAQ,YAAA;AAAA,UACR,IAAA,EAAM,iBAAA;AAAA,UACN,SAAA,EAAW;AAAA;AACb;AACF,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,KAAA,EAAM,qBAC5BA,GAAAA,CAAC,mBAAgB,OAAA,EAAkB,KAAA,EAAc,MAAA,EAAQ,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAE9E;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,cAAA;AAAA,IACX,OAAA,EAAS,YAAA;AAAA,IACT,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EAAa,gBAAA;AAAA,IACb,MAAA,EAAQ,WAAA;AAAA,IACR,SAAA,EAAW,cAAA;AAAA,IACX,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,eAAA,EAAiB;AAAA,GACnB;AACF;ACraA,IAAMkB,aAAY,EAAC;AAGnB,IAAM,WAAA,GAAsC;AAAA,EAC1C,GAAA,EAAK,gBAAA;AAAA,EACL,GAAA,EAAK,+BAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AACA,IAAM,aAAqC,EAAE,EAAA,EAAI,SAAS,EAAA,EAAI,OAAA,EAAS,IAAI,OAAA,EAAQ;AAG5E,SAAS,sBAAA,CAAuB,IAAA,GAAgC,EAAC,EAAW;AACjF,EAAA,MAAM,MAAM,cAAA,CAAe,IAAA,CAAK,UAAU,IAAA,CAAK,UAAA,EAAY,KAAK,gBAAgB,CAAA;AAChF,EAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAe,WAAW,SAAA,EAAW,WAAA,EAAa,aAAY,GAAI,GAAA;AAIrF,EAAA,MAAM,mBAAA,GAAuC;AAAA,IAC3C,KAAA,EAAO,iBAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,IAAA,EAAM,aAAA,CAAc,MAAA,EAAQ,MAAA,EAAW,MAAM,CAAA;AAAA,MAC7C,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC,OACF;AAAA,MACA,MAAA,EAAQ,UAAU,kBAAkB;AAAA,KACtC;AAAA,IACA,cAAc,EAAE,KAAA,EAAO,iBAAiB,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAA,EAAM;AAAA,IACrE,QAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,IAAA,EAAM,KAAA,EAAO,MAAA,EAAO,qBACjDlB,GAAAA,CAAC,KAAA,EAAA,EAAI,eAAa,WAAA,CAAY,EAAE,GAC9B,QAAA,kBAAAA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,kBAAkB,GAAA,CAAI;AAAA;AAAA,KACxB,EACF;AAAA,GAEJ;AAEA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,WAAA,EAAa,aAAA,CAAc,aAAA,EAAe,MAAA,EAAW,aAAa,CAAA;AAAA;AAAA;AAAA,MAGlE,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAC,QAAA,EAAU,OAAO,CAAA;AAAE,KACtD;AAAA,IACA,YAAA,EAAc,EAAE,KAAA,EAAO,YAAA,EAAc,SAASkB,UAAAA,EAAU;AAAA,IACxD,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,WAAA,EAAa,OAAA,EAAS,OAAA,EAAQ,qBAC3DlB,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA,kBAASA,GAAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,yBAAA,EAA0B,CAAA;AAAA,QACtD,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACxB,WAAA,EAAa,aAAA,CAAc,aAAA,EAAe,MAAA,EAAW,aAAa,CAAA;AAAA,MAClE,MAAM,SAAA,EAAU;AAAA;AAAA,MAEhB,QAAQ,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,CAAC,QAAQ,CAAA;AAAE,KAC5C;AAAA,IACA,YAAA,EAAc,EAAE,KAAA,EAAO,kBAAA,EAAoB,QAAQkB,UAAAA,EAAU;AAAA,IAC7D,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,aAAa,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAO,qBACtDlB,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA,EAAM,YAAY,IAAI,CAAA;AAAA,QACtB,MAAA,kBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAO,CAAA;AAAA,QAChB,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAEA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACtC,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MACpC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ;AACnC,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,YAAA,EAAc;AAAA,UACZ,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,UACtC,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,WAAA;AAAA,YACP,OAAA,EAAS;AAAA,cACP,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,cAC3B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,WACF;AAAA,UACA,IAAA,EAAM,UAAU,MAAM;AAAA;AACxB,OACF;AAAA,MACA,MAAM,SAAA;AAAU,KAClB;AAAA,IACA,cAAc,EAAE,KAAA,EAAO,UAAU,KAAA,EAAO,GAAA,EAAK,QAAQ,SAAA,EAAU;AAAA,IAC/D,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAK,qBACrDA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA,EAAM,YAAY,IAAI,CAAA;AAAA,QACtB,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA;AACxB,GAEJ;AAMA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,UACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,UACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA;AAAI;AAC3B,OACF;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,KAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA;AAAK;AAC5B,OACF;AAAA;AAAA,MAEA,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAC,YAAA,EAAc,YAAY,CAAA;AAAE,KAC7D;AAAA,IACA,cAAc,EAAE,OAAA,EAAS,KAAK,GAAA,EAAK,IAAA,EAAM,OAAOkB,UAAAA,EAAU;AAAA,IAC1D,QAAQ,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,KAAK,KAAA,EAAO,KAAA,EAAM,qBACxClB,IAAC,KAAA,EAAA,EAAI,aAAA,EAAa,WAAA,CAAY,EAAE,GAC9B,QAAA,kBAAAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWmB,EAAAA;AAAA,UACT,kBAAA;AAAA,UACA,WAAA,CAAY,OAAiB,CAAA,IAAK,WAAA,CAAY,GAAG,CAAA;AAAA,UACjD,UAAA,CAAW,GAAa,CAAA,IAAK,UAAA,CAAW;AAAA;AAC1C;AAAA,KACF,EACF;AAAA,GAEJ;AAQA,EAAA,MAAM,oBAAA,GAAwC;AAAA,IAC5C,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,MAC5B,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,UACxC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,UAC1C,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,OAAA;AAAA,YACP,OAAA,EAAS;AAAA,cACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,cAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,cACjC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS;AACrC;AACF,SACF;AAAA,QACA,kBAAkB,EAAE,MAAA,EAAQ,UAAU,KAAA,EAAO,OAAA,EAAS,OAAO,MAAA,EAAO;AAAA,QACpE,cAAA,EAAgB,CAAC,IAAA,KAA+B,IAAA,EAAM,MAAA,IAAU;AAAA,OAClE;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,OAAA;AAAA,YACP,WAAA,EAAa;AAAA,cACX,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA;AAAQ,aACxC;AAAA,YACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,EAAA,EAAG;AAAA,YAC9B,cAAA,EAAgB,CAAC,IAAA,KAA6B,IAAA,EAAM,KAAA,IAAS;AAAA;AAC/D,SACF;AAAA,QACA,gBAAA,EAAkB,EAAE,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,EAAA,EAAG,EAAG,EAAE,KAAA,EAAO,EAAA,EAAI,CAAA,EAAE;AAAA,QAC1D,gBAAgB,CAAC,KAAA,EAAgB,MAAe,CAAA,IAAA,EAAA,CAAQ,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,OACrE;AAAA,MACA,SAAA,EAAW,UAAU,YAAY;AAAA,KACnC;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAA,EAAS;AAAA,QACP,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,QAC/C,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,OAAO,MAAA;AAAO,OACrD;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAE,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,gBAAA,EAAiB,EAAG,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA,EAAE;AAAA,QAC5D,EAAE,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,gBAAA,EAAiB,EAAG,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA;AAAE,OAC9D;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,OAAA,EAAS,WAAU,KAAM;AACrD,MAAA,MAAM,IAAA,GAAQ,WAAW,EAAC;AAC1B,MAAA,MAAM,OAAA,GAAW,QAAQ,EAAC;AAE1B,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACtC,QAAA,MAAM,SAAiC,EAAC;AACxC,QAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3B,UAAA,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,IAAI,GAAA,CAAI,KAAA,GAAQ,KAAK,CAAA,EAAG,KAAA,IAAS,EAAA;AAAA,QACrE,CAAC,CAAA;AACD,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,KAAA,MAAW;AAAA,QAC/C,GAAG,GAAA;AAAA,QACH,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,CAAA,IAAA,EAAO,KAAK,CAAA;AAAA,OAClC,CAAE,CAAA;AACF,MAAA,uBACEnB,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,cAAA;AAAA,UACT,IAAA,EAAM,UAAA;AAAA,UACN,OAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA,EAAQ,YAAY,EAAE;AAAA;AAAA,OACxB;AAAA,IAEJ;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,MACzB,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,UACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,KAAA;AAAM;AAChC,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AAAA,UAC1B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA;AAAK;AAC5B,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,UACnC,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,OAAA,EAAS,UAAU,SAAS;AAAA,KAC9B;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,KAAA;AAAA,MACT,UAAU;AAAC,KACb;AAAA,IACA,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,QAAA,EAAS,qBAClEA,GAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAa,WAAA,CAAY,EAAE,CAAA,EAC9B,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,OAAA,EAAkB,QAAA,EAAoB,OAAA,EACzD,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,GACZ,CAAA,EACF;AAAA,GAEJ;AAEA,EAAA,MAAM,SAAA,GAA6B;AAAA,IACjC,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,UAC/B,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA;AAAW;AACzC,OACF;AAAA,MACA,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA;AAAO,KAC3B;AAAA,IACA,cAAc,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,EAAC,EAA0B;AAAA,IACtE,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,SAAS,QAAA,EAAU,QAAA,EAAS,qBACzCA,GAAAA,CAACoB,IAAAA,EAAA,EAAK,OAAA,EAAkB,SAAA,EAAU,OAAM,aAAA,EAAa,WAAA,CAAY,EAAE,CAAA,EACjE,QAAA,kBAAApB,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EACZ;AAAA,GAEJ;AAEA,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,MACzC,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,UACnC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAA,EAAc;AAAA,UAC7C,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,UACzC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,UACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC,OACF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,IAAA,EAAK;AAAA,UAC9B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,IAAA,EAAK;AAAA,UAC9B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA;AAAO;AACjC;AACF,KACF;AAAA,IACA,cAAc,EAAE,OAAA,EAAS,WAAW,IAAA,EAAM,SAAA,EAAW,UAAU,QAAA,EAAS;AAAA,IACxE,QAAQ,CAAC,EAAE,EAAA,EAAI,QAAA,EAAU,SAAS,IAAA,EAAK,qBACrCA,GAAAA,CAAC,UAAO,OAAA,EAAkB,IAAA,EAAY,eAAa,WAAA,CAAY,EAAE,GAC9D,QAAA,EACH;AAAA,GAEJ;AAEA,EAAA,MAAM,UAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MACpC,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,UACrC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,UACnC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY;AAAA,UACzC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAA,EAAc;AAAA,UAC7C,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA;AAAU;AACvC;AACF,KACF;AAAA,IACA,YAAA,EAAc,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,IAClD,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAI,MAAM,OAAA,EAAQ,qBAC3BA,GAAAA,CAAC,SAAM,OAAA,EAAkB,aAAA,EAAa,WAAA,CAAY,EAAE,GACjD,QAAA,EAAA,IAAA,EACH;AAAA,GAEJ;AAEA,EAAA,MAAM,cAAA,GAAkC;AAAA,IACtC,KAAA,EAAO,WAAA;AAAA,IACP,QAAQ,EAAC;AAAA,IACT,cAAc,EAAC;AAAA,IACf,MAAA,EAAQ,CAAC,EAAE,EAAA,EAAG,qBAAMA,GAAAA,CAAC,SAAA,EAAA,EAAU,aAAA,EAAa,WAAA,CAAY,EAAE,CAAA,EAAG;AAAA,GAC/D;AAEA,EAAA,MAAM,OAAA,GAAU,oBAAoB,GAAG,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,iBAAiB,GAAG,CAAA;AACjC,EAAA,MAAM,UAAU,IAAA,CAAK,WAAA,GAAc,iBAAA,CAAkB,GAAG,IAAI,EAAC;AAE7D,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,cAAA,EAAgB,mBAAA;AAAA,IAChB,UAAA,EAAY,eAAA;AAAA,IACZ,UAAA,EAAY,eAAA;AAAA,IACZ,UAAA,EAAY,eAAA;AAAA,IACZ,SAAA,EAAW,cAAA;AAAA,IACX,SAAA,EAAW,oBAAA;AAAA,IACX,OAAA,EAAS,YAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,SAAA,EAAW,cAAA;AAAA,IACX,GAAG,OAAA;AAAA,IACH,GAAG,IAAA;AAAA,IACH,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,MAAA,GAAiB;AAAA,IACrB,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,YAAY,CAAC,SAAA,EAAW,WAAA,EAAa,SAAA,EAAW,QAAQ,QAAQ;AAAA,OAClE;AAAA,MACA,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,WAAA;AAAA,QACP,UAAA,EAAY;AAAA,UACV,MAAA;AAAA,UACA,aAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA;AAAA,UACA,iBAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,KAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,SAAA;AAAA,QACP,YAAY,CAAC,gBAAA,EAAkB,cAAc,YAAA,EAAc,UAAA,EAAY,WAAW,MAAM;AAAA,OAC1F;AAAA,MACA,WAAA,EAAa,EAAE,KAAA,EAAO,aAAA,EAAe,YAAY,CAAC,MAAA,EAAQ,WAAW,CAAA,EAAE;AAAA,MACvE,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,CAAC,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,OAAO,CAAA,EAAE;AAAA,MAC7E,UAAU,EAAE,KAAA,EAAO,YAAY,UAAA,EAAY,CAAC,SAAS,CAAA,EAAE;AAAA,MACvD,OAAO,EAAE,KAAA,EAAO,SAAS,UAAA,EAAY,CAAC,aAAa,CAAA,EAAE;AAAA,MACrD,UAAA,EAAY,EAAE,KAAA,EAAO,YAAA,EAAc,YAAY,CAAC,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,MACpE,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,WAAA,EAAa,YAAA,EAAc,WAAA,EAAa,UAAU,CAAA,EAAE;AAAA,MACxF,GAAI,IAAA,CAAK,WAAA,GACL,EAAE,SAAS,EAAE,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,CAAC,eAAA,EAAiB,YAAY,CAAA,EAAE,KAC3E,EAAC;AAAA,MACL,UAAA,EAAY,EAAE,KAAA,EAAO,YAAA,EAAc,YAAY,CAAC,QAAA,EAAU,OAAA,EAAS,WAAW,CAAA;AAAE,KAClF;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,CAAC,EAAE,QAAA,uBACTA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWmB,EAAAA,CAAG,yCAAA,EAA2C,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,UAC7E,aAAA,EAAa,IAAA,CAAK,IAAA,EAAM,MAAA,IAAU,uBAAA;AAAA,UAEjC;AAAA;AAAA;AACH;AAEJ,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACliBO,SAAS,qBAAqB,MAAA,EAAyC;AAE5E,EAAA,MAAM,kBAAmC,MAAA,CAAO,OAAA;AAAA,IAAQ,CAAC,SAAS,IAAA,KAChE,OAAA,CAAQ,MAAM,GAAA,CAAI,CAAC,MAAM,IAAA,MAAU;AAAA,MACjC,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,IAAA,EAAM,KAAK,IAAA,IAAQ,KAAA;AAAA,MACnB,GAAA,EAAK,KAAK,GAAA,IAAO,KAAA;AAAA;AAAA,MAEjB,YAAA,EAAc,OAAO,GAAA,GAAM;AAAA,KAC7B,CAAE;AAAA,GACJ;AAGA,EAAA,MAAM,gBAA0B,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAG3D,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,MAAkC;AAAA,IACnD,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,IAAA,EAAM,EAAE,IAAA,IAAQ,MAAA;AAAA,IAChB,GAAA,EAAK,EAAE,GAAA,IAAO;AAAA,GAChB,CAAA;AAEA,EAAA,OAAO,EAAE,eAAA,EAAiB,aAAA,EAAe,SAAA,EAAU;AACrD;ACLO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA;AACF,CAAA,EAGsB;AACpB,EAAA,MAAM,EAAE,eAAA,EAAiB,aAAA,EAAe,SAAA,EAAU,GAAI,QAAA;AAGtD,EAAA,SAAS,SAAA,CAAU,WAA2CE,GAAAA,EAAqB;AACjF,IAAA,OAAO,SAAA,CAAUA,GAAE,CAAA,EAAG,OAAA,IAAW,IAAA;AAAA,EACnC;AAEA,EAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAqB,CAAA,CAAE,EAAA;AAGnC,EAAA,SAAS,OAAA,CAAQ,WAA2C,CAAA,EAA0B;AACpF,IAAA,OAAO,UAAU,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG,SAAS,CAAA,CAAE,YAAA;AAAA,EACtC;AAEA,EAAA,MAAM,iBAAiB,MAAA,EAAoB;AAAA,IACzC,OAAA;AAAA,MACE,CAAC,KAAK,GAAA,MAAS;AAAA,QACb,WAAW,EAAC;AAAA,QAEZ,MAAA,EAAQ,CAAC,QAAA,KAAa;AACpB,UAAA,MAAM,IAAI,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACvD,UAAA,IAAI,CAAC,CAAA,EAAG;AACR,UAAA,MAAM,GAAA,GAAM,KAAI,CAAE,SAAA;AAClB,UAAA,MAAM,IAAA,GAAO,IAAI,QAAQ,CAAA,IAAK,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,YAAA,EAAa;AACrE,UAAA,GAAA,CAAI;AAAA,YACF,WAAW,EAAE,GAAG,GAAA,EAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAA,EAAM,SAAS,CAAC,SAAA,CAAU,GAAA,EAAK,QAAQ,GAAE;AAAE,WAClF,CAAA;AAAA,QACH,CAAA;AAAA,QAEA,IAAA,EAAM,CAAC,QAAA,EAAU,GAAA,KAAQ;AACvB,UAAA,MAAM,GAAA,GAAM,KAAI,CAAE,SAAA;AAClB,UAAA,MAAM,SAAS,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC5D,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,UAAA,MAAM,QAAA,GAAW,gBAAgB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA;AAAA,YAC3E,CAACC,IAAGC,EAAAA,KAAM,OAAA,CAAQ,KAAKD,EAAC,CAAA,GAAI,OAAA,CAAQ,GAAA,EAAKC,EAAC;AAAA,WAC5C;AACA,UAAA,MAAM,MAAM,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACvD,UAAA,MAAM,OAAA,GAAU,GAAA,KAAQ,IAAA,GAAO,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA;AAC/C,UAAA,IAAI,OAAA,GAAU,CAAA,IAAK,OAAA,IAAW,QAAA,CAAS,MAAA,EAAQ;AAC/C,UAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,UAAA,MAAM,CAAA,GAAI,SAAS,OAAO,CAAA;AAC1B,UAAA,MAAM,IAAA,GAAO,EAAE,GAAG,GAAA,EAAI;AAEtB,UAAA,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA,GAAI,EAAE,SAAS,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,EAAE;AACrE,UAAA,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA,GAAI,EAAE,SAAS,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA,EAAE;AACrE,UAAA,GAAA,CAAI,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,QACzB,CAAA;AAAA,QAEA,OAAO,MAAM,GAAA,CAAI,EAAE,SAAA,EAAW,IAAI;AAAA,OACpC,CAAA;AAAA,MACA,EAAE,MAAM,UAAA;AAAW;AACrB,GACF;AAGA,EAAA,SAAS,kBAAA,GAAuE;AAC9E,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACnD,IAAA,OAAOZ,QAAQ,MAAM;AACnB,MAAA,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,QACrC,OAAA;AAAA,QACA,OAAA,EAAS,eAAA,CAAgB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,OAAO,CAAA,CACzD,IAAI,CAAC,CAAA,MAAO,EAAE,GAAG,GAAG,OAAA,EAAS,SAAA,CAAU,SAAA,EAAW,CAAA,CAAE,EAAE,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA,EAAE,CAAE,CAAA,CACxF,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK;AAAA,OACrC,CAAE,CAAA;AAAA,IACJ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAAA,EAChB;AAOA,EAAA,SAAS,aAAA,GAAiC;AACxC,IAAA,MAAM,UAAU,kBAAA,EAAmB;AACnC,IAAA,OAAOA,OAAAA;AAAA,MACL,MACE,OAAA,CACG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACX,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,KAAA,EAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,CAAI,SAAS;AAAA,OACzD,CAAE,EACD,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MACrC,CAAC,OAAO;AAAA,KACV;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,cAAA,EAAgB,kBAAA,EAAoB,aAAA,EAAc;AAC7D;AC9GA,IAAM,SAAS,CAAC,IAAA,EAAgB,OAC9B,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,CAAA;AAE1D,SAAS,yBAAA,CAA0B;AAAA,EACxC;AACF,CAAA,EAEiD;AAC/C,EAAA,OAAOa,MAAAA,EAA4B;AAAA,IACjCrB,OAAAA;AAAA,MACE,CAAC,GAAA,MAAS;AAAA,QACR,WAAW,EAAC;AAAA,QACZ,UAAU,EAAC;AAAA,QACX,YAAA,EAAc,CAAC,EAAA,KAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,SAAA,EAAW,MAAA,CAAO,CAAA,CAAE,SAAA,EAAW,EAAE,GAAE,CAAE,CAAA;AAAA,QACzE,WAAA,EAAa,CAAC,EAAA,KAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,QAAA,EAAU,MAAA,CAAO,CAAA,CAAE,QAAA,EAAU,EAAE,GAAE,CAAE,CAAA;AAAA,QACtE,KAAA,EAAO,MAAM,GAAA,CAAI,EAAE,SAAA,EAAW,EAAC,EAAG,QAAA,EAAU,EAAC,EAAG;AAAA,OAClD,CAAA;AAAA,MACA,EAAE,MAAM,UAAA;AAAW;AACrB,GACF;AACF;;;ACZO,SAAS,qBAAqB,GAAA,EAA2C;AAC9E,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,UAAA,EAAY,UAAS,GAAI,GAAA;AACpE,EAAA,MAAM,EAAE,eAAA,EAAiB,aAAA,EAAc,GAAI,QAAA;AAG3C,EAAA,SAAS,mBAAA,GAAsC;AAC7C,IAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,GAAI,WAAW,QAAA,EAAS;AACtD,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,WAAA,CAAY,eAAe,QAAA,EAAS;AAC1D,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAS,GAAI,WAAW,QAAA,EAAS;AAEpD,IAAA,MAAM,OAAA,GAA4B,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC5D,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,OAAA,EAAS,SAAA,CAAU,CAAA,CAAE,EAAE,GAAG,OAAA,IAAW,IAAA;AAAA,MACrC,OAAO,SAAA,CAAU,CAAA,CAAE,EAAE,CAAA,EAAG,SAAS,CAAA,CAAE;AAAA,MACnC,CAAA,CAAE,IAAA;AAAA,MACF,CAAC,CAAA,EAAG,CAAA,KACF,aAAA,CAAc,QAAQ,CAAA,CAAE,OAAO,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA,CAAE,OAAO,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAA,CAAE;AAAA,KACvF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA;AAAA,MACT,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MACpC,QAAA;AAAA,MACA,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,MAC/B,OAAA;AAAA,MACA,MAAA,EAAQ,EAAE,SAAA,EAAW,QAAA;AAAS,KAChC;AAAA,EACF;AAGA,EAAA,SAAS,SAAA,CAAU,MAAA,GAAyB,mBAAA,EAAoB,EAAW;AACzE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EACvC;AAGA,EAAA,SAAS,QAAA,CAAS,MAAA,GAAyB,mBAAA,EAAoB,EAAS;AACtE,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,SAAA,CAAU,MAAM,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AACvE,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,cAAA,CAAA;AACnC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,CAAA,CAAE,MAAA,EAAO;AACT,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,EAAE,mBAAA,EAAqB,SAAA,EAAW,QAAA,EAAS;AACpD;ACjEO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,YAAA,GAAe,WAAU,EAAuB;AACrF,EAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,EAAmB;AACzC,EAAA,MAAMsB,UAAS,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AACnD,EAAA,MAAM,OAAO,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC/C,EAAA,MAAM,QAAQ,KAAA,CAAM,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAEjD,EAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC9F,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAE9D,EAAA,uBACErB,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAY,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,QAAA,CAAA,EACrD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EACtE,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,QAAa,MAAA;AAAA,QAAK,KAAA;AAAA,QAAM;AAAA,OAAA,EAC3B,CAAA;AAAA,sBACAA,IAAAA;AAAA,QAACsB,MAAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,KAAA;AAAA,UACT,aAAA,EAAa,GAAG,YAAY,CAAA,cAAA,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA,4BAAA1B,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AACpC,KAAA,EACF,CAAA;AAAA,IAEC,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,qBACZI,IAAAA;AAAA,MAACgB,IAAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAQ,UAAA;AAAA,QACR,SAAA,EAAU,YAAA;AAAA,QACV,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,gBAAA,CAAA,EAAoB,MAAM,OAAO,CAAA;AAAA,QAEjE,QAAA,EAAA;AAAA,0BAAApB,GAAAA,CAAC,cACC,QAAA,kBAAAA,GAAAA,CAAC,aAAU,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA,EAClD,CAAA;AAAA,0BACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,aAAA,EACpB,gBAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,GAAA,KAAQ;AAC7B,YAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,YAAA,uBACEI,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,8EAAA;AAAA,gBACV,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,OAAA,CAAA,EAAW,EAAE,EAAE,CAAA;AAAA,gBAE/C,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,oCAAAJ,GAAAA;AAAA,sBAAC0B,MAAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,MAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,SAAA,EAAU,QAAA;AAAA,wBACV,UAAU,GAAA,KAAQ,CAAA;AAAA,wBAClB,OAAA,EAAS,MAAM,IAAA,CAAK,CAAA,CAAE,IAAI,IAAI,CAAA;AAAA,wBAC9B,YAAA,EAAY,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,GAAA,CAAA;AAAA,wBAC3B,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,UAAA,CAAA,EAAc,EAAE,EAAE,CAAA;AAAA,wBAElD,QAAA,kBAAA1B,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,qBAClC;AAAA,oCACAA,GAAAA;AAAA,sBAAC0B,MAAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,MAAA;AAAA,wBACL,OAAA,EAAQ,OAAA;AAAA,wBACR,SAAA,EAAU,QAAA;AAAA,wBACV,QAAA,EAAU,GAAA,KAAQ,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,wBACzC,OAAA,EAAS,MAAM,IAAA,CAAK,CAAA,CAAE,IAAI,MAAM,CAAA;AAAA,wBAChC,YAAA,EAAY,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,KAAA,CAAA;AAAA,wBAC3B,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,YAAA,CAAA,EAAgB,EAAE,EAAE,CAAA;AAAA,wBAEpD,QAAA,kBAAA1B,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AACpC,mBAAA,EACF,CAAA;AAAA,kCACAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,kCACxDI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,oCAAAJ,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EAAgD,YAAE,KAAA,EAAM,CAAA;AAAA,oCACrEA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EAAoD,YAAE,EAAA,EAAG;AAAA,mBAAA,EACxE,CAAA;AAAA,kBACC,CAAA,CAAE,wBACDI,IAAAA,CAACuB,OAAA,EAAM,OAAA,EAAQ,QAAA,EAAS,SAAA,EAAU,SAAA,EAChC,QAAA,EAAA;AAAA,oCAAA3B,GAAAA,CAACS,QAAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBAAE;AAAA,mBAAA,EACjC,CAAA;AAAA,kCAEFT,GAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,SAAS,CAAA,CAAE,OAAA;AAAA,sBACX,eAAA,EAAiB,MAAMyB,OAAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,sBAClC,YAAA,EAAY,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,sBAC7B,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EAAkB,EAAE,EAAE;AAAA;AAAA;AACxD;AAAA,eAAA;AAAA,cA3CK,CAAA,CAAE;AAAA,aA4CT;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA;AAAA,OAAA;AAAA,MA5DK,KAAA,CAAM;AAAA,KA8Dd;AAAA,GAAA,EACH,CAAA;AAEJ;ACzFA,IAAM,YAAA,GAA6C;AAAA,EACjD,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAQA,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAU,YAAA,EAAa,EAA+C;AAChG,EAAA,MAAM,OAAOxB,OAAAA,EAAQ;AACrB,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,KAAY2B,QAAAA,CAAS;AAAA,IAC5C,QAAA,EAAU,CAAC,SAAA,EAAW,cAAA,EAAgB,QAAQ,CAAA;AAAA,IAC9C,OAAA,EAAS,aAAa,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI,QAAQ,GAAG,MAAA,CAAO,gBAAA;AAAA,IACnE,SAAA,EAAW;AAAA,GACZ,CAAA;AACD,EAAA,MAAM,OAAO,SAAA,GAAY,QAAA,GAAM,OAAA,IAAW,CAAC,OAAO,QAAA,GAAM,IAAA;AACxD,EAAA,uBACExB,IAAAA;AAAA,IAACuB,KAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,YAAA,CAAa,IAAI,CAAA,IAAK,WAAA;AAAA,MAC/B,aAAA,EAAa,GAAA,CAAI,CAAA,EAAG,YAAY,uBAAuB,QAAQ,CAAA;AAAA,MAE/D,QAAA,EAAA;AAAA,wBAAA3B,GAAAA,CAAC6B,GAAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE;AAAA;AAAA;AAAA,GAC9B;AAEJ;AAOO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,YAAA,GAAe,WAAU,EAAqB;AACjF,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,cAAA,KAAmB,UAAA,EAAW;AAChE,EAAA,MAAM,EAAE,MAAM,MAAA,GAAS,IAAI,SAAA,EAAW,aAAA,KAAkB,SAAA,EAAU;AAClE,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AACxC,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAE9C,EAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,EAAC;AAEvC,EAAA,uBACEzB,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAY,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,OAAA,CAAA,EAErD,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAACgB,IAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,UAAA;AAAA,QACR,SAAA,EAAU,YAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,eAAA,CAAA;AAAA,QAE5B,QAAA,EAAA;AAAA,0BAAApB,GAAAA,CAAC8B,YAAA,EACC,QAAA,kBAAA1B,KAAC2B,SAAAA,EAAA,EAAU,WAAU,mCAAA,EACnB,QAAA,EAAA;AAAA,4BAAA/B,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,YAAE,2BAAA;AAAA,4BAChDA,IAAC2B,KAAAA,EAAA,EAAM,SAAQ,WAAA,EAAY,SAAA,EAAU,MAAA,EAClC,QAAA,EAAA,QAAA,CAAS,MAAA,EACZ;AAAA,WAAA,EACF,CAAA,EACF,CAAA;AAAA,0BACAvB,IAAAA,CAAC4B,WAAAA,EAAA,EAAY,WAAU,aAAA,EACpB,QAAA,EAAA;AAAA,YAAA,cAAA,oBACChC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,8BAAA,EAAuB,CAAA;AAAA,YAErE,CAAC,cAAA,IAAkB,QAAA,CAAS,MAAA,KAAW,CAAA,oBACtCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,4CAAA,EAE7C,CAAA;AAAA,YAED,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACbI,IAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,6FAAA;AAAA,gBACV,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EAAkB,EAAE,WAAW,CAAA;AAAA,gBAE/D,QAAA,EAAA;AAAA,kCAAAJ,GAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,SAAA,CAAU,QAAA,CAAS,CAAA,CAAE,WAAW,CAAA;AAAA,sBACzC,eAAA,EAAiB,MAAM,YAAA,CAAa,CAAA,CAAE,WAAW,CAAA;AAAA,sBACjD,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,qBAAA,CAAA,EAAyB,EAAE,WAAW;AAAA;AAAA,mBACxE;AAAA,kCACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,oCAAAJ,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EACV,QAAA,EAAA,CAAA,CAAE,SAAS,oBAAA,EACd,CAAA;AAAA,oCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EAAoD,YAAE,WAAA,EAAY;AAAA,mBAAA,EACjF,CAAA;AAAA,kCACAA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,QAAA,EAAU,CAAA,CAAE,aAAa,YAAA,EAA4B;AAAA;AAAA,eAAA;AAAA,cAflE,CAAA,CAAE;AAAA,aAiBV;AAAA,WAAA,EACH;AAAA;AAAA;AAAA,KACF;AAAA,oBAGAI,IAAAA,CAACgB,IAAAA,EAAA,EAAK,OAAA,EAAQ,UAAA,EAAW,SAAA,EAAU,YAAA,EAAa,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,cAAA,CAAA,EAC1E,QAAA,EAAA;AAAA,sBAAApB,GAAAA,CAAC8B,YAAA,EACC,QAAA,kBAAA1B,KAAC2B,SAAAA,EAAA,EAAU,WAAU,mCAAA,EACnB,QAAA,EAAA;AAAA,wBAAA/B,GAAAA,CAACiC,GAAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,QAAE,SAAA;AAAA,wBACvCjC,IAAC2B,KAAAA,EAAA,EAAM,SAAQ,WAAA,EAAY,SAAA,EAAU,MAAA,EAClC,QAAA,EAAA,MAAA,CAAO,MAAA,EACV;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAvB,IAAAA,CAAC4B,WAAAA,EAAA,EAAY,WAAU,aAAA,EACpB,QAAA,EAAA;AAAA,QAAA,aAAA,oBAAiBhC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,sBAAA,EAAe,CAAA;AAAA,QAC7E,CAAC,aAAA,IAAiB,MAAA,CAAO,MAAA,KAAW,CAAA,oBACnCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,QAEpE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACXI,IAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAU,6FAAA;AAAA,YACV,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,aAAA,CAAA,EAAiB,EAAE,WAAW,CAAA;AAAA,YAE9D,QAAA,EAAA;AAAA,8BAAAJ,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,CAAA,CAAE,WAAW,CAAA;AAAA,kBACxC,eAAA,EAAiB,MAAM,WAAA,CAAY,CAAA,CAAE,WAAW,CAAA;AAAA,kBAChD,eAAa,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA,oBAAA,CAAA,EAAwB,EAAE,WAAW;AAAA;AAAA,eACvE;AAAA,8BACAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAJ,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EACT,QAAA,EAAA,CAAA,CAAA,CAAE,cAAc,OAAA,EAAS,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,EAC9C,CAAA;AAAA,gCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EAAoD,YAAE,WAAA,EAAY;AAAA,eAAA,EACjF;AAAA;AAAA,WAAA;AAAA,UAdK,CAAA,CAAE;AAAA,SAgBV;AAAA,OAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AClHA,SAAS,WAAA,CAAY;AAAA,EACnB,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AAED,EAAA,MAAM,KAAA,GAAQ,YAAY,QAAA,EAAS;AACnC,EAAA,MAAM,OAAA,GAAU,YAAY,cAAA,EAAe;AAC3C,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,IAAA,GAAOW,OAAAA,CAAQ,MAAM,QAAA,CAAS,SAAA,EAAU,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAEnF,EAAA,uBACEP,IAAAA,CAACgB,IAAAA,EAAA,EAAK,OAAA,EAAQ,UAAA,EAAW,SAAA,EAAU,YAAA,EAAa,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,aAAA,CAAA,EAC1E,QAAA,EAAA;AAAA,oBAAApB,GAAAA,CAAC8B,YAAA,EACC,QAAA,kBAAA1B,KAAC2B,SAAAA,EAAA,EAAU,WAAU,6CAAA,EACnB,QAAA,EAAA;AAAA,sBAAA3B,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,QAAE;AAAA,OAAA,EAC9C,CAAA;AAAA,sBACAI,IAAAA;AAAA,QAACsB,MAAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS,MAAM,QAAA,CAAS,QAAA,EAAS;AAAA,UACjC,aAAA,EAAa,GAAG,YAAY,CAAA,OAAA,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA,4BAAA1B,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AACjC,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAACgC,WAAAA,EAAA,EACC,QAAA,kBAAAhC,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,2HAAA;AAAA,QACV,aAAA,EAAa,GAAG,YAAY,CAAA,eAAA,CAAA;AAAA,QAE3B,QAAA,EAAA;AAAA;AAAA,KACH,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAAyB;AACvB,EAAA,uBACEI,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAY,aAAA,EAAa,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAA,EACzD,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,oBAEDA,IAAAA,CAACa,IAAAA,EAAA,EAAK,cAAa,OAAA,EACjB,QAAA,EAAA;AAAA,sBAAAb,IAAAA,CAAC,QAAA,EAAA,EAAS,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,KAAA,CAAA,EACpC,QAAA,EAAA;AAAA,wBAAAA,KAAC,WAAA,EAAA,EAAY,KAAA,EAAM,SAAQ,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,UAAA,CAAA,EACrD,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAACkC,OAAAA,EAAA,EAAQ,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EAChC,CAAA;AAAA,wBACA9B,KAAC,WAAA,EAAA,EAAY,KAAA,EAAM,WAAU,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,YAAA,CAAA,EACvD,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EACnC,CAAA;AAAA,wBACAI,KAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UAAS,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,WAAA,CAAA,EACtD,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAACiC,GAAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EAC5B,CAAA;AAAA,wBACA7B,KAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UAAS,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,WAAA,CAAA,EACtD,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EACjC;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,SACjB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,WAAA;AAAA,UACR,OAAA,EAAQ,OAAA;AAAA,UACR,YAAA,EAAc,GAAG,YAAY,CAAA,MAAA,CAAA;AAAA,UAC7B,OAAA,EAAS;AAAA;AAAA,OACX,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,SAAA,EACjB,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,WAAA,EAAa,YAAA,EAA4B,CAAA,EACjE,CAAA;AAAA,sBACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,QAAA,EACjB,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,UAAA,EAAY,YAAA,EAA4B,CAAA,EAC9D,CAAA;AAAA,sBACAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UACjB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,WAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA,OACF,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * Live-data gate for the widget seam (context + hook only — no components, so\n * this stays fast-refresh clean and can be imported by both the runtime scaffold\n * and the widget factory without a cycle).\n *\n * The flag is `true` ONLY inside an authenticated in-app renderer\n * (`PageRenderer liveData`), which is where live ARBI data may resolve. In the\n * Studio editor canvas and on the public site it stays `false`, so every live\n * widget renders a placeholder instead of hitting the backend. It is deliberately\n * separate from the asset resolver (which IS on in the editor, to preview\n * images): back-office data must never resolve on the marketing canvas.\n */\nimport { createContext, useContext } from 'react'\n\n/** True only where live widgets may resolve backend data (an authenticated app tree). */\nexport const LiveDataContext = createContext<boolean>(false)\n\n/** Whether live widgets may resolve backend data here (false in editor/public). */\nexport function useLiveDataActive(): boolean {\n return useContext(LiveDataContext)\n}\n","/**\n * Live-widget runtime: everything in the seam that RENDERS — the provider that\n * turns the live-data gate on for an authenticated app tree, the placeholder\n * shown everywhere else, and the widget block bodies themselves (each gates on\n * the live-data flag and renders live data or a placeholder).\n *\n * Components only — kept apart from the context/hook ({@link ./liveData}) and the\n * config factory ({@link ./widgets}) so every file in the seam is fast-refresh\n * clean (a file exports either components or non-components, never both, and a\n * non-component-export file defines no components).\n *\n * The widgets read the SHARED `@arbidocs/react` hooks and the package connection\n * (for the active workspace), so they are host-agnostic.\n */\nimport type { LucideIcon } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { Bot, FileText, MessagesSquare, Sparkles } from 'lucide-react'\nimport { useConversations, useDocuments } from '@arbidocs/react'\nimport { Card } from '@arbidocs/react/ui'\nimport { MetricCard } from '../components/MetricCard'\nimport { useConnection } from '../connection/ConnectionProvider'\nimport { LiveDataContext, useLiveDataActive } from './liveData'\n\n// ── Scaffolding ───────────────────────────────────────────────────────────────\n/** Marks the subtree as an authenticated app tree, so live widgets resolve data. */\nexport function LiveDataProvider({ children }: { children: ReactNode }) {\n return <LiveDataContext.Provider value={true}>{children}</LiveDataContext.Provider>\n}\n\n/**\n * What a live widget shows when it can't (or shouldn't) resolve data: a labelled,\n * dashed card. Used in the Studio canvas and the public renderer so authoring a\n * dashboard is WYSIWYG-ish without leaking live back-office data.\n */\nexport function WidgetPlaceholder({\n label,\n icon: Icon = Sparkles,\n testId,\n}: {\n label: string\n icon?: LucideIcon\n testId?: string\n}) {\n return (\n <div\n className=\"flex items-center gap-3 rounded-lg bg-muted px-5 py-6 text-sm text-muted-foreground\"\n data-testid={testId}\n >\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-background text-muted-foreground\">\n <Icon className=\"size-4\" />\n </span>\n <span>\n <span className=\"font-medium text-foreground\">{label}</span>\n <span className=\"ml-1\">· live in the app</span>\n </span>\n </div>\n )\n}\n\n// ── Shared helpers ────────────────────────────────────────────────────────────\n/** Resolve the active workspace id from the package connection (host-agnostic). */\nfunction useActiveWorkspaceId(): string | undefined {\n const { workspaceId, fallbackWorkspaceId } = useConnection()\n return workspaceId ?? fallbackWorkspaceId ?? undefined\n}\n\n/** Compact relative time (\"3h ago\") — self-contained so widgets need no host util. */\nfunction timeAgo(iso: string | undefined): string {\n if (!iso) return ''\n const then = new Date(iso).getTime()\n if (Number.isNaN(then)) return ''\n const s = Math.max(0, Math.round((Date.now() - then) / 1000))\n if (s < 60) return 'just now'\n const m = Math.round(s / 60)\n if (m < 60) return `${m}m ago`\n const h = Math.round(m / 60)\n if (h < 24) return `${h}h ago`\n return `${Math.round(h / 24)}d ago`\n}\n\nconst METRIC_SOURCES = {\n documents: { label: 'Documents', icon: FileText },\n conversations: { label: 'Agent threads', icon: Bot },\n} as const\ntype MetricSource = keyof typeof METRIC_SOURCES\n\nconst asMetricSource = (s: string): MetricSource =>\n s in METRIC_SOURCES ? (s as MetricSource) : 'documents'\n\ninterface Conversation {\n external_id?: string\n title?: string\n updated_at?: string\n}\n\n// ── Live inner bodies (only mounted where the gate is on) ─────────────────────\nfunction AgentActivityLive({\n title,\n limit,\n testId,\n}: {\n title: string\n limit: number\n testId: string\n}) {\n const wsId = useActiveWorkspaceId()\n const { data, isLoading } = useConversations(wsId)\n const rows = [...((data ?? []) as Conversation[])]\n .sort((a, b) => +new Date(b.updated_at ?? 0) - +new Date(a.updated_at ?? 0))\n .slice(0, limit)\n\n return (\n <Card variant=\"elevated\" className=\"rounded-lg p-5\" data-testid={testId}>\n <div className=\"mb-3 flex items-center gap-2\">\n <Bot className=\"size-4 text-muted-foreground\" />\n <p className=\"text-sm font-semibold text-foreground\">{title}</p>\n </div>\n {isLoading ? (\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testId}-loading`}>\n Loading agent threads…\n </p>\n ) : rows.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testId}-empty`}>\n No agent threads yet.\n </p>\n ) : (\n <ul className=\"space-y-2\" data-testid={`${testId}-list`}>\n {rows.map((c, i) => (\n <li\n key={c.external_id ?? i}\n className=\"flex items-center justify-between gap-3\"\n data-testid={`${testId}-item-${i}`}\n >\n <span className=\"flex items-center gap-2 truncate\">\n <MessagesSquare className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate text-sm text-foreground\">\n {c.title?.trim() || 'Untitled thread'}\n </span>\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {timeAgo(c.updated_at)}\n </span>\n </li>\n ))}\n </ul>\n )}\n </Card>\n )\n}\n\nfunction LiveMetricInner({\n label,\n source,\n accent,\n testId,\n}: {\n label: string\n source: MetricSource\n accent: string\n testId: string\n}) {\n const wsId = useActiveWorkspaceId()\n const docs = useDocuments(wsId, { enabled: source === 'documents' })\n const convos = useConversations(wsId, { enabled: source === 'conversations' })\n const query = source === 'documents' ? docs : convos\n const count = Array.isArray(query.data) ? query.data.length : 0\n return (\n <MetricCard\n label={label || METRIC_SOURCES[source].label}\n value={query.isLoading ? '—' : String(count)}\n accent={accent}\n icon={METRIC_SOURCES[source].icon}\n testId={testId}\n />\n )\n}\n\n// ── Widget block bodies (gate on the live flag) ───────────────────────────────\n// Named components (not the Puck `render` arrow) so the live-context hook is a\n// legit component-level hook — mirrors how BlockImage gates on the asset resolver.\nexport function AgentActivityBlock({\n title,\n limit,\n testId,\n}: {\n title: string\n limit: number\n testId: string\n}) {\n return useLiveDataActive() ? (\n <AgentActivityLive title={title} limit={limit} testId={testId} />\n ) : (\n <WidgetPlaceholder label={String(title || 'Agent activity')} icon={Bot} testId={testId} />\n )\n}\n\nexport function LiveMetricBlock({\n label,\n source,\n accent,\n testId,\n}: {\n label: string\n source: string\n accent: string\n testId: string\n}) {\n const src = asMetricSource(source)\n return useLiveDataActive() ? (\n <LiveMetricInner label={label} source={src} accent={accent} testId={testId} />\n ) : (\n <WidgetPlaceholder\n label={String(label || METRIC_SOURCES[src].label)}\n icon={METRIC_SOURCES[src].icon}\n testId={testId}\n />\n )\n}\n","/**\n * Live-widget block factory for @arbidocs/blocks.\n *\n * Mirrors the other `create*Blocks` factories: it only WIRES pre-built block\n * components (from {@link ./liveWidgetRuntime}) into Puck `ComponentConfig`s, so\n * it exports a single function and defines no components of its own — keeping it\n * fast-refresh clean. The blocks gate on the live-data flag ({@link ./liveData}),\n * rendering real ARBI data inside an authenticated app tree and a placeholder in\n * the editor/public. They read the SHARED `@arbidocs/react` hooks, so any client\n * with an ARBI workspace gets them; a client supplies only *composition* via\n * `createArbiBlocksConfig({ liveWidgets: true })`.\n */\nimport type { ComponentConfig } from '@measured/puck'\nimport { AgentActivityBlock, LiveMetricBlock } from './liveWidgetRuntime'\nimport type { BlockKit } from './blockKit'\n\n/**\n * Build the live-widget block set, closing over the shared {@link BlockKit} for\n * stable testids. Registered under a \"Widgets\" category when a consumer opts in\n * with `createArbiBlocksConfig({ liveWidgets: true })`.\n */\nexport function createLiveWidgets(kit: BlockKit): Record<string, ComponentConfig> {\n const { blockTestId } = kit\n\n const AgentActivityWidget: ComponentConfig = {\n label: 'Agent activity (live)',\n fields: {\n title: { type: 'text', label: 'Title' },\n limit: { type: 'number', label: 'Rows', min: 1, max: 8 },\n },\n defaultProps: { title: 'Recent agent activity', limit: 4 },\n render: ({ id, title, limit }) => (\n <AgentActivityBlock title={title} limit={limit} testId={blockTestId(id)} />\n ),\n }\n\n const LiveMetricWidget: ComponentConfig = {\n label: 'Live metric',\n fields: {\n label: { type: 'text', label: 'Label' },\n source: {\n type: 'select',\n label: 'Source',\n options: [\n { label: 'Documents', value: 'documents' },\n { label: 'Agent threads', value: 'conversations' },\n ],\n },\n accent: {\n type: 'radio',\n label: 'Accent',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Primary', value: 'primary' },\n { label: 'Success', value: 'success' },\n ],\n },\n },\n defaultProps: { label: '', source: 'documents', accent: 'primary' },\n render: ({ id, label, source, accent }) => (\n <LiveMetricBlock label={label} source={source} accent={accent} testId={blockTestId(id)} />\n ),\n }\n\n return {\n AgentActivity: AgentActivityWidget,\n LiveMetric: LiveMetricWidget,\n }\n}\n","/**\n * The SDK-backed half of asset resolution.\n *\n * Kept apart from `assetResolver.tsx` on purpose. `BlockImage` — and through it\n * every website block — must not reach the SDK, React Query or AG Grid, so that\n * `@arbidocs/blocks/site` can be imported by an unauthenticated marketing page.\n * A dead code path is not enough: neither kit package declares `sideEffects`, so\n * a bundler must keep whatever the module graph mentions. The resolver is\n * therefore *injected* (see `AssetResolverProvider`) rather than imported, and\n * only the authenticated Studio — which already depends on the SDK — hands this\n * module in.\n */\nimport { useEffect } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useArbi, useThumbnails } from '@arbidocs/react'\nimport type { AssetRenderProps } from './assetResolver'\n\n/**\n * Resolve an asset ext_id to a displayable image src.\n *\n * Prefer the cheap thumbnail endpoint, but fall back to downloading the actual\n * bytes as an object URL when there's no thumbnail — AI-generated (and freshly\n * uploaded) images have no thumbnail yet, so the thumbnail-only path renders a\n * broken `<img>`. The bytes always exist (it's a stored document), so the editor\n * shows the real image immediately instead of waiting on async thumbnailing.\n */\nexport function useAssetImage(docId: string): string | undefined {\n const arbi = useArbi()\n const { data: thumbs } = useThumbnails([docId])\n const thumb = thumbs?.[docId]\n\n const { data: objectUrl } = useQuery({\n queryKey: ['arbi', 'asset-image', docId],\n queryFn: async () => {\n const res = await arbi.documents.download(docId)\n const blob = await res.blob()\n return URL.createObjectURL(blob)\n },\n // Only download when the thumbnail is genuinely absent (not merely loading).\n enabled: !!docId && thumbs != null && !thumb && arbi.hasWorkspace,\n staleTime: 10 * 60_000,\n })\n\n // Release the object URL when the doc changes / unmounts.\n useEffect(() => {\n return () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl)\n }\n }, [objectUrl])\n\n return thumb ?? objectUrl\n}\n\n/**\n * Resolve a single asset ext_id and render it as an `<img>`. This is the\n * `AssetRenderer` the Studio injects; it satisfies `AssetRenderProps`.\n */\nexport function AssetThumb({ docId, alt, className, testId }: AssetRenderProps) {\n const src = useAssetImage(docId)\n return <img src={src ?? undefined} alt={alt ?? ''} className={className} data-testid={testId} />\n}\n","/**\n * Publish-time asset materialization.\n *\n * While authoring, an image is stored as a workspace **asset ref**\n * (`asset:<docId>`) — resolvable only inside the authenticated Studio. The\n * public marketing renderer has no auth token, so a published page must be\n * **self-contained**: every asset ref is replaced with a directly-renderable\n * source before the page is saved for the public.\n *\n * The default {@link createArbiMaterializer} downloads each asset once and\n * inlines it as a `data:` URI — the bytes travel *inside* the published JSON,\n * so nothing is fetched, served or auth-gated at render time (no backend). A\n * consumer that prefers a CDN/static host can pass a `publishAsset` hook that\n * uploads the bytes and returns a URL instead; that is purely a payload-size\n * optimization and keeps this package host- and backend-agnostic.\n */\nimport type { Data } from '@measured/puck'\nimport { assetRefId, isAssetRef } from '../components/assetResolver'\nimport type { Arbi } from './types'\n\n/** Resolve a workspace document ext_id to a public-renderable src, or null. */\nexport type AssetMaterializer = (docId: string) => Promise<string | null>\n\nexport interface MaterializeOptions {\n /**\n * Optional sink: given a doc id + its bytes, store them somewhere public and\n * return the URL. When omitted, bytes are inlined as a `data:` URI (no backend).\n */\n publishAsset?: (docId: string, blob: Blob) => Promise<string>\n}\n\n/** Read a Blob as a `data:<mime>;base64,…` URI. */\nfunction blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(blob)\n })\n}\n\n/**\n * A materializer backed by the authenticated Arbi client: download the asset,\n * then either hand it to `publishAsset` or inline it as a data URI. Any failure\n * resolves to `null` so a single broken asset never fails the whole publish.\n */\nexport function createArbiMaterializer(\n arbi: Arbi,\n opts: MaterializeOptions = {}\n): AssetMaterializer {\n return async (docId: string) => {\n try {\n const res = await arbi.documents.download(docId)\n const blob = await res.blob()\n if (opts.publishAsset) return await opts.publishAsset(docId, blob)\n return await blobToDataUrl(blob)\n } catch {\n return null\n }\n }\n}\n\n/** Depth-first collect every distinct asset ref (`asset:…`) in a JSON value. */\nfunction collectAssetRefs(node: unknown, acc: Set<string>): void {\n if (typeof node === 'string') {\n if (isAssetRef(node)) acc.add(node)\n return\n }\n if (Array.isArray(node)) {\n for (const child of node) collectAssetRefs(child, acc)\n return\n }\n if (node && typeof node === 'object') {\n for (const value of Object.values(node)) collectAssetRefs(value, acc)\n }\n}\n\n/** Deep-clone a JSON value, swapping any string found in `replacements`. */\nfunction replaceAssetRefs<T>(node: T, replacements: Map<string, string>): T {\n if (typeof node === 'string') {\n return (replacements.get(node) ?? node) as T\n }\n if (Array.isArray(node)) {\n return node.map((child) => replaceAssetRefs(child, replacements)) as unknown as T\n }\n if (node && typeof node === 'object') {\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(node)) {\n out[key] = replaceAssetRefs(value, replacements)\n }\n return out as T\n }\n return node\n}\n\n/**\n * Return a copy of `data` with every `asset:<docId>` ref replaced by its\n * materialized source. Each distinct ref is resolved exactly once; a ref that\n * fails to resolve is left untouched (it simply won't paint for the public).\n */\nexport async function materializePageData(\n data: Data,\n materialize: AssetMaterializer\n): Promise<Data> {\n const refs = new Set<string>()\n collectAssetRefs(data, refs)\n if (refs.size === 0) return data\n\n const replacements = new Map<string, string>()\n await Promise.all(\n [...refs].map(async (ref) => {\n const src = await materialize(assetRefId(ref))\n if (src) replacements.set(ref, src)\n })\n )\n if (replacements.size === 0) return data\n return replaceAssetRefs(data, replacements)\n}\n","/**\n * StudioEditor — the WYSIWYG marketing-site builder.\n *\n * Wraps Puck's <Puck> with a host-supplied block config, a slim brand toolbar\n * (page picker, theme drawer, publish) and injected persistence. Data is loaded\n * per page slug on mount / slug change and saved on publish. The theme editor\n * rides in a slide-over so token changes preview live against the canvas.\n *\n * Firm-agnostic: the block config, page list, persistence, theme bundle/defaults\n * and brand labels all arrive as props; `live` is passed in (never read from env).\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Link } from 'react-router-dom'\nimport { Puck, type Config, type Data } from '@measured/puck'\nimport { ArrowLeft, Loader2, Palette, Rocket } from 'lucide-react'\nimport { useArbi } from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../provider/BlocksProvider'\nimport { ThemeEditor } from '../theme/ThemeEditor'\nimport { AssetResolverProvider } from '../components/assetResolver'\nimport { AssetThumb } from '../components/assetImage'\nimport { applyStoredTheme, type ThemeBundle } from '../theme/store'\nimport type { ThemeTokens } from '../theme/tokens'\nimport { createArbiMaterializer, materializePageData, type MaterializeOptions } from './publish'\nimport type { StudioPageMeta, StudioPersistence, PersistVia } from './types'\n\nconst EMPTY_DATA = { content: [], root: {} } as Data\n\nexport interface StudioEditorProps {\n config: Config\n pages: readonly StudioPageMeta[]\n persistence: StudioPersistence\n themeBundle: ThemeBundle\n defaultTheme: ThemeTokens\n brandLabel: string\n backHref?: string\n backLabel?: string\n live: boolean\n initialSlug?: string\n testIdPrefix?: string\n /**\n * Install a DEV-only `window.__studioResetSlug(slug)` hook that clears a slug's\n * stored page so a fresh seed governs the canvas. For tests/demos only — it can\n * delete pages, so keep it off in production (pass `import.meta.env.DEV`). The\n * package stays env-agnostic; the consumer owns the flag.\n */\n resetSeam?: boolean\n /**\n * Optional sink for published image bytes. When omitted, publishing inlines\n * each asset as a `data:` URI (self-contained, no backend). Provide this to\n * upload bytes to a CDN/static host and return a URL instead.\n */\n publishAsset?: MaterializeOptions['publishAsset']\n}\n\nexport function StudioEditor({\n config,\n pages,\n persistence,\n themeBundle,\n defaultTheme,\n brandLabel,\n backHref,\n backLabel = 'Back',\n live,\n initialSlug,\n testIdPrefix = 'studio',\n publishAsset,\n resetSeam = false,\n}: StudioEditorProps) {\n const arbi = useArbi()\n const { notify } = useBlocksEnvironment()\n const materialize = useMemo(\n () => createArbiMaterializer(arbi, { publishAsset }),\n [arbi, publishAsset]\n )\n\n const [slug, setSlug] = useState<string>(initialSlug ?? pages[0]?.slug ?? 'home')\n const [data, setData] = useState<Data>(EMPTY_DATA)\n const [rev, setRev] = useState(0) // bump to force-remount Puck on (re)load\n const [loading, setLoading] = useState(true)\n const [themeOpen, setThemeOpen] = useState(false)\n const [via, setVia] = useState<PersistVia | null>(null)\n const [saving, setSaving] = useState(false)\n // A failed load must not fall through to an empty canvas: publishing it would overwrite\n // whatever is stored. Show the failure instead and keep Publish disabled.\n const [loadError, setLoadError] = useState<string | null>(null)\n const latest = useRef<Data>(EMPTY_DATA)\n\n // (Re)load the page's stored layout whenever the slug changes.\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setLoadError(null)\n void (async () => {\n let loaded: Data | null\n try {\n loaded = (await persistence.loadPage<Data>(arbi, live, slug)).data\n } catch (e) {\n if (cancelled) return\n const message = e instanceof Error ? e.message : 'Could not load the page'\n setLoadError(message)\n notify(message, 'error')\n setLoading(false)\n return\n }\n if (cancelled) return\n const next = loaded ?? EMPTY_DATA\n setData(next)\n latest.current = next\n setRev((r) => r + 1)\n setLoading(false)\n })()\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slug, live])\n\n // DEV-only reset seam: clear a slug's stored page so a fresh seed governs the\n // canvas (backend content otherwise wins over localStorage). Lives in the\n // builder so EVERY client's studio gets deterministic test/demo resets for\n // free — no per-client wiring.\n useEffect(() => {\n if (!resetSeam) return\n const w = window as unknown as { __studioResetSlug?: (slug: string) => Promise<void> }\n w.__studioResetSlug = (s) => persistence.deletePage(arbi, live, s)\n return () => {\n delete w.__studioResetSlug\n }\n }, [resetSeam, arbi, live, persistence])\n\n // Publish = save the authoring layout (asset refs preserved, reusable) AND a\n // materialized copy (refs → data: URIs) the unauthenticated public can render.\n const persist = useCallback(\n async (toSave: Data) => {\n setSaving(true)\n try {\n const where = await persistence.savePage(arbi, live, slug, toSave)\n const published = await materializePageData(toSave, materialize)\n await persistence.savePublished(arbi, live, slug, published)\n setVia(where)\n } catch (e) {\n notify(e instanceof Error ? e.message : 'Could not save the page', 'error')\n } finally {\n setSaving(false)\n }\n },\n [arbi, live, slug, persistence, materialize, notify]\n )\n\n // Hydrate the shared theme store from any persisted theme, then preview it live\n // so the canvas is painted exactly as a published page will render.\n useEffect(() => {\n let cancelled = false\n void (async () => {\n let stored: ThemeTokens | null\n try {\n stored = (await persistence.loadTheme<ThemeTokens>(arbi, live)).data\n } catch (e) {\n notify(e instanceof Error ? e.message : 'Could not load the theme', 'error')\n return\n }\n if (cancelled || !stored) return\n themeBundle.useStore.setState({\n colors: { ...defaultTheme.colors, ...stored.colors },\n fonts: stored.fonts ?? defaultTheme.fonts,\n radius: stored.radius ?? defaultTheme.radius,\n activePresetId: null,\n })\n applyStoredTheme(themeBundle)\n })()\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [arbi, live])\n\n // Persist the current theme so PageRenderer can paint published pages.\n const saveThemeToArbi = useCallback(async () => {\n const snapshot = themeBundle.useStore.getState().snapshot()\n try {\n return await persistence.saveTheme(arbi, live, snapshot)\n } catch (e) {\n notify(e instanceof Error ? e.message : 'Could not save the theme', 'error')\n throw e\n }\n }, [arbi, live, persistence, themeBundle, notify])\n\n return (\n <div className=\"al-studio\" data-testid=\"page-studio\">\n {/* Brand toolbar */}\n <header className=\"flex items-center gap-3 border-b border-border bg-card px-4 py-2\">\n {backHref && (\n <>\n <Link\n to={backHref}\n className=\"inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-sm text-muted-foreground hover:text-primary\"\n data-testid={`${testIdPrefix}-back`}\n >\n <ArrowLeft className=\"size-4\" /> {backLabel}\n </Link>\n <span className=\"h-4 w-px bg-border\" />\n </>\n )}\n <span className=\"font-display text-sm font-semibold text-foreground\">{brandLabel}</span>\n <select\n value={slug}\n onChange={(e) => setSlug(e.target.value)}\n className=\"rounded border border-border bg-background px-2 py-1 text-sm\"\n data-testid={`${testIdPrefix}-slug`}\n >\n {pages.map((p) => (\n <option key={p.slug} value={p.slug}>\n {p.label}\n </option>\n ))}\n </select>\n\n <div className=\"ml-auto flex items-center gap-2\">\n {via && (\n <span\n className=\"text-xs text-muted-foreground\"\n data-testid={`${testIdPrefix}-save-via`}\n >\n saved via {via}\n </span>\n )}\n <button\n type=\"button\"\n onClick={() => setThemeOpen((o) => !o)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-1.5 text-sm font-medium text-foreground hover:border-primary hover:text-primary\"\n data-testid={`${testIdPrefix}-theme-toggle`}\n >\n <Palette className=\"size-4\" /> Theme\n </button>\n <button\n type=\"button\"\n onClick={() => void persist(latest.current)}\n disabled={saving || loading || loadError !== null}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-60\"\n data-testid={`${testIdPrefix}-publish`}\n >\n {saving ? <Loader2 className=\"size-4 animate-spin\" /> : <Rocket className=\"size-4\" />}\n {saving ? 'Publishing…' : 'Publish'}\n </button>\n </div>\n </header>\n\n {/* Editor + theme drawer */}\n <div className=\"al-studio__puck relative flex\">\n <div className=\"min-w-0 flex-1\">\n {loadError ? (\n <div\n role=\"alert\"\n className=\"flex h-full items-center justify-center p-6 text-sm text-destructive\"\n data-testid={`${testIdPrefix}-load-error`}\n >\n {loadError}\n </div>\n ) : loading ? (\n <div\n className=\"flex h-full items-center justify-center text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-loading`}\n >\n <Loader2 className=\"mr-2 size-4 animate-spin\" /> Loading “{slug}”…\n </div>\n ) : (\n <AssetResolverProvider render={AssetThumb}>\n <Puck\n key={`${slug}-${rev}`}\n config={config}\n data={data}\n onChange={(d) => {\n latest.current = d\n }}\n onPublish={(d) => void persist(d)}\n />\n </AssetResolverProvider>\n )}\n </div>\n\n {themeOpen && (\n <aside\n className=\"w-80 shrink-0 border-l border-border\"\n data-testid={`${testIdPrefix}-theme-drawer`}\n >\n <ThemeEditor\n bundle={themeBundle}\n variant=\"drawer\"\n testIdPrefix={`${testIdPrefix}-theme`}\n onSave={saveThemeToArbi}\n />\n </aside>\n )}\n </div>\n </div>\n )\n}\n","/**\n * PageRenderer — the public, read-only renderer for a studio-authored page.\n *\n * Loads the **published** Puck `data` for a slug (ARBI → localStorage) and paints\n * it with <Render>. The published copy is self-contained — its image refs were\n * materialized to `data:` URIs at publish — so this renders with no auth (no asset\n * resolver). Falls back to the authoring layout for pages saved before publish.\n * Also applies any persisted theme so a published page looks exactly as it did in\n * the editor. Intended to be mounted at a public route.\n *\n * Firm-agnostic: the block config, persistence, theme defaults and empty-state\n * copy arrive as props; `live` is passed in (never read from env).\n */\nimport { useEffect, useState } from 'react'\nimport { useParams } from 'react-router-dom'\nimport { Render, type Config, type Data } from '@measured/puck'\nimport { useArbi } from '@arbidocs/react'\nimport { applyThemeVars, type ThemeTokens } from '../theme/tokens'\nimport { LiveDataProvider } from './liveWidgetRuntime'\nimport type { StudioPersistence } from './types'\n\nexport interface PageRendererProps {\n config: Config\n persistence: StudioPersistence\n defaultTheme: ThemeTokens\n live: boolean\n slug?: string\n emptyState?: { title: string; body: string }\n testIdPrefix?: string\n /**\n * Render inside a {@link LiveDataProvider}, so live-widget blocks resolve real\n * ARBI data. Only pass this when mounting the renderer INSIDE the authenticated\n * app tree (providers + a selected workspace present); on the public site leave\n * it off and widgets render placeholders.\n */\n liveData?: boolean\n /**\n * Render this page verbatim instead of loading a slug from persistence — for an\n * in-code page (e.g. a config-authored in-app board) that isn't a published\n * studio document. The slug is ignored.\n */\n initialData?: Data\n /**\n * Apply the persisted studio theme to the document (default true). Turn OFF for\n * an in-app renderer so it keeps the ambient app theme instead of repainting the\n * whole document with the marketing palette.\n */\n applyTheme?: boolean\n}\n\nexport function PageRenderer({\n config,\n persistence,\n defaultTheme,\n live,\n slug: slugProp,\n emptyState,\n testIdPrefix = 'studio',\n liveData = false,\n initialData,\n applyTheme = true,\n}: PageRendererProps) {\n const params = useParams()\n const slug = slugProp ?? params.slug ?? 'home'\n const arbi = useArbi()\n\n const [data, setData] = useState<Data | null>(initialData ?? null)\n const [loading, setLoading] = useState(!initialData)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n setLoading(!initialData)\n setError(null)\n void (async () => {\n try {\n // Optionally load + apply the studio theme (off for an in-app renderer, so\n // it keeps the ambient app palette instead of the marketing one).\n const theme = applyTheme\n ? (await persistence.loadTheme<ThemeTokens>(arbi, live)).data\n : undefined\n if (cancelled) return\n // An in-code page renders verbatim; otherwise load the published layout\n // (falling back to the authoring layout for pages that predate a publish).\n const page =\n initialData ??\n (await persistence.loadPublished<Data>(arbi, live, slug)).data ??\n (await persistence.loadPage<Data>(arbi, live, slug)).data\n if (cancelled) return\n if (applyTheme) {\n applyThemeVars(\n theme\n ? { ...defaultTheme, ...theme, colors: { ...defaultTheme.colors, ...theme.colors } }\n : defaultTheme\n )\n }\n setData(page)\n setLoading(false)\n } catch (e) {\n if (cancelled) return\n setError(e instanceof Error ? e.message : 'Could not load the page')\n setLoading(false)\n }\n })()\n return () => {\n cancelled = true\n }\n }, [arbi, live, slug, persistence, defaultTheme, initialData, applyTheme])\n\n if (loading) {\n return (\n <div\n className=\"flex min-h-[60vh] items-center justify-center text-sm text-muted-foreground\"\n data-testid={`${testIdPrefix}-render-loading`}\n >\n Loading page…\n </div>\n )\n }\n\n if (error) {\n return (\n <div\n role=\"alert\"\n className=\"mx-auto max-w-2xl px-5 py-24 text-center text-sm text-destructive\"\n data-testid={`${testIdPrefix}-render-error`}\n >\n {error}\n </div>\n )\n }\n\n if (!data || data.content.length === 0) {\n const title = emptyState?.title ?? 'Nothing published yet'\n const body = emptyState?.body ?? `Publish the “${slug}” page to see it here.`\n return (\n <div\n className=\"mx-auto max-w-2xl px-5 py-24 text-center\"\n data-testid={`${testIdPrefix}-render-empty`}\n >\n <h1 className=\"font-display text-2xl font-semibold text-foreground\">{title}</h1>\n <p className=\"mt-2 text-sm text-muted-foreground\">{body}</p>\n </div>\n )\n }\n\n const rendered = <Render config={config} data={data} />\n return (\n <main data-testid={`page-${testIdPrefix}-render`}>\n {liveData ? <LiveDataProvider>{rendered}</LiveDataProvider> : rendered}\n </main>\n )\n}\n","/**\n * Studio persistence — save/load the Puck page `data` (and the theme) to a\n * host's public marketing workspace.\n *\n * Contract:\n * - Pages are stored as JSON documents named `<slug>.json` in the `site/`\n * folder of the configured workspace.\n * - The theme is stored as `theme.json` in the same folder.\n * - Whichever path is taken (\"arbi\" | \"local\") is returned, so the UI can show\n * where the content lives.\n * - Authored content is NEVER written to localStorage unless the host opts in\n * with `localStorageMode` (default \"off\"), because it would sit there as\n * plaintext next to a zero-knowledge store. When opted in, keys are scoped by\n * `storageScope()` (user + workspace) so two users or workspaces on one\n * browser never read each other's content. Without an ARBI session (or when\n * the ARBI call fails) and without that opt-in, calls REJECT with a\n * {@link StudioPersistenceError}; nothing is silently kept locally.\n *\n * Firm-agnostic: {@link createStudioPersistence} closes the workspace, folder\n * and storage-key constants over a config, returning a {@link StudioPersistence}.\n */\nimport type { useArbi } from '@arbidocs/react'\nimport type { LoadResult, PersistVia, StudioPersistence } from './types'\n\n/** The Arbi instance type, borrowed from the hook so we don't import internals. */\ntype Arbi = ReturnType<typeof useArbi>\n\n/** Thrown instead of silently degrading to plaintext local storage. */\nexport class StudioPersistenceError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'StudioPersistenceError'\n }\n}\n\n/**\n * - `off` (default): never touch localStorage; ARBI failures reject.\n * - `fallback`: use localStorage only when ARBI is unavailable or fails.\n * - `always`: additionally mirror every successful ARBI save locally.\n */\nexport type StudioLocalStorageMode = 'off' | 'fallback' | 'always'\n\nexport interface StudioPersistenceConfig {\n /** The public marketing workspace that backs the site builder. */\n workspaceId: string\n /** Folder inside the workspace where studio artefacts live. */\n folder?: string\n /** Prefix for the localStorage keys (e.g. \"studio-\"); only used when local storage is on. */\n storagePrefix: string\n /** Opt-in plaintext local storage (default \"off\"). */\n localStorageMode?: StudioLocalStorageMode\n /**\n * Isolation scope inserted into every local key, evaluated per call so it follows the\n * current user and workspace (e.g. `${userId}:${workspaceId}`). Required when\n * `localStorageMode` is not \"off\"; without a scope local access rejects.\n */\n storageScope?: () => string | null | undefined\n /** localStorage key for the theme mirror (default `${storagePrefix}theme`). */\n themeStorageKey?: string\n /** File name for the persisted theme document (default \"theme.json\"). */\n themeFileName?: string\n /** File name for a page's persisted document (default `${slug}.json`). */\n pageFileName?: (slug: string) => string\n /** File name for a page's published document (default `${slug}.published.json`). */\n publishedFileName?: (slug: string) => string\n}\n\nexport function createStudioPersistence(cfg: StudioPersistenceConfig): StudioPersistence {\n const WORKSPACE_ID = cfg.workspaceId\n const FOLDER = cfg.folder ?? 'site'\n const MODE: StudioLocalStorageMode = cfg.localStorageMode ?? 'off'\n\n /** Scoped key, or a loud error: an unscoped key would leak across users/workspaces. */\n function scoped(name: string): string {\n const scope = cfg.storageScope?.()\n if (!scope) {\n throw new StudioPersistenceError(\n 'Studio local storage needs a user/workspace scope (storageScope) before it can be used'\n )\n }\n return `${cfg.storagePrefix}${scope}:${name}`\n }\n const pageKey = (slug: string) => scoped(slug)\n const publishedKey = (slug: string) => scoped(`published-${slug}`)\n const themeKey = () => scoped(cfg.themeStorageKey ?? 'theme')\n const localAllowed = (arbiFailed: boolean) =>\n MODE === 'always' || (MODE === 'fallback' && arbiFailed)\n\n function unavailable(what: string, cause?: unknown): StudioPersistenceError {\n return new StudioPersistenceError(\n `${what}: no ARBI session or the ARBI request failed, and local storage is not enabled`,\n { cause }\n )\n }\n const THEME_FILE = cfg.themeFileName ?? 'theme.json'\n const pageFile = cfg.pageFileName ?? ((slug: string) => `${slug}.json`)\n const publishedFile = cfg.publishedFileName ?? ((slug: string) => `${slug}.published.json`)\n\n /** Should we even attempt the live backend? Demo sessions have no real store. */\n function canUseArbi(arbi: Arbi | null, live: boolean): arbi is Arbi {\n return live && !!arbi\n }\n\n /** Write JSON to the workspace as a named document; throws on failure. */\n async function uploadJson(arbi: Arbi, fileName: string, obj: unknown): Promise<void> {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const blob = new Blob([JSON.stringify(obj, null, 2)], { type: 'application/json' })\n await arbi.documents.uploadFile(blob, fileName, { folder: FOLDER })\n }\n\n /** Read + parse the most recent `site/<fileName>` document, or null if absent. */\n async function downloadJson<T>(arbi: Arbi, fileName: string): Promise<T | null> {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const docs = await arbi.documents.list()\n // Newest wins if the same name was uploaded more than once.\n const match = docs\n .filter((d) => (d.file_name ?? '').endsWith(fileName) && (d.folder ?? '').includes(FOLDER))\n .sort((a, b) => (a.created_at < b.created_at ? 1 : -1))[0]\n if (!match) return null\n\n // Prefer the raw bytes (round-trips JSON exactly); fall back to parsed content.\n try {\n const res = await arbi.documents.download(match.external_id)\n return JSON.parse(await res.text()) as T\n } catch {\n const parsed = await arbi.documents.getParsedContent(match.external_id, 'content')\n const raw = typeof parsed?.content === 'string' ? parsed.content : JSON.stringify(parsed)\n return JSON.parse(raw) as T\n }\n }\n\n function writeLocal(key: string, data: unknown): void {\n try {\n localStorage.setItem(key, JSON.stringify(data))\n } catch (e) {\n throw new StudioPersistenceError('Could not write to local storage', { cause: e })\n }\n }\n\n /** Persist a page-shaped artifact (authoring or published). */\n async function writePage(\n arbi: Arbi | null,\n live: boolean,\n kind: string,\n localKey: () => string,\n fileName: string,\n data: unknown\n ): Promise<PersistVia> {\n let failure: unknown\n if (canUseArbi(arbi, live)) {\n try {\n await uploadJson(arbi, fileName, data)\n if (localAllowed(false)) writeLocal(localKey(), data)\n return 'arbi'\n } catch (e) {\n if (e instanceof StudioPersistenceError) throw e\n failure = e\n }\n }\n if (!localAllowed(true)) throw unavailable(`Cannot save ${kind} \"${fileName}\"`, failure)\n writeLocal(localKey(), data)\n return 'local'\n }\n\n /** Load a page-shaped artifact from ARBI (and, only when opted in, localStorage). */\n async function readPage<T>(\n arbi: Arbi | null,\n live: boolean,\n localKey: () => string,\n fileName: string\n ): Promise<LoadResult<T>> {\n let arbiTried = false\n if (canUseArbi(arbi, live)) {\n arbiTried = true\n try {\n const data = await downloadJson<T>(arbi, fileName)\n if (data) return { data, via: 'arbi' }\n } catch (e) {\n if (MODE === 'off') throw unavailable(`Cannot load \"${fileName}\"`, e)\n }\n }\n if (MODE === 'off') {\n if (arbiTried) return { data: null, via: 'arbi' }\n throw unavailable(`Cannot load \"${fileName}\"`)\n }\n return readLocal<T>(localKey())\n }\n\n function readLocal<T>(key: string): LoadResult<T> {\n const raw = safeLocalGet(key)\n return { data: raw ? (JSON.parse(raw) as T) : null, via: 'local' }\n }\n\n /** Persist a page's authoring layout (image values stay `asset:` refs). */\n function savePage(arbi: Arbi | null, live: boolean, slug: string, data: unknown) {\n return writePage(arbi, live, 'page', () => pageKey(slug), pageFile(slug), data)\n }\n\n function loadPage<T>(arbi: Arbi | null, live: boolean, slug: string) {\n return readPage<T>(arbi, live, () => pageKey(slug), pageFile(slug))\n }\n\n /** Persist a page's published (materialized) layout, read by the public renderer. */\n function savePublished(arbi: Arbi | null, live: boolean, slug: string, data: unknown) {\n return writePage(\n arbi,\n live,\n 'published page',\n () => publishedKey(slug),\n publishedFile(slug),\n data\n )\n }\n\n function loadPublished<T>(arbi: Arbi | null, live: boolean, slug: string) {\n return readPage<T>(arbi, live, () => publishedKey(slug), publishedFile(slug))\n }\n\n /** Delete a slug's stored pages (authoring + published) from the backend and\n * the localStorage mirror, so the page resets to empty / a fresh seed governs. */\n async function deletePage(arbi: Arbi | null, live: boolean, slug: string): Promise<void> {\n if (MODE !== 'off') {\n try {\n localStorage.removeItem(pageKey(slug))\n localStorage.removeItem(publishedKey(slug))\n } catch (e) {\n if (e instanceof StudioPersistenceError) throw e\n /* storage may be unavailable */\n }\n }\n if (!canUseArbi(arbi, live)) return\n try {\n await arbi.selectWorkspace(WORKSPACE_ID)\n const docs = await arbi.documents.list()\n const names = [pageFile(slug), publishedFile(slug)]\n const ids = docs\n .filter(\n (d) =>\n (d.folder ?? '').includes(FOLDER) && names.some((n) => (d.file_name ?? '').endsWith(n))\n )\n .map((d) => d.external_id)\n if (ids.length) await arbi.documents.delete(ids)\n } catch (e) {\n throw new StudioPersistenceError(`Could not delete the stored page \"${slug}\" from ARBI`, {\n cause: e,\n })\n }\n }\n\n /** Persist the theme token set. */\n async function saveTheme(arbi: Arbi | null, live: boolean, theme: unknown): Promise<PersistVia> {\n return writePage(arbi, live, 'theme', themeKey, THEME_FILE, theme)\n }\n\n /** Load the theme token set. */\n async function loadTheme<T>(arbi: Arbi | null, live: boolean): Promise<LoadResult<T>> {\n return readPage<T>(arbi, live, themeKey, THEME_FILE)\n }\n\n function safeLocalGet(key: string): string | null {\n try {\n return localStorage.getItem(key)\n } catch {\n return null\n }\n }\n\n return { savePage, loadPage, savePublished, loadPublished, deletePage, saveTheme, loadTheme }\n}\n","/**\n * \"Write with AI\" fields — custom Puck fields that render a text input/area plus\n * a control that drafts copy grounded in a host's marketing workspace documents\n * (via the AI kit's `useAiTask`).\n *\n * The generation is non-blocking: the button shows a spinner while streaming and\n * the field fills live as tokens arrive. \"AI proposes\" — the editor still edits\n * and publishes the copy themselves. Firm-agnostic: {@link createAiFields} closes\n * the workspace id, prompt voice and testid prefix over a config.\n */\nimport { useEffect, useRef, useState } from 'react'\nimport { Loader2, Sparkles } from 'lucide-react'\nimport type { CustomField } from '@measured/puck'\nimport { useAiTask, useWorkspaceDocs as useKitWorkspaceDocs } from '@arbidocs/react'\nimport { tid } from '../lib/testid'\nimport type { BuildPrompt } from './types'\n\nexport interface AiFieldsConfig {\n /** The marketing workspace the AI grounds on. */\n workspaceId: string\n /** Turns a field's kind/label/current text into an instruction. */\n buildPrompt: BuildPrompt\n /** Default prompt kind when a field does not specify one. */\n defaultKind?: string\n /** Testid namespace for the field + write button. */\n testIdPrefix?: string\n}\n\nexport interface AiFields {\n aiText: (label: string, placeholder?: string) => CustomField<string>\n aiTextarea: (label: string, placeholder?: string, kind?: string) => CustomField<string>\n}\n\ninterface AiTextFieldProps {\n value: string\n onChange: (v: string) => void\n name: string\n label: string\n multiline?: boolean\n placeholder?: string\n kind: string\n workspaceId: string\n buildPrompt: BuildPrompt\n testIdPrefix: string\n}\n\nfunction AiTextField({\n value,\n onChange,\n name,\n label,\n multiline,\n placeholder,\n kind,\n workspaceId,\n buildPrompt,\n testIdPrefix,\n}: AiTextFieldProps) {\n const { docIds } = useKitWorkspaceDocs(workspaceId)\n const task = useAiTask()\n const [active, setActive] = useState(false)\n const activeRef = useRef(false)\n\n // Stream tokens straight into the field while a generation is in flight.\n useEffect(() => {\n if (activeRef.current && task.text) onChange(task.text)\n }, [task.text, onChange])\n\n useEffect(() => {\n if (active && !task.isRunning) {\n activeRef.current = false\n setActive(false)\n }\n }, [active, task.isRunning])\n\n const write = async () => {\n if (task.isRunning) return\n activeRef.current = true\n setActive(true)\n await task.run(buildPrompt({ kind, label, current: value ?? '' }), docIds)\n }\n\n const inputTid = tid(`${testIdPrefix}-field`, name)\n\n return (\n <div className=\"al-ai-field\">\n {multiline ? (\n <textarea\n className=\"al-ai-field__input\"\n rows={5}\n value={value ?? ''}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n data-testid={inputTid}\n />\n ) : (\n <input\n className=\"al-ai-field__input\"\n value={value ?? ''}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n data-testid={inputTid}\n />\n )}\n <button\n type=\"button\"\n className=\"al-ai-field__btn\"\n onClick={() => void write()}\n disabled={task.isRunning}\n data-testid={tid(`${testIdPrefix}-ai-write`, name)}\n title=\"Draft this field with AI, grounded in the marketing workspace\"\n >\n {task.isRunning ? (\n <Loader2 className=\"size-3 animate-spin\" />\n ) : (\n <Sparkles className=\"size-3\" />\n )}\n {task.isRunning ? 'Writing…' : 'Write with AI'}\n </button>\n </div>\n )\n}\n\nexport function createAiFields(cfg: AiFieldsConfig): AiFields {\n const { workspaceId, buildPrompt } = cfg\n const defaultKind = cfg.defaultKind ?? 'copy'\n const testIdPrefix = cfg.testIdPrefix ?? 'studio'\n\n /** An AI-authorable single-line text field. */\n const aiText = (label: string, placeholder?: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <AiTextField\n value={value ?? ''}\n onChange={onChange}\n name={name}\n label={label}\n placeholder={placeholder}\n kind={defaultKind}\n workspaceId={workspaceId}\n buildPrompt={buildPrompt}\n testIdPrefix={testIdPrefix}\n />\n ),\n })\n\n /** An AI-authorable multi-line text field. */\n const aiTextarea = (\n label: string,\n placeholder?: string,\n kind: string = defaultKind\n ): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <AiTextField\n value={value ?? ''}\n onChange={onChange}\n name={name}\n label={label}\n placeholder={placeholder}\n kind={kind}\n workspaceId={workspaceId}\n buildPrompt={buildPrompt}\n testIdPrefix={testIdPrefix}\n multiline\n />\n ),\n })\n\n return { aiText, aiTextarea }\n}\n","/**\n * useImageGen — the typed capability hook behind image generation.\n *\n * Wraps the connected AI task with the `/image` slash-command contract so callers\n * never hand-assemble the command string or dig the generated document out of\n * the artifact stream. `/image <prompt>` runs the normal agent loop with the\n * image tool force-enabled (backend `create_image`); the produced PNG arrives\n * as an `ArtifactEvent` with `mode: 'image'` carrying the workspace document\n * ext_id — which is what gets stored as the asset reference.\n */\nimport { useCallback, useMemo } from 'react'\nimport type { AiTaskStatus, ArtifactEvent } from './ai'\nimport { useConnectedAiTask } from './ai'\n\n/** ext_id of the newest image artifact in a list, or null if there is none. */\nfunction latestImageDocId(artifacts: readonly ArtifactEvent[]): string | null {\n for (let i = artifacts.length - 1; i >= 0; i--) {\n if (artifacts[i].mode === 'image') return artifacts[i].doc_ext_id\n }\n return null\n}\n\nexport interface UseImageGen {\n /** ext_id of the most recently generated image document (null until one exists). */\n docExtId: string | null\n /** Underlying task status: 'idle' | 'running' | 'done' | 'error'. */\n status: AiTaskStatus\n /** Human-readable failure message, or null. */\n error: string | null\n /** True while a generation is in flight. */\n isGenerating: boolean\n /**\n * Generate an image from a prompt, optionally editing / drawing on one or\n * more reference images already in the workspace. Pass the reference images'\n * document ext_ids in `referenceDocIds` (omit or `[]` for plain text→image).\n * Resolves with the new image document's ext_id, or null when the prompt is\n * empty or no image was produced.\n */\n generate: (prompt: string, referenceDocIds?: string[]) => Promise<string | null>\n /** Clear the current result and error. */\n reset: () => void\n}\n\nexport function useImageGen(): UseImageGen {\n const task = useConnectedAiTask()\n const { run } = task\n\n const generate = useCallback(\n async (prompt: string, referenceDocIds: string[] = []): Promise<string | null> => {\n const trimmed = prompt.trim()\n if (!trimmed) return null\n // `/image` rides the agent pipeline; the backend resolves the active\n // workspace from the session. Reference images are *grounded* on the task\n // (second arg) — they land in the agent's document index (typed as images\n // via its Type column), so the create_image tool picks them up as\n // `input_image_doc_ids`. Empty → plain text→image.\n const result = await run(`/image ${trimmed}`, referenceDocIds)\n return latestImageDocId(result?.artifacts ?? [])\n },\n [run]\n )\n\n const docExtId = useMemo(() => latestImageDocId(task.artifacts), [task.artifacts])\n\n return {\n docExtId,\n status: task.status,\n error: task.error,\n isGenerating: task.isRunning,\n generate,\n reset: task.reset,\n }\n}\n","/**\n * The image field — a custom Puck field for choosing an image any of the ways an\n * author expects: pick an existing **workspace asset**, **upload** from the\n * computer, paste a **URL**, or **generate** one with AI. Upload and generate both\n * save a workspace document, so every image lands in the reusable asset library.\n *\n * The stored value is a workspace **asset ref** (`asset:<docId>`) for asset /\n * upload / generate, or a plain URL for the URL mode. The editor previews a ref\n * via its thumbnail (see {@link AssetResolverProvider}); at publish the ref is\n * inlined to a `data:` URI (see the studio publish step). Firm-agnostic:\n * {@link createImageField} closes the workspace id and testid prefix over a config.\n */\nimport { useMemo, useState, type ChangeEvent } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { Check, Crop, ImagePlus, Link2, Loader2, Sparkles, Upload } from 'lucide-react'\nimport type { CustomField } from '@measured/puck'\nimport {\n useArbi,\n useDocuments,\n useThumbnails,\n ImageCropModal,\n DEFAULT_ASPECT_OPTIONS,\n type CropResult,\n} from '@arbidocs/react'\nimport { asAssetRef, assetRefId, isAssetRef } from '../components/assetResolver'\nimport { useAssetImage } from '../components/assetImage'\nimport { BlockImage } from '../components/BlockImage'\nimport { useImageGen } from '../connection/useImageGen'\nimport { tid } from '../lib/testid'\nimport { formatCount } from '../lib/format'\n\n/** Force a JPEG extension on a crop-exported filename. */\nfunction toJpgName(name: string): string {\n return name.replace(/\\.[^.]+$/, '') + '.jpg'\n}\n\nexport interface ImageFieldConfig {\n /** The workspace uploads/generations are saved to, and assets are picked from. */\n workspaceId: string\n /** Folder for uploaded/authored assets. Default \"assets\". */\n folder?: string\n /** Testid namespace. Default \"studio\". */\n testIdPrefix?: string\n}\n\nexport interface ImageFieldFactory {\n imageField: (label: string) => CustomField<string>\n}\n\ntype Mode = 'asset' | 'upload' | 'url' | 'generate'\n\ninterface ControlProps {\n value: string\n onChange: (v: string) => void\n name: string\n workspaceId: string\n folder: string\n testIdPrefix: string\n}\n\nconst IMAGE_EXT = /\\.(png|jpe?g|webp|gif|avif|svg)$/i\n\nfunction ImageFieldControl({\n value,\n onChange,\n name,\n workspaceId,\n folder,\n testIdPrefix,\n}: ControlProps) {\n const [mode, setMode] = useState<Mode>('asset')\n const [url, setUrl] = useState('')\n const [prompt, setPrompt] = useState('')\n const [busy, setBusy] = useState(false)\n // Reference images (doc ext_ids) to edit / draw on when generating. Empty is a\n // plain text→image; one or more turns it into an edit / variation.\n const [refIds, setRefIds] = useState<string[]>([])\n // Crop workflow: the image being framed + the filename to save it under.\n const [cropSrc, setCropSrc] = useState<string | null>(null)\n const [cropName, setCropName] = useState('image.jpg')\n const arbi = useArbi()\n const gen = useImageGen()\n const queryClient = useQueryClient()\n\n // Resolved image for the current asset value — lets us reframe an already\n // uploaded OR generated image (both are asset refs). Empty id → undefined.\n const currentAssetImage = useAssetImage(isAssetRef(value) ? assetRefId(value) : '')\n\n const tp = (...q: (string | number)[]) => tid(`${testIdPrefix}-image`, name, ...q)\n\n // A freshly uploaded/generated asset must appear in the picker grid at once —\n // refresh the workspace document list (and its thumbnails) so it's selectable.\n const refreshAssets = () =>\n queryClient.invalidateQueries({ queryKey: ['arbi', 'documents', workspaceId] })\n\n // Workspace image documents, for the \"pick an existing asset\" grid.\n const { data: docs } = useDocuments(workspaceId)\n const imageDocs = useMemo(\n () =>\n (docs ?? []).filter(\n (d: { file_name?: string | null }) => d.file_name && IMAGE_EXT.test(d.file_name)\n ),\n [docs]\n )\n const imageIds = useMemo(\n () => imageDocs.map((d: { external_id: string }) => d.external_id),\n [imageDocs]\n )\n const { data: thumbs } = useThumbnails(imageIds)\n\n // Uploading and reframing both route through the crop modal, then save the\n // framed result as a workspace asset — one path, whatever the source.\n const onUpload = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n setCropName(toJpgName(file.name))\n setCropSrc(URL.createObjectURL(file))\n e.target.value = '' // allow re-picking the same file\n }\n\n const openReframe = () => {\n if (!currentAssetImage) return\n setCropName('reframe.jpg')\n setCropSrc(currentAssetImage)\n }\n\n const uploadBlobAsAsset = async (blob: Blob, name: string) => {\n setBusy(true)\n try {\n await arbi.selectWorkspace(workspaceId)\n const file = new File([blob], name, { type: blob.type })\n const res = await arbi.documents.uploadFile(file, name, { folder })\n const id = res.doc_ext_ids?.[0]\n if (id) {\n onChange(asAssetRef(id))\n void refreshAssets()\n }\n } finally {\n setBusy(false)\n }\n }\n\n const onCropComplete = async (result: CropResult) => {\n const src = cropSrc\n setCropSrc(null)\n await uploadBlobAsAsset(result.blob, cropName)\n if (src?.startsWith('blob:')) URL.revokeObjectURL(src)\n }\n\n // Toggle a workspace image doc in/out of the reference set.\n const toggleRef = (id: string) =>\n setRefIds((prev) => (prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]))\n\n const onGenerate = async () => {\n if (!prompt.trim() || gen.isGenerating) return\n const id = await gen.generate(prompt, refIds)\n if (id) {\n onChange(asAssetRef(id))\n setRefIds([]) // fresh slate for the next generation\n void refreshAssets()\n }\n }\n\n const MODES: { key: Mode; label: string; icon: typeof Upload }[] = [\n { key: 'asset', label: 'Assets', icon: ImagePlus },\n { key: 'upload', label: 'Upload', icon: Upload },\n { key: 'url', label: 'URL', icon: Link2 },\n { key: 'generate', label: 'Generate', icon: Sparkles },\n ]\n\n const inputClass =\n 'w-full rounded-md border border-border bg-card px-2.5 py-1.5 text-sm text-foreground outline-none focus:border-primary'\n const tabClass = (on: boolean) =>\n `inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium ${\n on ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'\n }`\n\n return (\n <div className=\"flex flex-col gap-2\" data-testid={tp()}>\n <div className=\"relative\">\n <BlockImage src={value} aspect=\"16:9\" rounded=\"md\" testId={tp('preview')} />\n {currentAssetImage ? (\n <button\n type=\"button\"\n onClick={openReframe}\n className=\"absolute right-1.5 top-1.5 inline-flex items-center gap-1 rounded-md bg-background/85 px-2 py-1 text-xs font-medium text-foreground shadow-sm backdrop-blur hover:bg-background\"\n data-testid={tp('reframe')}\n >\n <Crop className=\"size-3\" /> Crop\n </button>\n ) : null}\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {MODES.map((m) => (\n <button\n key={m.key}\n type=\"button\"\n className={tabClass(mode === m.key)}\n onClick={() => setMode(m.key)}\n data-testid={tp('mode', m.key)}\n >\n <m.icon className=\"size-3\" /> {m.label}\n </button>\n ))}\n </div>\n\n {mode === 'asset' && (\n <div className=\"grid max-h-48 grid-cols-3 gap-1.5 overflow-auto\" data-testid={tp('assets')}>\n {imageDocs.length === 0 && (\n <p className=\"col-span-3 py-3 text-center text-xs text-muted-foreground\">\n No image assets yet — upload or generate one.\n </p>\n )}\n {imageDocs.map((d: { external_id: string; file_name?: string | null }) => {\n const thumb = thumbs?.[d.external_id]\n const selected = value === asAssetRef(d.external_id)\n return (\n <button\n key={d.external_id}\n type=\"button\"\n onClick={() => onChange(asAssetRef(d.external_id))}\n className={`overflow-hidden rounded border ${selected ? 'border-primary ring-1 ring-primary' : 'border-border'}`}\n title={d.file_name ?? ''}\n data-testid={tp('asset', d.external_id)}\n >\n {thumb ? (\n <img\n src={thumb}\n alt={d.file_name ?? ''}\n className=\"aspect-square w-full bg-muted object-contain\"\n />\n ) : (\n <span className=\"flex aspect-square w-full items-center justify-center bg-muted text-muted-foreground\">\n <ImagePlus className=\"size-4\" />\n </span>\n )}\n </button>\n )\n })}\n </div>\n )}\n\n {mode === 'upload' && (\n <label className=\"inline-flex cursor-pointer items-center gap-2 rounded-md border border-border px-2.5 py-1.5 text-sm text-foreground\">\n {busy ? <Loader2 className=\"size-4 animate-spin\" /> : <Upload className=\"size-4\" />}\n {busy ? 'Uploading…' : 'Choose a file'}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n disabled={busy}\n onChange={(e) => void onUpload(e)}\n data-testid={tp('upload')}\n />\n </label>\n )}\n\n {mode === 'url' && (\n <div className=\"flex gap-1.5\">\n <input\n className={inputClass}\n placeholder=\"https://…\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n data-testid={tp('url')}\n />\n <button\n type=\"button\"\n className=\"rounded-md bg-primary px-2.5 py-1.5 text-sm font-medium text-primary-foreground disabled:opacity-50\"\n disabled={!url.trim()}\n onClick={() => onChange(url.trim())}\n data-testid={tp('url-apply')}\n >\n Use\n </button>\n </div>\n )}\n\n {mode === 'generate' && (\n <div className=\"flex flex-col gap-1.5\">\n {/* Reference images (optional): edit or draw on existing workspace\n images. Multi-select — the backend accepts one or more. */}\n {imageDocs.length > 0 && (\n <div className=\"flex flex-col gap-1\" data-testid={tp('refs')}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">\n Reference images{refIds.length > 0 ? ` (${refIds.length})` : ' (optional)'}\n </span>\n {isAssetRef(value) && (\n <button\n type=\"button\"\n className=\"text-xs font-medium text-primary hover:underline\"\n onClick={() => toggleRef(assetRefId(value))}\n data-testid={tp('vary-current')}\n >\n {refIds.includes(assetRefId(value)) ? 'Varying current' : 'Vary current image'}\n </button>\n )}\n </div>\n <div className=\"grid max-h-28 grid-cols-4 gap-1.5 overflow-auto\">\n {imageDocs.map((d: { external_id: string; file_name?: string | null }) => {\n const thumb = thumbs?.[d.external_id]\n const on = refIds.includes(d.external_id)\n return (\n <button\n key={d.external_id}\n type=\"button\"\n onClick={() => toggleRef(d.external_id)}\n aria-pressed={on}\n className={`relative overflow-hidden rounded border ${on ? 'border-primary ring-1 ring-primary' : 'border-border'}`}\n title={d.file_name ?? ''}\n data-testid={tp('ref', d.external_id)}\n >\n {thumb ? (\n <img\n src={thumb}\n alt={d.file_name ?? ''}\n className=\"aspect-square w-full bg-muted object-contain\"\n />\n ) : (\n <span className=\"flex aspect-square w-full items-center justify-center bg-muted text-muted-foreground\">\n <ImagePlus className=\"size-3.5\" />\n </span>\n )}\n {on && (\n <span className=\"absolute right-0.5 top-0.5 rounded-full bg-primary p-0.5 text-primary-foreground\">\n <Check className=\"size-2.5\" />\n </span>\n )}\n </button>\n )\n })}\n </div>\n </div>\n )}\n <textarea\n className={inputClass}\n rows={2}\n placeholder={refIds.length > 0 ? 'Describe the edit to apply…' : 'Describe the image…'}\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n data-testid={tp('prompt')}\n />\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 self-start rounded-md bg-primary px-2.5 py-1.5 text-sm font-medium text-primary-foreground disabled:opacity-50\"\n disabled={!prompt.trim() || gen.isGenerating}\n onClick={() => void onGenerate()}\n data-testid={tp('generate')}\n >\n {gen.isGenerating ? (\n <Loader2 className=\"size-3.5 animate-spin\" />\n ) : (\n <Sparkles className=\"size-3.5\" />\n )}\n {gen.isGenerating\n ? 'Generating…'\n : refIds.length > 0\n ? `Generate from ${formatCount(refIds.length, { one: 'reference', other: 'references' })}`\n : 'Generate'}\n </button>\n {gen.error && (\n <span className=\"text-xs text-destructive\" role=\"alert\">\n {gen.error}\n </span>\n )}\n </div>\n )}\n\n {value && (\n <button\n type=\"button\"\n className=\"self-start text-xs text-muted-foreground hover:text-foreground\"\n onClick={() => onChange('')}\n data-testid={tp('clear')}\n >\n Clear\n </button>\n )}\n\n <ImageCropModal\n open={!!cropSrc}\n image={cropSrc}\n title=\"Frame your image\"\n aspectOptions={DEFAULT_ASPECT_OPTIONS}\n cropShape=\"rect\"\n output={{ maxSize: 1600 }}\n onComplete={onCropComplete}\n onCancel={() => setCropSrc(null)}\n />\n </div>\n )\n}\n\n/** Build the image field, closing over the host's workspace + testid prefix. */\nexport function createImageField(cfg: ImageFieldConfig): ImageFieldFactory {\n const { workspaceId } = cfg\n const folder = cfg.folder ?? 'assets'\n const testIdPrefix = cfg.testIdPrefix ?? 'studio'\n\n const imageField = (label: string): CustomField<string> => ({\n type: 'custom',\n label,\n render: ({ value, onChange, name }) => (\n <ImageFieldControl\n value={value ?? ''}\n onChange={onChange}\n name={name}\n workspaceId={workspaceId}\n folder={folder}\n testIdPrefix={testIdPrefix}\n />\n ),\n })\n\n return { imageField }\n}\n","/**\n * Standard section shell — max-width, padding and an optional tone. Token-only so\n * it themes to whatever app consumes it; shared by blocks that echo a page's\n * section rhythm.\n *\n * The `ink` tone is a true **dark island**: it scopes a full inverted `--color-*`\n * context (background↔foreground swapped, card/muted/border derived), so any child\n * block that uses semantic tokens renders correctly on a dark surface. This lets a\n * single page mix genuinely light and dark sections.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport type SectionTone = 'default' | 'muted' | 'ink'\nexport type SectionPadding = 'none' | 'sm' | 'md' | 'lg'\nexport type SectionWidth = 'narrow' | 'default' | 'wide' | 'full'\n\nexport interface SectionProps {\n children: ReactNode\n tone?: SectionTone\n padding?: SectionPadding\n maxWidth?: SectionWidth\n /** Subtle grain/texture overlay in the current text colour (editorial surfaces). */\n texture?: boolean\n className?: string\n}\n\n/** A dependency-free micro-dot grain in `currentColor`, kept very faint. */\nconst TEXTURE_STYLE: CSSProperties = {\n backgroundImage: 'radial-gradient(currentColor 0.5px, transparent 0.5px)',\n backgroundSize: '4px 4px',\n opacity: 0.04,\n}\n\nconst PADDING: Record<SectionPadding, string> = {\n none: '',\n sm: 'py-8 lg:py-10',\n md: 'py-16 lg:py-20',\n lg: 'py-24 lg:py-28',\n}\n\nconst WIDTH: Record<SectionWidth, string> = {\n narrow: 'max-w-3xl',\n default: 'max-w-7xl',\n wide: 'max-w-[90rem]',\n full: 'max-w-none',\n}\n\n/** A scoped inverted token context — the \"dark island\". */\nconst INVERTED_VARS: CSSProperties = {\n ['--color-background' as string]: 'var(--color-foreground)',\n ['--color-foreground' as string]: 'var(--color-background)',\n ['--color-card' as string]: 'color-mix(in srgb, var(--color-foreground) 92%, #fff)',\n ['--color-muted' as string]: 'color-mix(in srgb, var(--color-foreground) 85%, #fff)',\n ['--color-muted-foreground' as string]:\n 'color-mix(in srgb, var(--color-background) 60%, transparent)',\n ['--color-border' as string]: 'color-mix(in srgb, var(--color-background) 18%, transparent)',\n ['--color-accent' as string]: 'color-mix(in srgb, var(--color-foreground) 80%, #fff)',\n}\n\nexport function Section({\n children,\n tone = 'default',\n padding = 'md',\n maxWidth = 'default',\n texture,\n className = '',\n}: SectionProps) {\n const inverted = tone === 'ink'\n const toneClass = inverted\n ? 'bg-background text-foreground'\n : tone === 'muted'\n ? 'border-y border-border bg-card/40'\n : ''\n return (\n <section className={cn('relative', toneClass)} style={inverted ? INVERTED_VARS : undefined}>\n {texture && (\n <div className=\"pointer-events-none absolute inset-0\" style={TEXTURE_STYLE} aria-hidden />\n )}\n <div\n className={cn(\n 'relative mx-auto px-5 lg:px-8',\n WIDTH[maxWidth],\n PADDING[padding],\n className\n )}\n >\n {children}\n </div>\n </section>\n )\n}\n","/**\n * Shared field helpers for the block registry. Every block config — the built-ins\n * in {@link createArbiBlocksConfig} and the website blocks in\n * {@link file://./websiteBlocks.tsx} — builds its Puck fields from this one kit so\n * the AI-or-plain copy fallback, the icon `select`, the tone/bool radios and the\n * stable render-time testid are declared once.\n */\nimport type { Field } from '@measured/puck'\nimport type { LucideIcon } from 'lucide-react'\nimport {\n Activity,\n AlertCircle,\n Award,\n BarChart3,\n Bell,\n Briefcase,\n Calendar,\n CheckCircle,\n Clock,\n Cloud,\n Code,\n Cpu,\n DollarSign,\n FileText,\n Folder,\n Gavel,\n Globe,\n Heart,\n Info,\n Layers,\n Lock,\n Mail,\n MapPin,\n MessageSquare,\n Phone,\n Rocket,\n Scale,\n Shield,\n Sparkles,\n Star,\n Target,\n TrendingUp,\n Users,\n Zap,\n} from 'lucide-react'\nimport { tid } from '../lib/testid'\nimport type { AiFields } from './aiFields'\n\n// ── Icon registry ─────────────────────────────────────────────────────────────\n// A curated set of common back-office + marketing icons exposed as a `select`. The\n// editor picks a name; {@link BlockKit.resolveIcon} maps it back to the component.\nexport const iconMap: Record<string, LucideIcon> = {\n FileText,\n Folder,\n Users,\n Briefcase,\n Calendar,\n Clock,\n CheckCircle,\n AlertCircle,\n Info,\n TrendingUp,\n DollarSign,\n BarChart3,\n Activity,\n Bell,\n Scale,\n Gavel,\n Sparkles,\n // Marketing set\n Zap,\n Shield,\n Rocket,\n Star,\n Heart,\n Globe,\n Lock,\n Mail,\n Phone,\n MapPin,\n Award,\n Target,\n Layers,\n Cloud,\n Code,\n Cpu,\n MessageSquare,\n}\n\nconst ICON_OPTIONS = [\n { label: 'None', value: '' },\n ...Object.keys(iconMap).map((name) => ({ label: name, value: name })),\n]\n\n/** The bundle of field helpers a block config needs. */\nexport interface BlockKit {\n /** Single-line copy: AI-authorable when a host supplies aiFields, else plain text. */\n textField: (label: string, placeholder?: string) => Field\n /** Multi-line copy: AI-authorable when a host supplies aiFields, else plain textarea. */\n textareaField: (label: string, placeholder?: string, kind?: string) => Field\n /** Image source: a workspace-asset picker when a host supplies imageField, else a URL input. */\n imageField: (label: string) => Field\n /** A Yes/No radio. */\n boolRadio: (label: string) => Field\n /** A `select` over {@link iconMap} names. */\n iconField: (label?: string) => Field\n /** Resolve an icon name to its Lucide component. */\n resolveIcon: (name?: string) => LucideIcon | undefined\n /** Stable, e2e-locatable testid derived from a block's Puck id. */\n blockTestId: (id: string) => string\n /**\n * Optional host override for the eyebrow style on heading-bearing blocks\n * (Hero, Section heading). Lets a consumer render a brand accent (e.g. a brass\n * eyebrow) without forking the blocks. Undefined → the default token classes.\n */\n eyebrowClassName?: string\n}\n\n/** Build the shared field helpers, closing over the host's optional AI + image fields. */\nexport function createBlockKit(\n ai?: AiFields,\n image?: (label: string) => Field,\n eyebrowClassName?: string\n): BlockKit {\n return {\n eyebrowClassName,\n textField: (label, placeholder) =>\n ai ? (ai.aiText(label, placeholder) as Field) : { type: 'text', label, placeholder },\n textareaField: (label, placeholder, kind) =>\n ai\n ? (ai.aiTextarea(label, placeholder, kind) as Field)\n : { type: 'textarea', label, placeholder },\n imageField: (label) => (image ? image(label) : { type: 'text', label }),\n boolRadio: (label) => ({\n type: 'radio',\n label,\n options: [\n { label: 'No', value: false },\n { label: 'Yes', value: true },\n ],\n }),\n iconField: (label = 'Icon') => ({ type: 'select', label, options: ICON_OPTIONS }),\n resolveIcon: (name) => (name ? iconMap[name] : undefined),\n blockTestId: (id) => tid('arbi-block', id),\n }\n}\n","/**\n * Website-building blocks for the shared registry — the marketing vocabulary a user\n * drags to design a full site: heroes, feature grids, stats, testimonials, CTAs,\n * FAQs, navigation, media and layout primitives.\n *\n * Every block is serializable-only (text/textarea/number/radio/select/array/object/\n * slot/custom-AI — no function/ReactNode props), token-clean (semantic tokens so D1\n * live-theming recolours it), routes copy through the shared AI-or-plain fields, has\n * a stable render-time `data-testid`, and ships sensible defaults so it looks good\n * the moment it is dropped.\n */\nimport type { ComponentType, ReactNode } from 'react'\nimport type { ComponentConfig, Field } from '@measured/puck'\nimport type { BlockKit } from './blockKit'\nimport { Hero } from '../components/Hero'\nimport { FeatureGrid } from '../components/FeatureGrid'\nimport { StatGroup } from '../components/StatGroup'\nimport { Testimonial } from '../components/Testimonial'\nimport { CTABanner } from '../components/CTABanner'\nimport { LogoCloud } from '../components/LogoCloud'\nimport { FAQ } from '../components/FAQ'\nimport { RichTextBlock } from '../components/RichTextBlock'\nimport { Callout } from '../components/Callout'\nimport { BlockImage } from '../components/BlockImage'\nimport { AvatarBlock } from '../components/AvatarBlock'\nimport { Navbar } from '../components/Navbar'\nimport { Footer } from '../components/Footer'\nimport { ListBlock } from '../components/ListBlock'\nimport { Columns } from '../components/Columns'\nimport { Spacer } from '../components/Spacer'\nimport { Container } from '../components/Container'\nimport { Timeline, type TimelineViewMode } from '../timeline'\n\n/** One editor row of the Timeline block's `items` array. */\ninterface TimelineEntryProps {\n label?: string\n description?: string\n start: string\n end?: string\n}\n\n// Puck injects a component for each slot at render; default to an empty array.\nconst emptySlot = [] as unknown as ReactNode\nconst renderSlot = (slot: unknown): ReactNode => {\n if (typeof slot !== 'function') return null\n const Slot = slot as ComponentType\n return <Slot />\n}\n\nconst toneField: Field = {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Muted', value: 'muted' },\n { label: 'Ink', value: 'ink' },\n ],\n}\n\n/** Build every website block, closing over the shared field {@link BlockKit}. */\nexport function createWebsiteBlocks(kit: BlockKit): Record<string, ComponentConfig> {\n const { textField, textareaField, imageField, boolRadio, iconField, resolveIcon, blockTestId } =\n kit\n\n const ctaField = (label: string): Field => ({\n type: 'object',\n label,\n objectFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n })\n\n // ── Layout ──────────────────────────────────────────────────────────────────\n const ColumnsBlock: ComponentConfig = {\n label: 'Columns',\n fields: {\n count: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: 2 },\n { label: '3', value: 3 },\n { label: '4', value: 4 },\n ],\n },\n gap: {\n type: 'radio',\n label: 'Gap',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n col1: { type: 'slot' },\n col2: { type: 'slot' },\n col3: { type: 'slot' },\n col4: { type: 'slot' },\n },\n defaultProps: {\n count: 3,\n gap: 'md',\n col1: emptySlot,\n col2: emptySlot,\n col3: emptySlot,\n col4: emptySlot,\n },\n render: ({ id, count, gap, col1, col2, col3, col4 }) => {\n const n = Number(count) || 3\n const columns = [col1, col2, col3, col4].slice(0, n).map(renderSlot)\n return <Columns count={n as 2 | 3 | 4} gap={gap} columns={columns} testId={blockTestId(id)} />\n },\n }\n\n const SpacerBlock: ComponentConfig = {\n label: 'Spacer',\n fields: {\n size: {\n type: 'radio',\n label: 'Size',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'XL', value: 'xl' },\n ],\n },\n },\n defaultProps: { size: 'md' },\n render: ({ id, size }) => <Spacer size={size} testId={blockTestId(id)} />,\n }\n\n const ContainerBlock: ComponentConfig = {\n label: 'Container',\n fields: {\n width: {\n type: 'radio',\n label: 'Width',\n options: [\n { label: 'Narrow', value: 'narrow' },\n { label: 'Default', value: 'default' },\n { label: 'Wide', value: 'wide' },\n { label: 'Full', value: 'full' },\n ],\n },\n padding: {\n type: 'radio',\n label: 'Padding',\n options: [\n { label: 'None', value: 'none' },\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n children: { type: 'slot' },\n },\n defaultProps: { width: 'default', padding: 'md', children: emptySlot },\n render: ({ id, width, padding, children }) => (\n <Container width={width} padding={padding} testId={blockTestId(id)}>\n {renderSlot(children)}\n </Container>\n ),\n }\n\n // ── Marketing ───────────────────────────────────────────────────────────────\n const HeroBlock: ComponentConfig = {\n label: 'Hero',\n fields: {\n eyebrow: textField('Eyebrow'),\n title: textField('Title'),\n emphasis: { type: 'text', label: 'Emphasised word' },\n subtitle: textareaField('Subtitle', undefined, 'lead'),\n primaryCta: ctaField('Primary CTA'),\n secondaryCta: ctaField('Secondary CTA'),\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n ],\n },\n tone: toneField,\n imageUrl: imageField('Side image'),\n backgroundImage: imageField('Background image'),\n overlay: boolRadio('Background overlay'),\n },\n defaultProps: {\n eyebrow: 'Introducing',\n title: 'Build a better website, faster.',\n emphasis: '',\n subtitle:\n 'A flexible platform that helps your team ship polished, on-brand pages without waiting on engineering.',\n primaryCta: { label: 'Get started', href: '#' },\n secondaryCta: { label: 'Learn more', href: '#' },\n align: 'left',\n tone: 'default',\n imageUrl: '',\n backgroundImage: '',\n overlay: true,\n },\n render: ({\n id,\n eyebrow,\n title,\n emphasis,\n subtitle,\n primaryCta,\n secondaryCta,\n align,\n tone,\n imageUrl,\n backgroundImage,\n overlay,\n }) => (\n <Hero\n eyebrow={eyebrow}\n title={title}\n emphasis={emphasis}\n subtitle={subtitle}\n primaryCta={primaryCta}\n secondaryCta={secondaryCta}\n align={align}\n tone={tone}\n imageUrl={imageUrl}\n backgroundImage={backgroundImage}\n overlay={overlay}\n eyebrowClassName={kit.eyebrowClassName}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const FeatureGridBlock: ComponentConfig = {\n label: 'Feature grid',\n fields: {\n columns: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: '2' },\n { label: '3', value: '3' },\n ],\n },\n items: {\n type: 'array',\n label: 'Features',\n arrayFields: {\n icon: iconField(),\n title: textField('Title'),\n description: textareaField('Description'),\n },\n defaultItemProps: {\n icon: 'Sparkles',\n title: 'Feature',\n description: 'Describe this feature.',\n },\n getItemSummary: (item: { title?: string }) => item?.title || 'Feature',\n },\n },\n defaultProps: {\n columns: '3',\n items: [\n {\n icon: 'Zap',\n title: 'Fast by default',\n description: 'Ship pages in minutes with sensible, on-brand defaults.',\n },\n {\n icon: 'Shield',\n title: 'Secure & reliable',\n description: 'Enterprise-grade security baked into every layer.',\n },\n {\n icon: 'Layers',\n title: 'Composable',\n description: 'Mix and match blocks to build any layout you need.',\n },\n ],\n },\n render: ({ id, columns, items }) => {\n const list = (items ?? []).map(\n (it: { icon?: string; title: string; description?: string }) => ({\n ...it,\n icon: resolveIcon(it.icon),\n })\n )\n return <FeatureGrid columns={columns} items={list} testId={blockTestId(id)} />\n },\n }\n\n const StatGroupBlock: ComponentConfig = {\n label: 'Stat group',\n fields: {\n items: {\n type: 'array',\n label: 'Stats',\n arrayFields: {\n value: textField('Value'),\n label: textField('Label'),\n },\n defaultItemProps: { value: '100%', label: 'Metric' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Stat',\n },\n },\n defaultProps: {\n items: [\n { value: '10k+', label: 'Active users' },\n { value: '99.9%', label: 'Uptime' },\n { value: '4.9/5', label: 'Customer rating' },\n { value: '24/7', label: 'Support' },\n ],\n },\n render: ({ id, items }) => <StatGroup items={items} testId={blockTestId(id)} />,\n }\n\n const TestimonialBlock: ComponentConfig = {\n label: 'Testimonial',\n fields: {\n quote: textareaField('Quote'),\n author: textField('Author'),\n role: textField('Role'),\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n defaultProps: {\n quote: 'This is the best tool our team has adopted in years. It just works.',\n author: 'Alex Morgan',\n role: 'Head of Product, Northwind',\n avatarUrl: '',\n },\n render: ({ id, quote, author, role, avatarUrl }) => (\n <Testimonial\n quote={quote}\n author={author}\n role={role}\n avatarUrl={avatarUrl}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const CTABannerBlock: ComponentConfig = {\n label: 'CTA banner',\n fields: {\n title: textField('Title'),\n subtitle: textareaField('Subtitle'),\n cta: ctaField('Button'),\n tone: toneField,\n backgroundImage: imageField('Background image'),\n overlay: boolRadio('Background overlay'),\n },\n defaultProps: {\n title: 'Ready to get started?',\n subtitle: 'Join thousands of teams already building with us.',\n cta: { label: 'Start free trial', href: '#' },\n tone: 'default',\n backgroundImage: '',\n overlay: true,\n },\n render: ({ id, title, subtitle, cta, tone, backgroundImage, overlay }) => (\n <CTABanner\n title={title}\n subtitle={subtitle}\n cta={cta}\n tone={tone}\n backgroundImage={backgroundImage}\n overlay={overlay}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const LogoCloudBlock: ComponentConfig = {\n label: 'Logo cloud',\n fields: {\n items: {\n type: 'array',\n label: 'Logos',\n arrayFields: { label: textField('Label') },\n defaultItemProps: { label: 'Brand' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Logo',\n },\n },\n defaultProps: {\n items: [\n { label: 'Northwind' },\n { label: 'Acme' },\n { label: 'Globex' },\n { label: 'Initech' },\n { label: 'Umbrella' },\n ],\n },\n render: ({ id, items }) => <LogoCloud items={items} testId={blockTestId(id)} />,\n }\n\n const FAQBlock: ComponentConfig = {\n label: 'FAQ',\n fields: {\n items: {\n type: 'array',\n label: 'Questions',\n arrayFields: {\n question: textField('Question'),\n answer: textareaField('Answer'),\n },\n defaultItemProps: { question: 'A question?', answer: 'The answer.' },\n getItemSummary: (item: { question?: string }) => item?.question || 'Question',\n },\n },\n defaultProps: {\n items: [\n {\n question: 'How does the free trial work?',\n answer: 'You get full access for 14 days, no credit card required.',\n },\n {\n question: 'Can I change plans later?',\n answer: 'Yes — upgrade or downgrade at any time from your dashboard.',\n },\n {\n question: 'Do you offer support?',\n answer: 'Every plan includes 24/7 support from our team.',\n },\n ],\n },\n render: ({ id, items }) => <FAQ items={items} testId={blockTestId(id)} />,\n }\n\n /** A dated chronology on a page — key dates, a project plan, a hearing timetable.\n *\n * Dates are typed as ISO text (`2026-03-01`, or a full timestamp) because that\n * is what a span needs and what every backend already returns. An item without\n * an end is an instant; give it one and it becomes a bar covering that stretch. */\n const TimelineBlockConfig: ComponentConfig = {\n label: 'Timeline',\n fields: {\n view: {\n type: 'radio',\n label: 'View',\n options: [\n { label: 'Reader chooses', value: 'both' },\n { label: 'Calendar', value: 'calendar' },\n { label: 'Gantt', value: 'gantt' },\n ],\n },\n height: { type: 'number', label: 'Height (px)', min: 200, max: 1200 },\n items: {\n type: 'array',\n label: 'Entries',\n arrayFields: {\n label: textField('Label'),\n description: textareaField('Description'),\n start: { type: 'text', label: 'Start (YYYY-MM-DD)' },\n end: { type: 'text', label: 'End (YYYY-MM-DD, optional)' },\n },\n defaultItemProps: { label: 'Milestone', description: '', start: '', end: '' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Entry',\n },\n },\n defaultProps: {\n view: 'both',\n height: 520,\n items: [\n {\n label: 'Kick-off',\n description: 'Project starts.',\n start: '2026-01-12',\n end: '',\n },\n {\n label: 'Build phase',\n description: 'Design and implementation.',\n start: '2026-01-19',\n end: '2026-03-13',\n },\n {\n label: 'Launch',\n description: 'Public release.',\n start: '2026-03-30',\n end: '',\n },\n ],\n },\n render: ({ id, view, height, items }) => (\n <div style={{ height: height ?? 520 }}>\n <Timeline\n items={(items ?? [])\n .filter((item: { start?: string }) => !!item?.start)\n .map((item: TimelineEntryProps, index: number) => ({\n id: `${id}-${index}`,\n label: item.label ?? '',\n start: item.start,\n end: item.end || undefined,\n description: item.description || undefined,\n }))}\n view={view === 'both' ? undefined : (view as TimelineViewMode)}\n testId={blockTestId(id)}\n />\n </div>\n ),\n }\n\n const RichTextBlockConfig: ComponentConfig = {\n label: 'Rich text',\n fields: {\n content: textareaField('Content', undefined, 'body'),\n },\n defaultProps: {\n content:\n '## About us\\n\\nWe build tools that help teams do their best work. Our platform combines **power** and _simplicity_ so you can focus on what matters.\\n\\n- Fast to learn\\n- Easy to scale\\n- Loved by teams',\n },\n render: ({ id, content }) => <RichTextBlock content={content} testId={blockTestId(id)} />,\n }\n\n const CalloutBlock: ComponentConfig = {\n label: 'Callout',\n fields: {\n variant: {\n type: 'radio',\n label: 'Variant',\n options: [\n { label: 'Info', value: 'info' },\n { label: 'Success', value: 'success' },\n { label: 'Warning', value: 'warning' },\n { label: 'Danger', value: 'danger' },\n ],\n },\n title: textField('Title'),\n body: textareaField('Body'),\n },\n defaultProps: {\n variant: 'info',\n title: 'Good to know',\n body: 'This is a helpful note that draws attention to important information.',\n },\n render: ({ id, variant, title, body }) => (\n <Callout variant={variant} title={title} body={body} testId={blockTestId(id)} />\n ),\n }\n\n // ── Media ───────────────────────────────────────────────────────────────────\n const ImageBlock: ComponentConfig = {\n label: 'Image',\n fields: {\n src: imageField('Image'),\n alt: textField('Alt text'),\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '16:9', value: '16:9' },\n { label: '4:3', value: '4:3' },\n { label: '1:1', value: '1:1' },\n { label: '21:9', value: '21:9' },\n ],\n },\n rounded: {\n type: 'radio',\n label: 'Rounded',\n options: [\n { label: 'None', value: 'none' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'Full', value: 'full' },\n ],\n },\n framed: boolRadio('Framed'),\n },\n defaultProps: { src: '', alt: 'Image', aspect: '16:9', rounded: 'lg', framed: false },\n render: ({ id, src, alt, aspect, rounded, framed }) => (\n <BlockImage\n src={src}\n alt={alt}\n aspect={aspect}\n rounded={rounded}\n framed={framed}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const AvatarBlockConfig: ComponentConfig = {\n label: 'Avatar',\n fields: {\n src: { type: 'text', label: 'Image URL' },\n name: textField('Name'),\n size: {\n type: 'radio',\n label: 'Size',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n { label: 'XL', value: 'xl' },\n ],\n },\n },\n defaultProps: { src: '', name: 'Jane Doe', size: 'md' },\n render: ({ id, src, name, size }) => (\n <AvatarBlock src={src} name={name} size={size} testId={blockTestId(id)} />\n ),\n }\n\n // ── Navigation ──────────────────────────────────────────────────────────────\n const NavbarBlock: ComponentConfig = {\n label: 'Navbar',\n fields: {\n brand: textField('Brand'),\n links: {\n type: 'array',\n label: 'Links',\n arrayFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n defaultItemProps: { label: 'Link', href: '#' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Link',\n },\n cta: ctaField('CTA'),\n },\n defaultProps: {\n brand: 'Acme',\n links: [\n { label: 'Product', href: '#' },\n { label: 'Pricing', href: '#' },\n { label: 'About', href: '#' },\n { label: 'Contact', href: '#' },\n ],\n cta: { label: 'Sign up', href: '#' },\n },\n render: ({ id, brand, links, cta }) => (\n <Navbar brand={brand} links={links} cta={cta} testId={blockTestId(id)} />\n ),\n }\n\n const FooterBlock: ComponentConfig = {\n label: 'Footer',\n fields: {\n columns: {\n type: 'array',\n label: 'Columns',\n arrayFields: {\n heading: textField('Heading'),\n links: {\n type: 'array',\n label: 'Links',\n arrayFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n defaultItemProps: { label: 'Link', href: '#' },\n getItemSummary: (item: { label?: string }) => item?.label || 'Link',\n },\n },\n defaultItemProps: { heading: 'Column', links: [{ label: 'Link', href: '#' }] },\n getItemSummary: (item: { heading?: string }) => item?.heading || 'Column',\n },\n copyright: { type: 'text', label: 'Copyright' },\n },\n defaultProps: {\n columns: [\n {\n heading: 'Product',\n links: [\n { label: 'Features', href: '#' },\n { label: 'Pricing', href: '#' },\n ],\n },\n {\n heading: 'Company',\n links: [\n { label: 'About', href: '#' },\n { label: 'Careers', href: '#' },\n ],\n },\n {\n heading: 'Resources',\n links: [\n { label: 'Blog', href: '#' },\n { label: 'Docs', href: '#' },\n ],\n },\n {\n heading: 'Legal',\n links: [\n { label: 'Privacy', href: '#' },\n { label: 'Terms', href: '#' },\n ],\n },\n ],\n copyright: '© 2026 Acme, Inc. All rights reserved.',\n },\n render: ({ id, columns, copyright }) => (\n <Footer columns={columns} copyright={copyright} testId={blockTestId(id)} />\n ),\n }\n\n // ── Content ─────────────────────────────────────────────────────────────────\n const ListBlockConfig: ComponentConfig = {\n label: 'List',\n fields: {\n ordered: boolRadio('Ordered'),\n items: {\n type: 'array',\n label: 'Items',\n arrayFields: { text: textField('Text') },\n defaultItemProps: { text: 'List item' },\n getItemSummary: (item: { text?: string }) => item?.text || 'Item',\n },\n },\n defaultProps: {\n ordered: false,\n items: [{ text: 'First item' }, { text: 'Second item' }, { text: 'Third item' }],\n },\n render: ({ id, ordered, items }) => (\n <ListBlock ordered={ordered} items={items} testId={blockTestId(id)} />\n ),\n }\n\n return {\n Columns: ColumnsBlock,\n Spacer: SpacerBlock,\n Container: ContainerBlock,\n Hero: HeroBlock,\n FeatureGrid: FeatureGridBlock,\n StatGroup: StatGroupBlock,\n Testimonial: TestimonialBlock,\n CTABanner: CTABannerBlock,\n LogoCloud: LogoCloudBlock,\n FAQ: FAQBlock,\n Timeline: TimelineBlockConfig,\n RichText: RichTextBlockConfig,\n Callout: CalloutBlock,\n Image: ImageBlock,\n Avatar: AvatarBlockConfig,\n Navbar: NavbarBlock,\n Footer: FooterBlock,\n List: ListBlockConfig,\n }\n}\n","/**\n * The extended site-building block set — the richer vocabulary a builder needs to\n * assemble arbitrary sites beyond the marketing basics: pricing, tabs, accordion,\n * gallery, video, contact form, banner, split media, team, steps and a\n * multi-testimonial grid.\n *\n * Same contract as {@link createWebsiteBlocks}: serializable-only props, semantic\n * tokens (themes with the host), a stable render-time `data-testid`, and sensible\n * defaults so each block looks right the moment it is dropped. Copy props route\n * through the shared {@link BlockKit} AI-or-plain fields.\n */\nimport type { ComponentConfig, Field } from '@measured/puck'\nimport type { BlockKit } from './blockKit'\nimport { PricingTable } from '../components/PricingTable'\nimport { Tabs } from '../components/Tabs'\nimport { Accordion } from '../components/Accordion'\nimport { Gallery } from '../components/Gallery'\nimport { VideoEmbed } from '../components/VideoEmbed'\nimport { ContactForm } from '../components/ContactForm'\nimport { Banner } from '../components/Banner'\nimport { MediaText } from '../components/MediaText'\nimport { TeamGrid } from '../components/TeamGrid'\nimport { Steps } from '../components/Steps'\nimport { TestimonialGrid } from '../components/TestimonialGrid'\n\n/** Split a newline-authored textarea into a trimmed, non-empty string list. */\nconst lines = (s: string | undefined): string[] =>\n (s ?? '')\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n\nexport function createSiteBlocks(kit: BlockKit): Record<string, ComponentConfig> {\n const { textField, textareaField, imageField, boolRadio, blockTestId } = kit\n\n const ctaField = (label: string): Field => ({\n type: 'object',\n label,\n objectFields: {\n label: textField('Label'),\n href: { type: 'text', label: 'Link' },\n },\n })\n\n const columnsField = (values: string[]): Field => ({\n type: 'radio',\n label: 'Columns',\n options: values.map((v) => ({ label: v, value: v })),\n })\n\n // ── Commerce ──────────────────────────────────────────────────────────────────\n const PricingBlock: ComponentConfig = {\n label: 'Pricing',\n fields: {\n plans: {\n type: 'array',\n label: 'Plans',\n getItemSummary: (item: { name?: string }) => item?.name || 'Plan',\n defaultItemProps: {\n name: 'Plan',\n price: '£0',\n period: 'mo',\n description: '',\n features: 'Feature one\\nFeature two',\n ctaLabel: 'Choose',\n ctaHref: '#',\n featured: false,\n },\n arrayFields: {\n name: textField('Name'),\n price: { type: 'text', label: 'Price' },\n period: { type: 'text', label: 'Period' },\n description: textareaField('Description'),\n features: { type: 'textarea', label: 'Features (one per line)' },\n ctaLabel: { type: 'text', label: 'Button label' },\n ctaHref: { type: 'text', label: 'Button link' },\n featured: boolRadio('Featured'),\n },\n },\n },\n defaultProps: {\n plans: [\n {\n name: 'Starter',\n price: '£0',\n period: 'mo',\n description: 'For getting started.',\n features: 'Up to 3 projects\\nCommunity support',\n ctaLabel: 'Get started',\n ctaHref: '#',\n featured: false,\n },\n {\n name: 'Pro',\n price: '£29',\n period: 'mo',\n description: 'For growing teams.',\n features: 'Unlimited projects\\nPriority support\\nAdvanced analytics',\n ctaLabel: 'Start free trial',\n ctaHref: '#',\n featured: true,\n },\n {\n name: 'Enterprise',\n price: 'Custom',\n period: '',\n description: 'For large organisations.',\n features: 'SSO & SAML\\nDedicated success manager\\nSLA',\n ctaLabel: 'Contact sales',\n ctaHref: '#',\n featured: false,\n },\n ],\n },\n render: ({ id, plans }) => (\n <PricingTable\n plans={(plans ?? []).map(\n (p: {\n name: string\n price: string\n period?: string\n description?: string\n features?: string\n ctaLabel?: string\n ctaHref?: string\n featured?: boolean\n }) => ({\n name: p.name,\n price: p.price,\n period: p.period,\n description: p.description,\n features: lines(p.features),\n cta: { label: p.ctaLabel, href: p.ctaHref },\n featured: p.featured,\n })\n )}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Interactive ───────────────────────────────────────────────────────────────\n const TabsBlock: ComponentConfig = {\n label: 'Tabs',\n fields: {\n items: {\n type: 'array',\n label: 'Tabs',\n getItemSummary: (item: { label?: string }) => item?.label || 'Tab',\n defaultItemProps: { label: 'Tab', content: 'Tab content.' },\n arrayFields: {\n label: textField('Label'),\n content: textareaField('Content'),\n },\n },\n },\n defaultProps: {\n items: [\n { label: 'Overview', content: 'A quick overview of this section.' },\n { label: 'Details', content: 'The finer details go here.' },\n { label: 'FAQ', content: 'Answers to common questions.' },\n ],\n },\n render: ({ id, items }) => <Tabs items={items} testId={blockTestId(id)} />,\n }\n\n const AccordionBlock: ComponentConfig = {\n label: 'Accordion',\n fields: {\n allowMultiple: boolRadio('Allow multiple open'),\n items: {\n type: 'array',\n label: 'Items',\n getItemSummary: (item: { title?: string }) => item?.title || 'Item',\n defaultItemProps: { title: 'Section', content: 'Section content.' },\n arrayFields: {\n title: textField('Title'),\n content: textareaField('Content'),\n },\n },\n },\n defaultProps: {\n allowMultiple: false,\n items: [\n { title: 'What is included?', content: 'Everything you need to get started.' },\n { title: 'How does billing work?', content: 'Monthly or annually, cancel anytime.' },\n ],\n },\n render: ({ id, allowMultiple, items }) => (\n <Accordion allowMultiple={allowMultiple} items={items} testId={blockTestId(id)} />\n ),\n }\n\n // ── Media ───────────────────────────────────────────────────────────────────\n const GalleryBlock: ComponentConfig = {\n label: 'Gallery',\n fields: {\n columns: columnsField(['2', '3', '4']),\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '1:1', value: '1:1' },\n { label: '4:3', value: '4:3' },\n { label: '16:9', value: '16:9' },\n ],\n },\n images: {\n type: 'array',\n label: 'Images',\n getItemSummary: (item: { alt?: string }) => item?.alt || 'Image',\n defaultItemProps: { src: '', alt: 'Image', caption: '' },\n arrayFields: {\n src: imageField('Image'),\n alt: { type: 'text', label: 'Alt text' },\n caption: { type: 'text', label: 'Caption' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n aspect: '1:1',\n images: [\n { src: '', alt: 'Image one', caption: '' },\n { src: '', alt: 'Image two', caption: '' },\n { src: '', alt: 'Image three', caption: '' },\n ],\n },\n render: ({ id, columns, aspect, images }) => (\n <Gallery columns={columns} aspect={aspect} images={images} testId={blockTestId(id)} />\n ),\n }\n\n const VideoBlock: ComponentConfig = {\n label: 'Video',\n fields: {\n url: { type: 'text', label: 'Video URL (YouTube/Vimeo/Loom or file)' },\n title: { type: 'text', label: 'Title' },\n aspect: {\n type: 'radio',\n label: 'Aspect',\n options: [\n { label: '16:9', value: '16:9' },\n { label: '4:3', value: '4:3' },\n { label: '1:1', value: '1:1' },\n ],\n },\n rounded: boolRadio('Rounded'),\n },\n defaultProps: { url: '', title: '', aspect: '16:9', rounded: true },\n render: ({ id, url, title, aspect, rounded }) => (\n <VideoEmbed\n url={url}\n title={title}\n aspect={aspect}\n rounded={rounded}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Forms ───────────────────────────────────────────────────────────────────\n const ContactFormBlock: ComponentConfig = {\n label: 'Contact form',\n fields: {\n submitLabel: { type: 'text', label: 'Submit label' },\n action: { type: 'text', label: 'POST endpoint (optional)' },\n successMessage: textareaField('Success message'),\n fields: {\n type: 'array',\n label: 'Fields',\n getItemSummary: (item: { label?: string }) => item?.label || 'Field',\n defaultItemProps: { name: 'field', label: 'Field', type: 'text', required: false },\n arrayFields: {\n name: { type: 'text', label: 'Name attribute' },\n label: textField('Label'),\n type: {\n type: 'select',\n label: 'Type',\n options: [\n { label: 'Text', value: 'text' },\n { label: 'Email', value: 'email' },\n { label: 'Phone', value: 'tel' },\n { label: 'Multi-line', value: 'textarea' },\n ],\n },\n required: boolRadio('Required'),\n },\n },\n },\n defaultProps: {\n submitLabel: 'Send',\n action: '',\n successMessage: 'Thanks — we’ll be in touch shortly.',\n fields: [\n { name: 'name', label: 'Name', type: 'text', required: true },\n { name: 'email', label: 'Email', type: 'email', required: true },\n { name: 'message', label: 'Message', type: 'textarea', required: true },\n ],\n },\n render: ({ id, submitLabel, action, successMessage, fields }) => (\n <ContactForm\n submitLabel={submitLabel}\n action={action || undefined}\n successMessage={successMessage}\n fields={fields}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // ── Marketing (extended) ──────────────────────────────────────────────────────\n const BannerBlock: ComponentConfig = {\n label: 'Banner',\n fields: {\n text: textField('Text'),\n cta: ctaField('CTA'),\n tone: {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Primary', value: 'primary' },\n { label: 'Muted', value: 'muted' },\n { label: 'Dark', value: 'ink' },\n ],\n },\n },\n defaultProps: {\n text: 'We just shipped something new.',\n cta: { label: 'Read more', href: '#' },\n tone: 'primary',\n },\n render: ({ id, text, cta, tone }) => (\n <Banner text={text} cta={cta} tone={tone} testId={blockTestId(id)} />\n ),\n }\n\n const MediaTextBlock: ComponentConfig = {\n label: 'Media & text',\n fields: {\n eyebrow: textField('Eyebrow'),\n title: textField('Title'),\n body: textareaField('Body', undefined, 'lead'),\n imageUrl: imageField('Image'),\n mediaSide: {\n type: 'radio',\n label: 'Media side',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Right', value: 'right' },\n ],\n },\n cta: ctaField('CTA'),\n },\n defaultProps: {\n eyebrow: '',\n title: 'A closer look at what we do.',\n body: 'Pair a compelling visual with the copy that explains it — the classic split section, on any theme.',\n imageUrl: '',\n mediaSide: 'left',\n cta: { label: 'Learn more', href: '#' },\n },\n render: ({ id, eyebrow, title, body, imageUrl, mediaSide, cta }) => (\n <MediaText\n eyebrow={eyebrow}\n title={title}\n body={body}\n imageUrl={imageUrl}\n mediaSide={mediaSide}\n cta={cta}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const TeamGridBlock: ComponentConfig = {\n label: 'Team',\n fields: {\n columns: columnsField(['2', '3', '4']),\n members: {\n type: 'array',\n label: 'Members',\n getItemSummary: (item: { name?: string }) => item?.name || 'Member',\n defaultItemProps: { name: 'New member', role: 'Role', bio: '', avatarUrl: '' },\n arrayFields: {\n name: textField('Name'),\n role: { type: 'text', label: 'Role' },\n bio: textareaField('Bio'),\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n members: [\n { name: 'Alex Morgan', role: 'Founder & CEO', bio: '', avatarUrl: '' },\n { name: 'Sam Rivera', role: 'Head of Product', bio: '', avatarUrl: '' },\n { name: 'Jordan Lee', role: 'Lead Engineer', bio: '', avatarUrl: '' },\n ],\n },\n render: ({ id, columns, members }) => (\n <TeamGrid columns={columns} members={members} testId={blockTestId(id)} />\n ),\n }\n\n const StepsBlock: ComponentConfig = {\n label: 'Steps',\n fields: {\n variant: {\n type: 'radio',\n label: 'Style',\n options: [\n { label: 'Numbered', value: 'numbered' },\n { label: 'Timeline', value: 'timeline' },\n ],\n },\n steps: {\n type: 'array',\n label: 'Steps',\n getItemSummary: (item: { title?: string }) => item?.title || 'Step',\n defaultItemProps: { title: 'Step', description: 'Describe this step.' },\n arrayFields: {\n title: textField('Title'),\n description: textareaField('Description'),\n },\n },\n },\n defaultProps: {\n variant: 'numbered',\n steps: [\n { title: 'Sign up', description: 'Create your account in seconds.' },\n { title: 'Configure', description: 'Set things up to match your workflow.' },\n { title: 'Launch', description: 'Go live and start seeing results.' },\n ],\n },\n render: ({ id, variant, steps }) => (\n <Steps variant={variant} steps={steps} testId={blockTestId(id)} />\n ),\n }\n\n const TestimonialGridBlock: ComponentConfig = {\n label: 'Testimonial grid',\n fields: {\n columns: columnsField(['2', '3']),\n items: {\n type: 'array',\n label: 'Testimonials',\n getItemSummary: (item: { author?: string }) => item?.author || 'Testimonial',\n defaultItemProps: { quote: 'A great quote.', author: 'Author', role: '', avatarUrl: '' },\n arrayFields: {\n quote: textareaField('Quote'),\n author: textField('Author'),\n role: { type: 'text', label: 'Role' },\n avatarUrl: { type: 'text', label: 'Avatar URL' },\n },\n },\n },\n defaultProps: {\n columns: '3',\n items: [\n {\n quote: 'This changed how our whole team works.',\n author: 'Alex Morgan',\n role: 'CTO, Northwind',\n avatarUrl: '',\n },\n {\n quote: 'The best tool we adopted this year.',\n author: 'Sam Rivera',\n role: 'Ops Lead, Acme',\n avatarUrl: '',\n },\n {\n quote: 'Simple, fast, and it just works.',\n author: 'Jordan Lee',\n role: 'Founder, Globex',\n avatarUrl: '',\n },\n ],\n },\n render: ({ id, columns, items }) => (\n <TestimonialGrid columns={columns} items={items} testId={blockTestId(id)} />\n ),\n }\n\n return {\n Pricing: PricingBlock,\n Tabs: TabsBlock,\n Accordion: AccordionBlock,\n Gallery: GalleryBlock,\n Video: VideoBlock,\n ContactForm: ContactFormBlock,\n Banner: BannerBlock,\n MediaText: MediaTextBlock,\n Team: TeamGridBlock,\n Steps: StepsBlock,\n TestimonialGrid: TestimonialGridBlock,\n }\n}\n","/**\n * Shared Puck block registry for @arbidocs/blocks.\n *\n * {@link createArbiBlocksConfig} turns the package's shared components into a\n * single draggable builder palette (a Puck `Config`) so every consuming app gets\n * one shared block set instead of hand-rolling its own. It spans a full\n * website-building vocabulary: back-office data/content blocks plus marketing,\n * media, navigation and layout blocks (see {@link createWebsiteBlocks}).\n *\n * Cross-cutting rules baked in here:\n * - Copy props (\"title\", \"lead\", …) use the host's AI \"Write with AI\" fields when\n * `opts.aiFields` is provided, else fall back to Puck's built-in text/textarea —\n * so the config works with or without an AI-configured host.\n * - Icon props are a curated {@link iconMap} exposed as a `select`; the name is\n * resolved to a Lucide component at render.\n * - `className`/`testId` are never editor fields. A stable `data-testid` is derived\n * from each block's Puck id at render, so e2e locates by testid, never copy text.\n * - Container blocks (Section, Card, Columns, Container) expose children as Puck slots.\n */\nimport type { ReactNode } from 'react'\nimport type { ComponentConfig, Config, Field } from '@measured/puck'\nimport { Badge, Button, Card, Separator, cn } from '@arbidocs/react/ui'\nimport { SectionHeading } from '../components/SectionHeading'\nimport { PageHeader } from '../components/PageHeader'\nimport { EmptyState } from '../components/EmptyState'\nimport { MetricCard } from '../components/MetricCard'\nimport { DataTableBlock, type DataTableBlockColumn } from '../components/DataTableBlock'\nimport { Section } from './Section'\nimport { createBlockKit, iconMap } from './blockKit'\nimport { createWebsiteBlocks } from './websiteBlocks'\nimport { createSiteBlocks } from './siteBlocks'\nimport { createLiveWidgets } from './widgets'\nimport type { AiFields } from './aiFields'\n\nexport interface ArbiBlocksConfigOptions {\n /**\n * Firm AI fields from {@link createAiFields}. When present, every string copy\n * prop becomes an AI-authorable field; when absent, plain Puck text inputs.\n */\n aiFields?: AiFields\n /**\n * Firm image field from {@link createImageField}. When present, image props\n * become a workspace-asset picker (pick / upload / URL / generate); when absent,\n * a plain URL text input.\n */\n imageField?: (label: string) => Field\n /**\n * Page canvas overrides. The builder paints every page inside this root; a\n * consumer sets e.g. a dark editorial canvas without forking the package.\n * Defaults to `bg-background text-foreground font-sans` on a neutral wrapper.\n */\n root?: {\n /** Extra classes appended to (and able to override) the default canvas classes. */\n className?: string\n /** testid for the page root wrapper. Defaults to `arbi-blocks-page-root`. */\n testId?: string\n }\n /**\n * Firm override for the eyebrow style on heading-bearing blocks (Hero, Section\n * heading) — e.g. a brand accent like a brass eyebrow. Undefined → token default.\n */\n eyebrowClassName?: string\n /**\n * Register the live-widget blocks (a \"Widgets\" category) that read shared ARBI\n * hooks — Agent activity, Live metric. They render placeholders in the editor\n * and on the public site, resolving real data only inside an authenticated\n * in-app renderer (`PageRenderer liveData`). Opt-in so a pure marketing builder\n * doesn't surface back-office widgets.\n */\n liveWidgets?: boolean\n}\n\n// Re-exported so consumers keep importing the icon registry from here.\nexport { iconMap }\n\n// Puck injects a component for each `slot` field at render; its default value is\n// an empty array. Shared here so slot-bearing blocks default to an empty drop zone.\nconst emptySlot = [] as unknown as ReactNode\n\n// Responsive grid presets for the MetricRow KPI band (keyed by authored column count).\nconst METRIC_COLS: Record<string, string> = {\n '2': 'sm:grid-cols-2',\n '3': 'sm:grid-cols-2 lg:grid-cols-3',\n '4': 'sm:grid-cols-2 lg:grid-cols-4',\n}\nconst METRIC_GAP: Record<string, string> = { sm: 'gap-3', md: 'gap-4', lg: 'gap-6' }\n\n// ── Factory ───────────────────────────────────────────────────────────────────\nexport function createArbiBlocksConfig(opts: ArbiBlocksConfigOptions = {}): Config {\n const kit = createBlockKit(opts.aiFields, opts.imageField, opts.eyebrowClassName)\n const { textField, textareaField, boolRadio, iconField, resolveIcon, blockTestId } = kit\n\n // Each block is declared with explicit prop typing so render args stay checked.\n\n const SectionHeadingBlock: ComponentConfig = {\n label: 'Section heading',\n fields: {\n title: textField('Title'),\n eyebrow: textField('Eyebrow'),\n lead: textareaField('Lead', undefined, 'lead'),\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Center', value: 'center' },\n ],\n },\n invert: boolRadio('Invert (on dark)'),\n },\n defaultProps: { title: 'Section title', align: 'left', invert: false },\n render: ({ id, title, eyebrow, lead, align, invert }) => (\n <div data-testid={blockTestId(id)}>\n <SectionHeading\n title={title}\n eyebrow={eyebrow}\n lead={lead}\n align={align}\n invert={invert}\n eyebrowClassName={kit.eyebrowClassName}\n />\n </div>\n ),\n }\n\n const PageHeaderBlock: ComponentConfig = {\n label: 'Page header',\n fields: {\n title: textField('Title'),\n eyebrow: textField('Eyebrow'),\n description: textareaField('Description', undefined, 'description'),\n // `actions` is a slot so the top band can host real buttons/badges authored\n // as blocks (drop a Button in), while the interactive body stays bespoke.\n actions: { type: 'slot', allow: ['Button', 'Badge'] },\n },\n defaultProps: { title: 'Page title', actions: emptySlot },\n render: ({ id, title, eyebrow, description, actions: Actions }) => (\n <PageHeader\n title={title}\n eyebrow={eyebrow}\n description={description}\n actions={<Actions className=\"flex items-center gap-2\" />}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const EmptyStateBlock: ComponentConfig = {\n label: 'Empty state',\n fields: {\n title: textField('Title'),\n description: textareaField('Description', undefined, 'description'),\n icon: iconField(),\n // `action` is a slot so an empty state can offer a real call-to-action button.\n action: { type: 'slot', allow: ['Button'] },\n },\n defaultProps: { title: 'Nothing here yet', action: emptySlot },\n render: ({ id, title, description, icon, action: Action }) => (\n <EmptyState\n title={title}\n description={description}\n icon={resolveIcon(icon)}\n action={<Action />}\n testId={blockTestId(id)}\n />\n ),\n }\n\n const MetricCardBlock: ComponentConfig = {\n label: 'Metric card',\n fields: {\n label: { type: 'text', label: 'Label' },\n value: { type: 'text', label: 'Value' },\n hint: { type: 'text', label: 'Hint' },\n accent: {\n type: 'radio',\n label: 'Accent',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Primary', value: 'primary' },\n { label: 'Success', value: 'success' },\n { label: 'Muted', value: 'muted' },\n ],\n },\n delta: {\n type: 'object',\n label: 'Delta',\n objectFields: {\n value: { type: 'text', label: 'Value' },\n direction: {\n type: 'radio',\n label: 'Direction',\n options: [\n { label: 'Up', value: 'up' },\n { label: 'Down', value: 'down' },\n ],\n },\n good: boolRadio('Good'),\n },\n },\n icon: iconField(),\n },\n defaultProps: { label: 'Metric', value: '0', accent: 'default' },\n render: ({ id, label, value, hint, accent, delta, icon }) => (\n <MetricCard\n label={label}\n value={value}\n hint={hint}\n accent={accent}\n delta={delta}\n icon={resolveIcon(icon)}\n testId={blockTestId(id)}\n />\n ),\n }\n\n // A KPI band: a responsive grid whose cells are MetricCard blocks, so the top\n // of a page (dashboard/module header) is authored as config while the live body\n // stays bespoke. Slot-based (not a self-contained array) so it reuses the\n // MetricCard block verbatim — every card keeps its delta/icon/accent options.\n const MetricRowBlock: ComponentConfig = {\n label: 'Metric row',\n fields: {\n columns: {\n type: 'radio',\n label: 'Columns',\n options: [\n { label: '2', value: '2' },\n { label: '3', value: '3' },\n { label: '4', value: '4' },\n ],\n },\n gap: {\n type: 'radio',\n label: 'Gap',\n options: [\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n // Static KPI tiles and (when registered) live metric widgets both belong in a band.\n items: { type: 'slot', allow: ['MetricCard', 'LiveMetric'] },\n },\n defaultProps: { columns: '3', gap: 'md', items: emptySlot },\n render: ({ id, columns, gap, items: Items }) => (\n <div data-testid={blockTestId(id)}>\n <Items\n className={cn(\n 'grid grid-cols-1',\n METRIC_COLS[columns as string] ?? METRIC_COLS['3'],\n METRIC_GAP[gap as string] ?? METRIC_GAP.md\n )}\n />\n </div>\n ),\n }\n\n // Serializable table. `columns` is a flat schema (header/field/align). `rows` is a\n // Puck array of rows, each holding a nested array of string `cells` — genuinely\n // per-cell authorable and decoupled from column count (Puck objectFields are\n // static, so keying rows by an author-chosen `field` is impossible). Cells map to\n // columns by position at render, where they're rekeyed to the field-keyed records\n // {@link DataTableBlock} expects.\n const DataTableBlockConfig: ComponentConfig = {\n label: 'Data table',\n fields: {\n caption: textField('Caption'),\n columns: {\n type: 'array',\n label: 'Columns',\n arrayFields: {\n header: { type: 'text', label: 'Header' },\n field: { type: 'text', label: 'Field key' },\n align: {\n type: 'radio',\n label: 'Align',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Right', value: 'right' },\n { label: 'Center', value: 'center' },\n ],\n },\n },\n defaultItemProps: { header: 'Column', field: 'field', align: 'left' },\n getItemSummary: (item: DataTableBlockColumn) => item?.header || 'Column',\n },\n rows: {\n type: 'array',\n label: 'Rows',\n arrayFields: {\n cells: {\n type: 'array',\n label: 'Cells',\n arrayFields: {\n value: { type: 'text', label: 'Value' },\n },\n defaultItemProps: { value: '' },\n getItemSummary: (item: { value?: string }) => item?.value || 'Cell',\n },\n },\n defaultItemProps: { cells: [{ value: '' }, { value: '' }] },\n getItemSummary: (_item: unknown, i?: number) => `Row ${(i ?? 0) + 1}`,\n },\n emptyText: textField('Empty text'),\n },\n defaultProps: {\n columns: [\n { header: 'Item', field: 'item', align: 'left' },\n { header: 'Status', field: 'status', align: 'left' },\n ],\n rows: [\n { cells: [{ value: 'Acme v. Globex' }, { value: 'Active' }] },\n { cells: [{ value: 'Initech Merger' }, { value: 'Closed' }] },\n ],\n emptyText: 'No rows yet',\n },\n render: ({ id, columns, rows, caption, emptyText }) => {\n const cols = (columns ?? []) as DataTableBlockColumn[]\n const rawRows = (rows ?? []) as Array<{ cells?: Array<{ value?: string }> }>\n // Positional cells → field-keyed record, so DataTableBlock can look cells up by column field.\n const recordRows = rawRows.map((row) => {\n const record: Record<string, string> = {}\n cols.forEach((col, index) => {\n record[col.field || `col-${index}`] = row.cells?.[index]?.value ?? ''\n })\n return record\n })\n const normalisedCols = cols.map((col, index) => ({\n ...col,\n field: col.field || `col-${index}`,\n }))\n return (\n <DataTableBlock\n columns={normalisedCols}\n rows={recordRows}\n caption={caption}\n emptyText={emptyText}\n testId={blockTestId(id)}\n />\n )\n },\n }\n\n const SectionBlock: ComponentConfig = {\n label: 'Section',\n fields: {\n children: { type: 'slot' },\n tone: {\n type: 'radio',\n label: 'Tone',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Muted', value: 'muted' },\n { label: 'Dark', value: 'ink' },\n ],\n },\n padding: {\n type: 'radio',\n label: 'Padding',\n options: [\n { label: 'None', value: 'none' },\n { label: 'S', value: 'sm' },\n { label: 'M', value: 'md' },\n { label: 'L', value: 'lg' },\n ],\n },\n maxWidth: {\n type: 'radio',\n label: 'Width',\n options: [\n { label: 'Narrow', value: 'narrow' },\n { label: 'Default', value: 'default' },\n { label: 'Wide', value: 'wide' },\n { label: 'Full', value: 'full' },\n ],\n },\n texture: boolRadio('Texture'),\n },\n defaultProps: {\n tone: 'default',\n padding: 'md',\n maxWidth: 'default',\n texture: false,\n children: [] as unknown as ReactNode,\n },\n render: ({ id, tone, padding, maxWidth, texture, children: Children }) => (\n <div data-testid={blockTestId(id)}>\n <Section tone={tone} padding={padding} maxWidth={maxWidth} texture={texture}>\n <Children />\n </Section>\n </div>\n ),\n }\n\n const CardBlock: ComponentConfig = {\n label: 'Card',\n fields: {\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Flat', value: 'flat' },\n { label: 'Outline', value: 'outline' },\n { label: 'Elevated', value: 'elevated' },\n ],\n },\n children: { type: 'slot' },\n },\n defaultProps: { variant: 'flat', children: [] as unknown as ReactNode },\n render: ({ id, variant, children: Children }) => (\n <Card variant={variant} className=\"p-5\" data-testid={blockTestId(id)}>\n <Children />\n </Card>\n ),\n }\n\n const ButtonBlock: ComponentConfig = {\n label: 'Button',\n fields: {\n children: { type: 'text', label: 'Label' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Accent', value: 'accent' },\n { label: 'Destructive', value: 'destructive' },\n { label: 'Outline', value: 'outline' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Ghost', value: 'ghost' },\n { label: 'Link', value: 'link' },\n ],\n },\n size: {\n type: 'select',\n label: 'Size',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Small', value: 'sm' },\n { label: 'Large', value: 'lg' },\n { label: 'Icon', value: 'icon' },\n ],\n },\n },\n defaultProps: { variant: 'default', size: 'default', children: 'Button' },\n render: ({ id, children, variant, size }) => (\n <Button variant={variant} size={size} data-testid={blockTestId(id)}>\n {children}\n </Button>\n ),\n }\n\n const BadgeBlock: ComponentConfig = {\n label: 'Badge',\n fields: {\n text: { type: 'text', label: 'Text' },\n variant: {\n type: 'select',\n label: 'Variant',\n options: [\n { label: 'Default', value: 'default' },\n { label: 'Accent', value: 'accent' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Destructive', value: 'destructive' },\n { label: 'Outline', value: 'outline' },\n ],\n },\n },\n defaultProps: { text: 'Badge', variant: 'default' },\n render: ({ id, text, variant }) => (\n <Badge variant={variant} data-testid={blockTestId(id)}>\n {text}\n </Badge>\n ),\n }\n\n const SeparatorBlock: ComponentConfig = {\n label: 'Separator',\n fields: {},\n defaultProps: {},\n render: ({ id }) => <Separator data-testid={blockTestId(id)} />,\n }\n\n const website = createWebsiteBlocks(kit)\n const site = createSiteBlocks(kit)\n const widgets = opts.liveWidgets ? createLiveWidgets(kit) : {}\n\n const components = {\n SectionHeading: SectionHeadingBlock,\n PageHeader: PageHeaderBlock,\n EmptyState: EmptyStateBlock,\n MetricCard: MetricCardBlock,\n MetricRow: MetricRowBlock,\n DataTable: DataTableBlockConfig,\n Section: SectionBlock,\n Card: CardBlock,\n Button: ButtonBlock,\n Badge: BadgeBlock,\n Separator: SeparatorBlock,\n ...website,\n ...site,\n ...widgets,\n }\n\n const config: Config = {\n categories: {\n Layout: {\n title: 'Layout',\n components: ['Section', 'Container', 'Columns', 'Card', 'Spacer'],\n },\n Marketing: {\n title: 'Marketing',\n components: [\n 'Hero',\n 'FeatureGrid',\n 'StatGroup',\n 'Testimonial',\n 'TestimonialGrid',\n 'CTABanner',\n 'Banner',\n 'LogoCloud',\n 'FAQ',\n 'MediaText',\n 'Steps',\n 'Team',\n ],\n },\n Content: {\n title: 'Content',\n components: ['SectionHeading', 'PageHeader', 'EmptyState', 'RichText', 'Callout', 'List'],\n },\n Interactive: { title: 'Interactive', components: ['Tabs', 'Accordion'] },\n Media: { title: 'Media', components: ['Image', 'Avatar', 'Gallery', 'Video'] },\n Commerce: { title: 'Commerce', components: ['Pricing'] },\n Forms: { title: 'Forms', components: ['ContactForm'] },\n Navigation: { title: 'Navigation', components: ['Navbar', 'Footer'] },\n Data: { title: 'Data', components: ['MetricRow', 'MetricCard', 'DataTable', 'Timeline'] },\n ...(opts.liveWidgets\n ? { Widgets: { title: 'Widgets', components: ['AgentActivity', 'LiveMetric'] } }\n : {}),\n Primitives: { title: 'Primitives', components: ['Button', 'Badge', 'Separator'] },\n },\n components: components as Config['components'],\n root: {\n render: ({ children }: { children?: ReactNode }) => (\n <div\n className={cn('bg-background text-foreground font-sans', opts.root?.className)}\n data-testid={opts.root?.testId ?? 'arbi-blocks-page-root'}\n >\n {children}\n </div>\n ),\n },\n }\n\n return config\n}\n","/**\n * Module registry — a typed model of the back-office modules derived from a\n * host's canonical nav. We read the nav rather than re-declaring it so the\n * registry can never drift from the shipped nav (DRY). The builder\n * toggles/reorders these; the sidebar can consume the result via the module\n * store's `useEnabledNav()` without any nav data being duplicated here.\n */\nimport type { AppNavItem, AppNavSection } from '../../nav/types'\nimport type { BuilderModule, ModuleRegistry } from './types'\n\n/** Build a registry from a host's nav manifest. */\nexport function createModuleRegistry(appNav: AppNavSection[]): ModuleRegistry {\n /** Flattened, ordered registry built once from appNav. */\n const DEFAULT_MODULES: BuilderModule[] = appNav.flatMap((section, sIdx) =>\n section.items.map((item, iIdx) => ({\n id: item.id,\n label: item.label,\n section: section.heading,\n icon: item.icon,\n to: item.to,\n arbi: item.arbi ?? false,\n end: item.end ?? false,\n // Global order that preserves section grouping then in-section order.\n defaultOrder: sIdx * 100 + iIdx,\n }))\n )\n\n /** Section headings in their canonical order. */\n const SECTION_ORDER: string[] = appNav.map((s) => s.heading)\n\n /** Rebuild an AppNavItem from a registry entry (shape the sidebar consumes). */\n const toNavItem = (m: BuilderModule): AppNavItem => ({\n to: m.to,\n label: m.label,\n icon: m.icon,\n id: m.id,\n arbi: m.arbi || undefined,\n end: m.end || undefined,\n })\n\n return { DEFAULT_MODULES, SECTION_ORDER, toNavItem }\n}\n","/**\n * Module toggle/order store — pure config state (which modules the vertical\n * ships, and in what order), persisted to localStorage. Defaults are empty so\n * every existing module stays enabled in its canonical position — nothing in\n * the app breaks until an admin opts to change it.\n *\n * Firm-agnostic: {@link createModuleStore} closes the store + hooks over an\n * injected registry and storage key.\n */\nimport { useMemo } from 'react'\nimport { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport type { AppNavSection } from '../../nav/types'\nimport type { BuilderModule, ModuleRegistry, ResolvedModule } from './types'\n\ninterface ModuleOverride {\n enabled: boolean\n /** Effective order within the section. */\n order: number\n}\n\ninterface ModuleStore {\n /** Sparse overrides keyed by module id; absent → registry default. */\n overrides: Record<string, ModuleOverride>\n toggle: (id: string) => void\n /** Move a module up/down among its enabled+disabled section siblings. */\n move: (id: string, dir: 'up' | 'down') => void\n reset: () => void\n}\n\nexport interface ModuleStoreBundle {\n useModuleStore: UseBoundStore<StoreApi<ModuleStore>>\n useResolvedModules: () => { section: string; modules: ResolvedModule[] }[]\n useEnabledNav: () => AppNavSection[]\n}\n\nexport function createModuleStore({\n registry,\n storageKey,\n}: {\n registry: ModuleRegistry\n storageKey: string\n}): ModuleStoreBundle {\n const { DEFAULT_MODULES, SECTION_ORDER, toNavItem } = registry\n\n /** Effective enabled flag for a module given the current overrides. */\n function isEnabled(overrides: Record<string, ModuleOverride>, id: string): boolean {\n return overrides[id]?.enabled ?? true\n }\n\n const id = (m: BuilderModule) => m.id\n\n /** Effective order for a module (override wins, else its default position). */\n function orderOf(overrides: Record<string, ModuleOverride>, m: BuilderModule): number {\n return overrides[id(m)]?.order ?? m.defaultOrder\n }\n\n const useModuleStore = create<ModuleStore>()(\n persist(\n (set, get) => ({\n overrides: {},\n\n toggle: (moduleId) => {\n const m = DEFAULT_MODULES.find((x) => x.id === moduleId)\n if (!m) return\n const cur = get().overrides\n const prev = cur[moduleId] ?? { enabled: true, order: m.defaultOrder }\n set({\n overrides: { ...cur, [moduleId]: { ...prev, enabled: !isEnabled(cur, moduleId) } },\n })\n },\n\n move: (moduleId, dir) => {\n const cur = get().overrides\n const target = DEFAULT_MODULES.find((x) => x.id === moduleId)\n if (!target) return\n // Siblings in the same section, in current effective order.\n const siblings = DEFAULT_MODULES.filter((x) => x.section === target.section).sort(\n (a, b) => orderOf(cur, a) - orderOf(cur, b)\n )\n const idx = siblings.findIndex((x) => x.id === moduleId)\n const swapIdx = dir === 'up' ? idx - 1 : idx + 1\n if (swapIdx < 0 || swapIdx >= siblings.length) return\n const a = siblings[idx]\n const b = siblings[swapIdx]\n const next = { ...cur }\n // Persist both siblings' effective orders, swapped.\n next[a.id] = { enabled: isEnabled(cur, a.id), order: orderOf(cur, b) }\n next[b.id] = { enabled: isEnabled(cur, b.id), order: orderOf(cur, a) }\n set({ overrides: next })\n },\n\n reset: () => set({ overrides: {} }),\n }),\n { name: storageKey }\n )\n )\n\n /** The full registry resolved against overrides, grouped + sorted by section. */\n function useResolvedModules(): { section: string; modules: ResolvedModule[] }[] {\n const overrides = useModuleStore((s) => s.overrides)\n return useMemo(() => {\n return SECTION_ORDER.map((section) => ({\n section,\n modules: DEFAULT_MODULES.filter((m) => m.section === section)\n .map((m) => ({ ...m, enabled: isEnabled(overrides, m.id), order: orderOf(overrides, m) }))\n .sort((a, b) => a.order - b.order),\n }))\n }, [overrides])\n }\n\n /**\n * The filtered/ordered nav the sidebar COULD consume — same shape as `appNav`.\n * One-line integration in AppSidebar: `const nav = useEnabledNav()` then map\n * over `nav` instead of the imported `appNav`.\n */\n function useEnabledNav(): AppNavSection[] {\n const grouped = useResolvedModules()\n return useMemo(\n () =>\n grouped\n .map((g) => ({\n heading: g.section,\n items: g.modules.filter((m) => m.enabled).map(toNavItem),\n }))\n .filter((s) => s.items.length > 0),\n [grouped]\n )\n }\n\n return { useModuleStore, useResolvedModules, useEnabledNav }\n}\n","/**\n * Agent-selection store — which ARBI behaviour configurations and agents the\n * host marks \"active\" for this vertical. Pure selection state (the configs and\n * agents themselves come live from ARBI via React Query), persisted so the\n * choice seeds the exported vertical config.\n *\n * Firm-agnostic: {@link createAgentSelectionStore} parameterises the persist key.\n */\nimport { create, type StoreApi, type UseBoundStore } from 'zustand'\nimport { persist } from 'zustand/middleware'\n\nexport interface AgentSelectionStore {\n /** Configuration ext_ids marked active. */\n configIds: string[]\n /** Agent ext_ids marked active. */\n agentIds: string[]\n toggleConfig: (id: string) => void\n toggleAgent: (id: string) => void\n clear: () => void\n}\n\nconst toggle = (list: string[], id: string) =>\n list.includes(id) ? list.filter((x) => x !== id) : [...list, id]\n\nexport function createAgentSelectionStore({\n storageKey,\n}: {\n storageKey: string\n}): UseBoundStore<StoreApi<AgentSelectionStore>> {\n return create<AgentSelectionStore>()(\n persist(\n (set) => ({\n configIds: [],\n agentIds: [],\n toggleConfig: (id) => set((s) => ({ configIds: toggle(s.configIds, id) })),\n toggleAgent: (id) => set((s) => ({ agentIds: toggle(s.agentIds, id) })),\n clear: () => set({ configIds: [], agentIds: [] }),\n }),\n { name: storageKey }\n )\n )\n}\n","/**\n * Vertical-config export — combine the configured theme, enabled/ordered\n * modules and selected ARBI agent configs into one JSON document. This is the\n * seed a generator would consume to stamp out a new vertical app.\n *\n * Firm-agnostic: {@link createVerticalExport} closes over the theme/module/agent\n * stores and the module registry.\n */\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport type { ThemeState } from '../theme/store'\nimport type { ModuleRegistry } from './modules/types'\nimport type { ModuleStoreBundle } from './modules/store'\nimport type { AgentSelectionStore } from './agents/store'\nimport type { ExportedModule, VerticalConfig } from './types'\n\nexport interface VerticalExportConfig {\n vertical: { name: string; key: string }\n themeStore: UseBoundStore<StoreApi<ThemeState>>\n moduleStore: ModuleStoreBundle\n agentStore: UseBoundStore<StoreApi<AgentSelectionStore>>\n registry: ModuleRegistry\n}\n\nexport interface VerticalExport {\n buildVerticalConfig: () => VerticalConfig\n serialize: (cfg?: VerticalConfig) => string\n download: (cfg?: VerticalConfig) => void\n}\n\nexport function createVerticalExport(cfg: VerticalExportConfig): VerticalExport {\n const { vertical, themeStore, moduleStore, agentStore, registry } = cfg\n const { DEFAULT_MODULES, SECTION_ORDER } = registry\n\n /** Build the export payload from current store state (pure, side-effect free). */\n function buildVerticalConfig(): VerticalConfig {\n const { colors, fonts, radius } = themeStore.getState()\n const { overrides } = moduleStore.useModuleStore.getState()\n const { configIds, agentIds } = agentStore.getState()\n\n const modules: ExportedModule[] = DEFAULT_MODULES.map((m) => ({\n id: m.id,\n label: m.label,\n section: m.section,\n to: m.to,\n arbi: m.arbi,\n enabled: overrides[m.id]?.enabled ?? true,\n order: overrides[m.id]?.order ?? m.defaultOrder,\n })).sort(\n (a, b) =>\n SECTION_ORDER.indexOf(a.section) - SECTION_ORDER.indexOf(b.section) || a.order - b.order\n )\n\n return {\n version: 1,\n generatedAt: new Date().toISOString(),\n vertical,\n theme: { colors, fonts, radius },\n modules,\n agents: { configIds, agentIds },\n }\n }\n\n /** Serialise the export as pretty JSON. */\n function serialize(config: VerticalConfig = buildVerticalConfig()): string {\n return JSON.stringify(config, null, 2)\n }\n\n /** Trigger a browser download of the vertical config JSON. */\n function download(config: VerticalConfig = buildVerticalConfig()): void {\n const blob = new Blob([serialize(config)], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${config.vertical.key}-vertical.json`\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n }\n\n return { buildVerticalConfig, serialize, download }\n}\n","/**\n * Module registry UI — enable/disable and reorder the vertical's modules.\n * Firm-agnostic: consumes an injected module-store bundle instead of a\n * singleton, so every host app drives its own registry through the same UI.\n */\nimport { ChevronUp, ChevronDown, RotateCcw, Sparkles } from 'lucide-react'\nimport { Card, CardContent, CardHeader, CardTitle, Button, Badge } from '@arbidocs/react/ui'\nimport { Switch } from '@arbidocs/react/ui'\nimport { tid } from '../lib/testid'\nimport type { ModuleStoreBundle } from './modules/store'\n\nexport interface ModuleManagerProps {\n store: ModuleStoreBundle\n testIdPrefix?: string\n}\n\nexport function ModuleManager({ store, testIdPrefix = 'builder' }: ModuleManagerProps) {\n const grouped = store.useResolvedModules()\n const toggle = store.useModuleStore((s) => s.toggle)\n const move = store.useModuleStore((s) => s.move)\n const reset = store.useModuleStore((s) => s.reset)\n\n const enabledCount = grouped.reduce((n, g) => n + g.modules.filter((m) => m.enabled).length, 0)\n const total = grouped.reduce((n, g) => n + g.modules.length, 0)\n\n return (\n <div className=\"space-y-5\" data-testid={`${testIdPrefix}-modules`}>\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\" data-testid={`${testIdPrefix}-modules-count`}>\n {enabledCount} of {total} modules enabled\n </p>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={reset}\n data-testid={`${testIdPrefix}-modules-reset`}\n >\n <RotateCcw className=\"size-3.5\" /> Reset\n </Button>\n </div>\n\n {grouped.map((group) => (\n <Card\n key={group.section}\n variant=\"elevated\"\n className=\"rounded-lg\"\n data-testid={tid(`${testIdPrefix}-modules-section`, group.section)}\n >\n <CardHeader>\n <CardTitle className=\"text-base\">{group.section}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {group.modules.map((m, idx) => {\n const Icon = m.icon\n return (\n <div\n key={m.id}\n className=\"flex items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-module`, m.id)}\n >\n <div className=\"flex flex-col\">\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-6\"\n disabled={idx === 0}\n onClick={() => move(m.id, 'up')}\n aria-label={`Move ${m.label} up`}\n data-testid={tid(`${testIdPrefix}-module-up`, m.id)}\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-6\"\n disabled={idx === group.modules.length - 1}\n onClick={() => move(m.id, 'down')}\n aria-label={`Move ${m.label} down`}\n data-testid={tid(`${testIdPrefix}-module-down`, m.id)}\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </div>\n <Icon className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">{m.label}</p>\n <p className=\"truncate font-mono text-xs text-muted-foreground\">{m.to}</p>\n </div>\n {m.arbi && (\n <Badge variant=\"accent\" className=\"text-xs\">\n <Sparkles className=\"size-3\" /> ARBI\n </Badge>\n )}\n <Switch\n checked={m.enabled}\n onCheckedChange={() => toggle(m.id)}\n aria-label={`Enable ${m.label}`}\n data-testid={tid(`${testIdPrefix}-module-toggle`, m.id)}\n />\n </div>\n )\n })}\n </CardContent>\n </Card>\n ))}\n </div>\n )\n}\n","/**\n * Agent/behaviour surface — select which ARBI configs and agents are active for\n * the vertical. Firm-agnostic: consumes an injected agent-selection store; the\n * configs and agents themselves come live from ARBI via React Query.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport { useArbi, useAgents, useConfigs } from '@arbidocs/react'\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@arbidocs/react/ui'\nimport { Bot, BrainCircuit, Cpu } from 'lucide-react'\nimport { Checkbox } from '@arbidocs/react/ui'\nimport { tid } from '../lib/testid'\nimport type { AgentSelectionStore } from './agents/store'\n\ntype AgentStore = UseBoundStore<StoreApi<AgentSelectionStore>>\n\ntype BadgeVariant = 'default' | 'accent' | 'secondary'\n\n/** Colour the model tier so Premium/Wise read at a glance. */\nconst TIER_VARIANT: Record<string, BadgeVariant> = {\n Premium: 'default',\n Wise: 'accent',\n Fast: 'secondary',\n auto: 'secondary',\n}\n\n/**\n * The model tier lives inside a configuration's `Agents.AGENT_MODEL_NAME`\n * (auto|Fast|Wise|Premium) — NOT the list response — so we fetch the config\n * detail lazily. This is the tier, distinct from the assistant query `model`\n * field (which carries a configuration ext_id, not a tier).\n */\nfunction ConfigModelBadge({ configId, testIdPrefix }: { configId: string; testIdPrefix: string }) {\n const arbi = useArbi()\n const { data, isLoading, isError } = useQuery({\n queryKey: ['builder', 'config-model', configId],\n queryFn: async () => (await arbi.agentConfig.get(configId)).Agents.AGENT_MODEL_NAME,\n staleTime: 60_000,\n })\n const tier = isLoading ? '…' : isError || !data ? '—' : data\n return (\n <Badge\n variant={TIER_VARIANT[tier] ?? 'secondary'}\n data-testid={tid(`${testIdPrefix}-agents-config-tier`, configId)}\n >\n <Cpu className=\"size-3\" /> {tier}\n </Badge>\n )\n}\n\nexport interface AgentsPanelProps {\n store: AgentStore\n testIdPrefix?: string\n}\n\nexport function AgentsPanel({ store, testIdPrefix = 'builder' }: AgentsPanelProps) {\n const { data: configs, isLoading: configsLoading } = useConfigs()\n const { data: agents = [], isLoading: agentsLoading } = useAgents()\n const configIds = store((s) => s.configIds)\n const agentIds = store((s) => s.agentIds)\n const toggleConfig = store((s) => s.toggleConfig)\n const toggleAgent = store((s) => s.toggleAgent)\n\n const versions = configs?.versions ?? []\n\n return (\n <div className=\"space-y-6\" data-testid={`${testIdPrefix}-agents`}>\n {/* Behaviour configurations */}\n <Card\n variant=\"elevated\"\n className=\"rounded-lg\"\n data-testid={`${testIdPrefix}-agents-configs`}\n >\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <BrainCircuit className=\"size-4 text-primary\" /> Behaviour configurations\n <Badge variant=\"secondary\" className=\"ml-1\">\n {versions.length}\n </Badge>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {configsLoading && (\n <p className=\"text-sm text-muted-foreground\">Loading configurations…</p>\n )}\n {!configsLoading && versions.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n No configurations found on this workspace.\n </p>\n )}\n {versions.map((v) => (\n <label\n key={v.external_id}\n className=\"flex cursor-pointer items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-agents-config`, v.external_id)}\n >\n <Checkbox\n checked={configIds.includes(v.external_id)}\n onCheckedChange={() => toggleConfig(v.external_id)}\n data-testid={tid(`${testIdPrefix}-agents-config-toggle`, v.external_id)}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {v.title ?? 'Untitled behaviour'}\n </p>\n <p className=\"truncate font-mono text-xs text-muted-foreground\">{v.external_id}</p>\n </div>\n <ConfigModelBadge configId={v.external_id} testIdPrefix={testIdPrefix} />\n </label>\n ))}\n </CardContent>\n </Card>\n\n {/* Agents */}\n <Card variant=\"elevated\" className=\"rounded-lg\" data-testid={`${testIdPrefix}-agents-agents`}>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Bot className=\"size-4 text-primary\" /> Agents\n <Badge variant=\"secondary\" className=\"ml-1\">\n {agents.length}\n </Badge>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-1.5\">\n {agentsLoading && <p className=\"text-sm text-muted-foreground\">Loading agents…</p>}\n {!agentsLoading && agents.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No agents provisioned.</p>\n )}\n {agents.map((a) => (\n <label\n key={a.external_id}\n className=\"flex cursor-pointer items-center gap-3 rounded-md border border-border/60 bg-card px-3 py-2\"\n data-testid={tid(`${testIdPrefix}-agents-agent`, a.external_id)}\n >\n <Checkbox\n checked={agentIds.includes(a.external_id)}\n onCheckedChange={() => toggleAgent(a.external_id)}\n data-testid={tid(`${testIdPrefix}-agents-agent-toggle`, a.external_id)}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {(a.given_name ?? 'Agent').replace(/-/g, ' ')}\n </p>\n <p className=\"truncate font-mono text-xs text-muted-foreground\">{a.external_id}</p>\n </div>\n </label>\n ))}\n </CardContent>\n </Card>\n </div>\n )\n}\n","/**\n * VerticalBuilder — the back-office surface that configures a host's vertical:\n * theme tokens, which modules ship (and in what order) and which ARBI\n * behaviours/agents are active. Not a page builder — it produces a\n * vertical-config seed.\n *\n * Firm-agnostic: the theme bundle, module/agent stores and exporter arrive as\n * props; the host supplies its own `header` (PageHeader + links + badges) so\n * app-specific routing stays in the app.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport { Download, Palette, LayoutGrid, Bot, FileJson } from 'lucide-react'\nimport type { StoreApi, UseBoundStore } from 'zustand'\nimport { Card, CardContent, CardHeader, CardTitle, Button } from '@arbidocs/react/ui'\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '@arbidocs/react/ui'\nimport { ThemeEditor } from '../theme/ThemeEditor'\nimport type { ThemeBundle } from '../theme/store'\nimport { ModuleManager } from './ModuleManager'\nimport { AgentsPanel } from './AgentsPanel'\nimport type { ModuleStoreBundle } from './modules/store'\nimport type { AgentSelectionStore } from './agents/store'\nimport type { VerticalExport } from './export'\n\ntype AgentStore = UseBoundStore<StoreApi<AgentSelectionStore>>\n\nexport interface VerticalBuilderProps {\n themeBundle: ThemeBundle\n moduleStore: ModuleStoreBundle\n agentStore: AgentStore\n exporter: VerticalExport\n themePreview: { title: string; subtitle?: string }\n header?: ReactNode\n studioHref?: string\n testIdPrefix?: string\n}\n\n/** Export tab — a live JSON preview of the combined vertical config + download. */\nfunction ExportPanel({\n themeBundle,\n moduleStore,\n agentStore,\n exporter,\n testIdPrefix,\n}: {\n themeBundle: ThemeBundle\n moduleStore: ModuleStoreBundle\n agentStore: AgentStore\n exporter: VerticalExport\n testIdPrefix: string\n}) {\n // Subscribe to each store so the preview recomputes as the admin edits.\n const theme = themeBundle.useStore()\n const modules = moduleStore.useModuleStore()\n const agents = agentStore()\n const json = useMemo(() => exporter.serialize(), [theme, modules, agents, exporter])\n\n return (\n <Card variant=\"elevated\" className=\"rounded-xl\" data-testid={`${testIdPrefix}-export-panel`}>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between text-base\">\n <span className=\"flex items-center gap-2\">\n <FileJson className=\"size-4 text-primary\" /> Vertical config\n </span>\n <Button\n size=\"sm\"\n variant=\"accent\"\n onClick={() => exporter.download()}\n data-testid={`${testIdPrefix}-export`}\n >\n <Download className=\"size-4\" /> Download JSON\n </Button>\n </CardTitle>\n </CardHeader>\n <CardContent>\n <pre\n className=\"scrollbar-slim max-h-[520px] overflow-auto rounded-md bg-foreground p-4 font-mono text-xs leading-relaxed text-background\"\n data-testid={`${testIdPrefix}-export-preview`}\n >\n {json}\n </pre>\n </CardContent>\n </Card>\n )\n}\n\nexport function VerticalBuilder({\n themeBundle,\n moduleStore,\n agentStore,\n exporter,\n themePreview,\n header,\n testIdPrefix = 'builder',\n}: VerticalBuilderProps) {\n return (\n <div className=\"space-y-6\" data-testid={`page-${testIdPrefix}`}>\n {header}\n\n <Tabs defaultValue=\"theme\">\n <TabsList data-testid={`${testIdPrefix}-tabs`}>\n <TabsTrigger value=\"theme\" data-testid={`${testIdPrefix}-tab-theme`}>\n <Palette className=\"size-4\" /> Theme\n </TabsTrigger>\n <TabsTrigger value=\"modules\" data-testid={`${testIdPrefix}-tab-modules`}>\n <LayoutGrid className=\"size-4\" /> Modules\n </TabsTrigger>\n <TabsTrigger value=\"agents\" data-testid={`${testIdPrefix}-tab-agents`}>\n <Bot className=\"size-4\" /> Agents\n </TabsTrigger>\n <TabsTrigger value=\"export\" data-testid={`${testIdPrefix}-tab-export`}>\n <FileJson className=\"size-4\" /> Export\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"theme\">\n <ThemeEditor\n bundle={themeBundle}\n variant=\"panel\"\n testIdPrefix={`${testIdPrefix}-theme`}\n preview={themePreview}\n />\n </TabsContent>\n <TabsContent value=\"modules\">\n <ModuleManager store={moduleStore} testIdPrefix={testIdPrefix} />\n </TabsContent>\n <TabsContent value=\"agents\">\n <AgentsPanel store={agentStore} testIdPrefix={testIdPrefix} />\n </TabsContent>\n <TabsContent value=\"export\">\n <ExportPanel\n themeBundle={themeBundle}\n moduleStore={moduleStore}\n agentStore={agentStore}\n exporter={exporter}\n testIdPrefix={testIdPrefix}\n />\n </TabsContent>\n </Tabs>\n </div>\n )\n}\n"]}
|