@iota-uz/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +201 -0
  2. package/README.MD +164 -0
  3. package/assets/fonts/Actay/Actay-Regular.otf +0 -0
  4. package/assets/fonts/Actay/Actay-RegularItalic.otf +0 -0
  5. package/assets/fonts/Actay/ActayCondensed-Thin.otf +0 -0
  6. package/assets/fonts/Actay/ActayCondensed-ThinItalic.otf +0 -0
  7. package/assets/fonts/Actay/ActayWide-Bold.otf +0 -0
  8. package/assets/fonts/Actay/ActayWide-BoldItalic.otf +0 -0
  9. package/assets/fonts/Gilroy/Gilroy-Black.woff2 +0 -0
  10. package/assets/fonts/Gilroy/Gilroy-BlackItalic.woff2 +0 -0
  11. package/assets/fonts/Gilroy/Gilroy-Bold.woff2 +0 -0
  12. package/assets/fonts/Gilroy/Gilroy-BoldItalic.woff2 +0 -0
  13. package/assets/fonts/Gilroy/Gilroy-Extrabold.woff2 +0 -0
  14. package/assets/fonts/Gilroy/Gilroy-ExtraboldItalic.woff2 +0 -0
  15. package/assets/fonts/Gilroy/Gilroy-Heavy.woff2 +0 -0
  16. package/assets/fonts/Gilroy/Gilroy-HeavyItalic.woff2 +0 -0
  17. package/assets/fonts/Gilroy/Gilroy-Light.woff2 +0 -0
  18. package/assets/fonts/Gilroy/Gilroy-LightItalic.woff2 +0 -0
  19. package/assets/fonts/Gilroy/Gilroy-Medium.woff2 +0 -0
  20. package/assets/fonts/Gilroy/Gilroy-MediumItalic.woff2 +0 -0
  21. package/assets/fonts/Gilroy/Gilroy-Regular.woff2 +0 -0
  22. package/assets/fonts/Gilroy/Gilroy-RegularItalic.woff2 +0 -0
  23. package/assets/fonts/Gilroy/Gilroy-Semibold.woff2 +0 -0
  24. package/assets/fonts/Gilroy/Gilroy-SemiboldItalic.woff2 +0 -0
  25. package/assets/fonts/Gilroy/Gilroy-Thin.woff2 +0 -0
  26. package/assets/fonts/Gilroy/Gilroy-ThinItalic.woff2 +0 -0
  27. package/assets/fonts/Gilroy/Gilroy-UltraLight.woff2 +0 -0
  28. package/assets/fonts/Gilroy/Gilroy-UltraLightItalic.woff2 +0 -0
  29. package/assets/fonts/Inter.var.woff2 +0 -0
  30. package/dist/bichat/index.cjs +3033 -0
  31. package/dist/bichat/index.cjs.map +1 -0
  32. package/dist/bichat/index.css +139 -0
  33. package/dist/bichat/index.css.map +1 -0
  34. package/dist/bichat/index.d.cts +1081 -0
  35. package/dist/bichat/index.d.ts +1081 -0
  36. package/dist/bichat/index.mjs +2959 -0
  37. package/dist/bichat/index.mjs.map +1 -0
  38. package/dist/bichat/styles.css +160 -0
  39. package/dist/index.cjs +191 -0
  40. package/dist/index.cjs.map +1 -0
  41. package/dist/index.d.cts +237 -0
  42. package/dist/index.d.ts +237 -0
  43. package/dist/index.mjs +178 -0
  44. package/dist/index.mjs.map +1 -0
  45. package/package.json +70 -0
  46. package/tailwind/create-config.cjs +142 -0
  47. package/tailwind/iota.css +1106 -0
  48. package/tailwind/main.css +2 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../ui/src/bichat/components/MarkdownRenderer.tsx","../../ui/src/bichat/types/index.ts","../../ui/src/bichat/utils/RateLimiter.ts","../../ui/src/bichat/context/ChatContext.tsx","../../ui/src/bichat/context/IotaContext.tsx","../../ui/src/bichat/locales/defaults.ts","../../ui/src/bichat/hooks/useTranslation.ts","../../ui/src/bichat/hooks/useBranding.ts","../../ui/src/bichat/components/ChatHeader.tsx","../../ui/src/bichat/utils/fileUtils.ts","../../ui/src/bichat/components/AttachmentGrid.tsx","../../ui/src/bichat/components/ImageModal.tsx","../../ui/src/bichat/components/UserTurnView.tsx","../../ui/src/bichat/components/CodeOutputsPanel.tsx","../../ui/src/bichat/components/StreamingCursor.tsx","../../ui/src/bichat/components/ChartCard.tsx","../../ui/src/bichat/components/SourcesPanel.tsx","../../ui/src/bichat/components/DownloadCard.tsx","../../ui/src/bichat/components/InlineQuestionForm.tsx","../../ui/src/bichat/components/AssistantTurnView.tsx","../../ui/src/bichat/components/TurnBubble.tsx","../../ui/src/bichat/components/ScrollToBottomButton.tsx","../../ui/src/bichat/components/MessageList.tsx","../../ui/src/bichat/components/MessageInput.tsx","../../ui/src/bichat/components/WelcomeContent.tsx","../../ui/src/bichat/components/ChatSession.tsx","../../ui/src/bichat/index.ts","../../ui/src/bichat/animations/variants.ts","../../ui/src/bichat/components/EmptyState.tsx","../../ui/src/bichat/components/EditableText.tsx","../../ui/src/bichat/components/SearchInput.tsx","../../ui/src/bichat/components/Skeleton.tsx","../../ui/src/bichat/config/ConfigContext.tsx","../../ui/src/bichat/hooks/useStreaming.ts","../../ui/src/bichat/theme/themes.ts","../../ui/src/bichat/theme/ThemeProvider.tsx","../../ui/src/bichat/api/csrf.ts","../../ui/src/bichat/data/HttpDataSource.ts"],"names":["jsx","ReactMarkdown","remarkGfm","rehypeSanitize","SyntaxHighlighter","tomorrow","MessageRole","createContext","useState","useRef","useEffect","useCallback","useContext","useMemo","jsxs","X","Fragment","CaretLeft","CaretRight","Copy","PencilSimple","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","Bar","LineChart","Line","PieChart","Pie","Cell","AreaChart","Area","ResponsiveContainer","MarkdownRenderer","lazy","Suspense","formatDistanceToNow","ArrowsClockwise","AnimatePresence","motion","ArrowDown","forwardRef","useImperativeHandle","Paperclip","PaperPlaneRight","ChartBar","FileText","Lightbulb","prompt","memo","sizeClasses","CircleNotch","MagnifyingGlass","hasPermission"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,wBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,wBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAiBO,SAAS,gBAAA,CAAiB,EAAE,OAAA,EAAQ,EAA0B;AACnE,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACb,QAAA,kBAAAA,cAAAA;AAAA,IAACC,8BAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAe,CAACC,0BAAS,CAAA;AAAA,MACzB,aAAA,EAAe,CAACC,+BAAc,CAAA;AAAA,MAC9B,UAAA,EAAY;AAAA,QACV,KAAK,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,OAAM,EAAG;AACtC,UAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,SAAA,IAAa,EAAE,CAAA;AACnD,UAAA,MAAM,WAAW,CAAC,KAAA;AAClB,UAAA,OAAO,CAAC,QAAA,IAAY,KAAA,mBAClBH,cAAAA;AAAA,YAACI,4BAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAOC,cAAA;AAAA,cACP,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,cACjB,MAAA,EAAO,KAAA;AAAA,cAEN,QAAA,EAAA,MAAA,CAAO,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE;AAAA;AAAA,8BAGrCL,cAAAA,CAAC,UAAK,SAAA,EAAuB,GAAG,OAC7B,QAAA,EACH,CAAA;AAAA,QAEJ;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AA/CA,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+CAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACaO,IAAK,WAAA,qBAAAM,YAAAA,KAAL;AACL,EAAAA,aAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,aAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,aAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,aAAA,MAAA,CAAA,GAAO,MAAA;AAJG,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;;;ACHL,IAAM,cAAN,MAAkB;AAAA,EAKvB,YAAY,MAAA,EAA2B;AAJvC,IAAA,IAAA,CAAQ,aAAuB,EAAC;AAK9B,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,GAA0B;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,CAAW,MAAA,CAAO,OAAK,GAAA,GAAM,CAAA,GAAI,KAAK,QAAQ,CAAA;AAGrE,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,IAAU,IAAA,CAAK,WAAA,EAAa;AAC9C,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,GAAG,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAA,GAAkC;AAChC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa;AAC7C,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AACzC,IAAA,MAAM,cAAc,GAAA,GAAM,eAAA;AAC1B,IAAA,MAAM,aAAA,GAAgB,KAAK,QAAA,GAAW,WAAA;AAEtC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAa,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EACrB;AACF;AC1CA,IAAM,kBAAA,GAAqBC,oBAA8C,IAAI,CAAA;AAU7E,IAAM,yBAAA,GAA4B;AAAA,EAChC,WAAA,EAAa,EAAA;AAAA,EACb,QAAA,EAAU;AAAA;AACZ,CAAA;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,EAAa,mBAAA;AAAA,EACb;AACF,CAAA,EAA6B;AAE3B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,EAAE,CAAA;AAGzC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAA6B,SAAS,CAAA;AACtF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAyB,IAAI,CAAA;AAC3D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAG9C,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAiC,IAAI,CAAA;AAGnF,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,kBAAA,GAAqBC,aAA+B,IAAI,CAAA;AAG9D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAID,cAAA,CAA0B,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAA,CAAuB,EAAE,CAAA;AAG/D,EAAA,MAAM,cAAA,GAAiBC,YAAA;AAAA,IACrB,mBAAA,IAAuB,IAAI,WAAA,CAAY,yBAAyB;AAAA,GAClE;AAGA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,SAAS,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAA,IAAoB,gBAAA,KAAqB,KAAA,EAAO;AACnD,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,UAAA,CACG,YAAA,CAAa,gBAAgB,CAAA,CAC7B,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,MAAA,IAAI,SAAA,EAAW;AAEf,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,UAAA,CAAW,MAAM,OAAO,CAAA;AACxB,QAAA,WAAA,CAAY,MAAM,QAAQ,CAAA;AAC1B,QAAA,kBAAA,CAAmB,KAAA,CAAM,mBAAmB,IAAI,CAAA;AAAA,MAClD,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,mBAAmB,CAAA;AAAA,MAC9B;AACA,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,QAAA,CAAS,GAAA,CAAI,WAAW,wBAAwB,CAAA;AAChD,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,gBAAgB,CAAC,CAAA;AAEjC,EAAA,MAAM,UAAA,GAAaC,iBAAA,CAAY,OAAO,IAAA,KAAiB;AACrD,IAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAAA,EAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoBA,iBAAA;AAAA,IACxB,OAAO,OAAA,EAAiB,WAAA,GAA4B,EAAC,KAAqB;AACxE,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,IAAK,OAAA,EAAS;AAGhC,MAAA,IAAI,CAAC,cAAA,CAAe,OAAA,CAAQ,cAAA,EAAe,EAAG;AAC5C,QAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,OAAA,CAAQ,uBAAA,EAAwB;AACrE,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,aAAA,GAAgB,GAAI,CAAA;AAC9C,QAAA,QAAA,CAAS,CAAA,iCAAA,EAAoC,OAAO,CAAA,wCAAA,CAA0C,CAAA;AAC9F,QAAA,UAAA,CAAW,MAAM,QAAA,CAAS,IAAI,CAAA,EAAG,GAAI,CAAA;AACrC,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,mBAAA,CAAoB,EAAE,CAAA;AAGtB,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAGjD,MAAA,MAAM,eAAA,GAA2B;AAAA,QAC/B,EAAA,EAAI,CAAA,UAAA,EAAa,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,QAC3B,WAAW,gBAAA,IAAoB,KAAA;AAAA,QAC/B,IAAA,EAAA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AACA,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,eAAe,CAAC,CAAA;AAEhD,MAAA,IAAI;AAEF,QAAA,IAAI,eAAA,GAAkB,gBAAA;AACtB,QAAA,IAAI,mBAAA,GAAsB,KAAA;AAE1B,QAAA,IAAI,CAAC,eAAA,IAAmB,eAAA,KAAoB,KAAA,EAAO;AACjD,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,aAAA,EAAc;AAC9C,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,eAAA,GAAkB,MAAA,CAAO,EAAA;AACzB,YAAA,mBAAA,CAAoB,eAAe,CAAA;AACnC,YAAA,mBAAA,GAAsB,IAAA;AAAA,UACxB;AAAA,QACF;AAGA,QAAA,IAAI,kBAAA,GAAqB,EAAA;AACzB,QAAA,IAAI,gBAAA;AACJ,QAAA,cAAA,CAAe,IAAI,CAAA;AAEnB,QAAA,WAAA,MAAiB,SAAS,UAAA,CAAW,WAAA;AAAA,UACnC,eAAA,IAAmB,KAAA;AAAA,UACnB,OAAA;AAAA,UACA,WAAA;AAAA,UACA,mBAAmB,OAAA,EAAS;AAAA,SAC9B,EAAG;AAED,UAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAC9C,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,OAAA,EAAS;AAC3C,YAAA,kBAAA,IAAsB,KAAA,CAAM,OAAA;AAC5B,YAAA,mBAAA,CAAoB,kBAAkB,CAAA;AAAA,UACxC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,YAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,cAAc,CAAA;AAAA,UAC/C,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAChC,YAAA,IAAI,MAAM,SAAA,EAAW;AACnB,cAAA,gBAAA,GAAmB,KAAA,CAAM,SAAA;AAAA,YAC3B;AAEA,YAAA,MAAM,iBAAiB,gBAAA,IAAoB,eAAA;AAC3C,YAAA,IAAI,cAAA,IAAkB,mBAAmB,KAAA,EAAO;AAC9C,cAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,YAAA,CAAa,cAAc,CAAA;AAC1D,cAAA,IAAI,KAAA,EAAO;AACT,gBAAA,UAAA,CAAW,MAAM,OAAO,CAAA;AACxB,gBAAA,WAAA,CAAY,MAAM,QAAQ,CAAA;AAC1B,gBAAA,kBAAA,CAAmB,KAAA,CAAM,mBAAmB,IAAI,CAAA;AAAA,cAClD;AAAA,YACF;AAAA,UACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,cAAA,IAAkB,MAAM,SAAA,EAAW;AAC3D,YAAA,gBAAA,GAAmB,KAAA,CAAM,SAAA;AAAA,UAC3B;AAAA,QACF;AAGA,QAAA,MAAM,kBAAkB,gBAAA,IAAoB,eAAA;AAC5C,QAAA,IAAI,mBAAA,IAAuB,eAAA,IAAmB,eAAA,KAAoB,KAAA,EAAO;AACvE,UAAA,UAAA,CAAW,oBAAoB,eAAe,CAAA;AAAA,QAChD;AAAA,MACF,SAAS,GAAA,EAAK;AAEZ,QAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AAErD,UAAA,UAAA,CAAW,OAAO,CAAA;AAClB,UAAA;AAAA,QACF;AAGA,QAAA,WAAA,CAAY,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,eAAA,CAAgB,EAAE,CAAC,CAAA;AAErE,QAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AAC1D,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,GAAG,CAAA;AAAA,MAC1C,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,gBAAA,EAAkB,OAAA,EAAS,UAAU;AAAA,GACxC;AAEA,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AACjC,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,iBAAA;AAAA,IACnB,CAAC,CAAA,EAAoB,WAAA,GAAiC,EAAC,KAAM;AAC3D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,IAAK,WAAA,CAAY,WAAW,CAAA,EAAG;AAGjD,MAAA,MAAM,oBAAA,GAAqC,WAAA,CAAY,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QACjE,EAAA,EAAI,EAAA;AAAA;AAAA,QACJ,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,YAAY,GAAA,CAAI;AAAA,OAClB,CAAE,CAAA;AAEF,MAAA,iBAAA,CAAkB,SAAS,oBAAoB,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,CAAC,SAAS,iBAAiB;AAAA,GAC7B;AAEA,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACtC,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AACvD,IAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAEzC,IAAA,OAAO;AAAA,MACL,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,aAAa,UAAA,CAAW;AAAA,KAC1B;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,gBAAA,GAAmBA,iBAAA;AAAA,IACvB,OAAO,SAAA,KAAsB;AAC3B,MAAA,IAAI,CAAC,gBAAA,IAAoB,gBAAA,KAAqB,KAAA,EAAO;AAErD,MAAA,MAAM,eAAe,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AACjE,MAAA,IAAI,gBAAgB,CAAA,EAAG;AAEvB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AAEF,QAAA,MAAM,WAAA,GAAc,QAAA,CAAS,YAAA,GAAe,CAAC,CAAA;AAC7C,QAAA,IAAI,WAAA,IAAe,YAAY,IAAA,KAAA,MAAA,aAA2B;AACxD,UAAA,MAAM,iBAAA,CAAkB,WAAA,CAAY,OAAA,EAAS,EAAE,CAAA;AAAA,QACjD;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,8BAAA;AAC1D,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,GAAG,CAAA;AAAA,MACxC,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,gBAAA,EAAkB,iBAAiB;AAAA,GAChD;AAEA,EAAA,MAAM,UAAA,GAAaA,iBAAA;AAAA,IACjB,OAAO,WAAmB,UAAA,KAAuB;AAC/C,MAAA,IAAI,CAAC,gBAAA,IAAoB,gBAAA,KAAqB,KAAA,EAAO;AACnD,QAAA,UAAA,CAAW,UAAU,CAAA;AACrB,QAAA,WAAA,CAAY,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,SAAS,CAAC,CAAA;AAC5D,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AAEF,QAAA,MAAM,iBAAA,CAAkB,UAAA,EAAY,EAAE,CAAA;AAAA,MACxC,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AAC1D,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,eAAe,GAAG,CAAA;AAAA,MAClC,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,kBAAkB,iBAAiB;AAAA,GACtC;AAEA,EAAA,MAAM,2BAAA,GAA8BA,iBAAA;AAAA,IAClC,CAAC,OAAA,KAA6B;AAC5B,MAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,eAAA,EAAiB;AAE3C,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,MAAM,uBAAA,GAA0B,eAAA;AAChC,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAEtB,MAAA,CAAC,YAAY;AACZ,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,qBAAA;AAAA,YAC9B,gBAAA;AAAA,YACA,uBAAA,CAAwB,EAAA;AAAA,YACxB;AAAA,WACF;AAEA,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,cAAA,IAAI;AACF,gBAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,YAAA,CAAa,gBAAgB,CAAA;AAC5D,gBAAA,IAAI,KAAA,EAAO;AACT,kBAAA,WAAA,CAAY,MAAM,QAAQ,CAAA;AAC1B,kBAAA,kBAAA,CAAmB,KAAA,CAAM,mBAAmB,IAAI,CAAA;AAAA,gBAClD,CAAA,MAAO;AACL,kBAAA,kBAAA,CAAmB,uBAAuB,CAAA;AAC1C,kBAAA,QAAA,CAAS,gCAAgC,CAAA;AAAA,gBAC3C;AAAA,cACF,SAAS,QAAA,EAAU;AACjB,gBAAA,kBAAA,CAAmB,uBAAuB,CAAA;AAC1C,gBAAA,MAAM,YAAA,GACJ,QAAA,YAAoB,KAAA,GAChB,QAAA,CAAS,OAAA,GACT,gCAAA;AACN,gBAAA,QAAA,CAAS,YAAY,CAAA;AAAA,cACvB;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,kBAAA,CAAmB,uBAAuB,CAAA;AAC1C,YAAA,QAAA,CAAS,MAAA,CAAO,SAAS,0BAA0B,CAAA;AAAA,UACrD;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,kBAAA,CAAmB,uBAAuB,CAAA;AAC1C,UAAA,MAAM,YAAA,GACJ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,0BAAA;AACvC,UAAA,QAAA,CAAS,YAAY,CAAA;AAAA,QACvB,CAAA,SAAE;AACA,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF,CAAA,GAAG;AAAA,IACL,CAAA;AAAA,IACA,CAAC,gBAAA,EAAkB,eAAA,EAAiB,UAAU;AAAA,GAChD;AAEA,EAAA,MAAM,2BAAA,GAA8BA,kBAAY,YAAY;AAC1D,IAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,eAAA,EAAiB;AAE3C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,qBAAA,CAAsB,gBAAgB,EAAE,CAAA;AAExE,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,SAAS,2BAA2B,CAAA;AAAA,MACtD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,YAAA,GACJ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,2BAAA;AACvC,MAAA,QAAA,CAAS,YAAY,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,eAAA,EAAiB,UAAU,CAAC,CAAA;AAElD,EAAA,MAAM,KAAA,GAAiC;AAAA;AAAA,IAErC,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA;AAAA,IAGA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA;AAAA,IAGA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,2BAAA;AAAA,IACA,2BAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA,EAAa,iBAAA;AAAA,IACb,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,uBACEX,cAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAC1B,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,OAAA,GAAmC;AACjD,EAAA,MAAM,OAAA,GAAUY,iBAAW,kBAAkB,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,OAAA;AACT;ACtbA,IAAM,WAAA,GAAcL,oBAAsC,IAAI,CAAA;AAMvD,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAS,EAA6B;AAE1E,EAAA,MAAM,iBAAiB,MAAA,CAAO,kBAAA;AAE9B,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,MAAM,8EAA8E,CAAA;AAAA,EAChG;AAEA,EAAA,uBACEP,cAAAA,CAAC,WAAA,CAAY,UAAZ,EAAqB,KAAA,EAAO,gBAC1B,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,cAAA,GAAkC;AAChD,EAAA,MAAM,OAAA,GAAUY,iBAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,cAAc,UAAA,EAA6B;AACzD,EAAA,MAAM,UAAU,MAAA,CAAO,kBAAA;AACvB,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA;AACrD;;;ACnCO,IAAM,mBAAA,GAAoC;AAAA;AAAA,EAE/C,eAAA,EAAiB,mBAAA;AAAA,EACjB,qBAAA,EACE,sHAAA;AAAA,EACF,mBAAA,EAAqB,YAAA;AAAA;AAAA,EAGrB,cAAA,EAAgB,UAAA;AAAA,EAChB,eAAA,EAAiB,UAAA;AAAA,EACjB,aAAA,EAAe,QAAA;AAAA,EACf,aAAA,EAAe,SAAA;AAAA;AAAA,EAGf,mBAAA,EAAqB,mBAAA;AAAA,EACrB,mBAAA,EAAqB,cAAA;AAAA,EACrB,oBAAA,EAAsB,eAAA;AAAA,EACtB,kBAAA,EAAoB,kBAAA;AAAA,EACpB,mBAAA,EAAqB,cAAA;AAAA,EACrB,kBAAA,EAAoB,mBAAA;AAAA,EACpB,kBAAA,EAAoB,eAAA;AAAA,EACpB,sBAAA,EAAwB,2BAAA;AAAA,EACxB,oBAAA,EAAsB,eAAA;AAAA;AAAA,EAGtB,cAAA,EAAgB,MAAA;AAAA,EAChB,gBAAA,EAAkB,SAAA;AAAA,EAClB,oBAAA,EAAsB,YAAA;AAAA,EACtB,cAAA,EAAgB,MAAA;AAAA,EAChB,cAAA,EAAgB,MAAA;AAAA,EAChB,gBAAA,EAAkB,QAAA;AAAA;AAAA,EAGlB,oBAAA,EAAsB,aAAA;AAAA,EACtB,oBAAA,EAAsB,oBAAA;AAAA,EACtB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAGxB,iBAAA,EAAmB,QAAA;AAAA,EACnB,oBAAA,EAAsB,mBAAA;AAAA,EACtB,sBAAA,EAAwB,4BAAA;AAAA,EACxB,mBAAA,EAAqB,wBAAA;AAAA,EACrB,gBAAA,EAAkB,OAAA;AAAA,EAClB,uBAAA,EAAyB,gBAAA;AAAA;AAAA,EAGzB,eAAA,EAAiB,sBAAA;AAAA,EACjB,oBAAA,EAAsB,kCAAA;AAAA,EACtB,sBAAA,EAAwB,kCAAA;AAAA,EACxB,oBAAA,EAAsB,mBAAA;AAAA,EACtB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,gBAAA,EAAkB,6BAAA;AAAA;AAAA,EAGlB,kBAAA,EAAoB,iBAAA;AAAA,EACpB,kBAAA,EAAoB,kBAAA;AAAA,EACpB,iBAAA,EAAmB,2BAAA;AAAA;AAAA,EAGnB,eAAA,EAAiB,SAAA;AAAA,EACjB,kBAAA,EAAoB,WAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA;AAAA,EAGrB,mBAAA,EAAqB,cAAA;AAAA,EACrB,sBAAA,EAAwB,UAAA;AAAA,EACxB,oBAAA,EAAsB,QAAA;AAAA,EACtB,sBAAA,EAAwB,UAAA;AAAA;AAAA,EAGxB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,kBAAA,EAAoB,iBAAA;AAAA,EACpB,cAAA,EAAgB,mBAAA;AAAA;AAAA,EAGhB,mBAAA,EAAqB,eAAA;AAAA,EACrB,kBAAA,EAAoB,SAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB,CAAA;;;AClFO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,cAAA,EAAe;AAQlC,EAAA,MAAM,CAAA,GAAI,CAAC,GAAA,EAAa,MAAA,KAAyC;AAC/D,IAAA,IAAI,OAAO,MAAA,CAAO,YAAA,CAAa,GAAG,CAAA,IAAK,mBAAA,CAAoB,GAAG,CAAA,IAAK,GAAA;AAGnE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,QAAA,KAAa;AACxC,QAAA,MAAM,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAC7B,QAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAA,CAAA,EAAM,GAAG,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACvE,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,CAAA;AAAA,IACA,QAAQ,MAAA,CAAO;AAAA,GACjB;AACF;ACnBA,IAAM,qBAAA,GAAyC;AAAA,EAC7C;AAAA,IACE,QAAA,EAAU,eAAA;AAAA,IACV,IAAA,EAAM,2CAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAA,EAAU,SAAA;AAAA,IACV,IAAA,EAAM,uCAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,oCAAA;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAA;AAOO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,MAAM,QAAA,GAAWC,cAAQ,MAAsB;AAC7C,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,UAAA,EAAY,QAAA,IAAY,EAAC;AAGxD,IAAA,IAAI,cAAA,GAAiB,eAAe,OAAA,EAAS,cAAA;AAC7C,IAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AAElD,MAAA,cAAA,GAAiB,qBAAA,CAAsB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACjD,GAAG,CAAA;AAAA,QACH,QAAA,EAAU,CAAA,CAAE,CAAA,SAAA,EAAY,CAAA,CAAE,QAAA,CAAS,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,KAAK,CAAA,CAAE;AAAA,OAC/E,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,eAAe,OAAA,IAAW,QAAA;AAAA,MACnC,SAAS,cAAA,CAAe,OAAA;AAAA,MACxB,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,cAAA,CAAe,OAAA,EAAS,KAAA,IAAS,EAAE,eAAe,CAAA;AAAA,QACzD,WAAA,EAAa,cAAA,CAAe,OAAA,EAAS,WAAA,IAAe,EAAE,qBAAqB,CAAA;AAAA,QAC3E;AAAA,OACF;AAAA,MACA,OAAO,cAAA,CAAe;AAAA,KACxB;AAAA,EACF,GAAG,CAAC,OAAA,CAAQ,UAAA,EAAY,QAAA,EAAU,CAAC,CAAC,CAAA;AAEpC,EAAA,OAAO,QAAA;AACT;AC5CO,SAAS,WAAW,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,aAAY,EAAoB;AACtF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,MAAM,UAAA,GAAa,yBACjBb,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAU,2EAAA;AAAA,MACV,YAAA,EAAY,EAAE,aAAa,CAAA;AAAA,MAE3B,QAAA,kBAAAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,WAAA,EACjE,0BAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,iBAAA,EAAkB,CAAA,EACzF;AAAA;AAAA,GACF,GACE,IAAA;AAEJ,EAAA,MAAM,IAAA,GAAO,QAAA,KAAa,QAAA,CAAS,OAAA,mBACjCA,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAA,CAAS,SAAS,GAAA,EAAK,QAAA,CAAS,OAAA,EAAS,SAAA,EAAU,cAAa,CAAA,GACxE,IAAA,CAAA;AAEJ,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACEA,eAAC,QAAA,EAAA,EAAO,SAAA,EAAU,kEAChB,QAAA,kBAAAc,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,UAAA;AAAA,QACA,IAAA;AAAA,wBACDd,cAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,iDAAA,EACX,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EACnB;AAAA,OAAA,EACF,CAAA;AAAA,MACC,+BAAeA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EACxE,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,eAAC,QAAA,EAAA,EAAO,SAAA,EAAU,kEAChB,QAAA,kBAAAc,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MACA,IAAA;AAAA,sBACDd,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EAAmD,kBAAQ,KAAA,EAAM,CAAA;AAAA,MAC9E,OAAA,CAAQ,0BACPA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sCAAA;AAAA,UACV,IAAA,EAAK,cAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UACR,YAAA,EAAY,EAAE,aAAa,CAAA;AAAA,UAE3B,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qaAAA,EAAsa;AAAA;AAAA;AAChb,KAAA,EAEJ,CAAA;AAAA,oBACAc,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,MAAA,KAAW,8BAClBd,cAAAA,CAAC,UAAK,SAAA,EAAU,yFAAA,EACb,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EACpB,CAAA;AAAA,MAED;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;ACrFA,IAAM,mBAAA,GAAsB,KAAK,IAAA,GAAO,IAAA;AACxC,IAAM,mBAAA,GAAsB,CAAC,WAAA,EAAa,YAAA,EAAc,cAAc,WAAW,CAAA;AAM1E,SAAS,iBAAA,CAAkB,IAAA,EAAY,YAAA,GAAuB,mBAAA,EAA2B;AAC9F,EAAA,IAAI,CAAC,mBAAA,CAAoB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA,4CAAA,CAA8C,CAAA;AAAA,EAC/F;AACA,EAAA,IAAI,IAAA,CAAK,OAAO,YAAA,EAAc;AAC5B,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA,GAAO,IAAA,GAAO,IAAA,EAAM,QAAQ,CAAC,CAAA;AAClD,IAAA,MAAM,SAAA,GAAA,CAAa,YAAA,GAAe,IAAA,GAAO,IAAA,EAAM,QAAQ,CAAC,CAAA;AACxD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,WAAA,EAAc,SAAS,CAAA,QAAA,CAAU,CAAA;AAAA,EAC5E;AACF;AAKA,eAAsB,gBAAgB,IAAA,EAA6B;AACjE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,SAAS,MAAM;AACpB,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAClC,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,CAAA;AACA,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,qBAAqB,CAAC,CAAA;AAC9D,IAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;AAKO,SAAS,aAAA,CAAc,QAAgB,QAAA,EAA0B;AACtE,EAAA,OAAO,CAAA,KAAA,EAAQ,QAAQ,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAC1C;AAKO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5D,EAAA,OAAO,IAAI,KAAA,GAAQ,IAAA,GAAO,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5C;AAMO,SAAS,iBAAA,CAAkB,YAAA,EAAsB,QAAA,EAAkB,QAAA,GAAmB,EAAA,EAAU;AACrG,EAAA,MAAM,QAAQ,YAAA,GAAe,QAAA;AAC7B,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAQ,CAAA,0BAAA,EAA6B,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1F;AACF;AChDe,SAAR,cAAA,CAAgC;AAAA,EACrC,WAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAwB;AACtB,EAAA,IAAI,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAErC,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,QAAA;AACrB,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,MAAA;AAErB,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,qDAAA,EAAwD,SAAS,CAAA,CAAA,EAC9E,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,YAAY,KAAA,qBAC5Bc,eAAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,gBAAA,EACzB,QAAA,EAAA;AAAA,oBAAAd,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAK,UAAA,CAAW,OAAA;AAAA,QAChB,KAAK,UAAA,CAAW,QAAA;AAAA,QAChB,SAAA,EAAW,CAAA,gFAAA,EACT,UAAA,GAAa,oDAAA,GAAuD,EACtE,CAAA,CAAA;AAAA,QACA,OAAA,EAAS,MAAM,UAAA,IAAc,MAAA,CAAO,KAAK,CAAA;AAAA,QACzC,IAAA,EAAM,aAAa,QAAA,GAAW,MAAA;AAAA,QAC9B,QAAA,EAAU,aAAa,CAAA,GAAI,MAAA;AAAA,QAC3B,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,eAAe,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,CAAA,EAAM;AACtD,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UACd;AAAA,QACF;AAAA;AAAA,KACF;AAAA,IAEC,8BACCA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB,CAAA;AAAA,QACA,SAAA,EAAU,+IAAA;AAAA,QACV,YAAA,EAAY,CAAA,OAAA,EAAU,UAAA,CAAW,QAAQ,CAAA,CAAA;AAAA,QAEzC,0BAAAA,cAAAA,CAACe,SAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,KAC7B;AAAA,oBAGFD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAd,cAAAA,CAAC,SAAI,SAAA,EAAU,mDAAA,EAAoD,OAAO,UAAA,CAAW,QAAA,EAClF,qBAAW,QAAA,CAAS,MAAA,GAAS,KAC1B,CAAA,EAAG,UAAA,CAAW,SAAS,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAA,GACvC,WAAW,QAAA,EACjB,CAAA;AAAA,sBACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACZ,QAAA,EAAA,cAAA,CAAe,UAAA,CAAW,SAAS,CAAA,EACtC;AAAA,KAAA,EACF;AAAA,GAAA,EAAA,EAzCQ,KA0CV,CACD,CAAA,EACH,CAAA;AAEJ;AC9De,SAAR,UAAA,CAA4B,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAQ,EAAoB;AACrF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIQ,eAAS,YAAY,CAAA;AAE7D,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,eAAA,CAAgB,CAAC,SAAU,IAAA,GAAO,CAAA,GAAI,OAAO,CAAA,GAAI,MAAA,CAAO,SAAS,CAAE,CAAA;AAAA,EACrE,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,eAAA,CAAgB,CAAC,SAAU,IAAA,GAAO,MAAA,CAAO,SAAS,CAAA,GAAI,IAAA,GAAO,IAAI,CAAE,CAAA;AAAA,EACrE,CAAA;AAGA,EAAAE,gBAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa;AAChC,QAAA,cAAA,EAAe;AAAA,MACjB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,YAAA,EAAc;AACjC,QAAA,UAAA,EAAW;AAAA,MACb;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAAA,gBAAU,MAAM;AACd,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,EAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEI,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iEAAA;AAAA,MACV,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,YAAA,EAAW,cAAA;AAAA,MAGX,QAAA,EAAA;AAAA,wBAAAd,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU,sFAAA;AAAA,YACV,YAAA,EAAW,oBAAA;AAAA,YAEX,0BAAAA,cAAAA,CAACe,SAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,SAC7B;AAAA,QAGC,MAAA,CAAO,MAAA,GAAS,CAAA,oBACfD,gBAAAE,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAhB,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,cAAA,EAAe;AAAA,cACjB,CAAA;AAAA,cACA,SAAA,EAAU,+EAAA;AAAA,cACV,YAAA,EAAW,gBAAA;AAAA,cAEX,0BAAAA,cAAAA,CAACiB,iBAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,WACrC;AAAA,0BACAjB,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,UAAA,EAAW;AAAA,cACb,CAAA;AAAA,cACA,SAAA,EAAU,gFAAA;AAAA,cACV,YAAA,EAAW,YAAA;AAAA,cAEX,0BAAAA,cAAAA,CAACkB,kBAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA;AACtC,SAAA,EACF,CAAA;AAAA,wBAIFlB,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,MAAA,CAAO,YAAY,CAAA,CAAE,OAAA;AAAA,YAC1B,GAAA,EAAK,MAAA,CAAO,YAAY,CAAA,CAAE,QAAA;AAAA,YAC1B,SAAA,EAAU,0CAAA;AAAA,YACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA;AAAgB;AAAA,SACpC;AAAA,wBAGAc,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,yHAAA;AAAA,YACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,YAElC,QAAA,EAAA;AAAA,8BAAAd,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACZ,QAAA,EAAA,MAAA,CAAO,YAAY,EAAE,QAAA,EACxB,CAAA;AAAA,cACC,OAAO,MAAA,GAAS,CAAA,oBACfc,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,YAAA,GAAe,CAAA;AAAA,gBAAE,KAAA;AAAA,gBAAI,MAAA,CAAO;AAAA,eAAA,EAC/B;AAAA;AAAA;AAAA;AAEJ;AAAA;AAAA,GACF;AAEJ;ACjGO,SAAS,YAAA,CAAa,EAAE,OAAA,EAAQ,EAAsB;AAC3D,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,OAAA,EAAQ;AAC3C,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIN,eAAwB,IAAI,CAAA;AAEhF,EAAA,MAAM,kBAAkB,YAAY;AAClC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,UAAA,CAAW,QAAQ,OAAO,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAA;AAAA,MACrD,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AAAA,MACtC;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,eAAA,EAAiB,OAAA,CAAQ,OAAO,CAAA;AAC1D,MAAA,IAAI,UAAA,IAAc,UAAA,KAAe,OAAA,CAAQ,OAAA,EAAS;AAChD,QAAA,UAAA,CAAW,OAAA,CAAQ,IAAI,UAAU,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAEZ,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,oBACnDd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,MAAA,EAAQ,CAAC,KAAA,KAAU,qBAAA,CAAsB,KAAK;AAAA;AAAA,OAChD,EACF,CAAA;AAAA,MAID,OAAA,CAAQ,OAAA,oBACPA,cAAAA,CAAC,SAAI,SAAA,EAAU,+DAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,SACX,CAAA,EACF,CAAA;AAAA,sBAIFc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGAAA,EACb,QAAA,EAAA;AAAA,wBAAAd,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+CAAA,EACb,sCAAoB,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA,EACvE,CAAA;AAAA,wBAEAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,eAAA;AAAA,YACT,SAAA,EAAU,wKAAA;AAAA,YACV,YAAA,EAAW,cAAA;AAAA,YACX,KAAA,EAAM,MAAA;AAAA,YAEN,0BAAAA,cAAAA,CAACmB,YAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU;AAAA;AAAA,SACnC;AAAA,QAEC,8BACCnB,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,eAAA;AAAA,YACT,SAAA,EAAU,wKAAA;AAAA,YACV,YAAA,EAAW,cAAA;AAAA,YACX,KAAA,EAAM,MAAA;AAAA,YAEN,0BAAAA,cAAAA,CAACoB,oBAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU;AAAA;AAAA;AAC3C,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,oBAGApB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qHAAoH,QAAA,EAAA,GAAA,EAEnI,CAAA;AAAA,IAGC,kBAAA,KAAuB,IAAA,IAAQ,OAAA,CAAQ,WAAA,oBACtCA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,QAAQ,OAAA,CAAQ,WAAA;AAAA,QAChB,YAAA,EAAc,kBAAA;AAAA,QACd,OAAA,EAAS,MAAM,qBAAA,CAAsB,IAAI;AAAA;AAAA;AAC3C,GAAA,EAEJ,CAAA;AAEJ;ACnGe,SAAR,gBAAA,CAAkC,EAAE,OAAA,EAAQ,EAA0B;AAC3E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AAE7C,EAAA,uBACEc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGAAA,EACb,QAAA,EAAA;AAAA,oBAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EAA8D,QAAA,EAAA,aAAA,EAE7E,CAAA;AAAA,oBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACpBc,eAAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,MAAA,CAAO,IAAA,KAAS,2BACfd,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAM,OAAO,OAAA,CAA4B,OAAA;AAAA,UACzC,GAAA,EAAI,aAAA;AAAA,UACJ,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAED,MAAA,CAAO,IAAA,KAAS,MAAA,oBACfA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2GAAA,EACb,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA,MAAA,CAAO,SACV,CAAA,EACF,CAAA;AAAA,MAED,MAAA,CAAO,SAAS,OAAA,oBACfA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2HAAA,EACZ,QAAA,EAAA,MAAA,CAAO,OAAA,EACV;AAAA,KAAA,EAAA,EAlBM,KAoBV,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACxCe,SAAR,eAAA,GAAmC;AACxC,EAAA,uBACEA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,gFAAA;AAAA,MACV,YAAA,EAAW;AAAA;AAAA,GACb;AAEJ;ACeA,IAAM,SAAS,CAAC,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AAEzE,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAmB;AACvD,EAAA,MAAM,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,WAAW,MAAA,EAAQ,QAAA,GAAW,SAAQ,GAAI,SAAA;AAErE,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,KAAA;AACH,QAAA,uBACEc,eAAAA,CAACO,iBAAA,EAAA,EAAS,IAAA,EACR,QAAA,EAAA;AAAA,0BAAArB,cAAAA,CAACsB,sBAAA,EAAA,EAAc,eAAA,EAAgB,KAAA,EAAM,CAAA;AAAA,0BACrCtB,cAAAA,CAACuB,cAAA,EAAA,EAAM,OAAA,EAAS,QAAA,EAAU,CAAA;AAAA,0BAC1BvB,eAACwB,cAAA,EAAA,EAAM,CAAA;AAAA,0BACPxB,eAACyB,gBAAA,EAAA,EAAQ,CAAA;AAAA,0BACTzB,eAAC0B,eAAA,EAAA,EAAO,CAAA;AAAA,0BACR1B,cAAAA,CAAC2B,YAAA,EAAA,EAAI,OAAA,EAAS,QAAA,EAAU,MAAK,SAAA,EAAU;AAAA,SAAA,EACzC,CAAA;AAAA,MAEJ,KAAK,MAAA;AACH,QAAA,uBACEb,eAAAA,CAACc,kBAAA,EAAA,EAAU,IAAA,EACT,QAAA,EAAA;AAAA,0BAAA5B,cAAAA,CAACsB,sBAAA,EAAA,EAAc,eAAA,EAAgB,KAAA,EAAM,CAAA;AAAA,0BACrCtB,cAAAA,CAACuB,cAAA,EAAA,EAAM,OAAA,EAAS,QAAA,EAAU,CAAA;AAAA,0BAC1BvB,eAACwB,cAAA,EAAA,EAAM,CAAA;AAAA,0BACPxB,eAACyB,gBAAA,EAAA,EAAQ,CAAA;AAAA,0BACTzB,eAAC0B,eAAA,EAAA,EAAO,CAAA;AAAA,0BACR1B,eAAC6B,aAAA,EAAA,EAAK,IAAA,EAAK,YAAW,OAAA,EAAS,QAAA,EAAU,QAAO,SAAA,EAAU;AAAA,SAAA,EAC5D,CAAA;AAAA,MAEJ,KAAK,KAAA;AACH,QAAA,uBACEf,gBAACgB,iBAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA9B,cAAAA;AAAA,YAAC+B,YAAA;AAAA,YAAA;AAAA,cACC,IAAA;AAAA,cACA,OAAA,EAAS,QAAA;AAAA,cACT,OAAA,EAAS,QAAA;AAAA,cACT,EAAA,EAAG,KAAA;AAAA,cACH,EAAA,EAAG,KAAA;AAAA,cACH,WAAA,EAAa,EAAA;AAAA,cACb,KAAA,EAAK,IAAA;AAAA,cAEJ,eAAK,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACjB/B,cAAAA,CAACgC,aAAA,EAAA,EAA2B,IAAA,EAAM,MAAA,CAAO,QAAQ,MAAA,CAAO,MAAM,KAAnD,CAAA,KAAA,EAAQ,KAAK,EAAyC,CAClE;AAAA;AAAA,WACH;AAAA,0BACAhC,eAACyB,gBAAA,EAAA,EAAQ,CAAA;AAAA,0BACTzB,eAAC0B,eAAA,EAAA,EAAO;AAAA,SAAA,EACV,CAAA;AAAA,MAEJ,KAAK,MAAA;AACH,QAAA,uBACEZ,eAAAA,CAACmB,kBAAA,EAAA,EAAU,IAAA,EACT,QAAA,EAAA;AAAA,0BAAAjC,cAAAA,CAACsB,sBAAA,EAAA,EAAc,eAAA,EAAgB,KAAA,EAAM,CAAA;AAAA,0BACrCtB,cAAAA,CAACuB,cAAA,EAAA,EAAM,OAAA,EAAS,QAAA,EAAU,CAAA;AAAA,0BAC1BvB,eAACwB,cAAA,EAAA,EAAM,CAAA;AAAA,0BACPxB,eAACyB,gBAAA,EAAA,EAAQ,CAAA;AAAA,0BACTzB,eAAC0B,eAAA,EAAA,EAAO,CAAA;AAAA,0BACR1B,cAAAA,CAACkC,aAAA,EAAA,EAAK,IAAA,EAAK,UAAA,EAAW,SAAS,QAAA,EAAU,MAAA,EAAO,SAAA,EAAU,IAAA,EAAK,SAAA,EAAU;AAAA,SAAA,EAC3E,CAAA;AAAA,MAEJ;AACE,QAAA,uBAAOlC,cAAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA;AACtC,EACF,CAAA;AAEA,EAAA,uBACEc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBAASd,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAA8B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC5DA,eAACmC,4BAAA,EAAA,EAAoB,KAAA,EAAM,QAAO,MAAA,EAAQ,GAAA,EACvC,uBAAY,EACf;AAAA,GAAA,EACF,CAAA;AAEJ;ACzFO,SAAS,YAAA,CAAa,EAAE,SAAA,EAAU,EAAsB;AAC7D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI3B,eAAS,KAAK,CAAA;AAE9C,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,QACpC,SAAA,EAAU,qFAAA;AAAA,QACV,eAAA,EAAe,QAAA;AAAA,QAEf,QAAA,EAAA;AAAA,0BAAAd,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,6BAAA,EAAgC,QAAA,GAAW,WAAA,GAAc,EAAE,CAAA,CAAA;AAAA,cACtE,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,cAAA;AAAA,cACP,OAAA,EAAQ,WAAA;AAAA,cAER,QAAA,kBAAAA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,aAAA,EAAc,OAAA;AAAA,kBACd,cAAA,EAAe,OAAA;AAAA,kBACf,WAAA,EAAa,CAAA;AAAA,kBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,WACF;AAAA,0BACAc,gBAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,SAAA,CAAU,MAAA;AAAA,YAAO,GAAA;AAAA,YAAE,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,QAAA,GAAW;AAAA,WAAA,EAAU;AAAA;AAAA;AAAA,KAC1E;AAAA,IACC,QAAA,oBACCd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,qBACxBA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,mCAAA;AAAA,QAEV,QAAA,kBAAAc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAd,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mHAAA,EACb,kBAAQ,CAAA,EACX,CAAA;AAAA,0BACAc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,QAAA,EAAA;AAAA,4BAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA6B,mBAAS,MAAA,EAAO,CAAA;AAAA,YAC3D,QAAA,CAAS,uBACRA,cAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,MAAM,QAAA,CAAS,GAAA;AAAA,gBACf,MAAA,EAAO,QAAA;AAAA,gBACP,GAAA,EAAI,qBAAA;AAAA,gBACJ,SAAA,EAAU,8CAAA;AAAA,gBAET,QAAA,EAAA,QAAA,CAAS;AAAA;AAAA,aACZ;AAAA,YAED,SAAS,OAAA,oBACRc,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EAA4B,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAAE,QAAA,CAAS,OAAA;AAAA,cAAQ;AAAA,aAAA,EAAC;AAAA,WAAA,EAEnE;AAAA,SAAA,EACF;AAAA,OAAA;AAAA,MAvBK,QAAA,CAAS;AAAA,KAyBjB,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACjEO,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAsB;AAC5D,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,YAAA,EAAc,QAAA,EAAU,aAAY,GAAI,QAAA;AAErE,EAAA,MAAM,IAAA,GACJ,IAAA,KAAS,OAAA,mBACPA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,IAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,WAAA,EAClE,QAAA,EAAA;AAAA,oBAAAd,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mGAAA,EAAoG,CAAA;AAAA,oBAC5GA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sDAAA,EAAuD;AAAA,GAAA,EACjE,CAAA,mBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAuB,IAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,WAAA,EAChE,QAAA,kBAAAA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAS,SAAA;AAAA,MACT,CAAA,EAAE,qGAAA;AAAA,MACF,QAAA,EAAS;AAAA;AAAA,GACX,EACF,CAAA;AAGJ,EAAA,uBACEc,eAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAU,gHAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAd,cAAAA,CAAC,SAAK,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,wBACXc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,0BAC9Dc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACZ,QAAA,EAAA;AAAA,YAAA,YAAA,oBAAgBd,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,YACpC,QAAA,KAAa,MAAA,oBACZc,eAAAA,CAAAE,qBAAA,EACE,QAAA,EAAA;AAAA,8BAAAhB,cAAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,8BACPc,gBAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,gBAAA,QAAA;AAAA,gBAAS;AAAA,eAAA,EAAK;AAAA,aAAA,EACvB;AAAA,WAAA,EAEJ,CAAA;AAAA,UACC,+BAAed,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAA8B,QAAA,EAAA,WAAA,EAAY;AAAA,SAAA,EAC3E,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,CAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;ACpDO,SAAS,kBAAA,CAAmB,EAAE,eAAA,EAAgB,EAA4B;AAC/E,EAAA,MAAM,EAAE,2BAAA,EAA6B,2BAAA,EAA4B,GAAI,OAAA,EAAQ;AAC7E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIQ,cAAAA,CAA0B,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,EAAE,CAAA;AAE7C,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,eAAA,CAAgB,IAAA,KAAS,iBAAA,IAAqB,CAAC,QAAQ,MAAA,EAAQ;AACjE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,gBAAgB,IAAA,KAAS,WAAA,IAAe,CAAC,SAAA,CAAU,MAAK,EAAG;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eACJ,eAAA,CAAgB,IAAA,KAAS,oBACrB,OAAA,GACA,EAAE,QAAQ,SAAA,EAAU;AAE1B,IAAA,2BAAA,CAA4B,YAAY,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,uBACER,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEACb,QAAA,kBAAAc,eAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EACd,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,sBAAAd,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,8CAAA;AAAA,UACV,IAAA,EAAK,cAAA;AAAA,UACL,OAAA,EAAQ,WAAA;AAAA,UAER,QAAA,kBAAAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,QAAA,EAAS,SAAA;AAAA,cACT,CAAA,EAAE,wLAAA;AAAA,cACF,QAAA,EAAS;AAAA;AAAA;AACX;AAAA,OACF;AAAA,sBACAc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,QAAA,EAAA;AAAA,wBAAAd,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA,kBAAA,EAE/C,CAAA;AAAA,wBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAiB,0BAAgB,QAAA,EAAS;AAAA,OAAA,EACzD;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,gBAAgB,IAAA,KAAS,iBAAA,IAAqB,eAAA,CAAgB,OAAA,oBAC7DA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,0BAAgB,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,0BACpCc,eAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,wEAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAd,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,MAAA;AAAA,cACP,OAAA,EAAS,QAAQ,MAAA,KAAW,MAAA;AAAA,cAC5B,QAAA,EAAU,CAAC,CAAA,KACT,UAAA,CAAW,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,cAEnD,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAiB,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA,OAAA;AAAA,MAbnC;AAAA,KAeR,CAAA,EACH,CAAA;AAAA,IAGD,eAAA,CAAgB,SAAS,WAAA,oBACxBA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,SAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC5C,WAAA,EAAY,qBAAA;AAAA,QACZ,SAAA,EAAU,yIAAA;AAAA,QACV,IAAA,EAAM;AAAA;AAAA,KACR,EACF,CAAA;AAAA,oBAGFc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,sBAAAd,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,gGAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,2BAAA;AAAA,UACT,SAAA,EAAU,gFAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AC/FA,IAAMoC,iBAAAA,GAAmBC,UAAA;AAAA,EAAK,MAC5B,kFAA6B,IAAA,CAAK,CAAC,YAAY,EAAE,OAAA,EAAS,MAAA,CAAO,gBAAA,EAAiB,CAAE;AACtF,CAAA;AASO,SAAS,iBAAA,CAAkB,EAAE,OAAA,EAAQ,EAA2B;AACrE,EAAA,MAAM,EAAE,UAAA,EAAY,gBAAA,EAAkB,eAAA,KAAoB,OAAA,EAAQ;AAClE,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI7B,eAAS,KAAK,CAAA;AAEpE,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,EAAS,IAAA,GAAO,MAAA,GAAS,CAAA;AACpD,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,OAAA,CAAQ,aAAa,IAAA,EAAK;AACnD,EAAA,MAAM,kBAAA,GACJ,CAAC,CAAC,eAAA,IACF,gBAAgB,MAAA,KAAW,SAAA,IAC3B,eAAA,CAAgB,MAAA,KAAW,OAAA,CAAQ,EAAA;AAErC,EAAA,MAAM,kBAAkB,YAAY;AAClC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,UAAA,CAAW,QAAQ,OAAO,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAA;AAAA,MACrD,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AAAA,MACtC;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,wBAAwB,YAAY;AACxC,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,gBAAA,CAAiB,QAAQ,EAAE,CAAA;AAAA,IACnC;AAAA,EACF,CAAA;AAEA,EAAA,uBACEM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAEb,QAAA,EAAA;AAAA,oBAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mHAAA,EAAoH,QAAA,EAAA,IAAA,EAEnI,CAAA;AAAA,oBAEAc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAEZ,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,oBACnDd,cAAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,OAAA,CAAQ,WAAA,EAAa,CAAA;AAAA,MAIjD,OAAA,CAAQ,SAAA,oBACPA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,OAAA,CAAQ,WAAW,CAAA,EAC3C,CAAA;AAAA,MAID,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,SAAA,CAAU,MAAA,GAAS,CAAA,oBAC/CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,qBAChCA,cAAAA,CAAC,YAAA,EAAA,EAAmD,QAAA,EAAA,EAAjC,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAwB,CACzE,CAAA,EACH,CAAA;AAAA,MAID,UAAA,oBACCc,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2GAAA,EACb,QAAA,EAAA;AAAA,wBAAAd,cAAAA;AAAA,UAACsC,cAAA;AAAA,UAAA;AAAA,YACC,QAAA,kBACExB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kEAAA,EACb,QAAA,EAAA;AAAA,8BAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sGAAA,EAAuG,CAAA;AAAA,cAAE;AAAA,aAAA,EAE1H,CAAA;AAAA,YAGF,QAAA,kBAAAA,eAACoC,iBAAAA,EAAA,EAAiB,SAAS,OAAA,CAAQ,OAAA,EAAS,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW;AAAA;AAAA,SAC5E;AAAA,QAGC,OAAA,CAAQ,WAAA,oBAAepC,cAAAA,CAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,QAGxC,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,SAAA,CAAU,MAAA,GAAS,CAAA,oBAC/CA,cAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,QAI7C,cAAA,oBACCc,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yDAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,sBAAA,CAAuB,CAAC,mBAAmB,CAAA;AAAA,cAC1D,SAAA,EAAU,iIAAA;AAAA,cACV,eAAA,EAAe,mBAAA;AAAA,cAEf,QAAA,EAAA;AAAA,gCAAAd,cAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,CAAA,0CAAA,EAA6C,mBAAA,GAAsB,WAAA,GAAc,EAAE,CAAA,CAAA;AAAA,oBAC9F,IAAA,EAAK,MAAA;AAAA,oBACL,MAAA,EAAO,cAAA;AAAA,oBACP,OAAA,EAAQ,WAAA;AAAA,oBAER,QAAA,kBAAAA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,aAAA,EAAc,OAAA;AAAA,wBACd,cAAA,EAAe,OAAA;AAAA,wBACf,WAAA,EAAa,CAAA;AAAA,wBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,iBACF;AAAA,gCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAc,QAAA,EAAA,uBAAA,EAAqB;AAAA;AAAA;AAAA,WACrD;AAAA,UACC,mBAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+CAAA,EACb,QAAA,kBAAAA,cAAAA,CAACsC,cAAA,EAAA,EAAS,QAAA,kBAAUtC,eAAC,KAAA,EAAA,EAAI,QAAA,EAAA,YAAA,EAAU,CAAA,EACjC,QAAA,kBAAAA,cAAAA,CAACoC,iBAAAA,EAAA,EAAiB,OAAA,EAAS,OAAA,CAAQ,WAAA,EAAc,CAAA,EACnD,CAAA,EACF;AAAA,SAAA,EAEJ;AAAA,OAAA,EAEJ,CAAA;AAAA,MAID,kBAAA,oBAAsBpC,cAAAA,CAAC,kBAAA,EAAA,EAAmB,eAAA,EAAkC,CAAA;AAAA,MAG5E,UAAA,oBACCc,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2FAAA,EACb,QAAA,EAAA;AAAA,wBAAAd,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+CAAA,EACb,UAAAuC,2BAAAA,CAAoB,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA,EACvE,CAAA;AAAA,wBAEAvC,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,eAAA;AAAA,YACT,SAAA,EAAU,wKAAA;AAAA,YACV,YAAA,EAAW,cAAA;AAAA,YACX,KAAA,EAAM,MAAA;AAAA,YAEN,0BAAAA,cAAAA,CAACmB,YAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU;AAAA;AAAA,SACnC;AAAA,QAEC,oCACCnB,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,qBAAA;AAAA,YACT,SAAA,EAAU,wKAAA;AAAA,YACV,YAAA,EAAW,oBAAA;AAAA,YACX,KAAA,EAAM,YAAA;AAAA,YAEN,0BAAAA,cAAAA,CAACwC,uBAAA,EAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU;AAAA;AAAA;AAC9C,OAAA,EAEJ;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;ACnKO,SAAS,UAAA,CAAW;AAAA,EACzB,OAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,IAAI,QAAQ,IAAA,KAAA,MAAA,aAA2B;AACrC,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,uBAAOxC,cAAAA,CAAAgB,mBAAAA,EAAA,EAAG,QAAA,EAAA,iBAAA,CAAkB,OAAO,CAAA,EAAE,CAAA;AAAA,IACvC;AACA,IAAA,uBAAOhB,cAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAkB,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,QAAQ,IAAA,KAAA,WAAA,kBAAgC;AAC1C,IAAA,IAAI,sBAAA,EAAwB;AAC1B,MAAA,uBAAOA,cAAAA,CAAAgB,mBAAAA,EAAA,EAAG,QAAA,EAAA,sBAAA,CAAuB,OAAO,CAAA,EAAE,CAAA;AAAA,IAC5C;AACA,IAAA,uBAAOhB,cAAAA,CAAC,iBAAA,EAAA,EAAkB,OAAA,EAAkB,CAAA;AAAA,EAC9C;AAGA,EAAA,OAAO,IAAA;AACT;ACvBe,SAAR,oBAAA,CAAsC;AAAA,EAC3C,IAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAA8B;AAC5B,EAAA,uBACEA,cAAAA,CAACyC,4BAAA,EAAA,EACE,QAAA,EAAA,IAAA,oBACCzC,cAAAA;AAAA,IAAC0C,mBAAA,CAAO,MAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,MAC1B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAI;AAAA,MAC5B,OAAA;AAAA,MACA,SAAA,EAAU,4LAAA;AAAA,MACV,YAAA,EAAW,kBAAA;AAAA,MAEX,QAAA,kBAAA5B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAd,eAAC2C,iBAAA,EAAA,EAAU,IAAA,EAAM,IAAI,MAAA,EAAO,MAAA,EAAO,WAAU,kCAAA,EAAmC,CAAA;AAAA,QAG/E,WAAA,GAAc,CAAA,oBACb3C,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uKAAA,EACb,QAAA,EAAA,WAAA,GAAc,EAAA,GAAK,KAAA,GAAQ,WAAA,EAC9B;AAAA,OAAA,EAEJ;AAAA;AAAA,GACF,EAEJ,CAAA;AAEJ;AC7BO,SAAS,WAAA,CAAY,EAAE,iBAAA,EAAmB,sBAAA,EAAuB,EAAqB;AAC3F,EAAA,MAAM,EAAE,QAAA,EAAU,gBAAA,EAAkB,WAAA,KAAgB,OAAA,EAAQ;AAC5D,EAAA,MAAM,cAAA,GAAiBS,aAAuB,IAAI,CAAA;AAClD,EAAA,MAAM,YAAA,GAAeA,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAID,eAAS,KAAK,CAAA;AAG9D,EAAAE,gBAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,EAAE,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,QAAA,CAAS,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AAGtC,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,EAAa,GAAI,SAAA;AAClD,MAAA,MAAM,YAAA,GAAe,YAAA,GAAe,SAAA,GAAY,YAAA,GAAe,GAAA;AAC/D,MAAA,mBAAA,CAAoB,CAAC,YAAY,CAAA;AAAA,IACnC,CAAA;AAEA,IAAA,SAAA,CAAU,gBAAA,CAAiB,UAAU,YAAY,CAAA;AACjD,IAAA,OAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EACnE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,EAAE,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/D,CAAA;AAEA,EAAA,uBACEI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oBAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,SAAA,EAAU,oCAChC,QAAA,kBAAAc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACbd,cAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,OAAA;AAAA,UACA,iBAAA;AAAA,UACA;AAAA,SAAA;AAAA,QAHK,OAAA,CAAQ;AAAA,OAKhB,CAAA;AAAA,MACA,eAAe,gBAAA,oBACdc,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+FAAA,EAAgG,QAAA,EAAA,IAAA,EAE/G,CAAA;AAAA,wBACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oHACb,QAAA,kBAAAc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACZ,QAAA,EAAA;AAAA,UAAA,gBAAA;AAAA,0BACDd,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EAAyD;AAAA,SAAA,EAC3E,CAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBAEFA,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAA,EAAgB;AAAA,KAAA,EAC5B,CAAA,EACF,CAAA;AAAA,oBACAA,cAAAA,CAAC,oBAAA,EAAA,EAAqB,IAAA,EAAM,gBAAA,EAAkB,SAAS,cAAA,EAAgB;AAAA,GAAA,EACzE,CAAA;AAEJ;AC5CA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,qBAAA,GAAwB,KAAK,IAAA,GAAO,IAAA;AAC1C,IAAM,UAAA,GAAa,GAAA;AAEZ,IAAM,YAAA,GAAe4C,gBAAA;AAAA,EAC1B,CACE;AAAA,IACE,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,QAAA,GAAW,KAAA;AAAA,IACX,eAAe,EAAC;AAAA,IAChB,eAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA,EAAa,mBAAA;AAAA,IACb,QAAA,GAAW,iBAAA;AAAA,IACX,WAAA,GAAc,qBAAA;AAAA,IACd;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIpC,cAAAA,CAA4B,EAAE,CAAA;AACpE,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAGhD,IAAA,MAAM,WAAA,GAAc,mBAAA,IAAuB,CAAA,CAAE,mBAAmB,CAAA;AAEhE,IAAA,MAAM,WAAA,GAAcC,aAA4B,IAAI,CAAA;AACpD,IAAA,MAAM,YAAA,GAAeA,aAAyB,IAAI,CAAA;AAClD,IAAA,MAAM,YAAA,GAAeA,aAAuB,IAAI,CAAA;AAEhD,IAAAoC,yBAAA,CAAoB,KAAK,OAAO;AAAA,MAC9B,KAAA,EAAO,MAAM,WAAA,CAAY,OAAA,EAAS,KAAA,EAAM;AAAA,MACxC,OAAO,MAAM;AACX,QAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,QAAA,cAAA,CAAe,EAAE,CAAA;AACjB,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf;AAAA,KACF,CAAE,CAAA;AAEF,IAAAnC,gBAAU,MAAM;AACd,MAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,QAAA,CAAS,MAAM,MAAA,GAAS,MAAA;AACxB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,cAAc,UAAU,CAAA;AAC5D,MAAA,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA;AAAA,IACtC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAAA,gBAAU,MAAM;AACd,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,QAAA,CAAS,IAAI,GAAG,GAAI,CAAA;AACnD,MAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,IACjC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,IAAA,MAAM,gBAAA,GAAmB,OAAO,KAAA,KAA2B;AACzD,MAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAElC,MAAA,IAAI;AACF,QAAA,iBAAA,CAAkB,WAAA,CAAY,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAA;AAE5D,QAAA,MAAM,iBAAoC,EAAC;AAE3C,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,UAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,UAAA,iBAAA,CAAkB,MAAM,WAAW,CAAA;AACnC,UAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,IAAI,CAAA;AAC7C,UAAA,MAAM,OAAA,GAAU,aAAA,CAAc,UAAA,EAAY,IAAA,CAAK,IAAI,CAAA;AAEnD,UAAA,cAAA,CAAe,IAAA,CAAK;AAAA,YAClB,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,WAAW,IAAA,CAAK,IAAA;AAAA,YAChB,UAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAEA,QAAA,cAAA,CAAe,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,cAAc,CAAC,CAAA;AACrD,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yBAAyB,CAAA;AAAA,MACzE;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,qBAAA,GAAwB,CAAC,CAAA,KAA2C;AACxE,MAAA,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC/B,MAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AAAA,IACnB,CAAA;AAEA,IAAA,MAAM,sBAAA,GAAyB,CAAC,KAAA,KAAkB;AAChD,MAAA,cAAA,CAAe,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAC,CAAA;AAC3D,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAuB;AAC7C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAuB;AAC9C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,CAAA;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,CAAA,KAAuB;AAC/C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,MAAM,gBAAA,CAAiB,CAAA,CAAE,YAAA,CAAa,KAAK,CAAA;AAAA,IAC7C,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAgD;AACrE,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAK,IAAK,WAAA,CAAY,SAAS,CAAA,CAAA,EAAI;AAC1D,UAAA,gBAAA,CAAiB,CAA+B,CAAA;AAAA,QAClD;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,QAAA,cAAA,CAAe,EAAE,CAAA;AACjB,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf;AAEA,MAAA,IAAI,EAAE,GAAA,KAAQ,SAAA,IAAa,CAAC,OAAA,CAAQ,IAAA,MAAU,SAAA,EAAW;AACvD,QAAA,MAAM,WAAW,SAAA,EAAU;AAC3B,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,eAAA,CAAgB,SAAS,OAAO,CAAA;AAChC,UAAA,cAAA,CAAe,SAAS,WAAW,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAuB;AAC/C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,OAAA,IAAW,YAAa,CAAC,OAAA,CAAQ,MAAK,IAAK,WAAA,CAAY,WAAW,CAAA,EAAI;AACxE,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,GAAG,WAAW,CAAA;AACvB,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,OAAA,IAAW,CAAC,aAAa,OAAA,CAAQ,IAAA,EAAK,IAAK,WAAA,CAAY,MAAA,GAAS,CAAA,CAAA;AACnF,IAAA,MAAM,yBAAA,GAA4B,mBAAA;AAElC,IAAA,uBACEV,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,WAAW,kBAAA,IAAsB,yBAAA;AAAA,QAEjC,0BAAAc,eAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,gBAAA,EAAkB,WAAU,mBAAA,EAEzC,QAAA,EAAA;AAAA,UAAA,KAAA,oBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qKAAA,EACb,QAAA,EAAA;AAAA,4BAAAd,cAAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,4BACbA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,gBAC5B,SAAA,EAAU,2EAAA;AAAA,gBACV,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,gBAElC,QAAA,kBAAAA,cAAAA,CAACe,SAAAA,EAAA,EAAE,MAAM,EAAA,EAAI;AAAA;AAAA;AACf,WAAA,EACF,CAAA;AAAA,UAID,YAAA,CAAa,SAAS,CAAA,oBACrBf,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAA,cAAAA,CAAC,UAAK,SAAA,EAAU,6GAAA,EACb,YAAE,sBAAA,EAAwB,EAAE,OAAO,YAAA,CAAa,MAAA,EAAQ,CAAA,EAC3D,CAAA,EACF,CAAA;AAAA,UAID,WAAA,CAAY,MAAA,GAAS,CAAA,oBACpBA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,cAAA,EAAA,EAAe,WAAA,EAA0B,QAAA,EAAU,wBAAwB,CAAA,EAC9E,CAAA;AAAA,0BAIFc,eAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,UAAA;AAAA,cACV,UAAA,EAAY,cAAA;AAAA,cACZ,WAAA,EAAa,eAAA;AAAA,cACb,MAAA,EAAQ,UAAA;AAAA,cAGP,QAAA,EAAA;AAAA,gBAAA,UAAA,oBACCd,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wJACb,QAAA,kBAAAc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,kCAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4FAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC8C,iBAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC,CAAA,EAC1E,CAAA;AAAA,kCACA9C,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4DAAA,EACb,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EACvB;AAAA,iBAAA,EACF,CAAA,EACF,CAAA;AAAA,gCAIFc,eAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,CAAA,iHAAA,EACT,SAAA,GACI,gGAAA,GACA,sCACN,CAAA,CAAA;AAAA,oBAGA,QAAA,EAAA;AAAA,sCAAAd,cAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,OAAA,EAAS,MAAM,YAAA,CAAa,OAAA,EAAS,KAAA,EAAM;AAAA,0BAC3C,QAAA,EAAU,OAAA,IAAW,QAAA,IAAY,WAAA,CAAY,MAAA,IAAU,QAAA;AAAA,0BACvD,SAAA,EAAU,mOAAA;AAAA,0BACV,YAAA,EAAY,EAAE,mBAAmB,CAAA;AAAA,0BACjC,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,0BAE7B,QAAA,kBAAAA,cAAAA,CAAC8C,iBAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,uBACvB;AAAA,sCAGA9C,cAAAA;AAAA,wBAAC,OAAA;AAAA,wBAAA;AAAA,0BACC,GAAA,EAAK,YAAA;AAAA,0BACL,IAAA,EAAK,MAAA;AAAA,0BACL,MAAA,EAAO,2CAAA;AAAA,0BACP,QAAA,EAAQ,IAAA;AAAA,0BACR,QAAA,EAAU,qBAAA;AAAA,0BACV,SAAA,EAAU,QAAA;AAAA,0BACV,YAAA,EAAW;AAAA;AAAA,uBACb;AAAA,sCAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCACb,QAAA,kBAAAA,cAAAA;AAAA,wBAAC,UAAA;AAAA,wBAAA;AAAA,0BACC,GAAA,EAAK,WAAA;AAAA,0BACL,KAAA,EAAO,OAAA;AAAA,0BACP,UAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,0BAC/C,SAAA,EAAW,aAAA;AAAA,0BACX,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,0BAChC,MAAA,EAAQ,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,0BAChC,WAAA;AAAA,0BACA,SAAA,EAAU,+KAAA;AAAA,0BACV,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA,EAAK;AAAA,0BACtC,IAAA,EAAM,CAAA;AAAA,0BACN,UAAU,OAAA,IAAW,QAAA;AAAA,0BACrB,YAAA,EAAW;AAAA;AAAA,uBACb,EACF,CAAA;AAAA,sCAGAA,cAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,UAAU,CAAC,SAAA;AAAA,0BACX,SAAA,EAAU,yNAAA;AAAA,0BACV,YAAA,EAAY,EAAE,mBAAmB,CAAA;AAAA,0BAEhC,QAAA,EAAA,OAAA,mBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EAA4F,CAAA,mBAE3GA,cAAAA,CAAC+C,uBAAA,EAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA;AAE7C;AAAA;AAAA;AACF;AAAA;AAAA,WACF;AAAA,UAAA,CAGE,WAAW,QAAA,qBACXjC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6CAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,8BAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qEAAA,EAAsE,CAAA;AAAA,8BACrFA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAsE,KAAA,EAAO,EAAE,cAAA,EAAgB,OAAA,EAAQ,EAAG,CAAA;AAAA,8BACzHA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAsE,KAAA,EAAO,EAAE,cAAA,EAAgB,MAAA,EAAO,EAAG;AAAA,aAAA,EAC1H,CAAA;AAAA,4BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA,OAAA,GAAU,CAAA,CAAE,kBAAkB,CAAA,GAAI,CAAA,CAAE,kBAAkB,CAAA,EACzD;AAAA,WAAA,EACF;AAAA,SAAA,EAEJ;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,YAAA,CAAa,WAAA,GAAc,cAAA;ACpT3B,IAAM,eAAA,GAAmC;AAAA,EACvC;AAAA,IACE,QAAA,EAAU,eAAA;AAAA,IACV,IAAA,EAAMgD,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAA,EAAU,SAAA;AAAA,IACV,IAAA,EAAMC,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAMC,iBAAA;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAA;AAEA,IAAM,iBAAA,GAAoB;AAAA,EACxB,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,EACrB,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,eAAA,EAAiB,IAAA;AAAA,MACjB,aAAA,EAAe;AAAA;AACjB;AAEJ,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,EAC5B,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,KAAK,CAAC;AAAA;AACvB;AAEJ,CAAA;AAEe,SAAR,cAAA,CAAgC;AAAA,EACrC,cAAA;AAAA,EACA,KAAA,GAAQ,mBAAA;AAAA,EACR,WAAA,GAAc,sHAAA;AAAA,EACd,QAAA,GAAW;AACb,CAAA,EAAwB;AACtB,EAAA,MAAM,iBAAA,GAAoB,CAACC,OAAAA,KAAmB;AAC5C,IAAA,IAAI,cAAA,IAAkB,CAAC,QAAA,EAAU;AAC/B,MAAA,cAAA,CAAeA,OAAM,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,uBACErC,eAAAA;AAAA,IAAC4B,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,SAAA,EAAU,iDAAA;AAAA,MACV,QAAA,EAAU,iBAAA;AAAA,MACV,OAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAQ,SAAA;AAAA,MAGR,QAAA,EAAA;AAAA,wBAAA1C,cAAAA;AAAA,UAAC0C,mBAAAA,CAAO,EAAA;AAAA,UAAP;AAAA,YACC,SAAA,EAAU,uEAAA;AAAA,YACV,QAAA,EAAU,YAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAGA1C,cAAAA;AAAA,UAAC0C,mBAAAA,CAAO,CAAA;AAAA,UAAP;AAAA,YACC,SAAA,EAAU,mFAAA;AAAA,YACV,QAAA,EAAU,YAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAGA5B,eAAAA,CAAC4B,mBAAAA,CAAO,GAAA,EAAP,EAAW,UAAU,YAAA,EACpB,QAAA,EAAA;AAAA,0BAAA1C,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mFAAA,EAAoF,QAAA,EAAA,YAAA,EAEjG,CAAA;AAAA,0BAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,0BAAgB,GAAA,CAAI,CAACmD,OAAAA,EAAQ,KAAA,qBAC5BrC,eAAAA;AAAA,YAAC4B,mBAAAA,CAAO,MAAA;AAAA,YAAP;AAAA,cAEC,OAAA,EAAS,MAAM,iBAAA,CAAkBS,OAAAA,CAAO,IAAI,CAAA;AAAA,cAC5C,QAAA;AAAA,cACA,SAAA,EAAU,qYAAA;AAAA,cACV,QAAA,EAAU,YAAA;AAAA,cACV,YAAY,QAAA,GAAW,EAAC,GAAI,EAAE,GAAG,EAAA,EAAG;AAAA,cACpC,UAAU,QAAA,GAAW,EAAC,GAAI,EAAE,OAAO,IAAA,EAAK;AAAA,cAGxC,QAAA,EAAA;AAAA,gCAAAnD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uFAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,kBAACmD,OAAAA,CAAO,IAAA;AAAA,kBAAP;AAAA,oBACC,IAAA,EAAM,EAAA;AAAA,oBACN,MAAA,EAAO,SAAA;AAAA,oBACP,SAAA,EAAU;AAAA;AAAA,iBACZ,EACF,CAAA;AAAA,gCAGAnD,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6DAAA,EACb,QAAA,EAAAmD,QAAO,QAAA,EACV,CAAA;AAAA,gCAGAnD,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0DAAA,EACV,QAAA,EAAAmD,QAAO,IAAA,EACV;AAAA;AAAA,aAAA;AAAA,YAzBK;AAAA,WA2BR,CAAA,EACH;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACpGA,SAAS,eAAA,CAAgB;AAAA,EACvB,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,UAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAuD;AACrD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,MACE,OAAA,EAAQ;AAEZ,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACEnD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,CAAA,CAAE,kBAAkB,GAAE,CAAA,EAC3E,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CACb,QAAA,kBAAAc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,eAAe,CAAA;AAAA,MAAE,IAAA;AAAA,MAAG;AAAA,KAAA,EAAM,CAAA,EAC/E,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,IAAW,QAAA,CAAS,MAAA,KAAW,CAAA;AAEpD,EAAA,MAAM,kBAAA,GAAqB,CAACqC,OAAAA,KAAmB;AAC7C,IAAA,UAAA,CAAWA,OAAM,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,uBACErC,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,4EAA4E,SAAS,CAAA,CAAA;AAAA,MAG/F,QAAA,EAAA;AAAA,QAAA,UAAA,oBACCd,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAkB,MAAA,EAAgB,UAAoB,WAAA,EAA0B,CAAA;AAAA,QAI7F,8BACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDACZ,QAAA,EAAA,WAAA,oBAAeA,cAAAA,CAAC,cAAA,EAAA,EAAe,gBAAgB,kBAAA,EAAoB,QAAA,EAAU,OAAA,EAAS,CAAA,EACzF,oBAEAA,cAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,iBAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,QAID,CAAC,8BACAA,cAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,OAAA;AAAA,YACA,QAAA;AAAA,YACA,eAAA,EAAiB,UAAA;AAAA,YACjB,QAAA,EAAU,YAAA;AAAA,YACV,YAAA;AAAA,YACA,SAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA,GAEJ;AAEJ;AAEO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,GAAG,WAAU,GAAI,KAAA;AAEhD,EAAA,uBACEA,cAAAA,CAAC,mBAAA,EAAA,EAAoB,UAAA,EAAwB,SAAA,EAC3C,0BAAAA,cAAAA,CAAC,eAAA,EAAA,EAAiB,GAAG,SAAA,EAAW,CAAA,EAClC,CAAA;AAEJ;;;ACrHA,qBAAA,EAAA;;;ACTA,IAAM,uBAAuB,MAAM;AACjC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC/D,CAAA;AAKO,IAAM,cAAA,GAAiB;AAAA,EAC5B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,EACtB,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC;AAEJ;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAC5B,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI,GAAA;AAAA,MACvC,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,KAAK,CAAC;AAAA;AACvB,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC;AAEJ;AAKO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,EACnC,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO,CAAA;AAAA,IACP,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC;AAEJ;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,EACtB,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,QAAA,EAAU;AAAA;AACZ;AAEJ;AAKO,IAAM,cAAA,GAAiB;AAAA,EAC5B,GAAA,EAAK;AAAA,IACH,KAAA,EAAO;AAAA;AAEX;AAKO,IAAM,wBAAA,GAA2B;AAAA,EACtC,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,EACrB,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,eAAA,EAAiB,IAAA;AAAA,MACjB,aAAA,EAAe;AAAA;AACjB;AAEJ;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,EAC7B,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA;AAAI,GAC9B;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,EAAA;AAAA,IACH,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA;AAAK;AAEjC;AAKO,IAAM,eAAA,GAAkB;AAAA,EAC7B,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG;AAAA,GACL;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI,GAAA;AAAA,MACvC,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,KAAK,CAAC;AAAA;AACvB,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC;AAEJ;AAKO,IAAM,wBAAA,GAA2B;AAAA,EACtC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,EACtB,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,eAAA,EAAiB,IAAA;AAAA,MACjB,aAAA,EAAe;AAAA;AACjB;AAEJ;AAKO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,EAAE,OAAA,EAAS,GAAA,EAAI;AAAA,EACxB,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAC,GAAA,EAAK,CAAA,EAAG,GAAG,CAAA;AAAA,IACrB,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI,CAAA;AAAA,MACvC,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM;AAAA;AACR;AAEJ;AAKO,IAAM,sBAAA,GAAyB;AAAA,EACpC,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO,CAAA;AAAA,IACP,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO,GAAA;AAAA,IACP,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC;AAEJ;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,EAC7B,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,YAAY,EAAE,QAAA,EAAU,oBAAA,EAAqB,GAAI,IAAI,IAAA;AAAK,GAC5D;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,EAAA;AAAA,IACH,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA;AAAI;AAEhC;AAKO,IAAM,aAAA,GAAgB;AAAA,EAC3B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,EAC7B,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,EAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AAAA;AACzC;AAEJ;AC7NA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,WAAA;AAAA,IACX,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,WAAA;AAAA,IACX,KAAA,EAAO,WAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,YAAA;AAAA,IACX,KAAA,EAAO,SAAA;AAAA,IACP,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,IAAA,GAAO;AACT,CAAA,EAAoB;AAClB,EAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAE9B,EAAA,uBACEA,cAAAA;AAAA,IAAC0C,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,SAAA,EAAW,CAAA,iCAAA,EAAoC,KAAA,CAAM,SAAS,IAAI,SAAS,CAAA,CAAA;AAAA,MAC3E,QAAA,EAAU,cAAA;AAAA,MACV,OAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MAEL,QAAA,kBAAA5B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAEZ,QAAA,EAAA;AAAA,QAAA,IAAA,oBACCd,cAAAA;AAAA,UAAC0C,mBAAAA,CAAO,GAAA;AAAA,UAAP;AAAA,YACC,SAAA,EAAU,0BAAA;AAAA,YACV,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,YAClC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,YAChC,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,YAEvC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAIF1C,cAAAA;AAAA,UAAC0C,mBAAAA,CAAO,EAAA;AAAA,UAAP;AAAA,YACC,SAAA,EAAW,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,+CAAA,CAAA;AAAA,YACzB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,YAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,YAC5B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,YAEvC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAGC,+BACC1C,cAAAA;AAAA,UAAC0C,mBAAAA,CAAO,CAAA;AAAA,UAAP;AAAA,YACC,SAAA,EAAW,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,sCAAA,CAAA;AAAA,YAC/B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,YAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,YAC5B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,YAEvC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAID,0BACC1C,cAAAA;AAAA,UAAC0C,mBAAAA,CAAO,GAAA;AAAA,UAAP;AAAA,YACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,YAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,YAC5B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,YAEvC,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;AAEA,IAAO,kBAAA,GAAQU,WAAK,UAAU;AC1E9B,IAAMC,YAAAA,GAAc;AAAA,EAClB,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAeT,gBAAAA;AAAA,EACnB,CACE;AAAA,IACE,KAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,GAAY,GAAA;AAAA,IACZ,SAAA,GAAY,KAAA;AAAA,IACZ,WAAA,GAAc,UAAA;AAAA,IACd,SAAA,GAAY,EAAA;AAAA,IACZ,cAAA,GAAiB,EAAA;AAAA,IACjB,IAAA,GAAO;AAAA,KAET,GAAA,KACG;AACH,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIpC,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,QAAA,GAAWC,aAAyB,IAAI,CAAA;AAG9C,IAAAoC,yBAAAA,CAAoB,KAAK,OAAO;AAAA,MAC9B,cAAc,MAAM;AAClB,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,YAAA,CAAa,IAAI,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AAAA,MACA,eAAe,MAAM;AACnB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,KACF,CAAE,CAAA;AAGF,IAAAnC,gBAAU,MAAM;AACd,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,IAAAA,gBAAU,MAAM;AACd,MAAA,IAAI,SAAA,IAAa,SAAS,OAAA,EAAS;AACjC,QAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AACvB,QAAA,QAAA,CAAS,QAAQ,MAAA,EAAO;AAAA,MAC1B;AAAA,IACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,MAAM,OAAA,GAAU,UAAU,IAAA,EAAK;AAG/B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,YAAY,KAAA,EAAO;AACrB,QAAA,MAAA,CAAO,OAAO,CAAA;AAAA,MAChB;AAEA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA6C;AAClE,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,UAAA,EAAW;AAAA,MACb,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,oBAAoB,MAAM;AAC9B,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY2C,aAAY,IAAI,CAAA;AAElC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,uBACErD,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,gCAAA;AAAA,UACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,UAEjC,QAAA,kBAAAA,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,SAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC5C,SAAA,EAAW,aAAA;AAAA,cACX,MAAA,EAAQ,UAAA;AAAA,cACR,SAAA;AAAA,cACA,WAAA;AAAA,cACA,SAAA,EAAW,CAAA,iBAAA,EAAoB,SAAS,CAAA,+MAAA,EAAkN,cAAc,CAAA,CAAA;AAAA,cACxQ,YAAA,EAAW;AAAA;AAAA;AACb;AAAA,OACF;AAAA,IAEJ;AAEA,IAAA,MAAM,eAAe,KAAA,IAAS,WAAA;AAE9B,IAAA,uBACEA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAe,iBAAA;AAAA,QACf,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,6HAAA,EAAgI,SAAS,CAAA,CAAA;AAAA,QAChK,KAAA,EAAM,sBAAA;AAAA,QACN,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,iBAAA,EAAkB;AAAA,UACpB;AAAA,QACF,CAAA;AAAA,QAEC,QAAA,EAAA,SAAA,mBACCc,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iEAAA,EACd,QAAA,EAAA;AAAA,0BAAAd,cAAAA,CAACsD,mBAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI,WAAU,cAAA,EAAe,CAAA;AAAA,0BAChDtD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAU,QAAA,EAAA,YAAA,EAAa;AAAA,SAAA,EACzC,CAAA,mBAEAA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAC,KAAA,GAAQ,yCAAA,GAA4C,EAAA,EACnE,QAAA,EAAA,YAAA,EACH;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF,CAAA;AAEA,YAAA,CAAa,WAAA,GAAc,cAAA;AAE3B,IAAO,oBAAA,GAAQoD,WAAK,YAAY;AC3JhC,IAAMC,YAAAA,GAAc;AAAA,EAClB,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,0BAAA;AAAA,IACX,IAAA,EAAM,EAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,4BAAA;AAAA,IACX,IAAA,EAAM,EAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI;AAAA,IACF,SAAA,EAAW,4BAAA;AAAA,IACX,IAAA,EAAM,EAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,WAAA;AAAA,EACd,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,IAAA,GAAO,IAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY;AACd,CAAA,EAAqB;AACnB,EAAA,MAAM,QAAA,GAAW5C,aAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ4C,aAAY,IAAI,CAAA;AAE9B,EAAA3C,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,IAAa,SAAS,OAAA,EAAS;AACjC,MAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAuC;AAC5D,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,QAAA,EAAU;AACjC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,KAAA,IAAS,CAAC,QAAA,EAAU;AAEtB,QAAA,WAAA,EAAY;AAAA,MACd,WAAW,QAAA,EAAU;AACnB,QAAA,QAAA,EAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEI,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,mBAAmB,SAAS,CAAA,CAAA,EAAI,MAAK,QAAA,EAEnD,QAAA,EAAA;AAAA,oBAAAd,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EACd,QAAA,kBAAAA,cAAAA;AAAA,MAACuD,uBAAA;AAAA,MAAA;AAAA,QACC,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAA,EAAO,MAAA;AAAA,QACP,SAAA,EAAU,kCAAA;AAAA,QACV,aAAA,EAAY;AAAA;AAAA,KACd,EACF,CAAA;AAAA,oBAGAvD,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,KAAA;AAAA,QACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,SAAA,EAAW,aAAA;AAAA,QACX,WAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA,EAAW,CAAA,OAAA,EAAU,KAAA,CAAM,SAAS,CAAA,kYAAA,CAAA;AAAA,QACpC,YAAA,EAAY;AAAA;AAAA,KACd;AAAA,IAGC,KAAA,IAAS,CAAC,QAAA,oBACTA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,CAAA,6CAAA,EAAgD,KAAA,CAAM,QAAQ,CAAA,8JAAA,CAAA;AAAA,QACzE,YAAA,EAAW,cAAA;AAAA,QACX,KAAA,EAAM,cAAA;AAAA,QAEN,QAAA,kBAAAA,eAACe,SAAAA,EAAA,EAAE,MAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,MAAA,EAAO,MAAA,EAAO;AAAA;AAAA;AACzC,GAAA,EAEJ,CAAA;AAEJ;AAEA,IAAO,mBAAA,GAAQqC,WAAK,WAAW;ACpG/B,IAAM,cAAA,GAAiB;AAAA,EACrB,IAAA,EAAM,SAAA;AAAA,EACN,QAAA,EAAU,cAAA;AAAA,EACV,WAAA,EAAa,cAAA;AAAA,EACb,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,SAAS,QAAA,CAAS;AAAA,EAChB,OAAA,GAAU,MAAA;AAAA,EACV,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,OAAA,GAAU;AACZ,CAAA,EAAkB;AAChB,EAAA,MAAM,YAAA,GAAe,eAAe,OAAO,CAAA;AAE3C,EAAA,MAAM,KAAA,GAA6B;AAAA,IACjC,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,KAAA;AAAA,IAClD,QAAQ,OAAO,MAAA,KAAW,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA,GAAO;AAAA,GACvD;AAEA,EAAA,uBACEpD,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,gCAAgC,YAAY,CAAA,CAAA,EAAI,UAAU,eAAA,GAAkB,EAAE,IAAI,SAAS,CAAA,CAAA;AAAA,MACtG,KAAA;AAAA,MACA,aAAA,EAAY;AAAA;AAAA,GACd;AAEJ;AAKO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA,GAAQ,CAAA;AAAA,EACR,GAAA,GAAM,IAAA;AAAA,EACN,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAE/B,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,aAAA,EAAY,QACrD,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,GAAA;AAAA,IAAI,CAAC,CAAA,EAAG,KAAA,KACrC,2BACEA,cAAAA,CAAC,SAAiB,QAAA,EAAA,QAAA,CAAS,KAAK,KAAtB,KAAwB,CAAA,mBAElCA,cAAAA,CAAC,QAAA,EAAA,EAAqB,SAAQ,MAAA,EAAO,MAAA,EAAQ,MAA9B,KAAkC;AAAA,GAErD,EACF,CAAA;AAEJ;AAKO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA,GAAQ,CAAA;AAAA,EACR,SAAA,GAAY;AACd,CAAA,EAGG;AACD,EAAA,MAAM,SAAS,CAAC,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAElD,EAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,aAAa,SAAS,CAAA,CAAA,EAAI,eAAY,MAAA,EACnD,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,0BACrCA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,OAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA;AAAA,MACnC,MAAA,EAAQ;AAAA,KAAA;AAAA,IAHH;AAAA,GAKR,CAAA,EACH,CAAA;AAEJ;AAKO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA,GAAO,EAAA;AAAA,EACP,SAAA,GAAY;AACd,CAAA,EAGG;AACD,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR;AAAA;AAAA,GACF;AAEJ;AAKO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,MAAA,GAAS,GAAA;AAAA,EACT,SAAA,GAAY;AACd,CAAA,EAIG;AACD,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,SAAA;AAAA,MACR,KAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAKO,SAAS,gBAAA,CAAiB,EAAE,SAAA,GAAY,EAAA,EAAG,EAA2B;AAC3E,EAAA,uBACEc,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,kCAAA,EAAqC,SAAS,CAAA,CAAA,EAC5D,QAAA,EAAA;AAAA,oBAAAd,eAAC,QAAA,EAAA,EAAS,OAAA,EAAQ,WAAU,KAAA,EAAO,EAAA,EAAI,QAAQ,EAAA,EAAI,CAAA;AAAA,oBACnDA,eAAC,QAAA,EAAA,EAAS,OAAA,EAAQ,QAAO,MAAA,EAAQ,EAAA,EAAI,WAAU,QAAA,EAAS;AAAA,GAAA,EAC1D,CAAA;AAEJ;AAEA,IAAO,gBAAA,GAAQoD,WAAK,QAAQ;AC7I5B,IAAM,aAAA,GAAgB7C,oBAAmC,IAAI,CAAA;AAgBtD,SAAS,eAAe,EAAE,MAAA,EAAQ,eAAA,GAAkB,KAAA,EAAO,UAAS,EAAwB;AACjG,EAAA,IAAI,cAAA,GAAsC,IAAA;AAE1C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,cAAA,GAAiB,MAAA;AAAA,EACnB,CAAA,MAAA,IAAW,eAAA,IAAmB,OAAO,MAAA,KAAW,WAAA,EAAa;AAC3D,IAAA,MAAM,gBAAiB,MAAA,CAAe,kBAAA;AACtC,IAAA,MAAM,aAAc,MAAA,CAAe,cAAA;AAEnC,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,cAAA,GAAiB;AAAA,QACf,IAAA,EAAM;AAAA,UACJ,EAAA,EAAI,MAAA,CAAO,aAAA,CAAc,IAAA,EAAM,MAAM,EAAE,CAAA;AAAA,UACvC,KAAA,EAAO,aAAA,CAAc,IAAA,EAAM,KAAA,IAAS,EAAA;AAAA,UACpC,SAAA,EAAW,aAAA,CAAc,IAAA,EAAM,SAAA,IAAa,EAAA;AAAA,UAC5C,QAAA,EAAU,aAAA,CAAc,IAAA,EAAM,QAAA,IAAY,EAAA;AAAA,UAC1C,WAAA,EAAa,aAAA,CAAc,IAAA,EAAM,WAAA,IAAe;AAAC,SACnD;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,EAAA,EAAI,aAAA,CAAc,MAAA,EAAQ,EAAA,IAAM,EAAA;AAAA,UAChC,IAAA,EAAM,aAAA,CAAc,MAAA,EAAQ,IAAA,IAAQ;AAAA,SACtC;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,QAAA,EAAU,aAAA,CAAc,MAAA,EAAQ,QAAA,IAAY,IAAA;AAAA,UAC5C,YAAA,EAAc,aAAA,CAAc,MAAA,EAAQ,YAAA,IAAgB;AAAC,SACvD;AAAA,QACA,SAAA,EAAW;AAAA,UACT,OAAA,EAAS,aAAA,CAAc,MAAA,EAAQ,eAAA,IAAmB,UAAA;AAAA,UAClD,MAAA,EAAQ,aAAA,CAAc,MAAA,EAAQ,cAAA,IAAkB;AAAA,SAClD;AAAA,QACA,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAAA,EACF;AAEA,EAAA,uBACEP,cAAAA,CAAC,aAAA,CAAc,UAAd,EAAuB,KAAA,EAAO,gBAC5B,QAAA,EACH,CAAA;AAEJ;AAMO,SAAS,SAAA,GAAiC;AAC/C,EAAA,OAAOY,iBAAW,aAAa,CAAA;AACjC;AAMO,SAAS,iBAAA,GAAkC;AAChD,EAAA,MAAM,MAAA,GAASA,iBAAW,aAAa,CAAA;AACvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS4C,cAAAA,CAAc,QAA6B,UAAA,EAA6B;AACtF,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA;AACpD;ACzGO,SAAS,YAAA,CAAa,OAAA,GAA+B,EAAC,EAAG;AAC9D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIhD,eAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,kBAAA,GAAqBC,aAA+B,IAAI,CAAA;AAE9D,EAAA,MAAM,aAAA,GAAgBE,iBAAAA;AAAA,IACpB,OAAO,QAAqC,MAAA,KAAyB;AACnE,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,UAAA,CAAW,EAAE,CAAA;AAGb,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAGjD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,UAAA,kBAAA,CAAmB,SAAS,KAAA,EAAM;AAAA,QACpC,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,IAAI;AACF,QAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAEhC,UAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAC9C,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,OAAA,EAAS;AAC3C,YAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,cAAA,MAAM,UAAA,GAAa,OAAO,KAAA,CAAM,OAAA;AAChC,cAAA,OAAA,CAAQ,UAAU,UAAU,CAAA;AAC5B,cAAA,OAAO,UAAA;AAAA,YACT,CAAC,CAAA;AAAA,UACH,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,YAAA,MAAM,QAAA,GAAW,MAAM,KAAA,IAAS,cAAA;AAChC,YAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,QAAQ,CAAA;AAC9B,YAAA,QAAA,CAAS,GAAG,CAAA;AACZ,YAAA,OAAA,CAAQ,UAAU,QAAQ,CAAA;AAC1B,YAAA;AAAA,UACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAChC,YAAA,OAAA,CAAQ,MAAA,IAAS;AACjB,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AAErD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,WAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,eAAe,CAAA;AACvE,QAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,QAAA,OAAA,CAAQ,OAAA,GAAU,SAAS,OAAO,CAAA;AAAA,MACpC,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AACjC,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,UAAA,CAAW,EAAE,CAAA;AACb,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC7FO,IAAM,UAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,SAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,UAAA,EAAY,SAAA;AAAA,IACZ,eAAA,EAAiB,SAAA;AAAA,IACjB,QAAA,EAAU,SAAA;AAAA,IACV,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM;AAAA;AAEV;AAEO,IAAM,SAAA,GAAmB;AAAA,EAC9B,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,SAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,UAAA,EAAY,SAAA;AAAA,IACZ,eAAA,EAAiB,SAAA;AAAA,IACjB,QAAA,EAAU,SAAA;AAAA,IACV,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM;AAAA;AAEV;ACzDA,IAAM,YAAA,GAAeJ,oBAAwC,IAAI,CAAA;AAUjE,SAAS,cAAA,GAAwB;AAC/B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AACtE,EAAA,OAAO,cAAc,SAAA,GAAY,UAAA;AACnC;AAKA,SAAS,aAAa,SAAA,EAAuD;AAC3E,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,OAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,cAAA,EAAe;AAAA,IACxB;AACE,MAAA,OAAO,UAAA;AAAA;AAEb;AAKA,SAAS,oBAAoB,KAAA,EAAoB;AAC/C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AAGtB,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,SAAA,EAAY,GAAG,IAAI,KAAK,CAAA;AAAA,EACjD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACtD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,iBAAA,EAAoB,GAAG,IAAI,KAAK,CAAA;AAAA,EACzD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,YAAY,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC3D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,gBAAA,EAAmB,GAAG,IAAI,KAAK,CAAA;AAAA,EACxD,CAAC,CAAA;AACH;AAMO,SAAS,aAAA,CAAc,EAAE,KAAA,GAAQ,QAAA,EAAU,UAAS,EAAuB;AAChF,EAAA,MAAM,aAAA,GAAgBM,cAAQ,MAAM,YAAA,CAAa,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEhE,EAAAH,gBAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,aAAa,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,UAAU,QAAA,EAAU;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA;AAEnE,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,MAAM,WAAW,cAAA,EAAe;AAChC,MAAA,mBAAA,CAAoB,QAAQ,CAAA;AAAA,IAC9B,CAAA;AAEA,IAAA,UAAA,CAAW,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAElD,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,KAAA,GAA2B;AAAA,IAC/B,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,uBAAOV,cAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AACxD;AAKO,SAAS,QAAA,GAAkB;AAChC,EAAA,MAAM,OAAA,GAAUY,iBAAW,YAAY,CAAA;AAEvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAA;AACjB;;;ACvHO,SAAS,YAAA,GAAuB;AACrC,EAAA,MAAM,QAAQ,MAAA,CAAO,cAAA;AACrB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAA,CAAQ,KAAK,uCAAuC,CAAA;AACpD,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,cAAc,OAAA,EAA2B;AACvD,EAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,KAAK,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,sBAAsB,IAAA,EAA6B;AACjE,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAI,CAAA;AAChC,EAAA,OAAO,cAAc,OAAO,CAAA;AAC9B;;;ACFO,IAAM,iBAAN,MAA+C;AAAA,EAIpD,YAAY,MAAA,EAA8B;AAF1C,IAAA,IAAA,CAAQ,eAAA,GAA0C,IAAA;AAGhD,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,eAAA,EAAiB,UAAA;AAAA,MACjB,cAAA,EAAgB,SAAA;AAAA,MAChB,OAAA,EAAS,GAAA;AAAA,MACT,GAAG;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAC1B,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,OAAO,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,UAAA,GACpC,KAAK,MAAA,CAAO,SAAA,EAAU,GACtB,IAAA,CAAK,MAAA,CAAO,SAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,iBAAA,EAAqD;AACzE,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ;AAAA,MAC1B,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAG,KAAK,MAAA,CAAO,OAAA;AAAA,MACf,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,SAAS,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CAAW,KAAA,EAAe,SAAA,EAA6C;AACnF,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,eAAe,CAAA,CAAA;AAEhE,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAK,aAAA,EAAc;AAAA,MAC5B,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,MACzC,MAAA,EAAQ,KAAK,eAAA,EAAiB;AAAA,KAC/B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,WAAW,eAAe,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAkC;AACtC,IAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAad,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAwC,KAAK,CAAA;AACrE,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,EAAA,EAA0C;AAC3D,IAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAyDd,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,QAA8C,KAAA,EAAO,EAAE,IAAI,CAAA;AACnF,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,GAAG,CAAA;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAA,CACL,SAAA,EACA,SACA,WAAA,GAA4B,IAC5B,MAAA,EAC6B;AAE7B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAG3C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,QAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,MAC9B,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,cAAc,CAAA,CAAA;AAE/D,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,SAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA,EAAa,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QACjC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,YAAY,CAAA,CAAE;AAAA,OAChB,CAAE;AAAA,KACJ;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,KAAK,aAAA,EAAc;AAAA,QAC5B,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,QAC5B,MAAA,EAAQ,KAAK,eAAA,CAAgB;AAAA,OAC9B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MACjE;AAEA,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,QAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,MAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,MAAA,IAAI,MAAA,GAAS,EAAA;AAEb,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,UAAA,IAAI,IAAA,EAAM;AACR,YAAA;AAAA,UACF;AAEA,UAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAGhD,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,UAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,CAAC,IAAA,CAAK,IAAA,MAAU,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxC,cAAA;AAAA,YACF;AAEA,YAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,cAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAEzB,cAAA,IAAI;AACF,gBAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,gBAAA,MAAM,KAAA;AAGN,gBAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,OAAA,EAAS;AACnD,kBAAA;AAAA,gBACF;AAAA,cACF,SAAS,QAAA,EAAU;AACjB,gBAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,QAAQ,CAAA;AACnD,gBAAA,MAAM;AAAA,kBACJ,IAAA,EAAM,OAAA;AAAA,kBACN,KAAA,EAAO;AAAA,iBACT;AACA,gBAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,MAAA,CAAO,WAAA,EAAY;AAAA,MACrB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,eAAe,KAAA,EAAO;AACxB,QAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAC7B,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,WACT;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,OAAA;AAAA,YACN,OAAO,GAAA,CAAI;AAAA,WACb;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CACJ,SAAA,EACA,UAAA,EACA,OAAA,EACuB;AACvB,IAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AASd,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAErB,OAAO,EAAE,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,CAAA;AAE5C,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OAC9C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,UAAA,EAA2C;AACrE,IAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AASd,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,QAErB,KAAA,EAAO,EAAE,YAAY,CAAA;AAExB,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OAC9C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAmB,SAAA,EAAyB;AAE1C,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,MAAA,EAA8C;AACjF,EAAA,OAAO,IAAI,eAAe,MAAM,CAAA;AAClC","file":"index.cjs","sourcesContent":["/**\n * MarkdownRenderer component\n * Renders markdown with syntax highlighting and citations\n */\n\nimport ReactMarkdown from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport rehypeSanitize from 'rehype-sanitize'\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { tomorrow } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport { Citation } from '../types'\n\ninterface MarkdownRendererProps {\n content: string\n citations?: Citation[] | null\n}\n\nexport function MarkdownRenderer({ content }: MarkdownRendererProps) {\n return (\n <div className=\"prose prose-sm max-w-none\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeSanitize]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '')\n const isInline = !match\n return !isInline && match ? (\n <SyntaxHighlighter\n style={tomorrow as any}\n language={match[1]}\n PreTag=\"div\"\n >\n {String(children).replace(/\\n$/, '')}\n </SyntaxHighlighter>\n ) : (\n <code className={className} {...props}>\n {children}\n </code>\n )\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n )\n}\n","/**\n * Type definitions for BI-Chat UI components\n */\n\nexport interface Session {\n id: string\n title: string\n status: 'active' | 'archived'\n pinned: boolean\n createdAt: string\n updatedAt: string\n}\n\nexport enum MessageRole {\n User = 'user',\n Assistant = 'assistant',\n System = 'system',\n Tool = 'tool',\n}\n\nexport interface Message {\n id: string\n sessionId: string\n role: MessageRole\n content: string\n createdAt: string\n toolCalls?: ToolCall[]\n citations?: Citation[]\n chartData?: ChartData\n artifacts?: Artifact[]\n explanation?: string\n}\n\nexport interface ToolCall {\n id: string\n name: string\n arguments: string\n}\n\nexport interface Citation {\n id: string\n source: string\n url?: string\n excerpt?: string\n}\n\nexport interface Attachment {\n id: string\n filename: string\n mimeType: string\n sizeBytes: number\n base64Data?: string\n}\n\n// Image attachment with preview for MessageInput\nexport interface ImageAttachment {\n filename: string\n mimeType: string\n sizeBytes: number\n base64Data: string\n preview: string // data URL for img src\n}\n\n// Code interpreter output\nexport interface CodeOutput {\n type: 'image' | 'text' | 'error'\n content: string | ImageAttachment\n}\n\n// Queued message for offline/loading state\nexport interface QueuedMessage {\n content: string\n attachments: ImageAttachment[]\n}\n\nexport interface ChartData {\n type: 'bar' | 'line' | 'pie' | 'area'\n title?: string\n data: any[]\n xAxisKey?: string\n yAxisKey?: string\n}\n\nexport interface Artifact {\n type: 'excel' | 'pdf'\n filename: string\n url: string\n sizeReadable?: string\n rowCount?: number\n description?: string\n}\n\nexport interface PendingQuestion {\n id: string\n turnId: string\n question: string\n type: 'MULTIPLE_CHOICE' | 'FREE_TEXT'\n options?: string[]\n status: 'PENDING' | 'ANSWERED' | 'CANCELLED'\n}\n\nexport type QuestionAnswers = Record<string, string>\n\nexport interface StreamChunk {\n type: 'chunk' | 'error' | 'done' | 'user_message'\n content?: string\n error?: string\n sessionId?: string\n}\n\nexport interface ChatDataSource {\n createSession(): Promise<Session>\n fetchSession(id: string): Promise<{\n session: Session\n messages: Message[]\n pendingQuestion?: PendingQuestion | null\n } | null>\n sendMessage(\n sessionId: string,\n content: string,\n attachments?: Attachment[],\n signal?: AbortSignal\n ): AsyncGenerator<StreamChunk>\n submitQuestionAnswers(\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers\n ): Promise<{ success: boolean; error?: string }>\n cancelPendingQuestion(questionId: string): Promise<{ success: boolean; error?: string }>\n navigateToSession?(sessionId: string): void\n}\n\nexport interface ChatSessionContextValue {\n // State\n message: string\n messages: Message[]\n loading: boolean\n error: string | null\n currentSessionId?: string\n pendingQuestion: PendingQuestion | null\n session: Session | null\n fetching: boolean\n streamingContent: string\n isStreaming: boolean\n messageQueue: QueuedMessage[]\n codeOutputs: CodeOutput[]\n\n // Setters\n setMessage: (message: string) => void\n setError: (error: string | null) => void\n setCodeOutputs: (outputs: CodeOutput[]) => void\n\n // Handlers\n handleSubmit: (e: React.FormEvent, attachments?: ImageAttachment[]) => void\n handleRegenerate?: (messageId: string) => Promise<void>\n handleEdit?: (messageId: string, newContent: string) => Promise<void>\n handleCopy: (text: string) => Promise<void>\n handleSubmitQuestionAnswers: (answers: QuestionAnswers) => void\n handleCancelPendingQuestion: () => Promise<void>\n handleUnqueue: () => { content: string; attachments: ImageAttachment[] } | null\n sendMessage: (content: string, attachments?: Attachment[]) => Promise<void>\n cancel: () => void\n}\n\n// Translations\nexport type Translations = Record<string, string>\n\n// Branding\nexport interface ExamplePrompt {\n category: string\n text: string\n icon: string\n}\n\nexport interface BrandingConfig {\n appName: string\n logoUrl?: string\n theme?: {\n primary?: string\n secondary?: string\n accent?: string\n }\n welcome?: {\n title?: string\n description?: string\n examplePrompts?: ExamplePrompt[]\n }\n colors?: {\n primary?: string\n secondary?: string\n accent?: string\n }\n logo?: {\n src?: string\n alt?: string\n }\n}\n","/**\n * Per-session rate limiter\n * Prevents excessive requests within a time window\n */\n\nexport interface RateLimiterConfig {\n maxRequests: number\n windowMs: number\n}\n\nexport class RateLimiter {\n private timestamps: number[] = []\n private maxRequests: number\n private windowMs: number\n\n constructor(config: RateLimiterConfig) {\n this.maxRequests = config.maxRequests\n this.windowMs = config.windowMs\n }\n\n /**\n * Check if a request can be made\n * Updates internal state if request is allowed\n */\n canMakeRequest(): boolean {\n const now = Date.now()\n\n // Remove timestamps outside the current window\n this.timestamps = this.timestamps.filter(t => now - t < this.windowMs)\n\n // Check if limit exceeded\n if (this.timestamps.length >= this.maxRequests) {\n return false\n }\n\n // Add current timestamp\n this.timestamps.push(now)\n return true\n }\n\n /**\n * Get milliseconds until next request is allowed\n * Returns 0 if request can be made immediately\n */\n getTimeUntilNextRequest(): number {\n if (this.timestamps.length < this.maxRequests) {\n return 0\n }\n\n const now = Date.now()\n const oldestTimestamp = this.timestamps[0]\n const timeElapsed = now - oldestTimestamp\n const timeRemaining = this.windowMs - timeElapsed\n\n return Math.max(0, timeRemaining)\n }\n\n /**\n * Reset the rate limiter state\n */\n reset(): void {\n this.timestamps = []\n }\n}\n","/**\n * Chat session context provider and hook\n * Manages state for chat sessions including messages, loading, streaming, and HITL\n */\n\nimport { createContext, useContext, useState, useCallback, useEffect, ReactNode, useRef } from 'react'\nimport type {\n ChatDataSource,\n Session,\n Message,\n PendingQuestion,\n QuestionAnswers,\n Attachment,\n ImageAttachment,\n QueuedMessage,\n CodeOutput,\n ChatSessionContextValue,\n} from '../types'\nimport { MessageRole } from '../types'\nimport { RateLimiter } from '../utils/RateLimiter'\n\nconst ChatSessionContext = createContext<ChatSessionContextValue | null>(null)\n\ninterface ChatSessionProviderProps {\n dataSource: ChatDataSource\n sessionId?: string\n rateLimiter?: RateLimiter\n children: ReactNode\n}\n\n// Default rate limiter configuration\nconst DEFAULT_RATE_LIMIT_CONFIG = {\n maxRequests: 20,\n windowMs: 60000, // 1 minute\n}\n\nexport function ChatSessionProvider({\n dataSource,\n sessionId,\n rateLimiter: externalRateLimiter,\n children\n}: ChatSessionProviderProps) {\n // Form state\n const [message, setMessage] = useState('')\n\n // Message state\n const [messages, setMessages] = useState<Message[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Session state\n const [currentSessionId, setCurrentSessionId] = useState<string | undefined>(sessionId)\n const [session, setSession] = useState<Session | null>(null)\n const [fetching, setFetching] = useState(false)\n\n // Question state\n const [pendingQuestion, setPendingQuestion] = useState<PendingQuestion | null>(null)\n\n // Streaming state\n const [streamingContent, setStreamingContent] = useState('')\n const [isStreaming, setIsStreaming] = useState(false)\n const abortControllerRef = useRef<AbortController | null>(null)\n\n // Queue and code outputs state\n const [messageQueue, setMessageQueue] = useState<QueuedMessage[]>([])\n const [codeOutputs, setCodeOutputs] = useState<CodeOutput[]>([])\n\n // Rate limiter (use provided or create default)\n const rateLimiterRef = useRef<RateLimiter>(\n externalRateLimiter || new RateLimiter(DEFAULT_RATE_LIMIT_CONFIG)\n )\n\n // Update sessionId when prop changes\n useEffect(() => {\n setCurrentSessionId(sessionId)\n }, [sessionId])\n\n // Fetch session on mount/sessionId change\n useEffect(() => {\n if (!currentSessionId || currentSessionId === 'new') {\n setSession(null)\n setMessages([])\n setPendingQuestion(null)\n setFetching(false)\n return\n }\n\n let cancelled = false\n\n setFetching(true)\n setError(null)\n\n dataSource\n .fetchSession(currentSessionId)\n .then((state) => {\n if (cancelled) return\n\n if (state) {\n setSession(state.session)\n setMessages(state.messages)\n setPendingQuestion(state.pendingQuestion || null)\n } else {\n setError('Session not found')\n }\n setFetching(false)\n })\n .catch((err) => {\n if (cancelled) return\n setError(err.message || 'Failed to load session')\n setFetching(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [dataSource, currentSessionId])\n\n const handleCopy = useCallback(async (text: string) => {\n await navigator.clipboard.writeText(text)\n }, [])\n\n const sendMessageDirect = useCallback(\n async (content: string, attachments: Attachment[] = []): Promise<void> => {\n if (!content.trim() || loading) return\n\n // Check rate limit\n if (!rateLimiterRef.current.canMakeRequest()) {\n const timeUntilNext = rateLimiterRef.current.getTimeUntilNextRequest()\n const seconds = Math.ceil(timeUntilNext / 1000)\n setError(`Rate limit exceeded. Please wait ${seconds} seconds before sending another message.`)\n setTimeout(() => setError(null), 5000)\n return\n }\n\n setMessage('')\n setLoading(true)\n setError(null)\n setStreamingContent('')\n\n // Create abort controller for this request\n abortControllerRef.current = new AbortController()\n\n // Add optimistic user message\n const tempUserMessage: Message = {\n id: `temp-user-${Date.now()}`,\n sessionId: currentSessionId || 'new',\n role: MessageRole.User,\n content,\n createdAt: new Date().toISOString(),\n }\n setMessages((prev) => [...prev, tempUserMessage])\n\n try {\n // Create session if needed\n let activeSessionId = currentSessionId\n let shouldNavigateAfter = false\n\n if (!activeSessionId || activeSessionId === 'new') {\n const result = await dataSource.createSession()\n if (result) {\n activeSessionId = result.id\n setCurrentSessionId(activeSessionId)\n shouldNavigateAfter = true\n }\n }\n\n // Stream response\n let accumulatedContent = ''\n let createdSessionId: string | undefined\n setIsStreaming(true)\n\n for await (const chunk of dataSource.sendMessage(\n activeSessionId || 'new',\n content,\n attachments,\n abortControllerRef.current?.signal\n )) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break\n }\n\n if (chunk.type === 'chunk' && chunk.content) {\n accumulatedContent += chunk.content\n setStreamingContent(accumulatedContent)\n } else if (chunk.type === 'error') {\n throw new Error(chunk.error || 'Stream error')\n } else if (chunk.type === 'done') {\n if (chunk.sessionId) {\n createdSessionId = chunk.sessionId\n }\n // Refetch session to get final state\n const finalSessionId = createdSessionId || activeSessionId\n if (finalSessionId && finalSessionId !== 'new') {\n const state = await dataSource.fetchSession(finalSessionId)\n if (state) {\n setSession(state.session)\n setMessages(state.messages)\n setPendingQuestion(state.pendingQuestion || null)\n }\n }\n } else if (chunk.type === 'user_message' && chunk.sessionId) {\n createdSessionId = chunk.sessionId\n }\n }\n\n // Navigate to session page if a new session was created\n const targetSessionId = createdSessionId || activeSessionId\n if (shouldNavigateAfter && targetSessionId && targetSessionId !== 'new') {\n dataSource.navigateToSession?.(targetSessionId)\n }\n } catch (err) {\n // Check if error is due to cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n // Stream was cancelled - restore input message\n setMessage(content)\n return\n }\n\n // Remove optimistic message on error\n setMessages((prev) => prev.filter((m) => m.id !== tempUserMessage.id))\n\n const errorMessage = err instanceof Error ? err.message : 'Failed to send message'\n setError(errorMessage)\n console.error('Send message error:', err)\n } finally {\n setLoading(false)\n setStreamingContent('')\n setIsStreaming(false)\n abortControllerRef.current = null\n }\n },\n [currentSessionId, loading, dataSource]\n )\n\n const cancelStream = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n abortControllerRef.current = null\n setIsStreaming(false)\n setLoading(false)\n }\n }, [])\n\n const handleSubmit = useCallback(\n (e: React.FormEvent, attachments: ImageAttachment[] = []) => {\n e.preventDefault()\n if (!message.trim() && attachments.length === 0) return\n\n // Convert ImageAttachment to Attachment for the data source\n const convertedAttachments: Attachment[] = attachments.map(att => ({\n id: '', // Will be assigned by backend\n filename: att.filename,\n mimeType: att.mimeType,\n sizeBytes: att.sizeBytes,\n base64Data: att.base64Data\n }))\n\n sendMessageDirect(message, convertedAttachments)\n },\n [message, sendMessageDirect]\n )\n\n const handleUnqueue = useCallback(() => {\n if (messageQueue.length === 0) {\n return null\n }\n\n const lastQueued = messageQueue[messageQueue.length - 1]\n setMessageQueue(prev => prev.slice(0, -1))\n\n return {\n content: lastQueued.content,\n attachments: lastQueued.attachments\n }\n }, [messageQueue])\n\n const handleRegenerate = useCallback(\n async (messageId: string) => {\n if (!currentSessionId || currentSessionId === 'new') return\n\n const messageIndex = messages.findIndex((m) => m.id === messageId)\n if (messageIndex <= 0) return\n\n setLoading(true)\n setError(null)\n\n try {\n // Find the user message before this assistant message\n const userMessage = messages[messageIndex - 1]\n if (userMessage && userMessage.role === MessageRole.User) {\n await sendMessageDirect(userMessage.content, [])\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to regenerate message'\n setError(errorMessage)\n console.error('Regenerate error:', err)\n } finally {\n setLoading(false)\n }\n },\n [messages, currentSessionId, sendMessageDirect]\n )\n\n const handleEdit = useCallback(\n async (messageId: string, newContent: string) => {\n if (!currentSessionId || currentSessionId === 'new') {\n setMessage(newContent)\n setMessages((prev) => prev.filter((m) => m.id !== messageId))\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n // For edit, we resend the edited message\n await sendMessageDirect(newContent, [])\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to edit message'\n setError(errorMessage)\n console.error('Edit error:', err)\n } finally {\n setLoading(false)\n }\n },\n [currentSessionId, sendMessageDirect]\n )\n\n const handleSubmitQuestionAnswers = useCallback(\n (answers: QuestionAnswers) => {\n if (!currentSessionId || !pendingQuestion) return\n\n setLoading(true)\n setError(null)\n const previousPendingQuestion = pendingQuestion\n setPendingQuestion(null)\n\n ;(async () => {\n try {\n const result = await dataSource.submitQuestionAnswers(\n currentSessionId,\n previousPendingQuestion.id,\n answers\n )\n\n if (result.success) {\n if (currentSessionId !== 'new') {\n try {\n const state = await dataSource.fetchSession(currentSessionId)\n if (state) {\n setMessages(state.messages)\n setPendingQuestion(state.pendingQuestion || null)\n } else {\n setPendingQuestion(previousPendingQuestion)\n setError('Failed to load updated session')\n }\n } catch (fetchErr) {\n setPendingQuestion(previousPendingQuestion)\n const errorMessage =\n fetchErr instanceof Error\n ? fetchErr.message\n : 'Failed to load updated session'\n setError(errorMessage)\n }\n }\n } else {\n setPendingQuestion(previousPendingQuestion)\n setError(result.error || 'Failed to submit answers')\n }\n } catch (err) {\n setPendingQuestion(previousPendingQuestion)\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to submit answers'\n setError(errorMessage)\n } finally {\n setLoading(false)\n }\n })()\n },\n [currentSessionId, pendingQuestion, dataSource]\n )\n\n const handleCancelPendingQuestion = useCallback(async () => {\n if (!currentSessionId || !pendingQuestion) return\n\n try {\n const result = await dataSource.cancelPendingQuestion(pendingQuestion.id)\n\n if (result.success) {\n setPendingQuestion(null)\n } else {\n setError(result.error || 'Failed to cancel question')\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to cancel question'\n setError(errorMessage)\n }\n }, [currentSessionId, pendingQuestion, dataSource])\n\n const value: ChatSessionContextValue = {\n // State\n message,\n messages,\n loading,\n error,\n currentSessionId,\n pendingQuestion,\n session,\n fetching,\n streamingContent,\n isStreaming,\n messageQueue,\n codeOutputs,\n\n // Setters\n setMessage,\n setError,\n setCodeOutputs,\n\n // Handlers\n handleCopy,\n handleRegenerate,\n handleEdit,\n handleSubmit,\n handleSubmitQuestionAnswers,\n handleCancelPendingQuestion,\n handleUnqueue,\n sendMessage: sendMessageDirect,\n cancel: cancelStream,\n }\n\n return (\n <ChatSessionContext.Provider value={value}>\n {children}\n </ChatSessionContext.Provider>\n )\n}\n\nexport function useChat(): ChatSessionContextValue {\n const context = useContext(ChatSessionContext)\n if (!context) {\n throw new Error('useChat must be used within ChatSessionProvider')\n }\n return context\n}\n","/**\n * IOTA SDK integration context provider\n * Consumes server-side context from window.__BICHAT_CONTEXT__\n */\n\nimport { createContext, useContext, ReactNode } from 'react'\nimport type { IotaContext as IotaContextType } from '../types/iota'\n\nconst IotaContext = createContext<IotaContextType | null>(null)\n\ninterface IotaContextProviderProps {\n children: ReactNode\n}\n\nexport function IotaContextProvider({ children }: IotaContextProviderProps) {\n // Read initial context from window object injected by server\n const initialContext = window.__BICHAT_CONTEXT__\n\n if (!initialContext) {\n throw new Error('BICHAT_CONTEXT not found. Ensure server injected context into window object.')\n }\n\n return (\n <IotaContext.Provider value={initialContext}>\n {children}\n </IotaContext.Provider>\n )\n}\n\nexport function useIotaContext(): IotaContextType {\n const context = useContext(IotaContext)\n if (!context) {\n throw new Error('useIotaContext must be used within IotaContextProvider')\n }\n return context\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function hasPermission(permission: string): boolean {\n const context = window.__BICHAT_CONTEXT__\n if (!context) {\n return false\n }\n return context.user.permissions.includes(permission)\n}\n","/**\n * Default English translations for BiChat UI.\n * These serve as fallback when no custom translations are provided.\n *\n * Key naming convention:\n * - Use dot notation for namespacing: \"section.key\"\n * - Use {param} for interpolation: \"You have {count} messages\"\n */\n\nimport type { Translations } from '../types'\n\nexport const defaultTranslations: Translations = {\n // Welcome screen\n 'welcome.title': 'Welcome to BiChat',\n 'welcome.description':\n 'Your intelligent business analytics assistant. Ask questions about your data, generate reports, or explore insights.',\n 'welcome.tryAsking': 'Try asking',\n\n // Chat header\n 'chat.newChat': 'New Chat',\n 'chat.archived': 'Archived',\n 'chat.pinned': 'Pinned',\n 'chat.goBack': 'Go back',\n\n // Message input\n 'input.placeholder': 'Type a message...',\n 'input.attachFiles': 'Attach files',\n 'input.attachImages': 'Attach images',\n 'input.dropImages': 'Drop images here',\n 'input.sendMessage': 'Send message',\n 'input.aiThinking': 'AI is thinking...',\n 'input.processing': 'Processing...',\n 'input.messagesQueued': '{count} message(s) queued',\n 'input.dismissError': 'Dismiss error',\n\n // Message actions\n 'message.copy': 'Copy',\n 'message.copied': 'Copied!',\n 'message.regenerate': 'Regenerate',\n 'message.edit': 'Edit',\n 'message.save': 'Save',\n 'message.cancel': 'Cancel',\n\n // Assistant turn\n 'assistant.thinking': 'Thinking...',\n 'assistant.toolCall': 'Using tool: {name}',\n 'assistant.generating': 'Generating response...',\n\n // Question form\n 'question.submit': 'Submit',\n 'question.selectOne': 'Select one option',\n 'question.selectMulti': 'Select one or more options',\n 'question.required': 'This field is required',\n 'question.other': 'Other',\n 'question.specifyOther': 'Please specify',\n\n // Errors\n 'error.generic': 'Something went wrong',\n 'error.networkError': 'Network error. Please try again.',\n 'error.sessionExpired': 'Session expired. Please refresh.',\n 'error.fileTooLarge': 'File is too large',\n 'error.invalidFile': 'Invalid file type',\n 'error.maxFiles': 'Maximum {max} files allowed',\n\n // Empty states\n 'empty.noMessages': 'No messages yet',\n 'empty.noSessions': 'No chat sessions',\n 'empty.startChat': 'Start a new chat to begin',\n\n // Sources panel\n 'sources.title': 'Sources',\n 'sources.viewMore': 'View more',\n 'sources.citations': '{count} citation(s)',\n\n // Code outputs\n 'codeOutputs.title': 'Code Outputs',\n 'codeOutputs.download': 'Download',\n 'codeOutputs.expand': 'Expand',\n 'codeOutputs.collapse': 'Collapse',\n\n // Charts\n 'chart.download': 'Download chart',\n 'chart.fullscreen': 'View fullscreen',\n 'chart.noData': 'No data available',\n\n // Example prompt categories\n 'category.analysis': 'Data Analysis',\n 'category.reports': 'Reports',\n 'category.insights': 'Insights',\n}\n","/**\n * Translation hook using locale from IotaContext\n */\n\nimport { useIotaContext } from '../context/IotaContext'\nimport { defaultTranslations } from '../locales/defaults'\n\nexport function useTranslation() {\n const { locale } = useIotaContext()\n\n /**\n * Translate a key with optional parameter interpolation\n * @param key - Translation key (e.g., 'bichat.title')\n * @param params - Optional parameters for interpolation (e.g., { name: 'John' })\n * @returns Translated string\n */\n const t = (key: string, params?: Record<string, any>): string => {\n let text = locale.translations[key] || defaultTranslations[key] || key\n\n // Simple interpolation: replace {{key}} with params[key]\n if (params) {\n Object.keys(params).forEach((paramKey) => {\n const value = params[paramKey]\n text = text.replace(new RegExp(`{{${paramKey}}}`, 'g'), String(value))\n })\n }\n\n return text\n }\n\n return {\n t,\n locale: locale.language,\n }\n}\n","/**\n * Branding hook for UI customization.\n *\n * Provides access to branding configuration injected from the backend\n * via window.__BICHAT_CONTEXT__.extensions.branding\n */\n\nimport { useMemo } from 'react'\nimport { useIotaContext } from '../context/IotaContext'\nimport type { BrandingConfig, ExamplePrompt } from '../types'\nimport { useTranslation } from './useTranslation'\n\n/**\n * Default example prompts when none are configured.\n */\nconst defaultExamplePrompts: ExamplePrompt[] = [\n {\n category: 'Data Analysis',\n text: 'Show me sales trends for the last quarter',\n icon: 'chart-bar',\n },\n {\n category: 'Reports',\n text: 'Generate a summary of recent activity',\n icon: 'file-text',\n },\n {\n category: 'Insights',\n text: 'What are the top performing items?',\n icon: 'lightbulb',\n },\n]\n\n/**\n * Hook to access branding configuration.\n *\n * Returns merged branding with fallbacks to defaults and translations.\n */\nexport function useBranding() {\n const context = useIotaContext()\n const { t } = useTranslation()\n\n const branding = useMemo((): BrandingConfig => {\n const customBranding = context.extensions?.branding || {}\n\n // Get example prompts with category translations\n let examplePrompts = customBranding.welcome?.examplePrompts\n if (!examplePrompts || examplePrompts.length === 0) {\n // Use defaults with translated categories\n examplePrompts = defaultExamplePrompts.map((p) => ({\n ...p,\n category: t(`category.${p.category.toLowerCase().replace(/\\s+/g, '')}`) || p.category,\n }))\n }\n\n return {\n appName: customBranding.appName || 'BiChat',\n logoUrl: customBranding.logoUrl,\n welcome: {\n title: customBranding.welcome?.title || t('welcome.title'),\n description: customBranding.welcome?.description || t('welcome.description'),\n examplePrompts,\n },\n theme: customBranding.theme,\n }\n }, [context.extensions?.branding, t])\n\n return branding\n}\n\n/**\n * Hook to access feature flags.\n */\nexport function useFeatureFlags() {\n const context = useIotaContext()\n\n return useMemo(\n () => ({\n vision: context.extensions?.features?.vision ?? false,\n webSearch: context.extensions?.features?.webSearch ?? false,\n codeInterpreter: context.extensions?.features?.codeInterpreter ?? false,\n multiAgent: context.extensions?.features?.multiAgent ?? false,\n }),\n [context.extensions?.features]\n )\n}\n","/**\n * Chat header component\n * Displays session title and controls\n *\n * Supports customization via:\n * - logoSlot: Custom logo component\n * - actionsSlot: Custom action buttons\n * - Translations for \"New Chat\", \"Archived\", etc.\n */\n\nimport { ReactNode } from 'react'\nimport { Session } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { useBranding } from '../hooks/useBranding'\n\ninterface ChatHeaderProps {\n session: Session | null\n onBack?: () => void\n /** Custom logo component to display */\n logoSlot?: ReactNode\n /** Custom action buttons */\n actionsSlot?: ReactNode\n}\n\nexport function ChatHeader({ session, onBack, logoSlot, actionsSlot }: ChatHeaderProps) {\n const { t } = useTranslation()\n const branding = useBranding()\n\n const BackButton = onBack ? (\n <button\n onClick={onBack}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label={t('chat.goBack')}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n ) : null\n\n const Logo = logoSlot || (branding.logoUrl ? (\n <img src={branding.logoUrl} alt={branding.appName} className=\"h-6 w-auto\" />\n ) : null)\n\n if (!session) {\n return (\n <header className=\"bichat-header border-b border-[var(--bichat-border)] px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {BackButton}\n {Logo}\n <h1 className=\"text-lg font-semibold text-[var(--bichat-text)]\">\n {t('chat.newChat')}\n </h1>\n </div>\n {actionsSlot && <div className=\"flex items-center gap-2\">{actionsSlot}</div>}\n </div>\n </header>\n )\n }\n\n return (\n <header className=\"bichat-header border-b border-[var(--bichat-border)] px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {BackButton}\n {Logo}\n <h1 className=\"text-lg font-semibold text-[var(--bichat-text)]\">{session.title}</h1>\n {session.pinned && (\n <svg\n className=\"w-4 h-4 text-[var(--bichat-primary)]\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n aria-label={t('chat.pinned')}\n >\n <path d=\"M10 2a1 1 0 011 1v1.323l3.954 1.582 1.599-.8a1 1 0 01.894 1.79l-1.233.616 1.738 5.42a1 1 0 01-.285 1.05A3.989 3.989 0 0115 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.715-5.349L11 6.477V16h2a1 1 0 110 2H7a1 1 0 110-2h2V6.477L6.237 7.582l1.715 5.349a1 1 0 01-.285 1.05A3.989 3.989 0 015 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.738-5.42-1.233-.617a1 1 0 01.894-1.788l1.599.799L9 4.323V3a1 1 0 011-1z\" />\n </svg>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {session.status === 'archived' && (\n <span className=\"px-2 py-1 text-xs bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded\">\n {t('chat.archived')}\n </span>\n )}\n {actionsSlot}\n </div>\n </div>\n </header>\n )\n}\n","/**\n * File Utilities\n * Validation, conversion, and formatting for file attachments\n */\n\nconst MAX_FILE_SIZE_BYTES = 20 * 1024 * 1024 // 20MB\nconst ALLOWED_IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/gif']\n\n/**\n * Validates an image file against size and type constraints\n * @throws Error if validation fails\n */\nexport function validateImageFile(file: File, maxSizeBytes: number = MAX_FILE_SIZE_BYTES): void {\n if (!ALLOWED_IMAGE_TYPES.includes(file.type)) {\n throw new Error(`Invalid file type: ${file.type}. Only PNG, JPEG, WebP, and GIF are allowed.`)\n }\n if (file.size > maxSizeBytes) {\n const sizeMB = (file.size / 1024 / 1024).toFixed(1)\n const maxSizeMB = (maxSizeBytes / 1024 / 1024).toFixed(0)\n throw new Error(`File too large: ${sizeMB}MB exceeds ${maxSizeMB}MB limit`)\n }\n}\n\n/**\n * Converts a file to base64 string (without data URL prefix)\n */\nexport async function convertToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = reader.result as string\n // Strip data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1]\n resolve(base64)\n }\n reader.onerror = () => reject(new Error('Failed to read file'))\n reader.readAsDataURL(file)\n })\n}\n\n/**\n * Creates a data URL from base64 string and MIME type\n */\nexport function createDataUrl(base64: string, mimeType: string): string {\n return `data:${mimeType};base64,${base64}`\n}\n\n/**\n * Formats file size in human-readable format\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`\n}\n\n/**\n * Validates multiple files don't exceed count limit\n * @throws Error if count exceeds limit\n */\nexport function validateFileCount(currentCount: number, newCount: number, maxCount: number = 10): void {\n const total = currentCount + newCount\n if (total > maxCount) {\n throw new Error(`Cannot attach more than ${maxCount} files (attempting to add ${total})`)\n }\n}\n","/**\n * AttachmentGrid Component\n * Displays image attachments in a responsive grid\n * Supports both view-only mode and edit mode (with remove buttons)\n */\n\nimport { X } from '@phosphor-icons/react'\nimport { formatFileSize } from '../utils/fileUtils'\nimport type { ImageAttachment } from '../types'\n\ninterface AttachmentGridProps {\n attachments: ImageAttachment[]\n onRemove?: (index: number) => void\n onView?: (index: number) => void\n className?: string\n}\n\nexport default function AttachmentGrid({\n attachments,\n onRemove,\n onView,\n className = ''\n}: AttachmentGridProps) {\n if (attachments.length === 0) return null\n\n const isEditable = !!onRemove\n const isViewable = !!onView\n\n return (\n <div className={`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 ${className}`}>\n {attachments.map((attachment, index) => (\n <div key={index} className=\"relative group\">\n <img\n src={attachment.preview}\n alt={attachment.filename}\n className={`w-full h-24 object-cover rounded-lg border border-gray-200 dark:border-gray-700 ${\n isViewable ? 'cursor-pointer hover:opacity-80 transition-opacity' : ''\n }`}\n onClick={() => isViewable && onView(index)}\n role={isViewable ? 'button' : undefined}\n tabIndex={isViewable ? 0 : undefined}\n onKeyDown={(e) => {\n if (isViewable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n onView(index)\n }\n }}\n />\n\n {isEditable && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove(index)\n }}\n className=\"absolute top-1 right-1 p-1 bg-red-500 hover:bg-red-600 text-white rounded-full opacity-0 group-hover:opacity-100 transition-opacity shadow-md\"\n aria-label={`Remove ${attachment.filename}`}\n >\n <X size={16} weight=\"bold\" />\n </button>\n )}\n\n <div className=\"mt-1 px-1\">\n <div className=\"text-xs text-gray-600 dark:text-gray-400 truncate\" title={attachment.filename}>\n {attachment.filename.length > 20\n ? `${attachment.filename.substring(0, 20)}...`\n : attachment.filename}\n </div>\n <div className=\"text-xs text-gray-500 dark:text-gray-500\">\n {formatFileSize(attachment.sizeBytes)}\n </div>\n </div>\n </div>\n ))}\n </div>\n )\n}\n","/**\n * ImageModal Component\n * Full-screen image viewer with navigation for multiple images\n */\n\nimport { useState, useEffect } from 'react'\nimport { X, CaretLeft, CaretRight } from '@phosphor-icons/react'\nimport type { ImageAttachment } from '../types'\n\ninterface ImageModalProps {\n images: ImageAttachment[]\n initialIndex: number\n onClose: () => void\n}\n\nexport default function ImageModal({ images, initialIndex, onClose }: ImageModalProps) {\n const [currentIndex, setCurrentIndex] = useState(initialIndex)\n\n const handlePrevious = () => {\n setCurrentIndex((prev) => (prev > 0 ? prev - 1 : images.length - 1))\n }\n\n const handleNext = () => {\n setCurrentIndex((prev) => (prev < images.length - 1 ? prev + 1 : 0))\n }\n\n // Keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n } else if (e.key === 'ArrowLeft') {\n handlePrevious()\n } else if (e.key === 'ArrowRight') {\n handleNext()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [onClose])\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = ''\n }\n }, [])\n\n return (\n <div\n className=\"fixed inset-0 z-50 bg-black/90 flex items-center justify-center\"\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Image viewer\"\n >\n {/* Close button */}\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 p-2 text-white hover:bg-white/10 rounded-lg transition-colors\"\n aria-label=\"Close image viewer\"\n >\n <X size={24} weight=\"bold\" />\n </button>\n\n {/* Navigation buttons (only show if multiple images) */}\n {images.length > 1 && (\n <>\n <button\n onClick={(e) => {\n e.stopPropagation()\n handlePrevious()\n }}\n className=\"absolute left-4 p-2 text-white hover:bg-white/10 rounded-lg transition-colors\"\n aria-label=\"Previous image\"\n >\n <CaretLeft size={32} weight=\"bold\" />\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation()\n handleNext()\n }}\n className=\"absolute right-4 p-2 text-white hover:bg-white/10 rounded-lg transition-colors\"\n aria-label=\"Next image\"\n >\n <CaretRight size={32} weight=\"bold\" />\n </button>\n </>\n )}\n\n {/* Image */}\n <img\n src={images[currentIndex].preview}\n alt={images[currentIndex].filename}\n className=\"max-w-[90vw] max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n />\n\n {/* Image counter and filename */}\n <div\n className=\"absolute bottom-4 left-1/2 transform -translate-x-1/2 text-white text-sm bg-black/50 px-4 py-2 rounded-lg backdrop-blur\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"text-center font-medium mb-1\">\n {images[currentIndex].filename}\n </div>\n {images.length > 1 && (\n <div className=\"text-center text-xs opacity-80\">\n {currentIndex + 1} / {images.length}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * UserTurnView Component\n * Displays user messages with attachments, image modal, and actions\n * Clean, professional design\n */\n\nimport { useState } from 'react'\nimport { Copy, PencilSimple } from '@phosphor-icons/react'\nimport { formatDistanceToNow } from 'date-fns'\nimport AttachmentGrid from './AttachmentGrid'\nimport ImageModal from './ImageModal'\nimport { useChat } from '../context/ChatContext'\nimport type { Message, ImageAttachment } from '../types'\n\ninterface UserTurnViewProps {\n message: Message & {\n attachments?: ImageAttachment[]\n }\n}\n\nexport function UserTurnView({ message }: UserTurnViewProps) {\n const { handleEdit, handleCopy } = useChat()\n const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>(null)\n\n const handleCopyClick = async () => {\n if (handleCopy) {\n await handleCopy(message.content)\n } else {\n try {\n await navigator.clipboard.writeText(message.content)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n }\n\n const handleEditClick = () => {\n if (handleEdit) {\n const newContent = prompt('Edit message:', message.content)\n if (newContent && newContent !== message.content) {\n handleEdit(message.id, newContent)\n }\n }\n }\n\n return (\n <div className=\"flex gap-3 justify-end group\">\n <div className=\"flex-1 flex flex-col items-end max-w-[75%]\">\n {/* Attachments */}\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"mb-2 w-full\">\n <AttachmentGrid\n attachments={message.attachments}\n onView={(index) => setSelectedImageIndex(index)}\n />\n </div>\n )}\n\n {/* Message bubble - solid primary color */}\n {message.content && (\n <div className=\"bg-primary-600 text-white rounded-2xl rounded-br-sm px-4 py-3\">\n <div className=\"text-[15px] whitespace-pre-wrap break-words leading-relaxed\">\n {message.content}\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 mt-2 opacity-0 group-hover:opacity-100 transition-opacity duration-150\">\n <span className=\"text-xs text-gray-400 dark:text-gray-500 mr-1\">\n {formatDistanceToNow(new Date(message.createdAt), { addSuffix: true })}\n </span>\n\n <button\n onClick={handleCopyClick}\n className=\"p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition-colors duration-150\"\n aria-label=\"Copy message\"\n title=\"Copy\"\n >\n <Copy size={14} weight=\"regular\" />\n </button>\n\n {handleEdit && (\n <button\n onClick={handleEditClick}\n className=\"p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition-colors duration-150\"\n aria-label=\"Edit message\"\n title=\"Edit\"\n >\n <PencilSimple size={14} weight=\"regular\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Avatar - solid primary color */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-sm\">\n U\n </div>\n\n {/* Image modal */}\n {selectedImageIndex !== null && message.attachments && (\n <ImageModal\n images={message.attachments}\n initialIndex={selectedImageIndex}\n onClose={() => setSelectedImageIndex(null)}\n />\n )}\n </div>\n )\n}\n","/**\n * CodeOutputsPanel Component\n * Displays code interpreter outputs (images, text, errors)\n */\n\nimport type { CodeOutput, ImageAttachment } from '../types'\n\ninterface CodeOutputsPanelProps {\n outputs: CodeOutput[]\n}\n\nexport default function CodeOutputsPanel({ outputs }: CodeOutputsPanelProps) {\n if (!outputs || outputs.length === 0) return null\n\n return (\n <div className=\"mb-2 p-3 bg-gray-50 dark:bg-gray-900/50 rounded-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 mb-2\">\n Code Output\n </div>\n <div className=\"space-y-2\">\n {outputs.map((output, index) => (\n <div key={index}>\n {output.type === 'image' && (\n <img\n src={(output.content as ImageAttachment).preview}\n alt=\"Code output\"\n className=\"max-w-full rounded border border-gray-300 dark:border-gray-600\"\n />\n )}\n {output.type === 'text' && (\n <pre className=\"text-xs bg-white dark:bg-gray-800 p-2 rounded overflow-x-auto border border-gray-200 dark:border-gray-700\">\n <code className=\"text-gray-900 dark:text-gray-100\">\n {output.content as string}\n </code>\n </pre>\n )}\n {output.type === 'error' && (\n <div className=\"text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 p-2 rounded border border-red-200 dark:border-red-800\">\n {output.content as string}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * StreamingCursor Component\n * Animated cursor shown during AI response streaming\n */\n\n\nexport default function StreamingCursor() {\n return (\n <span\n className=\"inline-block w-1.5 h-4 ml-0.5 bg-primary-600 dark:bg-primary-500 animate-pulse\"\n aria-label=\"AI is typing\"\n />\n )\n}\n","/**\n * ChartCard component\n * Renders charts using recharts\n */\n\nimport {\n BarChart,\n Bar,\n LineChart,\n Line,\n PieChart,\n Pie,\n AreaChart,\n Area,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n Legend,\n ResponsiveContainer,\n Cell,\n} from 'recharts'\nimport { ChartData } from '../types'\n\ninterface ChartCardProps {\n chartData: ChartData\n}\n\nconst COLORS = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899']\n\nexport function ChartCard({ chartData }: ChartCardProps) {\n const { type, title, data, xAxisKey = 'name', yAxisKey = 'value' } = chartData\n\n const renderChart = () => {\n switch (type) {\n case 'bar':\n return (\n <BarChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey={xAxisKey} />\n <YAxis />\n <Tooltip />\n <Legend />\n <Bar dataKey={yAxisKey} fill=\"#3b82f6\" />\n </BarChart>\n )\n case 'line':\n return (\n <LineChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey={xAxisKey} />\n <YAxis />\n <Tooltip />\n <Legend />\n <Line type=\"monotone\" dataKey={yAxisKey} stroke=\"#3b82f6\" />\n </LineChart>\n )\n case 'pie':\n return (\n <PieChart>\n <Pie\n data={data}\n dataKey={yAxisKey}\n nameKey={xAxisKey}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius={80}\n label\n >\n {data.map((_entry, index) => (\n <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />\n ))}\n </Pie>\n <Tooltip />\n <Legend />\n </PieChart>\n )\n case 'area':\n return (\n <AreaChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey={xAxisKey} />\n <YAxis />\n <Tooltip />\n <Legend />\n <Area type=\"monotone\" dataKey={yAxisKey} stroke=\"#3b82f6\" fill=\"#3b82f6\" />\n </AreaChart>\n )\n default:\n return <div>Unsupported chart type</div>\n }\n }\n\n return (\n <div className=\"border border-[var(--bichat-border)] rounded-lg p-4 bg-white\">\n {title && <h3 className=\"text-lg font-semibold mb-4\">{title}</h3>}\n <ResponsiveContainer width=\"100%\" height={300}>\n {renderChart()}\n </ResponsiveContainer>\n </div>\n )\n}\n","/**\n * SourcesPanel component\n * Displays citations and sources\n */\n\nimport { useState } from 'react'\nimport { Citation } from '../types'\n\ninterface SourcesPanelProps {\n citations: Citation[]\n}\n\nexport function SourcesPanel({ citations }: SourcesPanelProps) {\n const [expanded, setExpanded] = useState(false)\n\n if (!citations || citations.length === 0) {\n return null\n }\n\n return (\n <div className=\"mt-4 border-t border-[var(--bichat-border)] pt-3\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 text-sm text-gray-600 hover:text-gray-800 transition-colors\"\n aria-expanded={expanded}\n >\n <svg\n className={`w-4 h-4 transition-transform ${expanded ? 'rotate-90' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n <span>{citations.length} {citations.length === 1 ? 'source' : 'sources'}</span>\n </button>\n {expanded && (\n <div className=\"mt-2 space-y-2\">\n {citations.map((citation, index) => (\n <div\n key={citation.id}\n className=\"p-3 bg-gray-50 rounded-lg text-sm\"\n >\n <div className=\"flex items-start gap-2\">\n <span className=\"flex-shrink-0 w-5 h-5 bg-[var(--bichat-primary)] text-white rounded-full flex items-center justify-center text-xs\">\n {index + 1}\n </span>\n <div className=\"flex-1\">\n <div className=\"font-medium text-gray-900\">{citation.source}</div>\n {citation.url && (\n <a\n href={citation.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[var(--bichat-primary)] hover:underline\"\n >\n {citation.url}\n </a>\n )}\n {citation.excerpt && (\n <div className=\"mt-1 text-gray-600 italic\">\"{citation.excerpt}\"</div>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","/**\n * DownloadCard component\n * Displays downloadable artifacts (Excel, PDF)\n */\n\nimport { Artifact } from '../types'\n\ninterface DownloadCardProps {\n artifact: Artifact\n}\n\nexport function DownloadCard({ artifact }: DownloadCardProps) {\n const { type, filename, url, sizeReadable, rowCount, description } = artifact\n\n const icon =\n type === 'excel' ? (\n <svg className=\"w-8 h-8 text-green-600\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M9 2a2 2 0 00-2 2v8a2 2 0 002 2h6a2 2 0 002-2V6.414A2 2 0 0016.414 5L14 2.586A2 2 0 0012.586 2H9z\" />\n <path d=\"M3 8a2 2 0 012-2v10h8a2 2 0 01-2 2H5a2 2 0 01-2-2V8z\" />\n </svg>\n ) : (\n <svg className=\"w-8 h-8 text-red-600\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n\n return (\n <a\n href={url}\n download={filename}\n className=\"flex items-center gap-3 p-4 border border-[var(--bichat-border)] rounded-lg hover:bg-gray-50 transition-colors\"\n >\n <div>{icon}</div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-gray-900 truncate\">{filename}</div>\n <div className=\"flex items-center gap-2 text-sm text-gray-600\">\n {sizeReadable && <span>{sizeReadable}</span>}\n {rowCount !== undefined && (\n <>\n <span>•</span>\n <span>{rowCount} rows</span>\n </>\n )}\n </div>\n {description && <div className=\"text-sm text-gray-600 mt-1\">{description}</div>}\n </div>\n <svg\n className=\"w-5 h-5 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n </a>\n )\n}\n","/**\n * InlineQuestionForm component\n * Handles HITL (Human-in-the-Loop) questions from the AI agent\n */\n\nimport { useState } from 'react'\nimport { PendingQuestion, QuestionAnswers } from '../types'\nimport { useChat } from '../context/ChatContext'\n\ninterface InlineQuestionFormProps {\n pendingQuestion: PendingQuestion\n}\n\nexport function InlineQuestionForm({ pendingQuestion }: InlineQuestionFormProps) {\n const { handleSubmitQuestionAnswers, handleCancelPendingQuestion } = useChat()\n const [answers, setAnswers] = useState<QuestionAnswers>({})\n const [textInput, setTextInput] = useState('')\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n\n if (pendingQuestion.type === 'MULTIPLE_CHOICE' && !answers.choice) {\n return\n }\n\n if (pendingQuestion.type === 'FREE_TEXT' && !textInput.trim()) {\n return\n }\n\n const finalAnswers =\n pendingQuestion.type === 'MULTIPLE_CHOICE'\n ? answers\n : { answer: textInput }\n\n handleSubmitQuestionAnswers(finalAnswers)\n }\n\n return (\n <div className=\"border border-[var(--bichat-border)] rounded-lg p-4 bg-yellow-50\">\n <form onSubmit={handleSubmit}>\n <div className=\"flex items-start gap-2 mb-4\">\n <svg\n className=\"w-5 h-5 text-yellow-600 flex-shrink-0 mt-0.5\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <div className=\"flex-1\">\n <h4 className=\"font-medium text-gray-900 mb-2\">\n Question from AI\n </h4>\n <p className=\"text-gray-700\">{pendingQuestion.question}</p>\n </div>\n </div>\n\n {pendingQuestion.type === 'MULTIPLE_CHOICE' && pendingQuestion.options && (\n <div className=\"space-y-2 mb-4\">\n {pendingQuestion.options.map((option, index) => (\n <label\n key={index}\n className=\"flex items-center gap-2 p-2 hover:bg-yellow-100 rounded cursor-pointer\"\n >\n <input\n type=\"radio\"\n name=\"choice\"\n value={option}\n checked={answers.choice === option}\n onChange={(e) =>\n setAnswers({ ...answers, choice: e.target.value })\n }\n className=\"w-4 h-4 text-[var(--bichat-primary)]\"\n />\n <span className=\"text-gray-900\">{option}</span>\n </label>\n ))}\n </div>\n )}\n\n {pendingQuestion.type === 'FREE_TEXT' && (\n <div className=\"mb-4\">\n <textarea\n value={textInput}\n onChange={(e) => setTextInput(e.target.value)}\n placeholder=\"Type your answer...\"\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[var(--bichat-primary)] focus:border-transparent resize-none\"\n rows={3}\n />\n </div>\n )}\n\n <div className=\"flex gap-2\">\n <button\n type=\"submit\"\n className=\"px-4 py-2 bg-[var(--bichat-primary)] text-white rounded-lg hover:opacity-90 transition-opacity\"\n >\n Submit Answer\n </button>\n <button\n type=\"button\"\n onClick={handleCancelPendingQuestion}\n className=\"px-4 py-2 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </form>\n </div>\n )\n}\n","/**\n * AssistantTurnView Component\n * Displays assistant messages with markdown, charts, sources, downloads, code outputs, and streaming cursor\n * Clean, professional design\n */\n\nimport { useState, lazy, Suspense } from 'react'\nimport { Copy, ArrowsClockwise } from '@phosphor-icons/react'\nimport { formatDistanceToNow } from 'date-fns'\nimport CodeOutputsPanel from './CodeOutputsPanel'\nimport StreamingCursor from './StreamingCursor'\nimport { ChartCard } from './ChartCard'\nimport { SourcesPanel } from './SourcesPanel'\nimport { DownloadCard } from './DownloadCard'\nimport { InlineQuestionForm } from './InlineQuestionForm'\nimport { useChat } from '../context/ChatContext'\nimport type { Message, CodeOutput } from '../types'\n\nconst MarkdownRenderer = lazy(() =>\n import('./MarkdownRenderer').then((module) => ({ default: module.MarkdownRenderer }))\n)\n\ninterface AssistantTurnViewProps {\n message: Message & {\n codeOutputs?: CodeOutput[]\n isStreaming?: boolean\n }\n}\n\nexport function AssistantTurnView({ message }: AssistantTurnViewProps) {\n const { handleCopy, handleRegenerate, pendingQuestion } = useChat()\n const [explanationExpanded, setExplanationExpanded] = useState(false)\n\n const hasContent = message.content?.trim().length > 0\n const hasExplanation = !!message.explanation?.trim()\n const hasPendingQuestion =\n !!pendingQuestion &&\n pendingQuestion.status === 'PENDING' &&\n pendingQuestion.turnId === message.id\n\n const handleCopyClick = async () => {\n if (handleCopy) {\n await handleCopy(message.content)\n } else {\n try {\n await navigator.clipboard.writeText(message.content)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n }\n\n const handleRegenerateClick = async () => {\n if (handleRegenerate) {\n await handleRegenerate(message.id)\n }\n }\n\n return (\n <div className=\"flex gap-3 group\">\n {/* Avatar - solid primary color */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-xs\">\n AI\n </div>\n\n <div className=\"flex-1 flex flex-col gap-3 max-w-[85%]\">\n {/* Code outputs */}\n {message.codeOutputs && message.codeOutputs.length > 0 && (\n <CodeOutputsPanel outputs={message.codeOutputs} />\n )}\n\n {/* Chart visualization */}\n {message.chartData && (\n <div className=\"mb-1 w-full\">\n <ChartCard chartData={message.chartData} />\n </div>\n )}\n\n {/* Artifact cards */}\n {message.artifacts && message.artifacts.length > 0 && (\n <div className=\"mb-1 flex flex-wrap gap-2\">\n {message.artifacts.map((artifact, index) => (\n <DownloadCard key={`${artifact.filename}-${index}`} artifact={artifact} />\n ))}\n </div>\n )}\n\n {/* Message bubble - clean card style */}\n {hasContent && (\n <div className=\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-2xl rounded-bl-sm px-4 py-3\">\n <Suspense\n fallback={\n <div className=\"flex items-center gap-2 text-sm text-gray-400 dark:text-gray-500\">\n <div className=\"w-4 h-4 border-2 border-gray-300 dark:border-gray-600 border-t-transparent rounded-full animate-spin\" />\n Loading...\n </div>\n }\n >\n <MarkdownRenderer content={message.content} citations={message.citations} />\n </Suspense>\n\n {/* Streaming cursor */}\n {message.isStreaming && <StreamingCursor />}\n\n {/* Sources panel */}\n {message.citations && message.citations.length > 0 && (\n <SourcesPanel citations={message.citations} />\n )}\n\n {/* Explanation section */}\n {hasExplanation && (\n <div className=\"mt-4 border-t border-gray-100 dark:border-gray-700 pt-4\">\n <button\n type=\"button\"\n onClick={() => setExplanationExpanded(!explanationExpanded)}\n className=\"flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition-colors\"\n aria-expanded={explanationExpanded}\n >\n <svg\n className={`w-4 h-4 transition-transform duration-150 ${explanationExpanded ? 'rotate-90' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n <span className=\"font-medium\">How I arrived at this</span>\n </button>\n {explanationExpanded && (\n <div className=\"pt-3 text-sm text-gray-600 dark:text-gray-400\">\n <Suspense fallback={<div>Loading...</div>}>\n <MarkdownRenderer content={message.explanation!} />\n </Suspense>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Inline Question Form */}\n {hasPendingQuestion && <InlineQuestionForm pendingQuestion={pendingQuestion} />}\n\n {/* Actions */}\n {hasContent && (\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity duration-150\">\n <span className=\"text-xs text-gray-400 dark:text-gray-500 mr-1\">\n {formatDistanceToNow(new Date(message.createdAt), { addSuffix: true })}\n </span>\n\n <button\n onClick={handleCopyClick}\n className=\"p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition-colors duration-150\"\n aria-label=\"Copy message\"\n title=\"Copy\"\n >\n <Copy size={14} weight=\"regular\" />\n </button>\n\n {handleRegenerate && (\n <button\n onClick={handleRegenerateClick}\n className=\"p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition-colors duration-150\"\n aria-label=\"Regenerate message\"\n title=\"Regenerate\"\n >\n <ArrowsClockwise size={14} weight=\"regular\" />\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * TurnBubble component\n * Container for individual messages with role-based styling\n */\n\nimport { ReactNode } from 'react'\nimport { Message, MessageRole } from '../types'\nimport { UserTurnView } from './UserTurnView'\nimport { AssistantTurnView } from './AssistantTurnView'\n\ninterface TurnBubbleProps {\n message: Message\n renderUserMessage?: (message: Message) => ReactNode\n renderAssistantMessage?: (message: Message) => ReactNode\n}\n\nexport function TurnBubble({\n message,\n renderUserMessage,\n renderAssistantMessage,\n}: TurnBubbleProps) {\n if (message.role === MessageRole.User) {\n if (renderUserMessage) {\n return <>{renderUserMessage(message)}</>\n }\n return <UserTurnView message={message} />\n }\n\n if (message.role === MessageRole.Assistant) {\n if (renderAssistantMessage) {\n return <>{renderAssistantMessage(message)}</>\n }\n return <AssistantTurnView message={message} />\n }\n\n // System and Tool messages are hidden by default\n return null\n}\n","/**\n * ScrollToBottomButton Component\n * Floating button to scroll chat to bottom, shown when user scrolls up\n */\n\nimport { ArrowDown } from '@phosphor-icons/react'\nimport { motion, AnimatePresence } from 'framer-motion'\n\ninterface ScrollToBottomButtonProps {\n show: boolean\n onClick: () => void\n unreadCount?: number\n}\n\nexport default function ScrollToBottomButton({\n show,\n onClick,\n unreadCount = 0\n}: ScrollToBottomButtonProps) {\n return (\n <AnimatePresence>\n {show && (\n <motion.button\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.2 }}\n onClick={onClick}\n className=\"absolute bottom-24 right-8 p-3 bg-white dark:bg-gray-800 rounded-full shadow-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors z-10\"\n aria-label=\"Scroll to bottom\"\n >\n <div className=\"relative\">\n <ArrowDown size={20} weight=\"bold\" className=\"text-gray-700 dark:text-gray-300\" />\n\n {/* Unread count badge */}\n {unreadCount > 0 && (\n <span className=\"absolute -top-2 -right-2 min-w-[18px] h-[18px] bg-primary-600 dark:bg-primary-500 text-white text-xs font-semibold rounded-full flex items-center justify-center px-1\">\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </div>\n </motion.button>\n )}\n </AnimatePresence>\n )\n}\n","/**\n * MessageList component\n * Displays messages with auto-scroll and grouping\n */\n\nimport { useEffect, useRef, ReactNode, useState } from 'react'\nimport { useChat } from '../context/ChatContext'\nimport { Message } from '../types'\nimport { TurnBubble } from './TurnBubble'\nimport ScrollToBottomButton from './ScrollToBottomButton'\n\ninterface MessageListProps {\n renderUserMessage?: (message: Message) => ReactNode\n renderAssistantMessage?: (message: Message) => ReactNode\n}\n\nexport function MessageList({ renderUserMessage, renderAssistantMessage }: MessageListProps) {\n const { messages, streamingContent, isStreaming } = useChat()\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const [showScrollButton, setShowScrollButton] = useState(false)\n\n // Auto-scroll to bottom on new messages\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [messages.length, streamingContent])\n\n // Scroll detection for ScrollToBottomButton\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = container\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100\n setShowScrollButton(!isNearBottom)\n }\n\n container.addEventListener('scroll', handleScroll)\n return () => container.removeEventListener('scroll', handleScroll)\n }, [])\n\n const scrollToBottom = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }\n\n return (\n <div className=\"relative flex-1 min-h-0\">\n <div ref={containerRef} className=\"h-full overflow-y-auto px-4 py-6\">\n <div className=\"max-w-4xl mx-auto space-y-6\">\n {messages.map((message) => (\n <TurnBubble\n key={message.id}\n message={message}\n renderUserMessage={renderUserMessage}\n renderAssistantMessage={renderAssistantMessage}\n />\n ))}\n {isStreaming && streamingContent && (\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white\">\n AI\n </div>\n <div className=\"flex-1 max-w-[80%] rounded-2xl px-4 py-3 bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 shadow-sm\">\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n {streamingContent}\n <span className=\"inline-block w-2 h-4 ml-1 bg-primary-600 animate-pulse\" />\n </div>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n </div>\n <ScrollToBottomButton show={showScrollButton} onClick={scrollToBottom} />\n </div>\n )\n}\n","/**\n * MessageInput Component\n * Advanced input with file upload, drag-drop, keyboard shortcuts, and message queuing\n * Clean, professional design\n */\n\nimport { useState, useRef, useEffect, forwardRef, useImperativeHandle } from 'react'\nimport { Paperclip, PaperPlaneRight, X } from '@phosphor-icons/react'\nimport AttachmentGrid from './AttachmentGrid'\nimport { validateImageFile, validateFileCount, convertToBase64, createDataUrl } from '../utils/fileUtils'\nimport type { ImageAttachment, QueuedMessage } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\n\nexport interface MessageInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport interface MessageInputProps {\n message: string\n loading: boolean\n fetching?: boolean\n disabled?: boolean\n messageQueue?: QueuedMessage[]\n onMessageChange: (value: string) => void\n onSubmit: (e: React.FormEvent, attachments: ImageAttachment[]) => void\n onUnqueue?: () => { content: string; attachments: ImageAttachment[] } | null\n placeholder?: string\n maxFiles?: number\n maxFileSize?: number\n containerClassName?: string\n}\n\nconst MAX_FILES_DEFAULT = 10\nconst MAX_FILE_SIZE_DEFAULT = 20 * 1024 * 1024 // 20MB\nconst MAX_HEIGHT = 192 // 12 lines approx\n\nexport const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(\n (\n {\n message,\n loading,\n fetching = false,\n disabled = false,\n messageQueue = [],\n onMessageChange,\n onSubmit,\n onUnqueue,\n placeholder: placeholderOverride,\n maxFiles = MAX_FILES_DEFAULT,\n maxFileSize = MAX_FILE_SIZE_DEFAULT,\n containerClassName,\n },\n ref\n ) => {\n const { t } = useTranslation()\n const [attachments, setAttachments] = useState<ImageAttachment[]>([])\n const [isDragging, setIsDragging] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [isFocused, setIsFocused] = useState(false)\n\n // Use override or translation\n const placeholder = placeholderOverride || t('input.placeholder')\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useImperativeHandle(ref, () => ({\n focus: () => textareaRef.current?.focus(),\n clear: () => {\n onMessageChange('')\n setAttachments([])\n setError(null)\n }\n }))\n\n useEffect(() => {\n const textarea = textareaRef.current\n if (!textarea) return\n\n textarea.style.height = 'auto'\n const newHeight = Math.min(textarea.scrollHeight, MAX_HEIGHT)\n textarea.style.height = `${newHeight}px`\n }, [message])\n\n useEffect(() => {\n if (!error) return\n const timer = setTimeout(() => setError(null), 5000)\n return () => clearTimeout(timer)\n }, [error])\n\n const handleFileSelect = async (files: FileList | null) => {\n if (!files || files.length === 0) return\n\n try {\n validateFileCount(attachments.length, files.length, maxFiles)\n\n const newAttachments: ImageAttachment[] = []\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i]\n validateImageFile(file, maxFileSize)\n const base64Data = await convertToBase64(file)\n const preview = createDataUrl(base64Data, file.type)\n\n newAttachments.push({\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n base64Data,\n preview\n })\n }\n\n setAttachments((prev) => [...prev, ...newAttachments])\n setError(null)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to process files')\n }\n }\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFileSelect(e.target.files)\n e.target.value = ''\n }\n\n const handleRemoveAttachment = (index: number) => {\n setAttachments((prev) => prev.filter((_, i) => i !== index))\n setError(null)\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(true)\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n }\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n await handleFileSelect(e.dataTransfer.files)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (!loading && (message.trim() || attachments.length > 0)) {\n handleFormSubmit(e as unknown as React.FormEvent)\n }\n }\n\n if (e.key === 'Escape') {\n onMessageChange('')\n setAttachments([])\n setError(null)\n }\n\n if (e.key === 'ArrowUp' && !message.trim() && onUnqueue) {\n const unqueued = onUnqueue()\n if (unqueued) {\n onMessageChange(unqueued.content)\n setAttachments(unqueued.attachments)\n }\n }\n }\n\n const handleFormSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (loading || disabled || (!message.trim() && attachments.length === 0)) {\n return\n }\n\n onSubmit(e, attachments)\n setAttachments([])\n setError(null)\n }\n\n const canSubmit = !loading && !disabled && (message.trim() || attachments.length > 0)\n const defaultContainerClassName = \"shrink-0 p-4 pb-6\"\n\n return (\n <div\n ref={containerRef}\n className={containerClassName ?? defaultContainerClassName}\n >\n <form onSubmit={handleFormSubmit} className=\"max-w-4xl mx-auto\">\n {/* Error display */}\n {error && (\n <div className=\"mb-3 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg text-sm text-red-600 dark:text-red-400 flex items-center justify-between\">\n <span>{error}</span>\n <button\n type=\"button\"\n onClick={() => setError(null)}\n className=\"ml-2 p-1 hover:bg-red-100 dark:hover:bg-red-800 rounded transition-colors\"\n aria-label={t('input.dismissError')}\n >\n <X size={14} />\n </button>\n </div>\n )}\n\n {/* Queue badge */}\n {messageQueue.length > 0 && (\n <div className=\"mb-3 text-xs text-gray-500 dark:text-gray-400\">\n <span className=\"px-2.5 py-1 bg-primary-50 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400 rounded font-medium\">\n {t('input.messagesQueued', { count: messageQueue.length })}\n </span>\n </div>\n )}\n\n {/* Attachment preview */}\n {attachments.length > 0 && (\n <div className=\"mb-3\">\n <AttachmentGrid attachments={attachments} onRemove={handleRemoveAttachment} />\n </div>\n )}\n\n {/* Input container with drag-drop */}\n <div\n className=\"relative\"\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* Drag overlay */}\n {isDragging && (\n <div className=\"absolute inset-0 z-10 bg-primary-50/95 dark:bg-primary-900/90 border-2 border-dashed border-primary-400 rounded-2xl flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-800 flex items-center justify-center\">\n <Paperclip size={20} className=\"text-primary-600 dark:text-primary-400\" />\n </div>\n <span className=\"text-sm text-primary-700 dark:text-primary-300 font-medium\">\n {t('input.dropImages')}\n </span>\n </div>\n </div>\n )}\n\n {/* Input container - using inline Tailwind classes */}\n <div\n className={`flex items-center gap-2 rounded-2xl p-2.5 bg-white dark:bg-gray-800 border shadow-sm transition-all duration-150 ${\n isFocused\n ? 'border-primary-400 dark:border-primary-500 ring-3 ring-primary-500/10 dark:ring-primary-500/15'\n : 'border-gray-200 dark:border-gray-700'\n }`}\n >\n {/* Attach button */}\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={loading || disabled || attachments.length >= maxFiles}\n className=\"flex-shrink-0 self-center p-2 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n aria-label={t('input.attachFiles')}\n title={t('input.attachImages')}\n >\n <Paperclip size={18} />\n </button>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,image/gif\"\n multiple\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-label=\"File input\"\n />\n\n {/* Textarea */}\n <div className=\"flex-1 self-stretch flex items-center\">\n <textarea\n ref={textareaRef}\n value={message}\n onChange={(e) => onMessageChange(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder={placeholder}\n className=\"resize-none bg-transparent border-none outline-none px-1 py-2 w-full text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 text-[15px] leading-relaxed\"\n style={{ maxHeight: `${MAX_HEIGHT}px` }}\n rows={1}\n disabled={loading || disabled}\n aria-label=\"Message input\"\n />\n </div>\n\n {/* Send button - using inline Tailwind classes */}\n <button\n type=\"submit\"\n disabled={!canSubmit}\n className=\"flex-shrink-0 self-center p-2 rounded-lg bg-primary-600 hover:bg-primary-700 active:bg-primary-800 text-white shadow-sm transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-primary-600\"\n aria-label={t('input.sendMessage')}\n >\n {loading ? (\n <div className=\"w-[18px] h-[18px] border-2 border-white/60 border-t-transparent rounded-full animate-spin\" />\n ) : (\n <PaperPlaneRight size={18} weight=\"fill\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Loading indicator */}\n {(loading || fetching) && (\n <div className=\"mt-3 flex items-center justify-center gap-2\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-1.5 h-1.5 bg-gray-400 dark:bg-gray-500 rounded-full animate-pulse\" />\n <div className=\"w-1.5 h-1.5 bg-gray-400 dark:bg-gray-500 rounded-full animate-pulse\" style={{ animationDelay: '0.15s' }} />\n <div className=\"w-1.5 h-1.5 bg-gray-400 dark:bg-gray-500 rounded-full animate-pulse\" style={{ animationDelay: '0.3s' }} />\n </div>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {loading ? t('input.aiThinking') : t('input.processing')}\n </span>\n </div>\n )}\n </form>\n </div>\n )\n }\n)\n\nMessageInput.displayName = 'MessageInput'\n","/**\n * WelcomeContent Component\n * Landing page shown when starting a new chat session\n * Clean, professional design for enterprise BI applications\n */\n\nimport { motion } from 'framer-motion'\nimport { ChartBar, FileText, Lightbulb, type Icon } from '@phosphor-icons/react'\n\ninterface ExamplePrompt {\n category: string\n icon: Icon\n text: string\n}\n\ninterface WelcomeContentProps {\n onPromptSelect?: (prompt: string) => void\n title?: string\n description?: string\n disabled?: boolean\n}\n\nconst EXAMPLE_PROMPTS: ExamplePrompt[] = [\n {\n category: 'Data Analysis',\n icon: ChartBar,\n text: 'Show me sales trends for the last quarter',\n },\n {\n category: 'Reports',\n icon: FileText,\n text: 'Generate a summary of customer feedback',\n },\n {\n category: 'Insights',\n icon: Lightbulb,\n text: 'What are the top performing products?',\n }\n]\n\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.08,\n delayChildren: 0.05\n }\n }\n}\n\nconst itemVariants = {\n hidden: { opacity: 0, y: 12 },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0.3,\n ease: [0.4, 0, 0.2, 1]\n }\n }\n}\n\nexport default function WelcomeContent({\n onPromptSelect,\n title = 'Welcome to BiChat',\n description = 'Your intelligent business analytics assistant. Ask questions about your data, generate reports, or explore insights.',\n disabled = false\n}: WelcomeContentProps) {\n const handlePromptClick = (prompt: string) => {\n if (onPromptSelect && !disabled) {\n onPromptSelect(prompt)\n }\n }\n\n return (\n <motion.div\n className=\"w-full max-w-3xl mx-auto px-6 py-12 text-center\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n {/* Title */}\n <motion.h1\n className=\"text-3xl sm:text-4xl font-semibold text-gray-900 dark:text-white mb-4\"\n variants={itemVariants}\n >\n {title}\n </motion.h1>\n\n {/* Description */}\n <motion.p\n className=\"text-base text-gray-500 dark:text-gray-400 mb-12 max-w-xl mx-auto leading-relaxed\"\n variants={itemVariants}\n >\n {description}\n </motion.p>\n\n {/* Example prompts */}\n <motion.div variants={itemVariants}>\n <p className=\"text-xs font-medium text-gray-400 dark:text-gray-500 uppercase tracking-wide mb-4\">\n Try asking\n </p>\n\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {EXAMPLE_PROMPTS.map((prompt, index) => (\n <motion.button\n key={index}\n onClick={() => handlePromptClick(prompt.text)}\n disabled={disabled}\n className=\"group flex flex-col items-start text-left p-5 rounded-xl bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 shadow-sm hover:shadow-md hover:border-gray-300 dark:hover:border-gray-600 transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-primary-500/50 focus:ring-offset-2 dark:focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed\"\n variants={itemVariants}\n whileHover={disabled ? {} : { y: -2 }}\n whileTap={disabled ? {} : { scale: 0.98 }}\n >\n {/* Icon */}\n <div className=\"w-9 h-9 rounded-lg bg-gray-100 dark:bg-gray-700 flex items-center justify-center mb-3\">\n <prompt.icon\n size={18}\n weight=\"regular\"\n className=\"text-gray-600 dark:text-gray-300\"\n />\n </div>\n\n {/* Category */}\n <span className=\"text-xs font-medium text-gray-400 dark:text-gray-500 mb-1.5\">\n {prompt.category}\n </span>\n\n {/* Prompt text */}\n <p className=\"text-sm text-gray-700 dark:text-gray-200 leading-relaxed\">\n {prompt.text}\n </p>\n </motion.button>\n ))}\n </div>\n </motion.div>\n </motion.div>\n )\n}\n","/**\n * Main ChatSession component\n * Composes ChatHeader, MessageList, and MessageInput\n *\n * Supports customization via slots:\n * - headerSlot: Custom content above the message list\n * - welcomeSlot: Replace the default welcome screen for new chats\n * - logoSlot: Custom logo in the header\n * - actionsSlot: Custom action buttons in the header\n */\n\nimport { ReactNode } from 'react'\nimport { ChatSessionProvider, useChat } from '../context/ChatContext'\nimport { ChatDataSource, Message } from '../types'\nimport { ChatHeader } from './ChatHeader'\nimport { MessageList } from './MessageList'\nimport { MessageInput } from './MessageInput'\nimport WelcomeContent from './WelcomeContent'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface ChatSessionProps {\n dataSource: ChatDataSource\n sessionId?: string\n isReadOnly?: boolean\n renderUserMessage?: (message: Message) => ReactNode\n renderAssistantMessage?: (message: Message) => ReactNode\n className?: string\n /** Custom content to display as header */\n headerSlot?: ReactNode\n /** Custom welcome screen component (replaces default WelcomeContent) */\n welcomeSlot?: ReactNode\n /** Custom logo for the header */\n logoSlot?: ReactNode\n /** Custom action buttons for the header */\n actionsSlot?: ReactNode\n /** Callback when user navigates back */\n onBack?: () => void\n}\n\nfunction ChatSessionCore({\n isReadOnly,\n renderUserMessage,\n renderAssistantMessage,\n className = '',\n headerSlot,\n welcomeSlot,\n logoSlot,\n actionsSlot,\n onBack,\n}: Omit<ChatSessionProps, 'dataSource' | 'sessionId'>) {\n const { t } = useTranslation()\n const {\n session,\n messages,\n fetching,\n error,\n message,\n setMessage,\n loading,\n handleSubmit,\n messageQueue,\n handleUnqueue,\n } = useChat()\n\n if (fetching) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-gray-500 dark:text-gray-400\">{t('input.processing')}</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-red-500 dark:text-red-400\">{t('error.generic')}: {error}</div>\n </div>\n )\n }\n\n // Show welcome screen for new sessions with no messages\n const showWelcome = !session && messages.length === 0\n\n const handlePromptSelect = (prompt: string) => {\n setMessage(prompt)\n }\n\n return (\n <main\n className={`flex-1 flex flex-col overflow-hidden min-h-0 bg-gray-50 dark:bg-gray-900 ${className}`}\n >\n {/* Header slot or default header */}\n {headerSlot || (\n <ChatHeader session={session} onBack={onBack} logoSlot={logoSlot} actionsSlot={actionsSlot} />\n )}\n\n {/* Welcome screen or message list */}\n {showWelcome ? (\n <div className=\"flex-1 flex items-center justify-center overflow-auto\">\n {welcomeSlot || <WelcomeContent onPromptSelect={handlePromptSelect} disabled={loading} />}\n </div>\n ) : (\n <MessageList\n renderUserMessage={renderUserMessage}\n renderAssistantMessage={renderAssistantMessage}\n />\n )}\n\n {/* Input area */}\n {!isReadOnly && (\n <MessageInput\n message={message}\n loading={loading}\n fetching={fetching}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n messageQueue={messageQueue}\n onUnqueue={handleUnqueue}\n />\n )}\n </main>\n )\n}\n\nexport function ChatSession(props: ChatSessionProps) {\n const { dataSource, sessionId, ...coreProps } = props\n\n return (\n <ChatSessionProvider dataSource={dataSource} sessionId={sessionId}>\n <ChatSessionCore {...coreProps} />\n </ChatSessionProvider>\n )\n}\n\nexport type { ChatSessionProps }\n","/**\n * BI-Chat UI Components\n * Main export file\n */\n\n// Import styles (will be bundled as style.css)\nimport './styles.css'\n\n// Components\nexport { ChatSession } from './components/ChatSession'\nexport { ChatHeader } from './components/ChatHeader'\nexport { MessageList } from './components/MessageList'\nexport { TurnBubble } from './components/TurnBubble'\nexport { UserTurnView } from './components/UserTurnView'\nexport { AssistantTurnView } from './components/AssistantTurnView'\nexport { MarkdownRenderer } from './components/MarkdownRenderer'\nexport { ChartCard } from './components/ChartCard'\nexport { SourcesPanel } from './components/SourcesPanel'\nexport { DownloadCard } from './components/DownloadCard'\nexport { InlineQuestionForm } from './components/InlineQuestionForm'\nexport { MessageInput, type MessageInputRef, type MessageInputProps } from './components/MessageInput'\nexport { default as AttachmentGrid } from './components/AttachmentGrid'\nexport { default as ImageModal } from './components/ImageModal'\nexport { default as WelcomeContent } from './components/WelcomeContent'\nexport { default as CodeOutputsPanel } from './components/CodeOutputsPanel'\nexport { default as StreamingCursor } from './components/StreamingCursor'\nexport { default as ScrollToBottomButton } from './components/ScrollToBottomButton'\nexport { default as EmptyState, type EmptyStateProps } from './components/EmptyState'\nexport { default as EditableText, type EditableTextProps, type EditableTextRef } from './components/EditableText'\nexport { default as SearchInput, type SearchInputProps } from './components/SearchInput'\nexport {\n default as Skeleton,\n SkeletonGroup,\n SkeletonText,\n SkeletonAvatar,\n SkeletonCard,\n ListItemSkeleton,\n type SkeletonProps,\n type SkeletonGroupProps,\n} from './components/Skeleton'\n\n// Animations\nexport * from './animations'\n\n// Context\nexport { ChatSessionProvider, useChat } from './context/ChatContext'\nexport { IotaContextProvider, useIotaContext, hasPermission } from './context/IotaContext'\nexport {\n ConfigProvider,\n useConfig,\n useRequiredConfig,\n hasPermission as hasConfigPermission,\n} from './config/ConfigContext'\n\n// Hooks\nexport { useStreaming } from './hooks/useStreaming'\nexport { useTranslation } from './hooks/useTranslation'\n\n// Theme\nexport { ThemeProvider, useTheme } from './theme/ThemeProvider'\nexport { lightTheme, darkTheme } from './theme/themes'\n\n// API utilities\nexport { getCSRFToken, addCSRFHeader, createHeadersWithCSRF } from './api/csrf'\n\n// Data sources\nexport { HttpDataSource, createHttpDataSource } from './data/HttpDataSource'\n\n// Utilities\nexport { RateLimiter } from './utils/RateLimiter'\nexport * from './utils/fileUtils'\n\n// Types\nexport type {\n Session,\n Message,\n ToolCall,\n Citation,\n Attachment,\n ImageAttachment,\n QueuedMessage,\n CodeOutput,\n ChartData,\n Artifact,\n PendingQuestion,\n QuestionAnswers,\n StreamChunk,\n ChatDataSource,\n ChatSessionContextValue,\n} from './types'\n\nexport type { Theme, ThemeColors, ThemeSpacing, ThemeBorderRadius } from './theme/types'\n\nexport type {\n UserContext,\n TenantContext,\n LocaleContext,\n AppConfig,\n IotaContext,\n} from './types/iota'\n\nexport type { BiChatConfig } from './config/ConfigContext'\nexport type { RateLimiterConfig } from './utils/RateLimiter'\nexport type { HttpDataSourceConfig } from './data/HttpDataSource'\n\n// Enums\nexport { MessageRole } from './types'\n\n// Styles (import separately)\n// import '@iota-uz/sdk/bichat/styles.css'\n","/**\n * Framer Motion animation variants for BiChat UI\n * Subtle, professional animations for enterprise applications\n * Respects prefers-reduced-motion for accessibility\n */\n\nconst prefersReducedMotion = () => {\n if (typeof window === 'undefined') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/**\n * Fade in animation\n */\nexport const fadeInVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Fade in with subtle slide up\n */\nexport const fadeInUpVariants = {\n initial: { opacity: 0, y: 8 },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n y: 8,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Scale fade for modals and popups\n */\nexport const scaleFadeVariants = {\n initial: { opacity: 0, scale: 0.98 },\n animate: {\n opacity: 1,\n scale: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n exit: {\n opacity: 0,\n scale: 0.98,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.1,\n },\n },\n}\n\n/**\n * Modal backdrop\n */\nexport const backdropVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: 0.15,\n },\n },\n}\n\n/**\n * Button press feedback\n */\nexport const buttonVariants = {\n tap: {\n scale: 0.98,\n },\n}\n\n/**\n * Stagger container for lists\n */\nexport const staggerContainerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.03,\n delayChildren: 0.05,\n },\n },\n}\n\n/**\n * List item animation\n */\nexport const listItemVariants = {\n initial: { opacity: 0, x: -8 },\n animate: {\n opacity: 1,\n x: 0,\n transition: { duration: 0.2 },\n },\n exit: {\n opacity: 0,\n x: -8,\n transition: { duration: 0.15 },\n },\n}\n\n/**\n * Message entrance animation\n */\nexport const messageVariants = {\n initial: {\n opacity: 0,\n y: 8,\n },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Container for staggered messages\n */\nexport const messageContainerVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n delayChildren: 0.05,\n },\n },\n}\n\n/**\n * Typing indicator dots\n */\nexport const typingDotVariants = {\n initial: { opacity: 0.4 },\n animate: {\n opacity: [0.4, 1, 0.4],\n transition: {\n duration: prefersReducedMotion() ? 0 : 1,\n repeat: Infinity,\n ease: 'easeInOut',\n },\n },\n}\n\n/**\n * Floating button (scroll to bottom, etc.)\n */\nexport const floatingButtonVariants = {\n initial: {\n opacity: 0,\n scale: 0.9,\n },\n animate: {\n opacity: 1,\n scale: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n scale: 0.9,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Dropdown menu\n */\nexport const dropdownVariants = {\n initial: { opacity: 0, y: -4 },\n animate: {\n opacity: 1,\n y: 0,\n transition: { duration: prefersReducedMotion() ? 0 : 0.15 },\n },\n exit: {\n opacity: 0,\n y: -4,\n transition: { duration: 0.1 },\n },\n}\n\n/**\n * Toast notification\n */\nexport const toastVariants = {\n initial: { opacity: 0, y: -8 },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n y: -8,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n","/**\n * EmptyState Component\n * Reusable empty state display with icon, title, description, and action\n */\n\nimport { memo, type ReactNode } from 'react'\nimport { motion } from 'framer-motion'\nimport { fadeInVariants } from '../animations/variants'\n\nexport interface EmptyStateProps {\n /** Optional icon to display */\n icon?: ReactNode\n /** Main title text */\n title: string\n /** Optional description text */\n description?: string\n /** Optional action element (button, link, etc.) */\n action?: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst sizeClasses = {\n sm: {\n container: 'py-6 px-3',\n title: 'text-sm',\n description: 'text-xs',\n },\n md: {\n container: 'py-8 px-4',\n title: 'text-base',\n description: 'text-sm',\n },\n lg: {\n container: 'py-12 px-6',\n title: 'text-lg',\n description: 'text-base',\n },\n}\n\nfunction EmptyState({\n icon,\n title,\n description,\n action,\n className = '',\n size = 'md',\n}: EmptyStateProps) {\n const sizes = sizeClasses[size]\n\n return (\n <motion.div\n className={`flex items-center justify-center ${sizes.container} ${className}`}\n variants={fadeInVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n >\n <div className=\"text-center max-w-md\">\n {/* Icon */}\n {icon && (\n <motion.div\n className=\"mb-4 flex justify-center\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.4, delay: 0.1 }}\n >\n {icon}\n </motion.div>\n )}\n\n {/* Title */}\n <motion.h3\n className={`${sizes.title} font-medium text-gray-900 dark:text-white mb-2`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.2 }}\n >\n {title}\n </motion.h3>\n\n {/* Description */}\n {description && (\n <motion.p\n className={`${sizes.description} text-gray-500 dark:text-gray-400 mb-4`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.3 }}\n >\n {description}\n </motion.p>\n )}\n\n {/* Action */}\n {action && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.4 }}\n >\n {action}\n </motion.div>\n )}\n </div>\n </motion.div>\n )\n}\n\nexport default memo(EmptyState)\n","/**\n * EditableText Component\n * Inline editable text with double-click to edit\n * Features: auto-focus, auto-select, Enter to save, Escape to cancel\n * Can be triggered programmatically via ref.startEditing()\n */\n\nimport { useState, useRef, useEffect, useImperativeHandle, forwardRef, memo } from 'react'\nimport { CircleNotch } from '@phosphor-icons/react'\n\nexport interface EditableTextProps {\n /** Current text value */\n value: string\n /** Callback when text is saved */\n onSave: (newValue: string) => void\n /** Maximum character length */\n maxLength?: number\n /** Whether the component is in loading state */\n isLoading?: boolean\n /** Placeholder text when empty */\n placeholder?: string\n /** Additional CSS classes for the text display */\n className?: string\n /** Additional CSS classes for the input */\n inputClassName?: string\n /** Font size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\nexport interface EditableTextRef {\n /** Programmatically start editing mode */\n startEditing: () => void\n /** Programmatically cancel editing */\n cancelEditing: () => void\n}\n\nconst sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n}\n\nconst EditableText = forwardRef<EditableTextRef, EditableTextProps>(\n (\n {\n value,\n onSave,\n maxLength = 100,\n isLoading = false,\n placeholder = 'Untitled',\n className = '',\n inputClassName = '',\n size = 'sm',\n },\n ref\n ) => {\n const [isEditing, setIsEditing] = useState(false)\n const [editValue, setEditValue] = useState(value)\n const inputRef = useRef<HTMLInputElement>(null)\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n startEditing: () => {\n if (!isLoading) {\n setIsEditing(true)\n }\n },\n cancelEditing: () => {\n setEditValue(value)\n setIsEditing(false)\n },\n }))\n\n // Update edit value when value prop changes\n useEffect(() => {\n setEditValue(value)\n }, [value])\n\n // Auto-focus and select when entering edit mode\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n }, [isEditing])\n\n const handleSave = () => {\n const trimmed = editValue.trim()\n\n // Don't save if empty - revert to original\n if (!trimmed) {\n setEditValue(value)\n setIsEditing(false)\n return\n }\n\n // Only call onSave if value actually changed\n if (trimmed !== value) {\n onSave(trimmed)\n }\n\n setIsEditing(false)\n }\n\n const handleCancel = () => {\n setEditValue(value)\n setIsEditing(false)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n handleSave()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n handleCancel()\n }\n }\n\n const handleDoubleClick = () => {\n if (!isLoading) {\n setIsEditing(true)\n }\n }\n\n const handleBlur = () => {\n handleSave()\n }\n\n const sizeClass = sizeClasses[size]\n\n if (isEditing) {\n return (\n <div\n className=\"flex items-center gap-2 flex-1\"\n onClick={(e) => e.preventDefault()}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n maxLength={maxLength}\n placeholder={placeholder}\n className={`flex-1 px-2 py-1 ${sizeClass} bg-white dark:bg-gray-700 border border-primary-500 dark:border-primary-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500/30 dark:focus:ring-primary-600/30 text-gray-900 dark:text-white ${inputClassName}`}\n aria-label=\"Edit text. Press Enter to save, Escape to cancel\"\n />\n </div>\n )\n }\n\n const displayValue = value || placeholder\n\n return (\n <span\n onDoubleClick={handleDoubleClick}\n className={`${sizeClass} font-medium truncate flex-1 cursor-pointer select-none hover:text-primary-600 dark:hover:text-primary-400 transition-colors ${className}`}\n title=\"Double-click to edit\"\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleDoubleClick()\n }\n }}\n >\n {isLoading ? (\n <span className=\"inline-flex items-center gap-2 text-gray-400 dark:text-gray-500\">\n <CircleNotch size={12} className=\"animate-spin\" />\n <span className=\"italic\">{displayValue}</span>\n </span>\n ) : (\n <span className={!value ? 'text-gray-400 dark:text-gray-500 italic' : ''}>\n {displayValue}\n </span>\n )}\n </span>\n )\n }\n)\n\nEditableText.displayName = 'EditableText'\n\nexport default memo(EditableText)\n","/**\n * SearchInput Component\n * Reusable search input with icon, clear button, and keyboard shortcuts\n */\n\nimport { useEffect, useRef, memo, type KeyboardEvent } from 'react'\nimport { MagnifyingGlass, X } from '@phosphor-icons/react'\n\nexport interface SearchInputProps {\n /** Current search value */\n value: string\n /** Callback when value changes */\n onChange: (value: string) => void\n /** Placeholder text */\n placeholder?: string\n /** Auto-focus on mount */\n autoFocus?: boolean\n /** Callback when Enter is pressed */\n onSubmit?: (value: string) => void\n /** Callback when Escape is pressed */\n onEscape?: () => void\n /** Additional CSS classes for the container */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Disable the input */\n disabled?: boolean\n /** ARIA label for accessibility */\n ariaLabel?: string\n}\n\nconst sizeClasses = {\n sm: {\n container: 'py-1.5 pl-8 pr-8 text-xs',\n icon: 14,\n clearBtn: 'p-1',\n },\n md: {\n container: 'py-2.5 pl-10 pr-10 text-sm',\n icon: 16,\n clearBtn: 'p-1.5',\n },\n lg: {\n container: 'py-3 pl-12 pr-12 text-base',\n icon: 18,\n clearBtn: 'p-2',\n },\n}\n\nfunction SearchInput({\n value,\n onChange,\n placeholder = 'Search...',\n autoFocus = false,\n onSubmit,\n onEscape,\n className = '',\n size = 'md',\n disabled = false,\n ariaLabel = 'Search',\n}: SearchInputProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const sizes = sizeClasses[size]\n\n useEffect(() => {\n if (autoFocus && inputRef.current) {\n inputRef.current.focus()\n }\n }, [autoFocus])\n\n const handleClear = () => {\n onChange('')\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onSubmit) {\n e.preventDefault()\n onSubmit(value)\n } else if (e.key === 'Escape') {\n e.preventDefault()\n if (value && !onEscape) {\n // Default behavior: clear on Escape if no handler provided\n handleClear()\n } else if (onEscape) {\n onEscape()\n }\n }\n }\n\n return (\n <div className={`relative w-full ${className}`} role=\"search\">\n {/* Search Icon */}\n <span className=\"absolute inset-y-0 left-3 flex items-center pointer-events-none\">\n <MagnifyingGlass\n size={sizes.icon}\n weight=\"bold\"\n className=\"text-gray-400 dark:text-gray-500\"\n aria-hidden=\"true\"\n />\n </span>\n\n {/* Input Field */}\n <input\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className={`w-full ${sizes.container} bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700/50 rounded-xl focus:outline-none focus:ring-2 focus:ring-primary-500/30 dark:focus:ring-primary-500/20 focus:border-primary-400 dark:focus:border-primary-600 text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed`}\n aria-label={ariaLabel}\n />\n\n {/* Clear Button */}\n {value && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n className={`absolute inset-y-0 right-2 flex items-center ${sizes.clearBtn} rounded-lg hover:bg-gray-200 dark:hover:bg-gray-700 transition-all duration-200 text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300`}\n aria-label=\"Clear search\"\n title=\"Clear search\"\n >\n <X size={sizes.icon - 2} weight=\"bold\" />\n </button>\n )}\n </div>\n )\n}\n\nexport default memo(SearchInput)\n","/**\n * Skeleton Component\n * Reusable loading skeleton with multiple variants\n */\n\nimport { memo } from 'react'\n\nexport interface SkeletonProps {\n /** Skeleton variant */\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded'\n /** Width (CSS value or number for pixels) */\n width?: string | number\n /** Height (CSS value or number for pixels) */\n height?: string | number\n /** Additional CSS classes */\n className?: string\n /** Enable animation */\n animate?: boolean\n}\n\nexport interface SkeletonGroupProps {\n /** Number of skeleton items to render */\n count?: number\n /** Gap between items */\n gap?: 'sm' | 'md' | 'lg'\n /** Additional CSS classes for the container */\n className?: string\n /** Render function for each skeleton item */\n children?: (index: number) => React.ReactNode\n}\n\nconst variantClasses = {\n text: 'rounded',\n circular: 'rounded-full',\n rectangular: 'rounded-none',\n rounded: 'rounded-lg',\n}\n\nconst gapClasses = {\n sm: 'space-y-1',\n md: 'space-y-2',\n lg: 'space-y-3',\n}\n\nfunction Skeleton({\n variant = 'text',\n width,\n height,\n className = '',\n animate = true,\n}: SkeletonProps) {\n const variantClass = variantClasses[variant]\n\n const style: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n }\n\n return (\n <div\n className={`bg-gray-200 dark:bg-gray-700 ${variantClass} ${animate ? 'animate-pulse' : ''} ${className}`}\n style={style}\n aria-hidden=\"true\"\n />\n )\n}\n\n/**\n * SkeletonGroup - Renders multiple skeleton items\n */\nexport function SkeletonGroup({\n count = 3,\n gap = 'md',\n className = '',\n children,\n}: SkeletonGroupProps) {\n const gapClass = gapClasses[gap]\n\n return (\n <div className={`${gapClass} ${className}`} aria-hidden=\"true\">\n {Array.from({ length: count }).map((_, index) =>\n children ? (\n <div key={index}>{children(index)}</div>\n ) : (\n <Skeleton key={index} variant=\"text\" height={16} />\n )\n )}\n </div>\n )\n}\n\n/**\n * SkeletonText - Text line skeleton with configurable width\n */\nexport function SkeletonText({\n lines = 1,\n className = '',\n}: {\n lines?: number\n className?: string\n}) {\n const widths = ['100%', '90%', '80%', '95%', '85%']\n\n return (\n <div className={`space-y-2 ${className}`} aria-hidden=\"true\">\n {Array.from({ length: lines }).map((_, index) => (\n <Skeleton\n key={index}\n variant=\"text\"\n width={widths[index % widths.length]}\n height={14}\n />\n ))}\n </div>\n )\n}\n\n/**\n * SkeletonAvatar - Circular avatar skeleton\n */\nexport function SkeletonAvatar({\n size = 40,\n className = '',\n}: {\n size?: number\n className?: string\n}) {\n return (\n <Skeleton\n variant=\"circular\"\n width={size}\n height={size}\n className={className}\n />\n )\n}\n\n/**\n * SkeletonCard - Card-shaped skeleton\n */\nexport function SkeletonCard({\n width,\n height = 120,\n className = '',\n}: {\n width?: string | number\n height?: string | number\n className?: string\n}) {\n return (\n <Skeleton\n variant=\"rounded\"\n width={width}\n height={height}\n className={className}\n />\n )\n}\n\n/**\n * ListItemSkeleton - Common list item skeleton with icon and text\n */\nexport function ListItemSkeleton({ className = '' }: { className?: string }) {\n return (\n <div className={`flex items-center gap-3 px-3 py-2 ${className}`}>\n <Skeleton variant=\"rounded\" width={20} height={20} />\n <Skeleton variant=\"text\" height={16} className=\"flex-1\" />\n </div>\n )\n}\n\nexport default memo(Skeleton)\n","/**\n * Configuration context provider for BiChat\n * Provides props-based configuration with optional window global fallback\n */\n\nimport { createContext, useContext, ReactNode } from 'react'\n\nexport interface BiChatConfig {\n user: {\n id: string\n email: string\n firstName: string\n lastName: string\n permissions: string[]\n }\n tenant: {\n id: string\n name: string\n }\n locale: {\n language: string\n translations: Record<string, string>\n }\n endpoints: {\n graphQL: string\n stream: string\n }\n csrfToken?: string\n}\n\nconst ConfigContext = createContext<BiChatConfig | null>(null)\n\ninterface ConfigProviderProps {\n config?: BiChatConfig\n useGlobalConfig?: boolean\n children: ReactNode\n}\n\n/**\n * ConfigProvider component\n * Provides configuration to the BiChat library\n *\n * @param config - Configuration object (preferred method)\n * @param useGlobalConfig - If true, falls back to window.__BICHAT_CONTEXT__ when config is not provided\n * @param children - React children\n */\nexport function ConfigProvider({ config, useGlobalConfig = false, children }: ConfigProviderProps) {\n let resolvedConfig: BiChatConfig | null = null\n\n if (config) {\n resolvedConfig = config\n } else if (useGlobalConfig && typeof window !== 'undefined') {\n const globalContext = (window as any).__BICHAT_CONTEXT__\n const globalCSRF = (window as any).__CSRF_TOKEN__\n\n if (globalContext) {\n resolvedConfig = {\n user: {\n id: String(globalContext.user?.id || ''),\n email: globalContext.user?.email || '',\n firstName: globalContext.user?.firstName || '',\n lastName: globalContext.user?.lastName || '',\n permissions: globalContext.user?.permissions || [],\n },\n tenant: {\n id: globalContext.tenant?.id || '',\n name: globalContext.tenant?.name || '',\n },\n locale: {\n language: globalContext.locale?.language || 'en',\n translations: globalContext.locale?.translations || {},\n },\n endpoints: {\n graphQL: globalContext.config?.graphQLEndpoint || '/graphql',\n stream: globalContext.config?.streamEndpoint || '/stream',\n },\n csrfToken: globalCSRF,\n }\n }\n }\n\n return (\n <ConfigContext.Provider value={resolvedConfig}>\n {children}\n </ConfigContext.Provider>\n )\n}\n\n/**\n * Hook to access BiChat configuration\n * Returns null if no configuration is available\n */\nexport function useConfig(): BiChatConfig | null {\n return useContext(ConfigContext)\n}\n\n/**\n * Hook to access BiChat configuration (required)\n * Throws an error if configuration is not available\n */\nexport function useRequiredConfig(): BiChatConfig {\n const config = useContext(ConfigContext)\n if (!config) {\n throw new Error(\n 'BiChat configuration not found. ' +\n 'Wrap your app with <ConfigProvider config={...}> or use useGlobalConfig={true}.'\n )\n }\n return config\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function hasPermission(config: BiChatConfig | null, permission: string): boolean {\n if (!config) {\n return false\n }\n return config.user.permissions.includes(permission)\n}\n","/**\n * useStreaming hook\n * Handles AsyncGenerator streaming responses with cancellation support\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { StreamChunk } from '../types'\n\ninterface UseStreamingOptions {\n onChunk?: (content: string) => void\n onError?: (error: string) => void\n onDone?: () => void\n}\n\nexport function useStreaming(options: UseStreamingOptions = {}) {\n const [content, setContent] = useState('')\n const [isStreaming, setIsStreaming] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const abortControllerRef = useRef<AbortController | null>(null)\n\n const processStream = useCallback(\n async (stream: AsyncGenerator<StreamChunk>, signal?: AbortSignal) => {\n setIsStreaming(true)\n setError(null)\n setContent('')\n\n // Create abort controller for this stream\n abortControllerRef.current = new AbortController()\n\n // Link external signal if provided\n if (signal) {\n signal.addEventListener('abort', () => {\n abortControllerRef.current?.abort()\n })\n }\n\n try {\n for await (const chunk of stream) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break\n }\n\n if (chunk.type === 'chunk' && chunk.content) {\n setContent((prev) => {\n const newContent = prev + chunk.content\n options.onChunk?.(newContent)\n return newContent\n })\n } else if (chunk.type === 'error') {\n const errorMsg = chunk.error || 'Stream error'\n const err = new Error(errorMsg)\n setError(err)\n options.onError?.(errorMsg)\n break\n } else if (chunk.type === 'done') {\n options.onDone?.()\n break\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n // Stream was cancelled - this is expected\n return\n }\n\n const errorObj = err instanceof Error ? err : new Error('Unknown error')\n setError(errorObj)\n options.onError?.(errorObj.message)\n } finally {\n setIsStreaming(false)\n abortControllerRef.current = null\n }\n },\n [options]\n )\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n abortControllerRef.current = null\n setIsStreaming(false)\n }\n }, [])\n\n const reset = useCallback(() => {\n setContent('')\n setError(null)\n setIsStreaming(false)\n }, [])\n\n return {\n content,\n isStreaming,\n error,\n processStream,\n cancel,\n reset,\n }\n}\n","/**\n * Predefined theme configurations\n */\n\nimport { Theme } from './types'\n\nexport const lightTheme: Theme = {\n name: 'light',\n colors: {\n background: '#ffffff',\n surface: '#f9fafb',\n primary: '#3b82f6',\n secondary: '#6b7280',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n success: '#10b981',\n warning: '#f59e0b',\n userBubble: '#3b82f6',\n assistantBubble: '#f3f4f6',\n userText: '#ffffff',\n assistantText: '#111827',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n },\n borderRadius: {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '9999px',\n },\n}\n\nexport const darkTheme: Theme = {\n name: 'dark',\n colors: {\n background: '#111827',\n surface: '#1f2937',\n primary: '#60a5fa',\n secondary: '#9ca3af',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n success: '#34d399',\n warning: '#fbbf24',\n userBubble: '#2563eb',\n assistantBubble: '#1f2937',\n userText: '#f9fafb',\n assistantText: '#f9fafb',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n },\n borderRadius: {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '9999px',\n },\n}\n","/**\n * Theme provider component and hook\n * Manages theme state and applies CSS variables to document root\n */\n\nimport { createContext, useContext, useEffect, useMemo, ReactNode } from 'react'\nimport { Theme } from './types'\nimport { lightTheme, darkTheme } from './themes'\n\ninterface ThemeContextValue {\n theme: Theme\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null)\n\nexport interface ThemeProviderProps {\n theme?: Theme | 'light' | 'dark' | 'system'\n children: ReactNode\n}\n\n/**\n * Detect system theme preference\n */\nfunction getSystemTheme(): Theme {\n if (typeof window === 'undefined') {\n return lightTheme\n }\n\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\n return prefersDark ? darkTheme : lightTheme\n}\n\n/**\n * Resolve theme prop to Theme object\n */\nfunction resolveTheme(themeProp: Theme | 'light' | 'dark' | 'system'): Theme {\n if (typeof themeProp === 'object') {\n return themeProp\n }\n\n switch (themeProp) {\n case 'light':\n return lightTheme\n case 'dark':\n return darkTheme\n case 'system':\n return getSystemTheme()\n default:\n return lightTheme\n }\n}\n\n/**\n * Apply theme CSS variables to document root\n */\nfunction applyThemeVariables(theme: Theme): void {\n if (typeof document === 'undefined') {\n return\n }\n\n const root = document.documentElement\n\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-${key}`, value)\n })\n\n // Apply spacing variables\n Object.entries(theme.spacing).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-spacing-${key}`, value)\n })\n\n // Apply border radius variables\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-radius-${key}`, value)\n })\n}\n\n/**\n * Theme provider component\n * Wraps the application and provides theme context\n */\nexport function ThemeProvider({ theme = 'system', children }: ThemeProviderProps) {\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme])\n\n useEffect(() => {\n applyThemeVariables(resolvedTheme)\n }, [resolvedTheme])\n\n // Listen for system theme changes when using 'system'\n useEffect(() => {\n if (theme !== 'system') {\n return\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n const handleChange = () => {\n const newTheme = getSystemTheme()\n applyThemeVariables(newTheme)\n }\n\n mediaQuery.addEventListener('change', handleChange)\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange)\n }\n }, [theme])\n\n const value: ThemeContextValue = {\n theme: resolvedTheme,\n }\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n\n/**\n * Hook to access current theme\n */\nexport function useTheme(): Theme {\n const context = useContext(ThemeContext)\n\n if (!context) {\n throw new Error('useTheme must be used within ThemeProvider')\n }\n\n return context.theme\n}\n","/**\n * CSRF token management for API requests\n */\n\n/**\n * Get CSRF token from window object\n * @returns CSRF token string\n */\nexport function getCSRFToken(): string {\n const token = window.__CSRF_TOKEN__\n if (!token) {\n console.warn('CSRF token not found in window object')\n return ''\n }\n return token\n}\n\n/**\n * Add CSRF token to request headers\n * @param headers - Headers object to modify\n * @returns Modified headers object\n */\nexport function addCSRFHeader(headers: Headers): Headers {\n const token = getCSRFToken()\n if (token) {\n headers.set('X-CSRF-Token', token)\n }\n return headers\n}\n\n/**\n * Create headers with CSRF token\n * @param init - Optional initial headers\n * @returns Headers object with CSRF token\n */\nexport function createHeadersWithCSRF(init?: HeadersInit): Headers {\n const headers = new Headers(init)\n return addCSRFHeader(headers)\n}\n","/**\n * Built-in HTTP data source with SSE streaming and AbortController\n * Implements ChatDataSource interface with real HTTP/GraphQL calls\n */\n\nimport type {\n ChatDataSource,\n Session,\n Message,\n PendingQuestion,\n Attachment,\n StreamChunk,\n QuestionAnswers,\n} from '../types'\n\nexport interface HttpDataSourceConfig {\n baseUrl: string\n graphQLEndpoint?: string\n streamEndpoint?: string\n csrfToken?: string | (() => string)\n headers?: Record<string, string>\n timeout?: number\n}\n\ninterface SessionState {\n session: Session\n messages: Message[]\n pendingQuestion?: PendingQuestion | null\n}\n\ninterface Result<T> {\n success: boolean\n data?: T\n error?: string\n}\n\nexport class HttpDataSource implements ChatDataSource {\n private config: HttpDataSourceConfig\n private abortController: AbortController | null = null\n\n constructor(config: HttpDataSourceConfig) {\n this.config = {\n graphQLEndpoint: '/graphql',\n streamEndpoint: '/stream',\n timeout: 30000,\n ...config,\n }\n }\n\n /**\n * Get CSRF token from config\n */\n private getCSRFToken(): string {\n if (!this.config.csrfToken) {\n return ''\n }\n return typeof this.config.csrfToken === 'function'\n ? this.config.csrfToken()\n : this.config.csrfToken\n }\n\n /**\n * Create headers for HTTP requests\n */\n private createHeaders(additionalHeaders?: Record<string, string>): Headers {\n const headers = new Headers({\n 'Content-Type': 'application/json',\n ...this.config.headers,\n ...additionalHeaders,\n })\n\n const csrfToken = this.getCSRFToken()\n if (csrfToken) {\n headers.set('X-CSRF-Token', csrfToken)\n }\n\n return headers\n }\n\n /**\n * Execute GraphQL query\n */\n private async graphql<T>(query: string, variables?: Record<string, any>): Promise<T> {\n const url = `${this.config.baseUrl}${this.config.graphQLEndpoint}`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.createHeaders(),\n body: JSON.stringify({ query, variables }),\n signal: this.abortController?.signal,\n })\n\n if (!response.ok) {\n throw new Error(`GraphQL request failed: ${response.statusText}`)\n }\n\n const result = await response.json()\n\n if (result.errors && result.errors.length > 0) {\n throw new Error(result.errors[0].message || 'GraphQL error')\n }\n\n return result.data\n }\n\n /**\n * Create a new chat session\n */\n async createSession(): Promise<Session> {\n const query = `\n mutation CreateChatSession {\n createChatSession {\n id\n title\n status\n pinned\n createdAt\n updatedAt\n }\n }\n `\n\n const data = await this.graphql<{ createChatSession: Session }>(query)\n return data.createChatSession\n }\n\n /**\n * Fetch an existing session with messages\n */\n async fetchSession(id: string): Promise<SessionState | null> {\n const query = `\n query GetChatSession($id: ID!) {\n chatSession(id: $id) {\n session {\n id\n title\n status\n pinned\n createdAt\n updatedAt\n }\n messages {\n id\n sessionId\n role\n content\n createdAt\n toolCalls {\n id\n name\n arguments\n }\n citations {\n id\n source\n url\n excerpt\n }\n chartData {\n type\n title\n data\n xAxisKey\n yAxisKey\n }\n artifacts {\n type\n filename\n url\n sizeReadable\n rowCount\n description\n }\n explanation\n }\n pendingQuestion {\n id\n turnId\n question\n type\n options\n status\n }\n }\n }\n `\n\n try {\n const data = await this.graphql<{ chatSession: SessionState | null }>(query, { id })\n return data.chatSession\n } catch (err) {\n console.error('Failed to fetch session:', err)\n return null\n }\n }\n\n /**\n * Send a message and stream the response using SSE\n */\n async *sendMessage(\n sessionId: string,\n content: string,\n attachments: Attachment[] = [],\n signal?: AbortSignal\n ): AsyncGenerator<StreamChunk> {\n // Create new abort controller for this stream\n this.abortController = new AbortController()\n\n // Link external signal if provided\n if (signal) {\n signal.addEventListener('abort', () => {\n this.abortController?.abort()\n })\n }\n\n const url = `${this.config.baseUrl}${this.config.streamEndpoint}`\n\n const payload = {\n sessionId,\n content,\n attachments: attachments.map(a => ({\n id: a.id,\n filename: a.filename,\n mimeType: a.mimeType,\n sizeBytes: a.sizeBytes,\n base64Data: a.base64Data,\n })),\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.createHeaders(),\n body: JSON.stringify(payload),\n signal: this.abortController.signal,\n })\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`)\n }\n\n if (!response.body) {\n throw new Error('Response body is null')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n break\n }\n\n buffer += decoder.decode(value, { stream: true })\n\n // Process SSE events in buffer\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.trim() || line.startsWith(':')) {\n continue\n }\n\n if (line.startsWith('data: ')) {\n const data = line.slice(6)\n\n try {\n const chunk = JSON.parse(data) as StreamChunk\n yield chunk\n\n // Stop if done or error\n if (chunk.type === 'done' || chunk.type === 'error') {\n return\n }\n } catch (parseErr) {\n console.error('Failed to parse SSE data:', parseErr)\n yield {\n type: 'error',\n error: 'Failed to parse stream data',\n }\n return\n }\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n } catch (err) {\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n yield {\n type: 'error',\n error: 'Stream cancelled',\n }\n } else {\n yield {\n type: 'error',\n error: err.message,\n }\n }\n } else {\n yield {\n type: 'error',\n error: 'Unknown error',\n }\n }\n } finally {\n this.abortController = null\n }\n }\n\n /**\n * Cancel ongoing stream\n */\n cancelStream(): void {\n if (this.abortController) {\n this.abortController.abort()\n this.abortController = null\n }\n }\n\n /**\n * Submit answers to a pending question\n */\n async submitQuestionAnswers(\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers\n ): Promise<Result<void>> {\n const query = `\n mutation SubmitQuestionAnswers($sessionId: ID!, $questionId: ID!, $answers: JSON!) {\n submitQuestionAnswers(sessionId: $sessionId, questionId: $questionId, answers: $answers) {\n success\n error\n }\n }\n `\n\n try {\n const data = await this.graphql<{\n submitQuestionAnswers: Result<void>\n }>(query, { sessionId, questionId, answers })\n\n return data.submitQuestionAnswers\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Failed to submit answers',\n }\n }\n }\n\n /**\n * Cancel a pending question\n */\n async cancelPendingQuestion(questionId: string): Promise<Result<void>> {\n const query = `\n mutation CancelPendingQuestion($questionId: ID!) {\n cancelPendingQuestion(questionId: $questionId) {\n success\n error\n }\n }\n `\n\n try {\n const data = await this.graphql<{\n cancelPendingQuestion: Result<void>\n }>(query, { questionId })\n\n return data.cancelPendingQuestion\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Failed to cancel question',\n }\n }\n }\n\n /**\n * Navigate to a session (optional, for SPA routing)\n */\n navigateToSession?(sessionId: string): void {\n // Default implementation - can be overridden\n if (typeof window !== 'undefined') {\n window.location.href = `/chat/${sessionId}`\n }\n }\n}\n\n/**\n * Factory function to create HttpDataSource\n */\nexport function createHttpDataSource(config: HttpDataSourceConfig): ChatDataSource {\n return new HttpDataSource(config)\n}\n"]}