{"version":3,"sources":["../../ui/src/bichat/context/IotaContext.tsx","../../ui/src/bichat/hooks/useTranslation.ts","../../ui/src/bichat/components/ChartCard.tsx","../../ui/src/bichat/components/TableExportButton.tsx","../../ui/src/bichat/utils/citationProcessor.ts","../../ui/src/bichat/utils/chartSpec.ts","../../ui/src/bichat/utils/markdownMath.ts","../../ui/src/bichat/components/TableWithExport.tsx","../../ui/src/bichat/components/CodeBlock.tsx","../../ui/src/bichat/components/MarkdownRenderer.tsx","../../ui/src/bichat/utils/RateLimiter.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/bichat/utils/errorDisplay.ts","../../ui/src/bichat/utils/queueStorage.ts","../../ui/src/bichat/utils/debugModeStorage.ts","../../ui/src/bichat/utils/reasoningEffortStorage.ts","../../ui/src/bichat/utils/debugTrace.ts","../../ui/src/bichat/types/index.ts","../../ui/src/bichat/context/chatHelpers.ts","../../ui/src/bichat/machine/selectors.ts","../../ui/src/bichat/utils/assistantTurnState.ts","../../ui/src/bichat/machine/hitlLifecycle.ts","../../ui/src/bichat/machine/ChatMachine.ts","../../ui/src/bichat/context/ChatContext.tsx","../../ui/src/bichat/components/ChatHeader.tsx","../../ui/src/bichat/hooks/useBranding.ts","../../ui/src/bichat/components/UserAvatar.tsx","../../ui/src/bichat/components/AvatarStack.tsx","../../ui/src/bichat/utils/dateFormatting.ts","../../ui/src/bichat/utils/fileUtils.ts","../../ui/src/bichat/components/AttachmentGrid.tsx","../../ui/src/bichat/hooks/useFocusTrap.ts","../../ui/src/bichat/hooks/useModalLock.ts","../../ui/src/bichat/components/InlineDialog.tsx","../../ui/src/bichat/components/ImageModal.tsx","../../ui/src/bichat/components/UserMessage.tsx","../../ui/src/bichat/components/UserTurnView.tsx","../../ui/src/bichat/components/AssistantTurnView.tsx","../../ui/src/bichat/components/CodeOutputsPanel.tsx","../../ui/src/bichat/components/StreamingCursor.tsx","../../ui/src/bichat/components/AssistantMessage.tsx","../../ui/src/bichat/components/InteractiveTableCard.tsx","../../ui/src/bichat/utils/columnTypes.ts","../../ui/src/bichat/hooks/useDataTable.ts","../../ui/src/bichat/components/DataTableHeader.tsx","../../ui/src/bichat/components/DataTableCell.tsx","../../ui/src/bichat/components/DataTableToolbar.tsx","../../ui/src/bichat/components/DataTableFooter.tsx","../../ui/src/bichat/components/FullscreenOverlay.tsx","../../ui/src/bichat/components/TabbedTableGroup.tsx","../../ui/src/bichat/components/TabBar.tsx","../../ui/src/bichat/components/TabbedChartGroup.tsx","../../ui/src/bichat/components/SourcesPanel.tsx","../../ui/src/bichat/components/DownloadCard.tsx","../../ui/src/bichat/components/InlineQuestionForm.tsx","../../ui/src/bichat/components/RetryActionArea.tsx","../../ui/src/bichat/utils/debugMetrics.ts","../../ui/src/bichat/components/DebugPanel.tsx","../../ui/src/bichat/components/SystemMessage.tsx","../../ui/src/bichat/components/TurnBubble.tsx","../../ui/src/bichat/animations/variants.ts","../../ui/src/bichat/components/TypingIndicator.tsx","../../ui/src/bichat/components/ActivityTrace.tsx","../../ui/src/bichat/utils/toolLabels.ts","../../ui/src/bichat/utils/activitySteps.ts","../../ui/src/bichat/components/ScrollToBottomButton.tsx","../../ui/src/bichat/components/DateSeparator.tsx","../../ui/src/bichat/utils/markdownStream.ts","../../ui/src/bichat/hooks/useKeyboardShortcuts.ts","../../ui/src/bichat/hooks/useMessageListScroll.ts","../../ui/src/bichat/components/MessageList.tsx","../../ui/src/bichat/components/MessageQueueList.tsx","../../ui/src/bichat/components/MessageInput.tsx","../../ui/src/bichat/components/CompactionDoodle.tsx","../../ui/src/bichat/components/WelcomeContent.tsx","../../ui/src/bichat/components/Alert.tsx","../../ui/src/bichat/components/ArchiveBanner.tsx","../../ui/src/bichat/components/ChatSession.tsx","../../ui/src/bichat/components/SessionArtifactsPanel.tsx","../../ui/src/bichat/components/SessionArtifactList.tsx","../../ui/src/bichat/utils/artifactHelpers.ts","../../ui/src/bichat/components/SessionArtifactPreviewModal.tsx","../../ui/src/bichat/components/SessionArtifactPreview.tsx","../../ui/src/bichat/utils/tableSpec.ts","../../ui/src/bichat/components/SessionMembersModal.tsx","../../ui/src/bichat/components/ConfirmModal.tsx","../../ui/src/bichat/components/StreamError.tsx","../../ui/src/bichat/components/ModelSelector.tsx","../../ui/src/bichat/index.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/components/LoadingSpinner.tsx","../../ui/src/bichat/components/Toast.tsx","../../ui/src/bichat/components/ToastContainer.tsx","../../ui/src/bichat/components/PermissionGuard.tsx","../../ui/src/bichat/components/ErrorBoundary.tsx","../../ui/src/bichat/components/SessionSkeleton.tsx","../../ui/src/bichat/hooks/useLongPress.ts","../../ui/src/bichat/components/TouchContextMenu.tsx","../../ui/src/bichat/components/SessionItem.tsx","../../ui/src/bichat/components/DateGroupHeader.tsx","../../ui/src/bichat/components/UserFilter.tsx","../../ui/src/bichat/components/AllChatsList.tsx","../../ui/src/bichat/components/Sidebar.tsx","../../ui/src/bichat/hooks/useToast.ts","../../ui/src/bichat/utils/sessionGrouping.ts","../../ui/src/bichat/components/ArchivedChatList.tsx","../../ui/src/bichat/components/SkipLink.tsx","../../ui/src/bichat/hooks/useSidebarState.ts","../../ui/src/bichat/components/BiChatLayout.tsx","../../ui/src/bichat/components/MessageActions.tsx","../../ui/src/bichat/components/AttachmentPreview.tsx","../../ui/src/bichat/components/AttachmentUpload.tsx","../../ui/src/bichat/components/ScreenReaderAnnouncer.tsx","../../ui/src/bichat/components/QuestionForm.tsx","../../ui/src/bichat/components/QuestionStep.tsx","../../ui/src/bichat/components/ConfirmationStep.tsx","../../ui/src/bichat/utils/questionFormUtils.ts","../../ui/src/bichat/primitives/Slot.tsx","../../ui/src/bichat/primitives/Turn.tsx","../../ui/src/bichat/primitives/Avatar.tsx","../../ui/src/bichat/primitives/Bubble.tsx","../../ui/src/bichat/primitives/ActionButton.tsx","../../ui/src/applet-core/hooks/useStreaming.ts","../../ui/src/bichat/hooks/useStreaming.ts","../../ui/src/bichat/hooks/useActiveRuns.ts","../../ui/src/bichat/hooks/useImageGallery.ts","../../ui/src/bichat/hooks/useAutoScroll.ts","../../ui/src/bichat/hooks/useMessageActions.ts","../../ui/src/bichat/hooks/useAttachments.ts","../../ui/src/bichat/hooks/useMarkdownCopy.ts","../../ui/src/bichat/hooks/useScrollToBottom.ts","../../ui/src/bichat/hooks/useHttpDataSourceConfigFromApplet.ts","../../ui/src/bichat/hooks/useBichatRouter.ts","../../ui/src/bichat/config/ConfigContext.tsx","../../ui/src/bichat/theme/themes.ts","../../ui/src/bichat/theme/ThemeProvider.tsx","../../ui/src/bichat/api/csrf.ts","../../ui/src/bichat/data/mappers.ts","../../ui/src/bichat/data/SessionManager.ts","../../ui/src/bichat/utils/sseParser.ts","../../ui/src/bichat/utils/eventNames.ts","../../ui/src/bichat/data/openManagedEventSource.ts","../../ui/src/bichat/data/AttachmentUploader.ts","../../ui/src/bichat/data/MessageTransport.ts","../../ui/src/bichat/data/ArtifactManager.ts","../../ui/src/bichat/data/HttpDataSource.ts","../../ui/src/bichat/utils/textBlocks.ts"],"names":["jsx","useContext","createContext","useCallback","key","useId","useState","useRef","useMemo","useEffect","jsxs","ApexCharts","ReactApexChart","Fragment","DownloadSimple","TableExportButton","memo","FileXls","isRecord","TableWithExport","sendMessage","MemoizedCodeBlock","useSyncExternalStore","Check","Copy","SyntaxHighlighter","vscDarkPlus","vs","MemoizedMarkdownRenderer","Children","isValidElement","Suspense","CodeBlock","ReactMarkdown","remarkGfm","remarkMath","rehypeKatex","lazy","STORAGE_PREFIX","MessageRole","getStreamStatus","finalSessionId","differenceInMinutes","differenceInHours","differenceInDays","format","ImageIcon","FilePdf","FileCsv","FileDoc","FileCode","FileText","File","ChartBar","X","React","focusableElements","MagnifyingGlassMinus","MagnifyingGlassPlus","ArrowCounterClockwise","ArrowClockwise","ArrowsIn","ImageBroken","CaretLeft","CaretRight","PencilSimple","Download","DataTableHeader","HeaderCell","CaretUp","CaretDown","Menu","MenuButton","DotsThreeVertical","MenuItems","MenuItem","DataTableCell","createPortal","DataTableToolbar","Popover","PopoverButton","Columns","PopoverPanel","ArrowsOut","StatRow","DataTableFooter","InteractiveTableCard","MagnifyingGlass","motion","TabbedTableGroup","INLINE_CLASS","FULLSCREEN_CLASS","TabbedChartGroup","isMultiSelect","ChatCircleDots","PencilSimpleLine","ArrowLeft","PaperPlaneTilt","ArrowRight","RetryActionArea","Warning","XCircle","CheckCircle","CircleNotch","Timer","Lightning","Stack","ArrowUp","ArrowDown","Database","Bug","ArrowSquareOut","Wrench","MarkdownRenderer","COPY_FEEDBACK_MS","defaultClassNames","mergeClassNames","AnimatePresence","ArrowsClockwise","Brain","ClockCounterClockwise","formatDuration","MotionConfig","isToday","isYesterday","isSameDay","CaretUpDown","forwardRef","useImperativeHandle","Paperclip","Stop","PaperPlaneRight","Lightbulb","useReducedMotion","Info","Archive","Spinner","TableIcon","Code","Package","WarningCircle","SpinnerGap","FloppyDisk","Trash","Plus","UsersThree","Crown","UserPlus","ArrowsCounterClockwise","ShareNetwork","Sidebar","sizeClasses","prefersReducedMotion","gapClasses","Transition","hasPermission","Component","useMotionValue","useTransform","ArrowUUpLeft","Bookmark","DotsThree","startOfDay","sessions","ChatCircle","Gear","Users","List","CaretLineLeft","CaretLineRight","cloneElement","useStreaming","pending","fileArray","removed","readString","normalizeQuestionType"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,SAAS,mBAAA,CAAoB,EAAE,OAAA,EAAS,QAAA,EAAS,EAA6B;AAEnF,EAAA,MAAM,WAAW,OAAA,KAAY,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,kBAAA,GAAqB,MAAA,CAAA;AAEzF,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,MAAM,uHAAuH,CAAA;AAAA,EACzI;AAEA,EAAA,uBACEA,cAAAA,CAAC,WAAA,CAAY,UAAZ,EAAqB,KAAA,EAAO,UAC1B,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,cAAA,GAAkC;AAChD,EAAA,MAAM,OAAA,GAAUC,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,OAAA,GAAU,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,kBAAA,GAAqB,MAAA;AAC5E,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;AAnDA,IAQM,WAAA;AARN,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAQA,IAAM,WAAA,GAAcC,oBAAsC,IAAI,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACDvD,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,cAAA,EAAe;AAClC,EAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAS,GAAI,MAAA;AAQnC,EAAA,MAAM,CAAA,GAAIC,iBAAA;AAAA,IACR,CAACC,MAAa,MAAA,KAA+D;AAC3E,MAAA,MAAM,GAAA,GAAM,aAAaA,IAAG,CAAA;AAC5B,MAAA,IAAI,OAAO,OAAO,GAAA,KAAQ,YAAY,GAAA,CAAI,IAAA,KAAS,GAAA,GAAMA,IAAAA;AAGzD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,QAAA,KAAa;AACxC,UAAA,MAAM,KAAA,GAAQ,OAAO,QAAQ,CAAA;AAC7B,UAAA,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,QACvE,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,IAAA,CAAK,IAAA,EAAK,GAAI,IAAA,GAAOA,IAAAA;AAAA,IAC9B,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,OAAO;AAAA,IACL,CAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;AAvCA,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAKA,IAAA,gBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC0CA,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AAC9D,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,GAAG,GAAG,GAAG,CAAA;AAC3C;AAEA,SAAS,mBAAA,CAAoB,OAAgBA,IAAAA,EAA2C;AACtF,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAS,MAAyBA,IAAG,CAAA;AAC3C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC7C;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,UAAa,KAAA,EAAa;AACjC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AACxC,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA;AAAA,IACtB,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,mBAAmB,IAAA,EAA6B;AACvD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,wDAAwD,CAAA;AACrF,EAAA,IAAI,SAAA,EAAW;AAAC,IAAA,OAAO,SAAA,CAAU,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,EAAE;AAClD,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACtC,EAAA,IAAI,KAAK,QAAA,CAAS,KAAK,KAAK,IAAA,CAAK,QAAA,CAAS,QAAG,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAC9D,EAAA,IAAI,KAAK,QAAA,CAAS,KAAK,KAAK,IAAA,CAAK,QAAA,CAAS,MAAG,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAC9D,EAAA,IAAI,KAAK,QAAA,CAAS,KAAK,KAAK,IAAA,CAAK,QAAA,CAAS,MAAG,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAC9D,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAA,CACP,SAAA,EACA,MAAA,EACA,UAAA,EACU;AACV,EAAA,IAAI,SAAA,KAAc,KAAA,IAAS,SAAA,KAAc,OAAA,EAAS;AAChD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC7B,MAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,MAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO,MAAA,CAAO,CAAC,CAAA,EAAG,IAAA,IAAQ,EAAC;AAAA,EAC7B;AACA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AACpF;AAEA,SAAS,oBAAA,CACP,KAAA,EACA,WAAA,EACA,OAAA,EACoC;AACpC,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AACvC,EAAA,MAAM,cAAc,CAAC,KAAA,EAAO,GAAG,WAAW,CAAA,CAAE,KAAK,GAAG,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,mBAAmB,WAAW,CAAA;AACnD,EAAA,MAAM,mBACJ,6GAAA,CAA8G,IAAA;AAAA,IAC5G;AAAA,GACF,IAAK,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA;AAChC,EAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,YAAA,EAAc;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAErD,EAAA,MAAM,WAAW,YAAA,IAAgB,KAAA;AACjC,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,KAAA,CAAA,EAAW;AAAA,MACjD,KAAA,EAAO,UAAA;AAAA,MACP,QAAA;AAAA,MACA,qBAAA,EAAuB;AAAA,KACxB,CAAA;AACD,IAAA,OAAO,CAAC,KAAA,KAA0B,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,YAAA,CAAa,QAAW,EAAE,qBAAA,EAAuB,mBAAmB,CAAA;AAC9F,IAAA,OAAO,CAAC,KAAA,KAA0B,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,EACzD;AACF;AAEA,SAAS,oBAAA,CACP,SACA,SAAA,EACa;AACb,EAAA,IAAI,CAAC,SAAA,EAAW;AAAC,IAAA,OAAO,OAAA;AAAA,EAAQ;AAEhC,EAAA,MAAM,IAAA,GAAoB,EAAE,GAAG,OAAA,EAAQ;AACvC,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAChC,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ;AAAA,QACN,GAAI,IAAA,EAAM,MAAA,IAAU,EAAC;AAAA,QACrB,WAAW,IAAA,EAAM,MAAA,EAAQ,cAAc,CAAC,KAAA,KAAkB,UAAU,KAAK,CAAA;AAAA;AAC3E,KACF,CAAE,CAAA;AAAA,EACJ,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,GAAI,SAAS,EAAC;AAAA,MACd,MAAA,EAAQ;AAAA,QACN,GAAI,KAAA,EAAO,MAAA,IAAU,EAAC;AAAA,QACtB,WAAW,KAAA,EAAO,MAAA,EAAQ,cAAc,CAAC,KAAA,KAAkB,UAAU,KAAK,CAAA;AAAA;AAC5E,KACF;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,KAAK,OAAA,EAAS,CAAA;AAC/B,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,KAAK,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,GAAW,EAAC;AACpF,EAAA,MAAM,iBAAA,GACJ,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,OAAO,QAAA,CAAS,SAAA,KAAc,UAAA,GAC5E,SAAS,SAAA,GACT,MAAA;AAEN,EAAA,IAAA,CAAK,OAAA,GAAU;AAAA,IACb,GAAI,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,IACrB,CAAA,EAAG;AAAA,MACD,GAAG,cAAA;AAAA,MACH,SAAA,EAAW,iBAAA,KAAsB,CAAC,KAAA,KAAkB,UAAU,KAAK,CAAA;AAAA;AACrE,GACF;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,aAAA,EAAe,MAAK,EAAmB;AAC5E,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,OAAA,GAAUC,WAAA,EAAM,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AACzC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAoC,IAAI,CAAA;AAClF,EAAA,MAAM,OAAA,GAAUC,aAAuB,IAAI,CAAA;AAE3C,EAAA,MAAM,EAAE,WAAW,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,GAAS,KAAI,GAAI,SAAA;AACnE,EAAA,MAAM,WAAA,GAAcC,aAAAA;AAAA,IAClB,MAAO,SAAS,SAAA,CAAU,OAAO,IAAI,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA,GAAI,IAAA;AAAA,IACpE,CAAC,UAAU,OAAO;AAAA,GACpB;AACA,EAAA,MAAM,WAAA,GAAcA,aAAAA;AAAA,IAClB,MAAA,CAAO,UAAU,EAAC,EAAG,OAAO,CAAC,KAAA,KAA2B,UAAU,IAAI,CAAA;AAAA,IACtE,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,YAAA,GACJ,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AAE/E,EAAAC,gBAAU,MAAM;AACd,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAS,WAAA,EAAY;AAC9C,IAAA,MAAM,YAAA,GACJ,OAAO,UAAA,KAAe,WAAA,IAAe,QAAA,YAAoB,UAAA;AAC3D,IAAA,mBAAA,CAAoB,SAAA,KAAc,SAAS,YAAY,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,UAAA,GAAaD,cAAQ,MAAM;AAC/B,IAAA,IAAI,WAAA,IAAe,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,EAAG;AACpD,MAAA,IAAI,SAAA,KAAc,KAAA,IAAS,SAAA,KAAc,OAAA,EAAS;AAChD,QAAA,MAAM,OAAA,GAAU,WAAA,CAAY,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AACzG,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AAAC,UAAA,OAAO,OAAA;AAAA,QAAQ;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CACxB,OAAO,CAAC,IAAA,KAAsD,SAAS,IAAI,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,IAAI,CAAC,EACxG,GAAA,CAAI,CAAC,MAAM,GAAA,MAAS;AAAA,UACnB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK,GAAI,IAAA,CAAK,IAAA,GAAO,CAAA,OAAA,EAAU,MAAM,CAAC,CAAA,CAAA;AAAA,UACvF,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,IAAI,IAAK;AAAA,SACrF,CAAE,CAAA,CACD,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAC,CAAA;AACrD,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAAC,UAAA,OAAO,MAAA;AAAA,QAAO;AAAA,MACxC;AAAA,IACF;AAEA,IAAA,OAAO,SAAA,KAAc,SAAS,SAAA,KAAc,OAAA,GACxC,OAAO,CAAC,CAAA,EAAG,QAAQ,EAAC,GACpB,OAAO,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK,CAAE,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,SAAA,EAAW,MAAA,EAAQ,WAAW,CAAC,CAAA;AAEnC,EAAA,MAAM,WAAA,GAAcA,cAAQ,MAAM;AAChC,IAAA,IAAI,SAAA,KAAc,KAAA,IAAS,SAAA,KAAc,OAAA,EAAS;AAAC,MAAA,OAAO,EAAC;AAAA,IAAE;AAC7D,IAAA,IAAI,WAAA,IAAe,QAAA,CAAS,WAAA,CAAY,KAAK,CAAA,EAAG;AAC9C,MAAA,OAAO,WAAA,CAAY,KAAA;AAAA,IACrB;AACA,IAAA,OAAO,EAAE,YAAY,WAAA,EAAY;AAAA,EACnC,CAAA,EAAG,CAAC,SAAA,EAAW,WAAA,EAAa,WAAW,CAAC,CAAA;AAExC,EAAA,MAAM,YAAA,GAAeA,cAAQ,MAAM;AACjC,IAAA,IAAI,SAAA,KAAc,KAAA,IAAS,SAAA,KAAc,OAAA,EAAS;AAAC,MAAA,OAAO,EAAC;AAAA,IAAE;AAC7D,IAAA,IAAI,WAAA,IAAe,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,EAAG;AACpD,MAAA,MAAM,WAAA,GAAc,YAAY,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,MAAM,QAAQ,CAAA;AACvF,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAAC,QAAA,OAAO,WAAA;AAAA,MAAY;AAAA,IAClD;AACA,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,EAAG,CAAC,SAAA,EAAW,WAAA,EAAa,WAAW,CAAC,CAAA;AAExC,EAAA,MAAM,yBAAA,GAA4BL,iBAAAA;AAAA,IAChC,CAAC,KAAA,EAAgB,aAAA,EAAwB,MAAA,KAA8D;AACrG,MAAA,IAAI,CAAC,gBAAA,IAAoB,SAAA,KAAc,KAAA,IAAS,CAAC,QAAQ,OAAA,EAAS;AAChE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GACH,KAAA,IACC,OAAO,KAAA,KAAU,QAAA,IACjB,QAAA,IAAY,KAAA,IACX,KAAA,CAAsC,MAAA,EAAQ,OAAA,CAAQ,sBAAsB,CAAA,IAC/E,IAAA;AAEF,MAAA,IAAI,EAAE,kBAAkB,kBAAA,CAAA,EAAqB;AAC3C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAc,OAAO,MAAA,EAAQ,WAAA,KAAgB,QAAA,GAAW,OAAO,WAAA,GAAc,CAAA;AACnF,MAAA,MAAM,iBAAiB,OAAO,MAAA,EAAQ,cAAA,KAAmB,QAAA,GAAW,OAAO,cAAA,GAAiB,EAAA;AAC5F,MAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAsB;AACvD,MAAA,MAAM,OAAA,GAAU,OAAO,qBAAA,EAAsB;AAC7C,MAAA,MAAM,QAAA,GAAW,MAAA,GAAS,WAAW,CAAA,EAAG,IAAA,GAAO,cAAc,CAAA,IAAK,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA;AAChG,MAAA,MAAM,KAAA,GACJ,OAAO,QAAA,KAAa,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,GACpD,QAAA,CAAS,cAAA,EAAe,GACxB,MAAA,CAAO,QAAQ,CAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,cAAc,CAAA,IAAK,EAAA;AAC7C,MAAA,MAAM,UAAA,GAAa,MAAA,GAAS,WAAW,CAAA,EAAG,IAAA,IAAQ,OAAA;AAElD,MAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,KAAA,EAAO,SAAS,CAAA;AACpD,MAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,KAAA,EAAO,SAAS,CAAA;AACpD,MAAA,MAAM,eAAe,OAAA,CAAQ,IAAA,GAAO,QAAA,CAAS,IAAA,GAAO,QAAQ,KAAA,GAAQ,CAAA;AACpE,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,GAAM,QAAA,CAAS,GAAA,GAAM,iBAAA;AACjD,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,KAAA,GAAQ,mBAAmB,iBAAiB,CAAA;AAC9E,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,MAAA,GAAS,mBAAmB,iBAAiB,CAAA;AAE9E,MAAA,MAAM,IAAA,GAAO,KAAA;AAAA,QACX,OAAA,KAAY,IAAA,GAAO,OAAA,GAAU,QAAA,CAAS,IAAA,GAAO,YAAA;AAAA,QAC7C,iBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,GAAA,GAAM,KAAA;AAAA,QACV,OAAA,KAAY,IAAA,GAAO,OAAA,GAAU,QAAA,CAAS,MAAM,uBAAA,GAA0B,WAAA;AAAA,QACtE,iBAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,gBAAA,CAAiB,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,SAAA,EAAW,MAAA,EAAQ,gBAAgB;AAAA,GACnD;AAEA,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,MAAM;AACzC,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,EACvB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAuBK,cAAQ,MAAM;AACzC,IAAA,MAAM,IAAA,GAAO,cACR,WAAA,GACA;AAAA,MACC,WAAA,EAAa;AAAA,QACX,GAAA,EAAK,EAAE,WAAA,EAAa,KAAA;AAAM,OAC5B;AAAA,MACA,MAAA,EAAQ,EAAE,QAAA,EAAU,QAAA,EAAU,iBAAiB,QAAA,EAAS;AAAA,MACxD,YAAY,EAAE,OAAA,EAAS,SAAA,KAAc,KAAA,IAAS,cAAc,OAAA,EAAQ;AAAA,MACpE,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,KAAA,EAAO,SAAA,KAAc,MAAA,IAAU,SAAA,KAAc,SAAS,CAAA,GAAI;AAAA,OAC5D;AAAA,MACA,MAAM,EAAE,OAAA,EAAS,SAAA,KAAc,MAAA,GAAS,MAAM,CAAA,EAAE;AAAA,MAChD,IAAA,EAAM;AAAA,QACJ,WAAA,EAAa,2DAAA;AAAA,QACb,eAAA,EAAiB;AAAA;AACnB,KACF;AAEJ,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,SAAA,EAAW,MAAA,EAAQ,aAAa,MAAM,CAAA;AACrE,IAAA,MAAM,cAAA,GAAiB,oBAAA;AAAA,MACrB,KAAA;AAAA,MACA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,MACxB;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAAoB;AAAA,MACxB,GAAG,IAAA;AAAA,MACH,KAAA,EAAO;AAAA,QACL,GAAI,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,QACnB,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,GAAI,IAAA,CAAK,KAAA,EAAO,OAAA,IAAW,EAAC;AAAA,UAC5B,IAAA,EAAM;AAAA,SACR;AAAA,QACA,UAAA,EAAY;AAAA,UACV,GAAI,IAAA,CAAK,KAAA,EAAO,UAAA,IAAc,EAAC;AAAA,UAC/B,OAAA,EAAS;AAAA,SACX;AAAA,QACA,UAAA,EAAY,SAAA;AAAA,QACZ,GAAI,gBAAA,GACA;AAAA,UACE,MAAA,EAAQ;AAAA,YACN,mBAAA,EAAqB,yBAAA;AAAA,YACrB,UAAA,EAAY;AAAA;AACd,YAEF;AAAC,OACP;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAI,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,QACrB,SAAS,CAAC,gBAAA;AAAA,QACV,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,KAAA,EAAO;AAAA,QACL,GAAI,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,QACnB,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAA,IAAS,MAAA;AAAA,QAC5B,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,GAAI,IAAA,CAAK,KAAA,EAAO,KAAA,IAAS,EAAC;AAAG,OAC3E;AAAA,MACA,MAAA,EAAQ,MAAA,EAAQ,MAAA,GAAS,MAAA,GAAU,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,cAAA;AAAA,MACrF,KAAA,EAAO,WAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAI,SAAA,CAAU,WAAA,IAAe,SAAA,KAAc,KAAA,IAAS,cAAc,OAAA,EAAS;AACzE,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK,CAAE,CAAA;AAAA,MACxE,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAI,IAAA,CAAK,SAAS,EAAC,EAAI,aAAa,IAAA,EAAK;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,OAAO,oBAAA,CAAqB,MAAM,cAAc,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,WAAA,EAAa,SAAA,EAAW,QAAQ,KAAA,EAAO,OAAA,EAAS,gBAAA,EAAkB,yBAAA,EAA2B,kBAAkB,MAAA,EAAQ,WAAA,EAAa,YAAA,EAAc,SAAA,CAAU,WAAW,CAAC,CAAA;AAE5K,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,uBACER,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wGACb,QAAA,kBAAAU,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EACV,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,QAAM;AAAA,OAAA,EAAE,CAAA;AAAA,MAChD,EAAE,qBAAqB;AAAA,KAAA,EAC1B,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,kBAAkB,YAAY;AAClC,IAAA,cAAA,CAAe,IAAI,CAAA;AAEnB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQC,2BAAA,CAAW,YAAA,CAAa,OAAO,CAAA;AAC7C,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,GAAA,GAAM,8BAAA;AACZ,QAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,QAAA,aAAA,GAAgB,GAAG,CAAA;AACnB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAS,MAAM,KAAA,CAAM,QAAQ,EAAE,KAAA,EAAO,GAAG,CAAA;AAE/C,MAAA,IAAI,EAAE,YAAY,MAAA,CAAA,EAAS;AACzB,QAAA,MAAM,GAAA,GAAM,kCAAA;AACZ,QAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,QAAA,aAAA,GAAgB,GAAG,CAAA;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,MAAA;AACnB,MAAA,IAAA,CAAK,QAAA,GAAW,GAAG,KAAA,CAAM,OAAA,CAAQ,eAAe,GAAG,CAAA,CAAE,aAAa,CAAA,UAAA,CAAA;AAClE,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,wBAAA;AACrD,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,aAAA,GAAgB,GAAG,CAAA;AAAA,IACrB,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,YAAA,IAAgB,KAAA;AACzC,EAAA,MAAM,gBAAgB,IAAA,GAClB,CAAA,mDAAA,EAAsD,UAAA,GAAa,uBAAA,GAA0B,EAAE,CAAA,CAAA,GAC/F,uKAAA;AACJ,EAAA,MAAM,WAAA,GAAc,UAAA,GAChB,MAAA,GACA,QAAA,CAAS,QAAQ,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,OAAA,CAAQ,MAAM,MAAA,GAAS,MAAA;AAEjG,EAAA,uBACED,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,aAAA;AAAA,MACX,YAAA,EAAc,gBAAA;AAAA,MAEd,QAAA,EAAA;AAAA,wBAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,GAAa,oBAAA,GAAuB,QAClD,QAAA,kBAAAA,cAAAA;AAAA,UAACY,+BAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,MAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAM,SAAA;AAAA,YACN,KAAA,EAAM,MAAA;AAAA,YACN,MAAA,EAAQ;AAAA;AAAA,SACV,EACF,CAAA;AAAA,QACC,gBAAA,IAAoB,iCACnBZ,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,mCAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,CAAA,EAAG,aAAA,CAAc,IAAI,CAAA,EAAA,CAAA;AAAA,cAC3B,GAAA,EAAK,CAAA,EAAG,aAAA,CAAc,GAAG,CAAA,EAAA,CAAA;AAAA,cACzB,SAAA,EAAW;AAAA,aACb;AAAA,YAEA,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mKAAA,EACZ,QAAA,EAAA;AAAA,cAAA,aAAA,CAAc,yBACbV,cAAAA,CAAC,SAAI,SAAA,EAAU,yEAAA,EACZ,wBAAc,KAAA,EACjB,CAAA;AAAA,8BAEFU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,CAAA;AAAA,gCACtDU,gBAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,kBAAA,aAAA,CAAc,UAAA;AAAA,kBAAW,IAAA;AAAA,kCAAEV,cAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,aAAA,CAAc,KAAA,EAAM;AAAA,iBAAA,EAC3D;AAAA,eAAA,EACF;AAAA,aAAA,EACF;AAAA;AAAA,SACF;AAAA,wBAEFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,eAAA;AAAA,YACT,QAAA,EAAU,WAAA;AAAA,YACV,SAAA,EAAU,0YAAA;AAAA,YACV,KAAA,EAAO,EAAE,uBAAuB,CAAA;AAAA,YAE/B,QAAA,EAAA,WAAA,mBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAAE,CAAA,mBAEhFU,eAAAA,CAAAG,qBAAA,EACE,QAAA,EAAA;AAAA,8BAAAb,cAAAA,CAACc,oBAAA,EAAA,EAAe,SAAA,EAAU,aAAA,EAAc,QAAO,MAAA,EAAO,CAAA;AAAA,8BACtDd,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAAE;AAAA,aAAA,EACvC;AAAA;AAAA,SAEJ,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAlfA,IA0CM,cAAA,EACA,mBACA,iBAAA,EACA,uBAAA;AA7CN,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAaA,IAAA,mBAAA,EAAA;AA6BA,IAAM,iBAAiB,CAAC,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AAC7E,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,iBAAA,GAAoB,CAAA;AAC1B,IAAM,uBAAA,GAA0B,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACzBnBe;AApBb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gDAAA,GAAA;AAOA,IAAA,mBAAA,EAAA;AAaO,IAAMA,yBAAA,GAAoBC,UAAAA,CAAK,SAASD,kBAAAA,CAAkB;AAAA,MAC/D,OAAA;AAAA,MACA,QAAA,GAAW,KAAA;AAAA,MACX,KAAA;AAAA,MACA;AAAA,KACF,EAA2B;AACzB,MAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,MAAA,MAAM,aAAA,GAAgB,KAAA,IAAS,CAAA,CAAE,eAAe,CAAA;AAChD,MAAA,MAAM,uBAAA,GAA0B,eAAA,IAAmB,CAAA,CAAE,0BAA0B,CAAA;AAC/E,MAAA,uBACEL,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA,EAAU,8TAAA;AAAA,UACV,YAAA,EAAY,aAAA;AAAA,UACZ,KAAA,EAAO,WAAW,uBAAA,GAA0B,aAAA;AAAA,UAE5C,QAAA,EAAA;AAAA,4BAAAV,eAACiB,aAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,4BACjCjB,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,aAAA,EAAc;AAAA;AAAA;AAAA,OACvB;AAAA,IAEJ,CAAC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJM,SAAS,gBAAA,CACd,SACA,SAAA,EACkB;AAElB,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACxC,IAAA,OAAO,EAAE,OAAA,EAAS,SAAA,EAAW,EAAC,EAAE;AAAA,EAClC;AAIA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAU,CAAA;AAEjF,EAAA,IAAI,gBAAA,GAAmB,OAAA;AACvB,EAAA,MAAM,qBAAiE,EAAC;AAGxE,EAAA,eAAA,CAAgB,OAAA,CAAQ,CAAC,QAAA,EAAU,KAAA,KAAU;AAC3C,IAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,QAAA;AAGjC,IAAA,IAAI,aAAa,CAAA,IAAK,QAAA,GAAW,gBAAA,CAAiB,MAAA,IAAU,cAAc,QAAA,EAAU;AAClF,MAAA,OAAA,CAAQ,KAAK,+CAAA,EAAiD;AAAA,QAC5D,UAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAe,gBAAA,CAAiB;AAAA,OACjC,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,UAAU,MAAA,GAAS,KAAA;AAGxC,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,KAAA,CAAM,QAAQ,CAAA;AAC7C,IAAA,gBAAA,GAAmB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,YAAY,IAAI,KAAK,CAAA,CAAA;AAGrD,IAAA,kBAAA,CAAmB,OAAA,CAAQ;AAAA,MACzB,GAAG,QAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,gBAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AACF;AAvFA,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACeO,SAASkB,UAAS,KAAA,EAAkD;AACzE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,WAAc,KAAA,EAAa;AAClC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EAC7C;AACA,EAAA,IAAIA,SAAAA,CAAS,KAAK,CAAA,EAAG;AACnB,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAACd,IAAAA,EAAK,MAAM,CAAA,KAAM;AAC/C,MAAA,GAAA,CAAIA,IAAG,CAAA,GAAI,UAAA,CAAW,MAAM,CAAA;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAsC;AAC3D,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAAC,IAAA,OAAO,MAAA;AAAA,EAAU;AAC7C,EAAA,MAAM,MAAA,GAAS,KAAA,CACZ,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAC3C,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAAC,MAAA,OAAO,OAAO,IAAI,CAAA;AAAA,IAAE;AAC5E,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,IAAA,KAAyB,OAAO,SAAS,QAAQ,CAAA;AAC5D,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AACtC;AAEA,SAAS,sBAAsB,KAAA,EAAsC;AACnE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,CAACc,UAAS,IAAI,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAChD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,IAAA,EAAM;AAC7B,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACvD,QAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACf,QAAA;AAAA,MACF;AACA,MAAA,IAAIA,SAAAA,CAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG;AAC9E,QAAA,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AACjB,QAAA;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,CAAK,IAAA,EAAK,GAAI,IAAA,CAAK,IAAA,GAAO,YAAA;AAC7E,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,IAAA;AACtC;AAEA,SAAS,mBAAmB,KAAA,EAA+C;AACzE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAC5C,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAC5C,EAAA,IAAI,qBAAA,CAAsB,GAAA,CAAI,UAAoC,CAAA,EAAG;AACnE,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,2BAA2B,OAAA,EAAuD;AACzF,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,EAAA,IAAIA,UAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,gBAAgB,SAAA,EAAW;AAC7D,IAAA,OAAO,KAAA,CAAM,WAAA;AAAA,EACf;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAIA,UAAS,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,gBAAgB,SAAA,EAAW;AAC3D,QAAA,IAAI,KAAK,WAAA,EAAa;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,0BAAA,CACP,MACA,aAAA,EACkB;AAClB,EAAA,MAAM,UAAUA,SAAAA,CAAS,IAAA,CAAK,OAAO,CAAA,GAAI,KAAK,OAAA,GAAU,IAAA;AACxD,EAAA,MAAM,QAAQA,SAAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GAAI,QAAQ,KAAA,GAAQ,MAAA;AACxD,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,KAAA,EAAO,IAAI,CAAA;AAChD,EAAA,IAAI,CAAC,SAAA,EAAW;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAE7B,EAAA,MAAM,QAAA,GAAWA,UAAS,OAAA,CAAQ,KAAK,IAAI,OAAA,CAAQ,KAAA,CAAM,OAAO,OAAA,CAAQ,KAAA;AACxE,EAAA,MAAM,QAAQ,OAAO,QAAA,KAAa,YAAY,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,aAAA;AAE3E,EAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAC1B,EAAA,IAAI,MAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,SAAA,KAAc,KAAA,IAAS,SAAA,KAAc,OAAA,EAAS;AAChD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAC,CAAA;AAChH,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,MAAA,GAAS,CAAC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,SAAS,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,sBAAsB,SAAS,CAAA;AAAA,MAC1C;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,sBAAsB,SAAS,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAE1B,EAAA,MAAM,MAAA,GACJ,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA,KAC3BA,SAAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GAAI,aAAA,CAAc,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,GAAI,MAAA,CAAA;AAEvE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,MAAM,MAAA,GACJ,KAAA,IAAS,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,GACrE,KAAA,CAAM,MAAA,GACN,MAAA;AACN,EAAA,MAAM,WAAA,GAAc,2BAA2B,OAAO,CAAA;AAEtD,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,WAAW,OAAO,CAAA;AAAA,IAC3B;AAAA,GACF;AACF;AAKO,SAAS,sBAAA,CACd,IAAA,EACA,aAAA,GAAgB,OAAA,EACE;AAClB,EAAA,OAAO,0BAAA,CAA2B,MAAM,aAAa,CAAA;AACvD;AAKO,SAAS,4BAAA,CACd,IAAA,EACA,aAAA,GAAgB,OAAA,EACE;AAClB,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,OAAA,EAAS;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAE3B,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAACA,SAAAA,CAAS,IAAI,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAClC,EAAA,OAAO,sBAAA,CAAuB,MAAM,aAAa,CAAA;AACnD;AA1LA,IAOa,qBAAA;AAPb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AAOO,IAAM,qBAAA,uBAA4B,GAAA,CAA4B;AAAA,MACnE,MAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACLM,SAAS,yBAAyB,QAAA,EAA0B;AACjE,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAC9C,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,WAAA,GAAc,KAAA;AAAA,MAChB,CAAA,MAAA,IAAW,KAAA,CAAM,CAAC,CAAA,KAAM,WAAA,CAAY,CAAC,CAAA,IAAK,KAAA,CAAM,MAAA,IAAU,WAAA,CAAY,MAAA,EAAQ;AAC5E,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,WAAA,GAAc,EAAA;AAAA,MAChB;AACA,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAC,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAEA,SAAS,mBAAmB,QAAA,EAA2B;AACrD,EAAA,OAAO,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,SAAS,QAAA,CAAS,KAAK,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,QAAA,CAAS,SAAS,KAAK,CAAA;AACpH;AAEA,SAAS,eAAe,IAAA,EAA6B;AACnD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AAC5C,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAC5B;AAEA,SAAS,yBAAyB,IAAA,EAAsB;AACtD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACpD,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,CAAC,CAAA,GAAI,OAAA,CACX,QAAQ,OAAA,EAAS,MAAM,IAAI,CAAA,CAC3B,OAAA,CAAQ,SAAS,MAAM,IAAI,EAC3B,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,OAAA,CAAQ,SAAS,GAAG,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,QAAA,CAAS,KAAK,EAAE,CAAA;AACzB;AAlEA,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACsBaC;AAtBb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8CAAA,GAAA;AAMA,IAAA,sBAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AAeO,IAAMA,uBAAA,GAAkBH,UAAAA,CAAK,SAASG,gBAAAA,CAAgB;AAAA,MAC3D,QAAA;AAAA,MACA,WAAA,EAAAC,YAAAA;AAAA,MACA,QAAA,GAAW,KAAA;AAAA,MACX,aAAA;AAAA,MACA;AAAA,KACF,EAAyB;AACvB,MAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,MAAA,MAAM,qBAAA,GAAwB,aAAA,IAAiB,CAAA,CAAE,2BAA2B,CAAA;AAC5E,MAAA,MAAM,mBAAA,GAAsB,WAAA,IAAe,CAAA,CAAE,eAAe,CAAA;AAC5D,MAAA,MAAM,YAAA,GAAejB,kBAAY,MAAM;AACrC,QAAAiB,eAAc,qBAAqB,CAAA;AAAA,MACrC,CAAA,EAAG,CAACA,YAAAA,EAAa,qBAAqB,CAAC,CAAA;AAEvC,MAAA,uBACEV,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAb,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,kBAAAA,eAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAS,CAAA,EACrE,CAAA;AAAA,QACCoB,YAAAA,oBACCpB,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EACb,QAAA,kBAAAA,cAAAA,CAACe,yBAAA,EAAA,EAAkB,OAAA,EAAS,YAAA,EAAc,QAAA,EAAoB,KAAA,EAAO,qBAAqB,CAAA,EAC5F;AAAA,OAAA,EAEJ,CAAA;AAAA,IAEJ,CAAC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChDD,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,SAAA,EAAA,MAAAM,iBAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA6DA,SAAS,WAAA,GAAc;AACrB,EAAA,OAAOC,2BAAqB,aAAA,CAAc,SAAA,EAAW,aAAA,CAAc,WAAA,EAAa,cAAc,iBAAiB,CAAA;AACjH;AA2BA,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,IAAI,CAAC,IAAA,EAAM;AAAC,IAAA,OAAO,MAAA;AAAA,EAAO;AAC1B,EAAA,OAAO,YAAY,IAAA,CAAK,WAAA,EAAa,CAAA,IAAK,KAAK,WAAA,EAAY;AAC7D;AAEA,SAAS,SAAA,CAAU;AAAA,EACjB,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,iBAAA,GAAoB,SAAA,IAAa,CAAA,CAAE,qBAAqB,CAAA;AAC9D,EAAA,MAAM,mBAAA,GAAsB,WAAA,IAAe,CAAA,CAAE,uBAAuB,CAAA;AACpE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIhB,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,aAAa,WAAA,EAAY;AAC/B,EAAA,MAAM,cAAA,GAAiBC,aAAsB,IAAI,CAAA;AACjD,EAAA,MAAM,oBAAA,GAAuBA,aAAsB,IAAI,CAAA;AAEvD,EAAA,MAAM,kBAAA,GAAqB,kBAAkB,QAAQ,CAAA;AAGrD,EAAAE,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,cAAA,CAAe,YAAY,IAAA,EAAM;AACnC,QAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA,MACrC;AACA,MAAA,IAAI,oBAAA,CAAqB,YAAY,IAAA,EAAM;AACzC,QAAA,YAAA,CAAa,qBAAqB,OAAO,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,KAAK,CAAA;AACzC,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,MAAA,IAAI,cAAA,CAAe,YAAY,IAAA,EAAM;AACnC,QAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA,MACrC;AACA,MAAA,cAAA,CAAe,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AAC/C,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,MAC3B,GAAG,GAAI,CAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AACpC,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,IAAI,oBAAA,CAAqB,YAAY,IAAA,EAAM;AACzC,QAAA,YAAA,CAAa,qBAAqB,OAAO,CAAA;AAAA,MAC3C;AACA,MAAA,oBAAA,CAAqB,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACrD,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAAA,MACjC,GAAG,GAAI,CAAA;AAAA,IACT;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBACET,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yGACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4FAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wHAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA,kBAAA,EACH,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAW,CAAA,oDAAA,EACT,UAAA,GACI,gCAAA,GACA,4EACN,CAAA,CAAA;AAAA,UACA,KAAA,EAAO,iBAAA;AAAA,UACP,WAAA,EAAU,QAAA;AAAA,UAET,QAAA,EAAA,MAAA,mBACCU,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAb,eAACuB,WAAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,4BACrCvB,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,mBAAA,EAAoB;AAAA,WAAA,EAC7B,CAAA,mBAEAU,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAb,eAACwB,UAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,4BACpCxB,cAAAA,CAAC,MAAA,EAAA,EAAM,uBAAa,CAAA,CAAE,2BAA2B,IAAI,iBAAA,EAAkB;AAAA,WAAA,EACzE;AAAA;AAAA;AAEJ,KAAA,EACF,CAAA;AAAA,oBAGAA,cAAAA;AAAA,MAACyB,4BAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,kBAAA;AAAA,QACV,KAAA,EAAO,aAAaC,iBAAA,GAAcC,QAAA;AAAA,QAClC,WAAA,EAAa;AAAA,UACX,MAAA,EAAQ,CAAA;AAAA,UACR,YAAA,EAAc,CAAA;AAAA,UACd,QAAA,EAAU,UAAA;AAAA,UACV,UAAA,EAAY,KAAA;AAAA,UACZ,OAAA,EAAS;AAAA,SACX;AAAA,QACA,eAAA,EAAiB,KAAA;AAAA,QACjB,SAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAc;AAAA,UACZ,KAAA,EAAO;AAAA,YACL,UAAA,EAAY;AAAA;AACd,SACF;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAvNA,IAyBM,aAAA,CAAA,CAyCA,aAuJAN,0BAAA,CAAA,KAIC;AA7NP,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAOA,IAAA,mBAAA,EAAA;AAkBA,IAAM,iBAAiB,MAAM;AAC3B,MAAA,IAAI,OAAA,GACF,OAAO,QAAA,KAAa,WAAA,KACnB,SAAS,eAAA,CAAgB,SAAA,CAAU,SAAS,MAAM,CAAA,IAChD,CAAC,QAAA,CAAS,eAAA,CAAgB,UAAU,QAAA,CAAS,OAAO,KACnD,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA,CAAA;AACxD,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgB;AAEtC,MAAA,SAAS,KAAA,GAAQ;AACf,QAAA,MAAM,IAAA,GACJ,OAAO,QAAA,KAAa,WAAA,KACnB,SAAS,eAAA,CAAgB,SAAA,CAAU,SAAS,MAAM,CAAA,IAChD,CAAC,QAAA,CAAS,eAAA,CAAgB,UAAU,QAAA,CAAS,OAAO,KACnD,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA,CAAA;AACxD,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,EAAA,KAAO,EAAA,EAAI,CAAA;AAAA,QAChC;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,QAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,KAAK,CAAA;AAC3C,QAAA,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAS,eAAA,EAAiB,EAAE,UAAA,EAAY,MAAM,eAAA,EAAiB,CAAC,OAAO,CAAA,EAAG,CAAA;AAC3F,QAAA,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,gBAAA,CAAiB,UAAU,KAAK,CAAA;AAAA,MACpF;AAEA,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,CAAC,EAAA,KAAmB;AAC7B,UAAA,SAAA,CAAU,IAAI,EAAE,CAAA;AAChB,UAAA,OAAO,MAAM;AAAE,YAAA,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,UAAG,CAAA;AAAA,QACvC,CAAA;AAAA,QACA,aAAa,MAAM,OAAA;AAAA,QACnB,mBAAmB,MAAM;AAAA,OAC3B;AAAA,IACF,CAAA,GAAG;AAOH,IAAM,WAAA,GAAsC;AAAA,MAC1C,EAAA,EAAI,YAAA;AAAA,MACJ,EAAA,EAAI,YAAA;AAAA,MACJ,GAAA,EAAK,KAAA;AAAA,MACL,GAAA,EAAK,KAAA;AAAA,MACL,EAAA,EAAI,QAAA;AAAA,MACJ,EAAA,EAAI,MAAA;AAAA,MACJ,GAAA,EAAK,MAAA;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,GAAA,EAAK,KAAA;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,GAAA,EAAK,KAAA;AAAA,MACL,GAAA,EAAK,KAAA;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,GAAA,EAAK,KAAA;AAAA,MACL,CAAA,EAAG,GAAA;AAAA,MACH,MAAA,EAAQ,QAAA;AAAA,MACR,GAAA,EAAK;AAAA,KACP;AAiIA,IAAMA,iBAAA,GAAoBL,WAAK,SAAS,CAAA;AACxC,IAAAK,iBAAA,CAAkB,WAAA,GAAc,WAAA;AAGhC,IAAO,iBAAA,GAAQA,iBAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7Nf,IAAA,wBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,wBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAAO,wBAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA6EA,SAAS,iBAAiB,QAAA,EAA8B;AACtD,EAAA,OAAOC,eAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AAChD,IAAA,IAAI,CAACC,oBAAA,CAAe,KAAK,CAAA,EAAG;AAC1B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAChC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,gBAAA,CAAkB,KAAA,CAAM,KAAA,CAAmC,QAAQ,CAAA;AAAA,IAC5E;AAGA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,EAAAV,YAAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,SAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,iBAAA,GAAoB,SAAA,IAAa,CAAA,CAAE,qBAAqB,CAAA;AAC9D,EAAA,MAAM,mBAAA,GAAsB,WAAA,IAAe,CAAA,CAAE,uBAAuB,CAAA;AACpE,EAAA,MAAM,mBAAA,GAAsB,WAAA,IAAe,CAAA,CAAE,eAAe,CAAA;AAE5D,EAAA,MAAM,SAAA,GAAYZ,cAAQ,MAAM;AAC9B,IAAA,OAAO,gBAAA,CAAiB,SAAS,SAAS,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AACvB,EAAA,MAAM,iBAAA,GAAoBA,aAAAA,CAAQ,MAAM,wBAAA,CAAyB,SAAA,CAAU,OAAO,CAAA,EAAG,CAAC,SAAA,CAAU,OAAO,CAAC,CAAA;AAExG,EAAA,MAAM,UAAA,GAAyBA,aAAAA;AAAA,IAC7B,OAAO;AAAA;AAAA,MAEL,GAAA,EAAK,CAAC,EAAE,QAAA,uBAAeR,cAAAA,CAAAa,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAAA,MACnC,KAAK,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,MAAK,EAAc;AACrD,QAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,SAAA,IAAa,EAAE,CAAA;AACnD,QAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AACpC,QAAA,MAAM,QAAQ,MAAA,CAAO,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAIhD,QAAA,MAAM,YAAA,GAAe,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AACxC,QAAA,MAAM,SAAA,GAAY,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,IAAA;AACzC,QAAA,MAAM,OAAA,GAAU,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,IAAA;AACrC,QAAA,MAAM,eAAA,GAAkB,SAAA,KAAc,MAAA,IAAa,OAAA,KAAY,UAAa,SAAA,KAAc,OAAA;AAC1F,QAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,IAAa,CAAC,iBAAiB,eAAA,IAAmB,SAAA,KAAc,UAAa,OAAA,KAAY,MAAA,CAAA;AACjH,QAAA,MAAM,QAAA,GAAW,MAAA,KAAW,IAAA,IAAS,MAAA,KAAW,KAAA,IAAS,cAAA;AAEzD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,uBACEb,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yGACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QAEJ;AAEA,QAAA,MAAM,IAAA,GAAO,SAAS,WAAA,EAAY;AAClC,QAAA,MAAM,YACJ,IAAA,KAAS,OAAA,GACL,4BAAA,CAA6B,KAAA,EAAO,OAAO,CAAA,GAC3C,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,aAAa,CAAA,GAC7C,4BAAA,CAA6B,KAAA,EAAO,OAAO,CAAA,GAC3C,IAAA;AAER,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAsB,CAAA,EACnC,CAAA;AAAA,QAEJ;AAGA,QAAA,uBACEA,cAAAA;AAAA,UAAC+B,cAAA;AAAA,UAAA;AAAA,YACC,QAAA,kBACE/B,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,KAAA,EAAM,CAAA,EAC7C,CAAA;AAAA,YAGF,QAAA,kBAAAA,cAAAA;AAAA,cAACgC,UAAAA;AAAA,cAAA;AAAA,gBACC,QAAA;AAAA,gBACA,KAAA;AAAA,gBACA,MAAA,EAAQ,KAAA;AAAA,gBACR,SAAA,EAAW,iBAAA;AAAA,gBACX,WAAA,EAAa;AAAA;AAAA;AACf;AAAA,SACF;AAAA,MAEJ,CAAA;AAAA,MACA,CAAA,EAAG,CAAC,EAAE,QAAA,EAAS,KAAM;AACnB,QAAA,IAAI,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAC9B,UAAA,uBAAOhC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAmB,QAAA,EAAS,CAAA;AAAA,QACpD;AAEA,QAAA,uBAAOA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAmB,QAAA,EAAS,CAAA;AAAA,MAClD,CAAA;AAAA,MACA,GAAG,CAAC,EAAE,IAAA,EAAM,QAAA,uBACVA,cAAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAA;AAAA,UACA,MAAA,EAAO,QAAA;AAAA,UACP,GAAA,EAAI,qBAAA;AAAA,UACJ,SAAA,EAAU,8VAAA;AAAA,UAET;AAAA;AAAA,OACH;AAAA,MAEF,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAS,CAAA;AAAA,MACzF,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAS,CAAA;AAAA,MACxF,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAS,CAAA;AAAA,MAC5F,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+CAAA,EAAiD,QAAA,EAAS,CAAA;AAAA,MAC9F,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAS,CAAA;AAAA,MAC5F,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAS,CAAA;AAAA,MAC1F,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EAAoD,QAAA,EAAS,CAAA;AAAA,MACjG,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAS,CAAA;AAAA,MACpG,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EAAe,QAAA,EAAS,CAAA;AAAA,MAC5D,UAAA,EAAY,CAAC,EAAE,QAAA,EAAS,qBACtBA,cAAAA,CAAC,YAAA,EAAA,EAAW,SAAA,EAAU,uHAAA,EACnB,QAAA,EACH,CAAA;AAAA,MAEF,KAAA,EAAO,CAAC,EAAE,QAAA,uBACRA,cAAAA;AAAA,QAACmB,uBAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAaC,YAAAA;AAAA,UACb,QAAA,EAAU,YAAA;AAAA,UACV,WAAA,EAAa,mBAAA;AAAA,UAEZ;AAAA;AAAA,OACH;AAAA,MAEF,KAAA,EAAO,CAAC,EAAE,QAAA,EAAS,qBACjBpB,cAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAS,CAAA;AAAA,MAE3E,KAAA,EAAO,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAS,CAAA;AAAA,MACrE,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2DAAA,EAA6D,QAAA,EAAS,CAAA;AAAA,MAEtF,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wFAAA,EACX,QAAA,EACH,CAAA;AAAA,MAEF,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gEAAA,EAAkE,QAAA,EAAS,CAAA;AAAA,MAE3F,IAAI,sBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,uDAAA,EAAwD,CAAA;AAAA,MAChF,MAAA,EAAQ,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAS,CAAA;AAAA,MACtF,EAAA,EAAI,CAAC,EAAE,QAAA,EAAS,qBAAMA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAS;AAAA,KACrE,CAAA;AAAA,IACA,CAAC,iBAAA,EAAmB,mBAAA,EAAqB,mBAAA,EAAqBoB,cAAa,YAAY;AAAA,GACzF;AAEA,EAAA,uBACEpB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAAA,cAAAA;AAAA,IAACiC,8BAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAe,CAACC,0BAAA,EAAWC,2BAAU,CAAA;AAAA,MACrC,aAAA,EAAe,CAAC,CAACC,4BAAA,EAAa,EAAE,MAAA,EAAQ,QAAA,EAAU,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,CAAC,CAAA;AAAA,MAC1F,UAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAzPA,IA0BMJ,UAAAA,CAAAA,CA+BA,aAkMAJ,iCAAA,CAAA,KAIC;AA/PP,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+CAAA,GAAA;AAiBA,IAAA,sBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AAEA,IAAA,oBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AAGA,IAAMI,UAAAA,GAAYK,UAAA,CAAK,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA,CAAsB,IAAA,CAAK,CAAC,MAAA,MAAY,EAAE,OAAA,EAAS,MAAA,CAAO,SAAA,EAAU,CAAE,CAAC,CAAA;AA+BpG,IAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,MAC1B,GAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAgLD,IAAMT,wBAAA,GAA2BZ,WAAK,gBAAgB,CAAA;AACtD,IAAAY,wBAAA,CAAyB,WAAA,GAAc,kBAAA;AAGvC,IAAO,wBAAA,GAAQA,wBAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrPR,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;;;AC/DO,SAAS,0BAAA,GAAsC;AACpD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAEjD,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA;AACxC,EAAA,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,aAAa,MAAM,GAAA,EAAK;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAE9D,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,oBAAoB,CAAA,KAAM,GAAA;AAAA,EAC/D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACHO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAK5C,YAAY,IAAA,EAA6E;AACvF,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACpB;AACF,CAAA;AAsBO,SAAS,sBAAsB,OAAA,EAAuC;AAC3E,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,KAAA;AACnC,EAAA,MAAM,SAAA,GAAY,OAAO,OAAA,CAAQ,SAAA,KAAc,YAAY,OAAA,CAAQ,SAAA,GAAY,CAAA,GAAI,OAAA,CAAQ,SAAA,GAAY,CAAA;AAEvG,EAAA,eAAe,IAAA,CAAuB,QAAgB,MAAA,EAAmC;AACvF,IAAA,MAAM,MAAkB,EAAE,EAAA,EAAI,OAAO,UAAA,EAAW,EAAG,QAAQ,MAAA,EAAO;AAClE,IAAA,MAAM,SAAA,GAAY,OAAO,WAAA,KAAgB,WAAA,GAAc,YAAY,GAAA,EAAI,GAAI,KAAK,GAAA,EAAI;AACpF,IAAA,MAAM,eAAA,GAAkB,SAAA,GAAY,CAAA,GAAI,IAAI,iBAAgB,GAAI,MAAA;AAChE,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,qBAAA,CAAsB;AAAA,MACpB,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI;AACF,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,aAAA,GAAgB,WAAW,MAAM;AAC/B,UAAA,QAAA,GAAW,IAAA;AACX,UAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,QACxB,GAAG,SAAS,CAAA;AAAA,MACd;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU;AAAA,QAC3C,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,QACxB,QAAQ,eAAA,EAAiB;AAAA,OAC1B,CAAA;AAED,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,QAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,UAC3B,IAAA,EAAM,YAAA;AAAA,UACN,OAAA,EAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,UAC5B,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,SAChC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,UAC3B,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,UACjB,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,UACpB,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,SACrB,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,IAAA,CAAK,WAAW,KAAA,CAAA,EAAW;AAC7B,QAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,UAC3B,IAAA,EAAM,kBAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,qBAAA,CAAsB;AAAA,QACpB,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAA,EAAQ,SAAA;AAAA,QACR,UAAA,EAAY,UAAU,SAAS;AAAA,OAChC,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,MAAA,GAAkB,GAAA;AACtB,MAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA,MAAA,GAAS,IAAI,kBAAA,CAAmB;AAAA,UAC9B,IAAA,EAAM,WAAW,SAAA,GAAY,SAAA;AAAA,UAC7B,OAAA,EAAS,QAAA,GAAW,CAAA,4BAAA,EAA+B,SAAS,CAAA,EAAA,CAAA,GAAO,yBAAA;AAAA,UACnE,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AACA,MAAA,qBAAA,CAAsB;AAAA,QACpB,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAA,EAAQ,OAAA;AAAA,QACR,UAAA,EAAY,UAAU,SAAS,CAAA;AAAA,QAC/B,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,MAAM,MAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,QAAA,YAAA,CAAa,aAAa,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAe,SAAA,CAGb,QAAiB,MAAA,EAAyE;AAC1F,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAC3B;AAUA,SAAS,sBAAsB,MAAA,EAAqB;AAClD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,IAAA;AAAA,EAAO;AAE3C,EAAA,IAAI,CAAC,4BAA2B,EAAG;AAAC,IAAA;AAAA,EAAO;AAE3C,EAAA,MAAA,CAAO,cAAc,IAAI,WAAA,CAAY,mBAAmB,EAAE,MAAA,EAAQ,CAAC,CAAA;AACrE;AAEA,SAAS,UAAU,SAAA,EAA2B;AAC5C,EAAA,MAAM,GAAA,GAAM,OAAO,WAAA,KAAgB,WAAA,GAAc,YAAY,GAAA,EAAI,GAAI,KAAK,GAAA,EAAI;AAC9E,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AAChD;;;ACpIO,SAAS,wBAAwB,KAAA,EAAyB;AAC/D,EAAA,IAAI,CAAC,KAAA,EAAO;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAE1B,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AACtC,IAAA,IAAI,IAAI,QAAA,CAAS,WAAW,KAAK,GAAA,CAAI,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAAA,EACnF;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,MAAM,GAAA,GAAM,KAAA;AAGZ,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,SAAS,GAAA,EAAK;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAC/D,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AACrC,IAAA,IAAI,GAAA,CAAI,eAAe,GAAA,EAAK;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAGzC,IAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,GAAA,CAAI,aAAa,IAAA,EAAM;AAC7D,MAAA,MAAM,OAAO,GAAA,CAAI,QAAA;AACjB,MAAA,IAAI,IAAA,CAAK,WAAW,GAAA,EAAK;AAAC,QAAA,OAAO,IAAA;AAAA,MAAK;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,IAAA,IAAI,MAAM,QAAA,CAAS,WAAW,KAAK,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAAA,EACvF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAoC;AACzD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AAAC,IAAA,OAAO,MAAA;AAAA,EAAU;AAC3D,EAAA,MAAM,GAAA,GAAM,KAAA;AAEZ,EAAA,IAAI,OAAO,GAAA,CAAI,MAAA,KAAW,QAAA,EAAU;AAAC,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EAAO;AACvD,EAAA,IAAI,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,EAAU;AAAC,IAAA,OAAO,GAAA,CAAI,UAAA;AAAA,EAAW;AAE/D,EAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,IAAY,GAAA,CAAI,YAAY,IAAA,EAAM;AAC3D,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,IAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,EAAU;AAAC,MAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IAAO;AAC/D,IAAA,IAAI,OAAO,OAAA,CAAQ,UAAA,KAAe,QAAA,EAAU;AAAC,MAAA,OAAO,OAAA,CAAQ,UAAA;AAAA,IAAW;AAAA,EACzE;AAEA,EAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,GAAA,CAAI,aAAa,IAAA,EAAM;AAC7D,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,IAAI,OAAO,QAAA,CAAS,MAAA,KAAW,QAAA,EAAU;AAAC,MAAA,OAAO,QAAA,CAAS,MAAA;AAAA,IAAO;AAAA,EACnE;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAA,GAAwB;AAC/B,EAAA,OAAO,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,MAAA,KAAW,KAAA;AAClE;AAEA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,IAAI,cAAa,EAAG;AAAC,IAAA,OAAO,SAAA;AAAA,EAAU;AAEtC,EAAA,IAAI,iBAAiB,kBAAA,EAAoB;AACvC,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA,CAAE,WAAA,GAAc,IAAA,EAAK;AACzD,IAAA,IAAI,IAAA,EAAM;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAAA,EACzB;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,OAAO,IAAI,IAAA,KAAS,QAAA,IAAY,IAAI,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAC1D,MAAA,OAAO,GAAA,CAAI,KAAK,WAAA,EAAY;AAAA,IAC9B;AACA,IAAA,IAAI,OAAO,IAAI,KAAA,KAAU,QAAA,IAAY,IAAI,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AAC5D,MAAA,OAAO,GAAA,CAAI,MAAM,WAAA,EAAY;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,EAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AAAC,IAAA,OAAO,WAAA;AAAA,EAAY;AAC1D,EAAA,IAAI,WAAW,GAAA,EAAK;AAAC,IAAA,OAAO,WAAA;AAAA,EAAY;AACxC,EAAA,IAAI,WAAW,GAAA,EAAK;AAAC,IAAA,OAAO,SAAA;AAAA,EAAU;AACtC,EAAA,IAAI,WAAW,GAAA,EAAK;AAAC,IAAA,OAAO,mBAAA;AAAA,EAAoB;AAChD,EAAA,IAAI,WAAW,GAAA,EAAK;AAAC,IAAA,OAAO,cAAA;AAAA,EAAe;AAC3C,EAAA,IAAI,MAAA,IAAU,UAAU,GAAA,EAAK;AAAC,IAAA,OAAO,cAAA;AAAA,EAAe;AACpD,EAAA,IAAI,MAAA,IAAU,UAAU,GAAA,EAAK;AAAC,IAAA,OAAO,aAAA;AAAA,EAAc;AAEnD,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAAC,IAAA,OAAA,GAAU,KAAA,CAAM,OAAA;AAAA,EAAQ;AACrD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AAAC,IAAA,OAAA,GAAU,KAAA;AAAA,EAAM;AAC5D,EAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAElC,EAAA,IAAI,MAAM,QAAA,CAAS,SAAS,KAAK,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,SAAA;AAAA,EAAU;AAChF,EAAA,IAAI,MAAM,QAAA,CAAS,OAAO,KAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,EAAG;AAAC,IAAA,OAAO,SAAA;AAAA,EAAU;AAC3E,EAAA,IAAI,MAAM,QAAA,CAAS,WAAW,KAAK,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAAC,IAAA,OAAO,WAAA;AAAA,EAAY;AAC5F,EAAA,IAAI,MAAM,QAAA,CAAS,WAAW,KAAK,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAAC,IAAA,OAAO,WAAA;AAAA,EAAY;AAC5F,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,mBAAmB,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG;AAAC,IAAA,OAAO,mBAAA;AAAA,EAAoB;AACrI,EAAA,IAAI,MAAM,QAAA,CAAS,SAAS,KAAK,KAAA,CAAM,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAAC,IAAA,OAAO,eAAA;AAAA,EAAgB;AAE5F,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,YAAA,CAAa,MAAc,aAAA,EAAmF;AACrH,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,iBAAA;AAAA,QACP,WAAA,EAAa,+CAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,mBAAA;AAAA,QACP,WAAA,EAAa,8CAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,kBAAA;AAAA,QACP,WAAA,EAAa,6CAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,wDAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,WAAA;AAAA,QACP,WAAA,EAAa,4CAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,mBAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,sBAAA;AAAA,QACP,WAAA,EAAa,0EAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,iBAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,aAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,iBAAA;AAAA,QACP,WAAA,EAAa,qEAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,mBAAA;AAAA,QACP,WAAA,EAAa,2CAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,YAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAa,kEAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,eAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,4DAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,aAAA;AAAA,QACP,WAAA,EAAa,yCAAA;AAAA,QACb,SAAA,EAAW;AAAA,OACb;AAAA;AAEN;AAEO,SAAS,iBAAA,CAAkB,OAAgB,aAAA,EAA2C;AAC3F,EAAA,MAAM,IAAA,GAAO,eAAe,KAAK,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,aAAa,CAAA;AAC7C,EAAA,MAAM,gBAAA,GAAmB,IAAA,KAAS,WAAA,IAAe,uBAAA,CAAwB,KAAK,CAAA;AAE9E,EAAA,IAAI,cAAc,IAAA,CAAK,WAAA;AACvB,EAAA,IAAI,KAAA,YAAiB,kBAAA,IAAsB,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK,KAAM,EAAA,IAAM,IAAA,CAAK,UAAU,aAAA,EAAe;AAC3I,IAAA,WAAA,GAAc,KAAA,CAAM,OAAA;AAAA,EACtB,WAAW,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,IAAW,SAAS,SAAA,EAAW;AACxE,IAAA,WAAA,GAAc,KAAA,CAAM,OAAA;AAAA,EACtB;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,WAAA;AAAA,IACA,WAAA,EAAa,eAAe,IAAA,CAAK,KAAA;AAAA,IACjC,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,kBAAA,EAAoB,gBAAA;AAAA,IACpB,WAAW,IAAA,KAAS,SAAA;AAAA,IACpB,WAAW,IAAA,KAAS,SAAA;AAAA,IACpB,YAAY,IAAA,KAAS,SAAA;AAAA,IACrB,YAAY,IAAA,KAAS;AAAA,GACvB;AACF;AAKO,SAAS,cAAA,CAAe,OAAgB,aAAA,EAAwC;AACrF,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,aAAa,CAAA;AACzD,EAAA,OAAO;AAAA,IACL,OAAO,UAAA,CAAW,KAAA;AAAA,IAClB,aAAa,UAAA,CAAW,WAAA;AAAA,IACxB,oBAAoB,UAAA,CAAW;AAAA,GACjC;AACF;;;ACxOA,IAAM,cAAA,GAAiB,eAAA;AACvB,IAAM,YAAY,GAAA,GAAM,IAAA;AAExB,SAAS,IAAI,SAAA,EAA2B;AACtC,EAAA,OAAO,CAAA,EAAG,cAAc,CAAA,EAAG,SAAS,CAAA,CAAA;AACtC;AAEA,SAAS,cAAc,KAAA,EAAuC;AAC5D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACjC,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,SAAA,CAAU,WAAmB,KAAA,EAAwB;AACnE,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,IAAA;AAAA,EAAO;AAC3C,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,KAAA,EAAO;AAAC,IAAA;AAAA,EAAO;AAE/C,EAAA,IAAI;AACF,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,MAAA,MAAA,CAAO,cAAA,CAAe,UAAA,CAAW,GAAA,CAAI,SAAS,CAAC,CAAA;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,cAAc,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,UAAA,EAAY;AAAC,MAAA;AAAA,IAAO;AAEzB,IAAA,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,SAAS,GAAG,UAAU,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,SAAS,UAAU,SAAA,EAAoC;AAC5D,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,IAAA,OAAO,EAAC;AAAA,EAAE;AAC9C,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,KAAA,EAAO;AAAC,IAAA,OAAO,EAAC;AAAA,EAAE;AAElD,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAC,CAAA;AACxD,IAAA,IAAI,CAAC,GAAA,EAAK;AAAC,MAAA,OAAO,EAAC;AAAA,IAAE;AAErB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAAC,MAAA,OAAO,EAAC;AAAA,IAAE;AAGvC,IAAA,OAAO,MAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,OAAO;AAAA,QACL,SAAS,OAAO,GAAA,EAAK,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,EAAA;AAAA,QAC1D,WAAA,EAAa,MAAM,OAAA,CAAQ,GAAA,EAAK,WAAW,CAAA,GAAI,GAAA,CAAI,cAAc;AAAC,OACpE;AAAA,IACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAK,KAAM,EAAA,IAAA,CAAO,CAAA,CAAE,WAAA,EAAa,MAAA,IAAU,KAAK,CAAC,CAAA;AAAA,EAC9E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;AC9DA,IAAMU,eAAAA,GAAiB,eAAA;AAEvB,SAASlC,KAAI,SAAA,EAA2B;AACtC,EAAA,OAAO,CAAA,EAAGkC,eAAc,CAAA,EAAG,SAAS,CAAA,CAAA;AACtC;AAEA,SAAS,uBAAuB,SAAA,EAA4B;AAC1D,EAAA,OAAO,OAAA,CAAQ,SAAA,IAAa,SAAA,KAAc,KAAK,CAAA;AACjD;AAEO,SAAS,aAAA,CAAc,WAAmB,OAAA,EAAwB;AACvE,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,IAAA;AAAA,EAAO;AAC3C,EAAA,IAAI,CAAC,sBAAA,CAAuB,SAAS,CAAA,EAAG;AAAC,IAAA;AAAA,EAAO;AAEhD,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQlC,IAAAA,CAAI,SAAS,GAAG,GAAG,CAAA;AACjD,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,cAAA,CAAe,UAAA,CAAWA,IAAAA,CAAI,SAAS,CAAC,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,SAAS,cAAc,SAAA,EAA4B;AACxD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACjD,EAAA,IAAI,CAAC,sBAAA,CAAuB,SAAS,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAEtD,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,cAAA,CAAe,OAAA,CAAQA,IAAAA,CAAI,SAAS,CAAC,CAAA,KAAM,GAAA;AAAA,EAC3D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AClCA,IAAM,WAAA,GAAc,wBAAA;AAEb,SAAS,oBAAoB,MAAA,EAAsB;AACxD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,EAAa,MAAM,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,SAAS,mBAAA,GAAqC;AACnD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,oBAAA,GAA6B;AAC3C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,WAAW,WAAW,CAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;AC/BO,SAAS,mBAAmB,KAAA,EAAsC;AACvE,EAAA,IAAI,CAAC,KAAA,EAAO;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAC1B,EAAA,OACE,KAAA,CAAM,YAAA,GAAe,CAAA,IACrB,KAAA,CAAM,mBAAmB,CAAA,IACzB,KAAA,CAAM,WAAA,GAAc,CAAA,IAAA,CACnB,MAAM,YAAA,IAAgB,CAAA,IAAK,CAAA,IAAA,CAC3B,KAAA,CAAM,QAAQ,CAAA,IAAK,CAAA;AAExB;AAEO,SAAS,cAAc,KAAA,EAA4B;AACxD,EAAA,OACE,MAAM,KAAA,CAAM,MAAA,GAAS,CAAA,IAAA,CACpB,KAAA,CAAM,UAAU,MAAA,IAAU,CAAA,IAAK,CAAA,IAAA,CAC/B,KAAA,CAAM,OAAO,MAAA,IAAU,CAAA,IAAK,CAAA,IAAA,CAC5B,KAAA,CAAM,QAAQ,MAAA,IAAU,CAAA,IAAK,CAAA,IAC9B,kBAAA,CAAmB,MAAM,KAAK,CAAA,IAC9B,CAAC,CAAC,MAAM,YAAA,IACR,CAAC,CAAC,KAAA,CAAM,WACR,CAAC,CAAC,MAAM,QAAA,IACR,CAAC,CAAC,KAAA,CAAM,QAAA;AAEZ;AAEO,SAAS,qBAAqB,KAAA,EAA8C;AACjF,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,IAAI,sBAAA,GAAyB,CAAA;AAC7B,EAAA,IAAI,iBAAA,GAAoB,CAAA;AAExB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,KAAA;AACzC,IAAA,IAAI,CAAC,kBAAA,CAAmB,KAAK,CAAA,IAAK,CAAC,KAAA,EAAO;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,EAAA;AACA,IAAA,YAAA,IAAgB,KAAA,CAAM,YAAA;AACtB,IAAA,gBAAA,IAAoB,KAAA,CAAM,gBAAA;AAC1B,IAAA,WAAA,IAAe,KAAA,CAAM,WAAA;AACrB,IAAA,kBAAA,GAAqB,KAAA,CAAM,YAAA;AAC3B,IAAA,sBAAA,GAAyB,KAAA,CAAM,gBAAA;AAC/B,IAAA,iBAAA,GAAoB,KAAA,CAAM,WAAA;AAAA,EAC5B;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC4BO,IAAK,WAAA,qBAAAmC,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;;;AC3EL,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EACzC,kBAAA;AAAA,EACA,YAAA;AAAA,EACA,uBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,eAAe,MAAA,EAAwB;AACrD,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAC3E;AAEO,SAAS,iBAAA,CACd,SAAA,EACA,OAAA,EACA,WAAA,GAA4B,EAAC,EACX;AAClB,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,eAAe,MAAM,CAAA;AAAA,IACzB,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,EAAA,EAAI,eAAe,MAAM,CAAA;AAAA,MACzB,OAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;AAEO,SAAS,yBAAA,CAA0B,WAAmB,OAAA,EAAmC;AAC9F,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,eAAe,MAAM,CAAA;AAAA,IACzB,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,EAAA,EAAI,eAAe,MAAM,CAAA;AAAA,MACzB,OAAA,EAAS,EAAA;AAAA,MACT,aAAa,EAAC;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,IACA,aAAA,EAAe;AAAA,MACb,EAAA,EAAI,eAAe,WAAW,CAAA;AAAA,MAC9B,IAAA,EAAA,QAAA;AAAA,MACA,OAAA,EAAS,OAAA;AAAA,MACT,WAAW,EAAC;AAAA,MACZ,WAAW,EAAC;AAAA,MACZ,aAAa,EAAC;AAAA,MACd,SAAA,EAAW,UAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;AASO,SAAS,kBAAkB,KAAA,EAA0C;AAC1E,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAE3C,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACjD,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAErC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AACvC,EAAA,IAAI,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,QAAA,IAAY,cAAc,UAAA,EAAY;AAChF,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS,MAAM,MAAA,GAAS;AAAA,GAC1B;AACF;AAEO,SAAS,gCAAA,GAAuD;AACrE,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,kBAAA,EAAoB,UAAA,EAAY,KAAA,EAAO,MAAA;AAC7D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM;AAAA,IACJ,eAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAA;AAEJ,EAAA,IACE,OAAO,eAAA,KAAoB,QAAA,IAC3B,OAAO,cAAA,KAAmB,QAAA,IAC1B,OAAO,kBAAA,KAAuB,QAAA,IAC9B,OAAO,uBAAA,KAA4B,QAAA,EACnC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,2CAAA,GAAoE;AAClF,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,kBAAA,EAAoB,UAAA,EAAY,GAAA,EAAK,sBAAA;AACzD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAW,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAA4B,OAAO,MAAM,QAAQ,CAAA;AAC/E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAA;AACT;;;ACvIO,SAAS,gBAAgB,KAAA,EAAkC;AAChE,EAAA,MAAMnC,IAAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,gBAAA,IAAoB,KAAA;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,kBAAA,CAAmBA,IAAG,CAAA,IAAK,KAAA;AAClD;AAEO,SAAS,qBAAA,CACd,OACA,OAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAA;AAAA,IACvB,gBAAA,EAAkB,MAAM,OAAA,CAAQ,gBAAA;AAAA,IAChC,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,IACxB,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA;AAAA,IACrB,cAAA,EAAgB,MAAM,OAAA,CAAQ,cAAA;AAAA,IAC9B,SAAA,EAAW,gBAAgB,KAAK,CAAA;AAAA,IAChC,iBAAA,EAAmB,oBAAA,CAAqB,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AAAA,IAC7D,WAAA,EAAa,MAAM,OAAA,CAAQ,WAAA;AAAA,IAC3B,eAAA,EAAiB,MAAM,OAAA,CAAQ,eAAA;AAAA,IAC/B,sBAAA,EAAwB,MAAM,OAAA,CAAQ,sBAAA;AAAA,IACtC,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA;AAAA,IACrB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,IAC3B,oBAAoB,OAAA,CAAQ,kBAAA;AAAA,IAC5B,UAAU,OAAA,CAAQ;AAAA,GACpB;AACF;AAEO,SAAS,uBAAA,CACd,OACA,OAAA,EAamB;AACnB,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IAAO,OAAA;AAAA,IAAS,WAAA;AAAA,IAAa,gBAAA;AAAA,IAAkB,YAAA;AAAA,IAC/C,WAAA;AAAA,IAAa,oBAAA;AAAA,IAAsB,eAAA;AAAA,IAAiB,WAAA;AAAA,IACpD,4BAAA;AAAA,IAA8B,eAAA;AAAA,IAAiB,WAAA;AAAA,IAC/C;AAAA,MACE,KAAA,CAAM,SAAA;AAeV,EAAA,MAAM,WAAA,GAAc,YAAY,MAAA,GAAS,CAAA;AACzC,EAAA,MAAM,iBAAiB,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,QAAQ,CAAA;AAIlE,EAAA,MAAM,iBAAA,GAAoB,CAAC,YAAA,IAAgB,WAAA,KACrC,mBAAmB,cAAA,GAAiB,WAAA,CAAA;AAE1C,EAAA,MAAM,mBAAA,GAAsB,CAAC,YAAA,IAAgB,CAAC,mBAAmB,CAAC,gBAAA,KAC5D,WAAY,WAAA,IAAe,WAAA,CAAA;AAEjC,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA,EAAmB,IAAA;AAAA,IACnB,4BAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,GAAG;AAAA,GACL;AACF;AAEO,SAAS,mBAAA,CACd,OACA,OAAA,EAUe;AACf,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAM,KAAA,CAAM,OAAA;AAAA,IACrB,UAAA,EAAY,MAAM,KAAA,CAAM,UAAA;AAAA,IACxB,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,IAC1B,GAAG;AAAA,GACL;AACF;;;AC1HO,SAAS,qBAAqB,IAAA,EAA8B;AACjE,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAClD,EAAA,IAAA,CAAK,KAAK,WAAA,EAAa,IAAA,EAAK,CAAE,MAAA,IAAU,KAAK,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAC9D,EAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAA,IAAU,CAAA,IAAK,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACrD,EAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAA,IAAU,CAAA,IAAK,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACrD,EAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,MAAA,IAAU,CAAA,IAAK,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAClD,EAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,MAAA,IAAU,CAAA,IAAK,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACxD,EAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAA,IAAU,CAAA,IAAK,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACrD,EAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,MAAA,IAAU,CAAA,IAAK,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACvD,EAAA,IAAI,KAAK,KAAA,EAAO;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAC9B,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,kCAAkC,IAAA,EAA8B;AAC9E,EAAA,OAAO,IAAA,CAAK,SAAA,KAAc,yBAAA,IAA6B,oBAAA,CAAqB,IAAI,CAAA;AAClF;AAEO,SAAS,uBAAA,CAAwB,MAAqB,aAAA,EAAiC;AAC5F,EAAA,IAAI,CAAC,aAAA,EAAe;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAClC,EAAA,IAAI,IAAA,CAAK,cAAc,yBAAA,EAA2B;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAChE,EAAA,OAAO,qBAAqB,IAAI,CAAA;AAClC;;;ACdO,SAAS,sBACd,OAAA,EACqC;AACrC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA,CACpC,IAAA,EAAK,CACL,WAAA,EAAY,CACZ,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AACzB,EAAA,OAAO,UAAA,KAAe,oBAAoB,iBAAA,GAAoB,eAAA;AAChE;AAEO,SAAS,qBACd,MAAA,EACS;AACT,EAAA,OACE,MAAA,KAAW,aACX,MAAA,KAAW,kBAAA,IACX,WAAW,kBAAA,IACX,MAAA,KAAW,0BACX,MAAA,KAAW,sBAAA;AAEf;AAEO,SAAS,0BACd,MAAA,EACS;AACT,EAAA,OACE,MAAA,KAAW,SAAA,IACX,MAAA,KAAW,sBAAA,IACX,MAAA,KAAW,sBAAA;AAEf;AAEO,SAAS,4BAAA,CACd,WACA,cAAA,EACwB;AACxB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,YAAA,EAAc,IAAA,EAAK;AAClD,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,SAAA,CAAU,SAAS,CAAA,GAC/C,SAAA,CAAU,UACP,MAAA,CAAO,CAAC,aAAa,CAAC,CAAC,YAAY,OAAO,QAAA,CAAS,OAAO,QAAQ,CAAA,CAClE,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,IAClB,IAAI,QAAA,CAAS,EAAA;AAAA,IACb,MAAM,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,SAAS,IAAA,GAAO,EAAA;AAAA,IAC1D,IAAA,EAAM,qBAAA,CAAsB,QAAA,CAAS,IAAI,CAAA;AAAA,IACzC,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,GACnC,QAAA,CAAS,QACN,MAAA,CAAO,CAAC,WAAW,CAAC,CAAC,UAAU,OAAO,MAAA,CAAO,OAAO,QAAQ,CAAA,CAC5D,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MAChB,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,OAAO,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,GAAW,OAAO,KAAA,GAAQ,EAAA;AAAA,MACzD,OAAO,MAAA,CAAO;AAAA,KAChB,CAAE,IACJ;AAAC,GACP,CAAE,IACJ,EAAC;AAEL,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,YAAA;AAAA,IACJ,MAAA,EAAQ,cAAA;AAAA,IACR,WAAW,SAAA,CAAU,SAAA;AAAA,IACrB,SAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;AAEO,SAAS,+BAAA,CACd,OACA,eAAA,EACQ;AACR,EAAA,IACE,CAAC,mBACD,CAAC,oBAAA,CAAqB,gBAAgB,MAAM,CAAA,IAC5C,KAAA,CAAM,MAAA,KAAW,CAAA,EACjB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,MAAA,EAAQ,IAAA,EAAK;AACnD,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,gBAAgB,KAAA,CAAM,SAAA;AAAA,MAC1B,CAAC,IAAA,KACC,IAAA,CAAK,EAAA,KAAO,aAAA,IACZ,IAAA,CAAK,QAAA,CAAS,EAAA,KAAO,aAAA,IACrB,IAAA,CAAK,aAAA,EAAe,EAAA,KAAO;AAAA,KAC/B;AACA,IAAA,IAAI,kBAAkB,EAAA,EAAI;AACxB,MAAA,OAAO,aAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,aAAA,EAAe;AAC1B,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA;AACxB;AAEO,SAAS,oCAAA,CACd,OACA,eAAA,EACoB;AACpB,EAAA,MAAM,YAAA,GAAe,+BAAA,CAAgC,KAAA,EAAO,eAAe,CAAA;AAC3E,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC3C,IAAA,MAAM,qBAAqB,YAAA,KAAiB,KAAA;AAC5C,IAAA,MAAM,mBAA2C,kBAAA,GAC7C,yBAAA,CAA0B,iBAAiB,MAAM,CAAA,GAC/C,4BACA,UAAA,GACF,UAAA;AAEJ,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,IAAI,CAAC,kBAAA,IAAsB,CAAC,eAAA,EAAiB;AAC3C,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,aAAA,EAAe;AAAA,UACb,EAAA,EAAI,CAAA,EAAG,eAAA,CAAgB,EAAE,CAAA,UAAA,CAAA;AAAA,UACzB,IAAA,EAAA,WAAA;AAAA,UACA,OAAA,EAAS,EAAA;AAAA,UACT,WAAW,EAAC;AAAA,UACZ,WAAW,EAAC;AAAA,UACZ,aAAa,EAAC;AAAA,UACd,SAAA,EAAW,gBAAA;AAAA,UACX,WAAW,IAAA,CAAK;AAAA;AAClB,OACF;AAAA,IACF;AAEA,IAAA,IACE,CAAC,kBAAA,IACD,iCAAA,CAAkC,IAAA,CAAK,aAAa,CAAA,EACpD;AACA,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,SAAA,KAAc,gBAAA,EAAkB;AACrD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,aAAA,EAAe;AAAA,QACb,GAAG,IAAA,CAAK,aAAA;AAAA,QACR,SAAA,EAAW;AAAA;AACb,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,UAAU,SAAA,GAAY,KAAA;AAC/B;;;AC5GA,IAAM,cAAA,GAAiB,CAAA;AACvB,IAAM,iBAAA,GAAoB,aAAA;AAE1B,IAAM,wBAAA,GAA2B,GAAA;AAEjC,SAAS,gBAAgB,SAAA,EAA2B;AAClD,EAAA,OAAO,CAAA,EAAG,iBAAiB,CAAA,EAAG,SAAS,CAAA,CAAA;AACzC;AAEA,SAAS,YAAA,CAAa,WAAmB,KAAA,EAAqB;AAC5D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,SAAA,IAAa,cAAc,KAAA,EAAO;AACtE,IAAA;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,eAAA,CAAgB,SAAS,GAAG,KAAK,CAAA;AAAA,EACjE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,aAAa,SAAA,EAAkC;AACtD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,SAAA,IAAa,cAAc,KAAA,EAAO;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,eAAA,CAAgB,SAAS,CAAC,CAAA;AAAA,EACjE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,eAAe,SAAA,EAAyB;AAC/C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,SAAA,IAAa,cAAc,KAAA,EAAO;AACtE,IAAA;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,UAAA,CAAW,eAAA,CAAgB,SAAS,CAAC,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAMO,IAAM,cAAN,MAAkB;AAAA,EAkFvB,YAAY,MAAA,EAA2B;AAxEvC;AAAA,IAAA,IAAA,CAAQ,eAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,eAAA,GAA0C,IAAA;AAElD;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAkC,IAAA;AAQ1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AACzB,IAAA,IAAA,CAAQ,QAAA,GAAW,KAAA;AACnB,IAAA,IAAA,CAAQ,sBAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,wBAAA,GAA+C,IAAA;AAEvD;AAAA,IAAA,IAAA,CAAQ,qBAAA,GAAkD,IAAA;AAE1D;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAA0D,IAAA;AAGlE;AAAA,IAAA,IAAA,CAAQ,gBAAA,uBAAuB,GAAA,EAAc;AAC7C,IAAA,IAAA,CAAQ,kBAAA,uBAAyB,GAAA,EAAc;AAC/C,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAAc;AAG3C;AAAA,IAAA,IAAA,CAAQ,qBAAA,GAAgD,IAAA;AACxD,IAAA,IAAA,CAAQ,uBAAA,GAAoD,IAAA;AAC5D,IAAA,IAAA,CAAQ,mBAAA,GAA4C,IAAA;AACpD,IAAA,IAAA,CAAQ,sBAAA,GAAyB,CAAA;AACjC,IAAA,IAAA,CAAQ,wBAAA,GAA2B,CAAA;AACnC,IAAA,IAAA,CAAQ,oBAAA,GAAuB,CAAA;AAC/B,IAAA,IAAA,CAAQ,0BAAA,GAA6B,EAAA;AACrC,IAAA,IAAA,CAAQ,4BAAA,GAA+B,EAAA;AACvC,IAAA,IAAA,CAAQ,wBAAA,GAA2B,EAAA;AAsNnC;AAAA;AAAA;AAAA,IAAA,IAAA,CAAA,gBAAA,GAAmB,CAAC,QAAA,KAAqC;AACvD,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAClC,MAAA,OAAO,MAAM;AACX,QAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAAA,MACvC,CAAA;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAA,kBAAA,GAAqB,MAAuB;AAC1C,MAAA,IAAI,IAAA,CAAK,0BAAA,KAA+B,IAAA,CAAK,sBAAA,EAAwB;AACnE,QAAA,IAAA,CAAK,qBAAA,GAAwB,qBAAA,CAAsB,IAAA,CAAK,KAAA,EAAO;AAAA,UAC7D,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,mBAAmB,IAAA,CAAK,iBAAA;AAAA,UACxB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,UACzB,UAAU,IAAA,CAAK;AAAA,SAChB,CAAA;AACD,QAAA,IAAA,CAAK,6BAA6B,IAAA,CAAK,sBAAA;AAAA,MACzC;AACA,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,IACd,CAAA;AAEA,IAAA,IAAA,CAAA,kBAAA,GAAqB,CAAC,QAAA,KAAqC;AACzD,MAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,QAAQ,CAAA;AACpC,MAAA,OAAO,MAAM;AACX,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,QAAQ,CAAA;AAAA,MACzC,CAAA;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAA,oBAAA,GAAuB,MAAyB;AAC9C,MAAA,IAAI,IAAA,CAAK,4BAAA,KAAiC,IAAA,CAAK,wBAAA,EAA0B;AACvE,QAAA,IAAA,CAAK,uBAAA,GAA0B,uBAAA,CAAwB,IAAA,CAAK,KAAA,EAAO;AAAA,UACjE,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,UACvB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,6BAA6B,IAAA,CAAK,2BAAA;AAAA,UAClC,6BAA6B,IAAA,CAAK,2BAAA;AAAA,UAClC,kBAAkB,IAAA,CAAK,gBAAA;AAAA,UACvB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,UACvB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,gBAAgB,IAAA,CAAK;AAAA,SACtB,CAAA;AACD,QAAA,IAAA,CAAK,+BAA+B,IAAA,CAAK,wBAAA;AAAA,MAC3C;AACA,MAAA,OAAO,IAAA,CAAK,uBAAA;AAAA,IACd,CAAA;AAEA,IAAA,IAAA,CAAA,cAAA,GAAiB,CAAC,QAAA,KAAqC;AACrD,MAAA,IAAA,CAAK,cAAA,CAAe,IAAI,QAAQ,CAAA;AAChC,MAAA,OAAO,MAAM;AACX,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,QAAQ,CAAA;AAAA,MACrC,CAAA;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAA,gBAAA,GAAmB,MAAqB;AACtC,MAAA,IAAI,IAAA,CAAK,wBAAA,KAA6B,IAAA,CAAK,oBAAA,EAAsB;AAC/D,QAAA,IAAA,CAAK,mBAAA,GAAsB,mBAAA,CAAoB,IAAA,CAAK,KAAA,EAAO;AAAA,UACzD,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,cAAc,IAAA,CAAK,YAAA;AAAA,UACnB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,gBAAgB,IAAA,CAAK,cAAA;AAAA,UACrB,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,iBAAiB,IAAA,CAAK;AAAA,SACvB,CAAA;AACD,QAAA,IAAA,CAAK,2BAA2B,IAAA,CAAK,oBAAA;AAAA,MACvC;AACA,MAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,IACd,CAAA;AAnPE,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,gBAAA;AAC/B,IAAA,IAAA,CAAK,sBAAA,GAAyB,KAAK,2BAAA,EAA4B;AAC/D,IAAA,IAAA,CAAK,2BAA2B,IAAA,CAAK,sBAAA,GACjC,IAAI,GAAA,CAAI,IAAA,CAAK,sBAAsB,CAAA,GACnC,IAAA;AACJ,IAAA,MAAM,yBAAyB,IAAA,CAAK,uBAAA;AAAA,MAClC,qBAAoB,IAAK;AAAA,KAC3B;AACA,IAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,MAAA,oBAAA,EAAqB;AAAA,IACvB;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,OAAA,EAAS;AAAA,QACP,gBAAA,EAAkB,MAAA;AAAA,QAClB,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO,IAAA;AAAA,QACP,cAAA,EAAgB,KAAA;AAAA,QAChB,oBAAoB,EAAC;AAAA,QACrB,aAAa,gCAAA,EAAiC;AAAA,QAC9C,eAAA,EAAiB,sBAAA;AAAA,QACjB,sBAAA,EAAwB,KAAK,sBAAA,IAA0B,MAAA;AAAA,QACvD,KAAA,EAAO;AAAA,OACT;AAAA,MACA,SAAA,EAAW;AAAA,QACT,OAAO,EAAC;AAAA,QACR,gBAAA,EAAkB,EAAA;AAAA,QAClB,WAAA,EAAa,KAAA;AAAA,QACb,WAAA,EAAa,IAAA;AAAA,QACb,oBAAA,EAAsB,KAAA;AAAA,QACtB,OAAA,EAAS,KAAA;AAAA,QACT,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAa,EAAC;AAAA,QACd,YAAA,EAAc,KAAA;AAAA,QACd,4BAAA,EAA8B,CAAA;AAAA,QAC9B,eAAA,EAAiB,EAAA;AAAA,QACjB,aAAa,EAAC;AAAA,QACd,oBAAA,EAAsB;AAAA,OACxB;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,EAAA;AAAA,QACT,UAAA,EAAY,IAAA;AAAA,QACZ,cAAc;AAAC;AACjB,KACF;AAGA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AAC1D,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,2BAAA,GACH,IAAA,CAAK,4BAAA,CAA6B,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,2BAAA,GACH,IAAA,CAAK,4BAAA,CAA6B,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACpC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACtD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACtD,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AAC5D,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEQ,2BAAA,GAA+C;AACrD,IAAA,MAAM,UAAU,2CAAA,EAA4C;AAC5D,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGQ,wBACN,MAAA,EACoB;AACpB,IAAA,IACE,CAAC,UACD,CAAC,IAAA,CAAK,4BACN,IAAA,CAAK,wBAAA,CAAyB,SAAS,CAAA,EACvC;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAI,MAAM,IAAI,MAAA,GAAS,MAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,EAAA,EAA8B;AACzC,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA;AAChC,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA;AAAA,IACF;AAKA,IAAA,IAAA,CAAK,SAAA,EAAA;AACL,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAMzB,IAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,MACpB,gBAAA,EAAkB,EAAA;AAAA,MAClB,eAAA,EAAiB,EAAA;AAAA,MACjB,aAAa,EAAC;AAAA,MACd,WAAA,EAAa,KAAA;AAAA,MACb,OAAA,EAAS,KAAA;AAAA,MACT,oBAAA,EAAsB,KAAA;AAAA,MACtB,WAAA,EAAa,IAAA;AAAA,MACb,oBAAA,EAAsB;AAAA,KACvB,CAAA;AAED,IAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,gBAAA,GAAmB,EAAA;AACtC,IAAA,IAAA,CAAK,4BAA4B,EAAE,CAAA;AACnC,IAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,IAAA,IAAI,CAAC,EAAA,IAAM,EAAA,KAAO,KAAA,EAAO;AACvB,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,YAAA,EAAc,IAAI,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAa,EAAE,YAAA,EAAc,SAAA,CAAU,EAAE,GAAG,CAAA;AAAA,IACnD;AAEA,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aACE,MAAA,EACM;AACN,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,gBAAA;AAAA,EACjC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EA+EQ,eAAe,KAAA,EAAiD;AACtE,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AACvC,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,sBAAA,EAAA;AACL,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,gBAAA,EAAkB;AACtC,MAAA,EAAA,EAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEQ,iBAAiB,KAAA,EAAmD;AAC1E,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAGtB,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,IAAA,CAAK,KAAA,CAAM,UAAU,KAAK,CAAA;AAChE,MAAA,IAAI,CAAC,sBAAA,CAAuB,IAAA,CAAK,qBAAA,EAAuB,QAAQ,CAAA,EAAG;AACjE,QAAA,IAAA,CAAK,qBAAA,GAAwB,QAAA;AAC7B,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAA,CAAK,wBAAA,EAAA;AACL,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,kBAAA,EAAoB;AACxC,MAAA,EAAA,EAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEQ,aAAa,KAAA,EAA+C;AAClE,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AAErC,IAAA,IAAI,kBAAkB,KAAA,EAAO;AAC3B,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,oBAAA,EAAA;AACL,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,cAAA,EAAgB;AACpC,MAAA,EAAA,EAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA;AAC/B,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,KAAQ,KAAA,EAAO;AACzB,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,gBAAgB,KAAA,EAAwB;AAC9C,IAAA,OAAO,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAA,KAAc,KAAA;AAAA,EAC9C;AAAA;AAAA,EAGQ,iBAAA,GAA6B;AACnC,IAAA,OACE,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,OAAA,IACrB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,oBAAA,IACrB,oBAAA,CAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,iBAAiB,MAAM,CAAA;AAAA,EAErE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,mBAAmB,KAAA,EAAqB;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAA;AAC/B,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,mBAAkB,EAAG;AAClD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAA,CAAK,aAAa,EAAE,YAAA,EAAc,MAAM,KAAA,CAAM,CAAC,GAAG,CAAA;AAElD,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,mBAAkB,EAAG;AAE5B,QAAA,IAAA,CAAK,YAAA,CAAa;AAAA,UAChB,cAAc,CAAC,IAAA,EAAM,GAAG,IAAA,CAAK,KAAA,CAAM,MAAM,YAAY;AAAA,SACtD,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,WAAW,CAAA;AAAA,IACtD,GAAG,CAAC,CAAA;AAAA,EACN;AAAA,EAEQ,uBAAA,CAAwB,WAAmB,OAAA,EAAwB;AACzE,IAAA,MAAM,yBAAyB,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,kBAAA,EAAmB;AAC1E,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,sBAAA,CAAuB,SAAS,CAAA,GAAI,IAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,OAAO,uBAAuB,SAAS,CAAA;AAAA,IACzC;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe,EAAE,kBAAA,EAAoB,sBAAA,EAAwB,CAAA;AAClE,IAAA,aAAA,CAAc,WAAW,OAAO,CAAA;AAAA,EAClC;AAAA,EAEQ,4BAA4B,SAAA,EAAqC;AACvE,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,KAAA,EAAO;AACrC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,kBAAA,CAAmB,SAAS,MAAM,IAAA,EAAM;AAC7D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,aAAA,CAAc,SAAS,CAAA,EAAG;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe;AAAA,MAClB,kBAAA,EAAoB;AAAA,QAClB,GAAG,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,kBAAA;AAAA,QACtB,CAAC,SAAS,GAAG;AAAA;AACf,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,oBAAoB,MAAA,EAAsB;AAChD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,uBAAA,CAAwB,MAAM,CAAA;AAChD,IAAA,IAAA,CAAK,cAAA,CAAe,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA;AAC7C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA;AAAA,IACF;AACA,IAAA,oBAAA,EAAqB;AAAA,EACvB;AAAA,EAEQ,UAAU,KAAA,EAAiC;AACjD,IAAA,IAAA,CAAK,cAAA,CAAe,EAAE,KAAA,EAAO,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,GAA8B;AACpC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA;AAC9B,IAAA,IAAI,CAAC,EAAA,IAAM,EAAA,KAAO,KAAA,EAAO;AACvB,MAAA,IAAA,CAAK,cAAA,CAAe;AAAA,QAClB,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO,IAAA;AAAA,QACP,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,OAAO,EAAC;AAAA,QACR,eAAA,EAAiB;AAAA,OAClB,CAAA;AACD,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AACtC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,qBAAqB,EAAA,EAAI;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,cAAA,CAAe,EAAE,QAAA,EAAU,IAAA,EAAM,OAAO,IAAA,EAAM,cAAA,EAAgB,OAAO,CAAA;AAC1E,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAEtC,IAAA,MAAM,OAAA,GAAU,EAAA;AAChB,IAAA,IAAA,CAAK,WACF,YAAA,CAAa,OAAO,CAAA,CACpB,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,QAAA,EAAU;AACxC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA,KAAqB,OAAA,EAAS;AACnD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,qBAAqB,OAAA,EAAS;AACrC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,eAAe,EAAE,OAAA,EAAS,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAChE,QAAA,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,mBAAmB,IAAI,CAAA;AACpE,QAAA,IAAA,CAAK,kCAAkC,OAAO,CAAA;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,eAAe,EAAE,KAAA,EAAO,mBAAA,EAAqB,QAAA,EAAU,OAAO,CAAA;AAAA,MACrE;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,QAAA,EAAU;AACxC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA,KAAqB,OAAA,EAAS;AACnD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,qBAAqB,OAAA,EAAS;AACrC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,EAAK,wBAAwB,CAAA;AAClE,MAAA,IAAA,CAAK,cAAA,CAAe;AAAA,QAClB,OAAO,UAAA,CAAW,WAAA;AAAA,QAClB,gBAAgB,UAAA,CAAW,SAAA;AAAA,QAC3B,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAA,CACN,cACA,eAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA;AAClC,IAAA,MAAM,kBAAA,GACJ,KAAK,MAAA,GAAS,CAAA,IAAK,CAAC,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,aAAA;AAC5C,IAAA,MAAM,QAA8C,EAAC;AACrD,IAAA,MAAM,2BACJ,eAAA,KAAoB,MAAA,GAChB,IAAA,CAAK,KAAA,CAAM,UAAU,eAAA,GACrB,eAAA;AAEN,IAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,MAAA,KAAA,CAAM,eAAA,GAAkB,eAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,kBAAA,KAAuB,CAAC,YAAA,IAAgB,YAAA,CAAa,WAAW,CAAA,CAAA,EAAI;AACtE,MAAA,MAAM,cAAA,GAAiB,oCAAA;AAAA,QACrB,IAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,QAAA,KAAA,CAAM,KAAA,GAAQ,cAAA;AAAA,MAChB;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACjC,QAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,MAC7B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAA,GAAQ,oCAAA;AAAA,MACZ,YAAA,IAAgB,IAAA;AAAA,MAChB;AAAA,KACF;AACA,IAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,kCAAkC,SAAA,EAAyB;AACjE,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,mBAAmB,CAAC,IAAA,CAAK,WAAW,YAAA,EAAc;AACrE,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,WACF,eAAA,CAAgB,SAAS,CAAA,CACzB,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,QAAA,EAAU;AACxC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA,KAAqB,SAAA,EAAW;AACrD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,qBAAqB,SAAA,EAAW;AACvC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,IAAU,CAAC,OAAO,KAAA,EAAO;AACpC,QAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,oBAAA,EAAsB,KAAA,EAAO,CAAA;AACrD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,aAAa,SAAS,CAAA;AAC1C,MAAA,IAAI,WAAA,KAAgB,OAAO,KAAA,EAAO;AAChC,QAAA,IAAA,CAAK,iBAAiB,SAAA,EAAW,MAAA,CAAO,KAAK,CAAA,CAAE,MAAM,MAAM;AACzD,UAAA,cAAA,CAAe,SAAS,CAAA;AACxB,UAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,oBAAA,EAAsB,KAAA,EAAO,CAAA;AAAA,QACvD,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,oBAAA,EAAsB,IAAA,EAAM,CAAA;AACpD,QAAA,IAAA,CAAK,qBAAqB,SAAS,CAAA;AAAA,MACrC;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,MAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,oBAAA,EAAsB,KAAA,EAAO,CAAA;AAAA,IACvD,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,aAAA,CAAc,KAAK,gBAAgB,CAAA;AACnC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,qBAAqB,SAAA,EAAyB;AACpD,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,gBAAA,GAAmB,YAAY,MAAM;AACxC,MAAA,IAAI,KAAK,QAAA,IAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,qBAAqB,SAAA,EAAW;AACtE,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,WACF,eAAA,GAAkB,SAAS,CAAA,CAC3B,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,QAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,UAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,UAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,oBAAA,EAAsB,KAAA,EAAO,CAAA;AACrD,UAAA,IAAA,CAAK,WACF,YAAA,CAAa,SAAS,CAAA,CACtB,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,YAAA,IACE,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA,KAAqB,aACxC,MAAA,EACA;AACA,cAAA,IAAA,CAAK,kBAAA;AAAA,gBACH,MAAA,CAAO,KAAA;AAAA,gBACP,OAAO,eAAA,IAAmB;AAAA,eAC5B;AAAA,YACF;AAAA,UACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,mDAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF,CAAC,CAAA;AAAA,QACL;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,GAAG,CAAA;AAAA,MACrD,CAAC,CAAA;AAAA,IACL,GAAG,wBAAwB,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAc,gBAAA,CACZ,SAAA,EACA,KAAA,EACe;AACf,IAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AAClC,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,SAAA;AACxB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,IAAA,CAAK,eAAA,GAAkB,UAAA;AACvB,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA;AACnB,IAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,IAAA,EAAM,CAAA;AAE3C,IAAA,IAAI;AACF,MAAA,IAAI,kBAAA,GAAqB,EAAA;AACzB,MAAA,MAAM,KAAK,UAAA,CAAW,YAAA;AAAA,QACpB,SAAA;AAAA,QACA,KAAA;AAAA,QACA,CAAC,KAAA,KAAU;AAET,UAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,YAAA;AAAA,UACF;AACA,UAAA,IACE,MAAM,IAAA,KAAS,UAAA,IACf,KAAA,CAAM,QAAA,EAAU,mBAAmB,KAAA,CAAA,EACnC;AACA,YAAA,kBAAA,GAAqB,MAAM,QAAA,CAAS,cAAA;AACpC,YAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,gBAAA,EAAkB,kBAAA,EAAoB,CAAA;AAAA,UAChE,CAAA,MAAA,IAAA,CACG,MAAM,IAAA,KAAS,SAAA,IAAa,MAAM,IAAA,KAAS,OAAA,KAC5C,MAAM,OAAA,EACN;AACA,YAAA,kBAAA,IAAsB,KAAA,CAAM,OAAA;AAC5B,YAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,gBAAA,EAAkB,kBAAA,EAAoB,CAAA;AAAA,UAChE,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,MAAM,OAAA,EAAS;AACrD,YAAA,IAAA,CAAK,oBAAA,CAAqB,MAAM,OAAO,CAAA;AAAA,UACzC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,MAAM,IAAA,EAAM;AACpD,YAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAAA,UAClC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,EAAM;AAClD,YAAA,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAA;AAAA,UAChC,WAAW,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,OAAA,EAAS;AAAA,UAE5D;AAAA,QACF,CAAA;AAAA,QACA,UAAA,CAAW;AAAA,OACb;AACA,MAAA,cAAA,CAAe,SAAS,CAAA;AACxB,MAAA,MAAM,IAAA,CAAK,sBAAA,CAAuB,SAAA,EAAW,IAAA,EAAM,KAAK,CAAA;AAAA,IAC1D,CAAA,SAAE;AACA,MAAA,IAAI,IAAA,CAAK,oBAAoB,UAAA,EAAY;AACvC,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB;AACA,MAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC/B,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,QAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,UACpB,WAAA,EAAa,KAAA;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,gBAAA,EAAkB,EAAA;AAAA,UAClB,eAAA,EAAiB,EAAA;AAAA,UACjB,aAAa,EAAC;AAAA,UACd,oBAAA,EAAsB;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,wBAAA,CACZ,SAAA,EACA,KAAA,EACe;AACf,IAAA,YAAA,CAAa,WAAW,KAAK,CAAA;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,KAAK,CAAA;AAAA,IAC9C,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,0EAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAMoC,gBAAAA,GAAkB,KAAK,UAAA,CAAW,eAAA;AACxC,MAAA,MAAM,MAAA,GAASA,mBACX,MAAMA,gBAAAA,CAAgB,SAAS,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA,GACjD,IAAA;AACJ,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,cAAA,CAAe,SAAS,CAAA;AACxB,QAAA,MAAM,KAAK,sBAAA,CAAuB,SAAA,EAAW,IAAI,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AACjE,QAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,oBAAA,EAAsB,KAAA,EAAO,CAAA;AACrD,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,SAAA,EAAW,MAAA,CAAO,KAAA,IAAS,KAAK,CAAA;AAC7C,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS,KAAA;AAAA,QACT,oBAAA,EAAsB;AAAA,OACvB,CAAA;AACD,MAAA,IAAA,CAAK,qBAAqB,SAAS,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,KAAA,EAA4B;AAC5C,IAAA,IAAA,CAAK,cAAA,CAAe;AAAA,MAClB,KAAA;AAAA,MACA,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,EACH;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,EAC7B;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,MACpB,WAAA,EAAa,IAAA;AAAA,MACb,oBAAA,EAAsB;AAAA,KACvB,CAAA;AAAA,EACH;AAAA,EAEQ,sBAAA,CAAuB,QAAgB,SAAA,EAA0B;AACvE,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,aAAA;AAAA,MACL,IAAI,YAAY,yBAAA,EAA2B;AAAA,QACzC,MAAA,EAAQ,EAAE,MAAA,EAAQ,SAAA;AAAU,OAC7B;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAM,SAAA,GACJ,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,MAAM,OAAA,CAAQ,gBAAA;AAC9C,MAAA,IAAI,SAAA,IAAa,cAAc,KAAA,EAAO;AACpC,QAAA,cAAA,CAAe,SAAS,CAAA;AACxB,QAAA,IAAI,IAAA,CAAK,WAAW,cAAA,EAAgB;AAClC,UAAA,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,SAAS,CAAA,CAAE,MAAM,MAAM;AAAA,UAEtD,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS,KAAA;AAAA,QACT,gBAAA,EAAkB,EAAA;AAAA,QAClB,eAAA,EAAiB,EAAA;AAAA,QACjB,aAAa;AAAC,OACf,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAAA,EAA6B;AACnD,IAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,OAAA,EAAS,CAAA;AAAA,EAChD;AAAA,EAEQ,YAAY,OAAA,EAAuB;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,CAAA;AAAA,EAC/B;AAAA,EAEQ,eAAe,KAAA,EAA4B;AACjD,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,KAAA,EAAO,CAAA;AAAA,EACzC;AAAA;AAAA,EAIA,MAAc,qBACZ,OAAA,EACkB;AAClB,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,+BAAA,EAAiC,CAAA;AACjE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,OAAO,CAAA;AAC1D,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AACtC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,MAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAC5C,MAAA,MAAMpC,IAAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA,IAAoB,KAAA;AACnD,MAAA,MAAM,gBAAgB,CAAC,SAAA;AACvB,MAAA,IAAA,CAAK,uBAAA,CAAwBA,MAAK,aAAa,CAAA;AAE/C,MAAA,IACE,aAAA,IACA,KAAK,KAAA,CAAM,OAAA,CAAQ,oBACnB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA,KAAqB,KAAA,EACxC;AACA,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAA;AAAA,YACnC,IAAA,CAAK,MAAM,OAAA,CAAQ;AAAA,WACrB;AACA,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,IAAA,CAAK,cAAA,CAAe,EAAE,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAC/C,YAAA,IAAA,CAAK,kBAAA;AAAA,cACH,MAAA,CAAO,KAAA;AAAA,cACP,OAAO,eAAA,IAAmB;AAAA,aAC5B;AAAA,UACF;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,GAAG,CAAA;AAAA,QAChE;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,EAAA,EAAI,CAAA;AACjC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA;AACxC,IAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,KAAiB,KAAA,EAAO;AAC3C,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,mCAAA,EAAqC,CAAA;AACrE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,EAAA,EAAI,CAAA;AACjC,MAAA,IAAA,CAAK,iBAAiB,EAAE,OAAA,EAAS,IAAA,EAAM,gBAAA,EAAkB,IAAI,CAAA;AAE7D,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,YAAY,CAAA;AACtD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,aAAa,YAAY,CAAA;AAC9D,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,cAAA,CAAe,EAAE,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAC/C,UAAA,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,mBAAmB,IAAI,CAAA;AAAA,QACtE,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,kBAAA,CAAmB,EAAC,EAAG,IAAI,CAAA;AAAA,QAClC;AACA,QAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,IAAI,CAAA;AAAA,MAC3C,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,UAAA,GAAa,iBAAA;AAAA,UACjB,GAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,UAAA,CAAW,aAAa,CAAA;AAAA,MAC1D,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,iBAAiB,EAAE,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,OAAO,CAAA;AAAA,MAC9D;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,UAAA,EAAY;AAC/B,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,EAAA,EAAI,CAAA;AACjC,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,IAAA;AAAA,QACd,gBAAA,EAAkB;AAAA,OACnB,CAAA;AAED,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GACJ,MAAM,IAAA,CAAK,UAAA,CAAW,sBAAsB,YAAY,CAAA;AAC1D,QAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACnB,UAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,QAC5D;AACA,QAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,UACpB,KAAA,EAAO,oCAAA;AAAA,YACL;AAAA,cACE,yBAAA;AAAA,gBACE,YAAA;AAAA,gBACA;AAAA;AACF,aACF;AAAA,YACA;AAAA,WACF;AAAA,UACA,eAAA,EAAiB;AAAA,SAClB,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,wBAAA,CAAyB,YAAA,EAAc,QAAA,CAAS,KAAK,CAAA;AAChE,QAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,oBAAA,EAAsB;AAC9C,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,aAAa,YAAY,CAAA;AAC9D,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,IAAA,CAAK,cAAA,CAAe,EAAE,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAC/C,YAAA,IAAA,CAAK,kBAAA;AAAA,cACH,MAAA,CAAO,KAAA;AAAA,cACP,OAAO,eAAA,IAAmB;AAAA,aAC5B;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,kBAAA,CAAmB,EAAC,EAAG,IAAI,CAAA;AAAA,UAClC;AACA,UAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,IAAI,CAAA;AAAA,QAC3C;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,UAAA,GAAa,iBAAA;AAAA,UACjB,GAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,UAAA,CAAW,aAAa,CAAA;AAAA,MAC1D,CAAA,SAAE;AACA,QAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,UACpB,YAAA,EAAc,KAAA;AAAA,UACd,OAAA,EAAS,KAAA;AAAA,UACT,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,kCAAA,EAAoC,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,qBAAA,CACN,SAAA,EACA,QAAA,EACA,oBAAA,EACM;AACN,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,KAAA,EAAO,CAAC,GAAG,SAAA,EAAW,QAAQ,GAAG,CAAA;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,SAAA,CAAU,SAAA;AAAA,MACpB,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,EAAA,KAAO;AAAA,KACjC;AACA,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,uCAAuC,oBAAoB,CAAA,kCAAA;AAAA,OAC7D;AACA,MAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,KAAA,EAAO,CAAC,GAAG,SAAA,EAAW,QAAQ,GAAG,CAAA;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,KAAA,EAAO,CAAC,GAAG,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA;AAAA,EACzE;AAAA,EAEA,MAAc,mBAAA,CACZ,gBAAA,EACA,SAAA,EAIC;AACD,IAAA,IAAI,eAAA,GAAkB,gBAAA;AACtB,IAAA,IAAI,mBAAA,GAAsB,KAAA;AAE1B,IAAA,IAAI,CAAC,eAAA,IAAmB,eAAA,KAAoB,KAAA,EAAO;AACjD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,aAAA,EAAc;AACnD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,mBAAmB,MAAA,CAAO,EAAA;AAChC,QAAA,eAAA,GAAkB,gBAAA;AAClB,QAAA,IAAA,CAAK,cAAA,CAAe,EAAE,gBAAA,EAAkB,gBAAA,EAAkB,CAAA;AAC1D,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAA,CAAK,uBAAA,CAAwB,kBAAkB,IAAI,CAAA;AAAA,QACrD;AACA,QAAA,mBAAA,GAAsB,IAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,iBAAiB,mBAAA,EAAoB;AAAA,EAChD;AAAA,EAEA,MAAc,sBAAA,CACZ,SAAA,EACA,eAAA,GAAkB,OAClB,KAAA,EACe;AACf,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,aAAa,SAAS,CAAA;AAChE,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,UAAU,MAAA,IAAa,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe,EAAE,OAAA,EAAS,WAAA,CAAY,SAAS,CAAA;AACpD,IAAA,IAAA,CAAK,kBAAA;AAAA,MACH,eAAA,GAAkB,WAAA,CAAY,KAAA,IAAS,KAAK,WAAA,CAAY,KAAA;AAAA,MACxD,YAAY,eAAA,IAAmB;AAAA,KACjC;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,MAAA,EAe1B;AACD,IAAA,MAAM;AAAA,MACJ,eAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,oBAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,IAAI,kBAAA,GAAqB,EAAA;AACzB,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,IAAI,YAAA;AACJ,IAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,IAAA,EAAM,CAAA;AAE3C,IAAA,WAAA,MAAiB,KAAA,IAAS,KAAK,UAAA,CAAW,WAAA;AAAA,MACxC,eAAA,IAAmB,KAAA;AAAA,MACnB,OAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA,CAAW,MAAA;AAAA,MACX;AAAA,QACE,SAAA;AAAA,QACA,oBAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA;AACF,KACF,EAAG;AAED,MAAA,IAAI,WAAW,MAAA,CAAO,OAAA,IAAW,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC7D,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,gBAAA,IAAoB,KAAA,CAAM,KAAA,EAAO;AAClD,QAAA,YAAA,GAAe,KAAA,CAAM,KAAA;AACrB,QAAA,IAAI,eAAA,IAAmB,oBAAoB,KAAA,EAAO;AAChD,UAAA,YAAA,CAAa,eAAA,EAAiB,MAAM,KAAK,CAAA;AAAA,QAC3C;AAAA,MACF;AAEA,MAAA,IAAA,CACG,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,IAAA,KAAS,SAAA,KAC1C,MAAM,OAAA,EACN;AACA,QAAA,kBAAA,IAAsB,KAAA,CAAM,OAAA;AAC5B,QAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,gBAAA,EAAkB,kBAAA,EAAoB,CAAA;AAAA,MAChE,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,MAAM,OAAA,EAAS;AACrD,QAAA,IAAA,CAAK,oBAAA,CAAqB,MAAM,OAAO,CAAA;AAAA,MACzC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,MAAM,IAAA,EAAM;AACpD,QAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAAA,MAClC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,EAAM;AAClD,QAAA,IAAA,CAAK,cAAA,CAAe,MAAM,IAAI,CAAA;AAAA,MAChC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,QAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,cAAc,CAAA;AAAA,MAC/C,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa;AACrC,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,gBAAA,GAAmB,KAAA,CAAM,SAAA;AAAA,QAC3B;AAEA,QAAA,MAAM,oBAAA,GAAuB,4BAAA;AAAA,UAC3B,KAAA,CAAM,SAAA;AAAA,UACN;AAAA,SACF;AACA,QAAA,IAAI,oBAAA,EAAsB;AACxB,UAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,YACpB,eAAA,EAAiB,oBAAA;AAAA,YACjB,KAAA,EAAO,oCAAA;AAAA,cACL,IAAA,CAAK,MAAM,SAAA,CAAU,KAAA;AAAA,cACrB;AAAA;AACF,WACD,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,MAAMqC,kBAAiB,gBAAA,IAAoB,eAAA;AAC3C,UAAA,IAAIA,eAAAA,IAAkBA,oBAAmB,KAAA,EAAO;AAC9C,YAAA,MAAM,IAAA,CAAK,sBAAA,CAAuBA,eAAAA,EAAgB,KAAA,EAAO,KAAK,CAAA;AAAA,UAChE;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAChC,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,gBAAA,GAAmB,KAAA,CAAM,SAAA;AAAA,QAC3B;AACA,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,MAAMA,kBAAiB,gBAAA,IAAoB,eAAA;AAC3C,UAAA,IAAIA,eAAAA,IAAkBA,oBAAmB,KAAA,EAAO;AAC9C,YAAA,MAAM,IAAA,CAAK,sBAAA,CAAuBA,eAAAA,EAAgB,KAAA,EAAO,KAAK,CAAA;AAAA,UAChE;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,cAAA,IAAkB,MAAM,SAAA,EAAW;AAC3D,QAAA,gBAAA,GAAmB,KAAA,CAAM,SAAA;AACzB,QAAA,IAAI,gBAAgB,gBAAA,EAAkB;AACpC,UAAA,YAAA,CAAa,kBAAkB,YAAY,CAAA;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,iBAAiB,gBAAA,IAAoB,eAAA;AAC3C,IAAA,IAAI,cAAA,IAAkB,mBAAmB,KAAA,EAAO;AAC9C,MAAA,cAAA,CAAe,cAAc,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,OAAA,GAAU,WAAW,MAAA,CAAO,OAAA;AAClC,IAAA,OAAO,EAAE,gBAAA,EAAkB,cAAA,EAAgB,OAAA,EAAQ;AAAA,EACrD;AAAA,EAEA,MAAc,6BAAA,CACZ,eAAA,EACA,gBAAA,EACA,gBACA,KAAA,EACe;AACf,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAiB,gBAAA,IAAoB,eAAA;AAC3C,IAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,KAAmB,KAAA,EAAO;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,sBAAA,CAAuB,cAAA,EAAgB,IAAA,EAAM,KAAK,CAAA;AAAA,IAC/D,SAAS,QAAA,EAAU;AACjB,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,QAAQ,CAAA;AAAA,IACjE;AAAA,EACF;AAAA,EAEQ,uBAAA,CACN,iBACA,mBAAA,EACM;AACN,IAAA,IAAI,eAAA,IAAmB,oBAAoB,KAAA,EAAO;AAChD,MAAA,IAAA,CAAK,sBAAA,CAAuB,gBAAgB,eAAe,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,mBAAA,IAAuB,eAAA,IAAmB,eAAA,KAAoB,KAAA,EAAO;AACvE,MAAA,IAAA,CAAK,sBAAA,CAAuB,mBAAmB,eAAe,CAAA;AAC9D,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,QAAA,IAAA,CAAK,iBAAiB,eAAe,CAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AAAA,EAEQ,gBAAA,CACN,GAAA,EACA,OAAA,EACA,QAAA,EACA,KAAA,EACS;AAIT,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AAGrD,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,OAAA,EAAS,CAAA;AACtC,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,MAAA;AAAA,UAChC,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,QAAA,CAAS;AAAA;AACjC,OACD,CAAA;AACD,MAAA,MAAM,SAAA,GACJ,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,MAAM,OAAA,CAAQ,gBAAA;AAC9C,MAAA,IAAI,SAAA,IAAa,cAAc,KAAA,EAAO;AACpC,QAAA,IAAA,CAAK,uBAAuB,SAAA,EAAW,IAAA,EAAM,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACpE;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,EAAK,wBAAwB,CAAA;AAQlE,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,eAAA,GAAkB;AAAA,QACrB,GAAG,IAAA,CAAK,eAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,eAAA,CAAgB,OAAA;AAAA,UACxB,oBAAA,EAAsB,SAAS,QAAA,CAAS;AAAA;AAC1C,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,aAAa,EAAE,OAAA,EAAS,EAAA,EAAI,UAAA,EAAY,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,MACpB,aAAa,UAAA,CAAW,WAAA;AAAA,MACxB,sBAAsB,UAAA,CAAW;AAAA,KAClC,CAAA;AACD,IAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,GAAG,CAAA;AACxC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,YAAA,CACZ,OAAA,EACA,WAAA,GAA4B,EAAC,EACd;AACf,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,WAAW,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,CACZ,OAAA,EACA,WAAA,EACA,OAAA,EACe;AACf,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,OAAO,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAA,CACZ,OAAA,EACA,WAAA,GAA4B,IAC5B,OAAA,EACe;AACf,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IACE,CAAC,OAAA,CAAQ,IAAA,EAAK,IACd,KAAK,KAAA,CAAM,SAAA,CAAU,OAAA,IACrB,oBAAA,CAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,eAAA,EAAiB,MAAM,CAAA,EACjE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,EAAK;AACpC,IAAA,IAAI,cAAA,CAAe,UAAA,CAAW,GAAG,CAAA,EAAG;AAClC,MAAA,MAAM,YAAA,GAAe,kBAAkB,OAAO,CAAA;AAC9C,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,kCAAA,EAAoC,CAAA;AACpE,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,iCAAA,EAAmC,CAAA;AACnE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,CAAK,qBAAqB,YAAY,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,cAAA,EAAe,EAAG;AACtC,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,WAAA,CAAY,uBAAA,EAAwB;AAC/D,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,aAAA,GAAgB,GAAI,CAAA;AAC9C,MAAA,IAAA,CAAK,YAAA,CAAa;AAAA,QAChB,UAAA,EAAY,oCAAoC,OAAO,CAAA,wCAAA;AAAA,OACxD,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAa,EAAE,OAAA,EAAS,EAAA,EAAI,UAAA,EAAY,MAAM,CAAA;AACnD,IAAA,IAAA,CAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,OAAO,CAAA;AAC1D,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,MACpB,OAAA,EAAS,IAAA;AAAA,MACT,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,IAAA,CAAK,eAAA,GAAkB,UAAA;AACvB,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA;AAEnB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA;AACxC,IAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAC/C,IAAA,MAAM,uBAAuB,OAAA,EAAS,oBAAA;AACtC,IAAA,MAAM,QAAA,GAAW,iBAAA;AAAA,MACf,YAAA,IAAgB,KAAA;AAAA,MAChB,OAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,OAAA,EAAS,WAAA,EAAa,OAAA,EAAQ;AAEvD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA;AACvC,IAAA,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAW,QAAA,EAAU,oBAAoB,CAAA;AAEpE,IAAA,IAAI,gBAAA,GAAmB,IAAA;AAEvB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,iBAAiB,mBAAA,EAAoB,GAC3C,MAAM,IAAA,CAAK,mBAAA,CAAoB,cAAc,YAAY,CAAA;AAG3D,MAAA,IAAA,CAAK,mBAAmB,eAAA,IAAmB,IAAA;AAE3C,MAAA,MAAM,EAAE,gBAAA,EAAkB,cAAA,EAAgB,SAAQ,GAChD,MAAM,KAAK,cAAA,CAAe;AAAA,QACxB,eAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA,EAAW,YAAA;AAAA,QACX,oBAAA;AAAA,QACA,iBAAiB,IAAA,CAAK,uBAAA;AAAA,UACpB,IAAA,CAAK,MAAM,OAAA,CAAQ;AAAA,SACrB;AAAA,QACA,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA;AAAA,QAC1B,YAAY,QAAA,CAAS,EAAA;AAAA,QACrB,UAAA;AAAA,QACA;AAAA,OACD,CAAA;AAKH,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAAA,MAElC,WAAW,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,UACpB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,MAAA;AAAA,YAChC,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,QAAA,CAAS;AAAA;AACjC,SACD,CAAA;AACD,QAAA,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,OAAA,EAAS,CAAA;AACtC,QAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,QAAA,MAAM,SAAS,gBAAA,IAAoB,eAAA;AACnC,QAAA,IAAI,MAAA,IAAU,WAAW,KAAA,EAAO;AAC9B,UAAA,MAAM,KAAK,sBAAA,CAAuB,MAAA,EAAQ,MAAM,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QACvE;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,CAAK,6BAAA;AAAA,UACT,eAAA;AAAA,UACA,gBAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,kBAAkB,gBAAA,IAAoB,eAAA;AAC5C,QAAA,IAAA,CAAK,uBAAA,CAAwB,iBAAiB,mBAAmB,CAAA;AAAA,MACnE;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,gBAAA,GAAmB,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,OAAA,EAAS,UAAU,KAAK,CAAA;AAAA,IACxE,CAAA,SAAE;AAGA,MAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC/B,QAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,gBAAA,EAAkB,EAAA;AAAA,UAClB,WAAA,EAAa,KAAA;AAAA,UACb,eAAA,EAAiB,EAAA;AAAA,UACjB,aAAa;AAAC,SACf,CAAA;AACD,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAC1B;AAEA,MAAA,IAAI,IAAA,CAAK,oBAAoB,UAAA,EAAY;AACvC,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB;AAIA,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,qBAAqB,OAAA,EAAuB;AAClD,IAAA,MAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,eAAA;AAClC,IAAA,IAAI,UAAU,IAAA,GAAO,OAAA;AACrB,IAAA,IAAI,OAAA,CAAQ,SAAS,qBAAA,EAAuB;AAC1C,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,qBAAqB,CAAA;AAAA,IAChD;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,eAAA,EAAiB,OAAA,EAAS,CAAA;AAGlD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,WAAA;AACnC,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA;AAAA,MACrB,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,EAAE,MAAA,KAAW;AAAA,KAC/C;AACA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAA,GAAqB;AAAA,QACzB,EAAA,EAAI,CAAA,SAAA,EAAY,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,QAC1B,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,QAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AACA,MAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,CAAC,GAAG,KAAA,EAAO,IAAI,GAAG,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEQ,iBAAiB,IAAA,EAKhB;AAEP,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,WAAA,CAAY,GAAA;AAAA,MAAI,CAAC,CAAA,KAChD,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,EAAE,MAAA,KAAW,QAAA,GAClC,EAAE,GAAG,GAAG,MAAA,EAAQ,WAAA,EAAsB,aAAa,IAAA,CAAK,GAAA,IAAM,GAC9D;AAAA,KACN;AAEA,IAAA,MAAM,iBAAA,GAAoB,KAAK,IAAA,KAAS,MAAA;AACxC,IAAA,MAAM,IAAA,GAAqB;AAAA,MACzB,IACE,IAAA,CAAK,MAAA,IACL,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,MAC9D,IAAA,EAAM,oBAAoB,kBAAA,GAAqB,MAAA;AAAA,MAC/C,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAA,EAAQ,QAAA;AAAA,MACR,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,IAAI,CAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,KAAA,EAAO,CAAA;AAAA,EAC9C;AAAA,EAEQ,eAAe,IAAA,EAKd;AACP,IAAA,MAAM,QAAQ,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,UAAU,WAAW,CAAA;AAClD,IAAA,MAAM,MAAM,KAAA,CAAM,SAAA;AAAA,MAChB,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,YAAY,IAAA,CAAK,UAAA,CAAW,GAAG,IAAI;AAAA,KACzD;AACA,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI;AAAA,QACX,GAAG,MAAM,GAAG,CAAA;AAAA,QACZ,MAAA,EAAQ,WAAA;AAAA,QACR,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,QACtB,YAAY,IAAA,CAAK;AAAA,OACnB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,WAAA,EAAa,KAAA,EAAO,CAAA;AAG5C,IAAA,IAAI,KAAK,IAAA,IAAQ,mBAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACnD,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,4BAAA,EACE,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,4BAAA,GAA+B;AAAA,OACvD,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGQ,UAAA,CACN,MACA,IAAA,EACS;AAET,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA;AAAA,IAC1B;AACA,IAAA,OAAO,KAAK,QAAA,KAAa,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,cAAc,IAAA,CAAK,SAAA;AAAA,EAChE;AAAA;AAAA,EAIA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,MAAM,cAAc,IAAA,CAAK,eAAA;AACzB,IAAA,IAAI,CAAC,WAAA,IAAe,IAAA,CAAK,KAAA,CAAM,UAAU,OAAA,EAAS;AAChD,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AACtC,IAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,MACT,WAAA,CAAY,OAAA;AAAA,MACZ,WAAA,CAAY,WAAA;AAAA,MACZ,WAAA,CAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,iBAAA,CACZ,MAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA;AACxC,IAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,KAAiB,KAAA,EAAO;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AACnE,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,IAAS,KAAA,KAAU,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,EAAO;AAC/C,MAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,OAAO,CAAA;AAE1D,IAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,MACT,KAAK,QAAA,CAAS,OAAA;AAAA,MACd,KAAK,QAAA,CAAS,WAAA;AAAA,MACd;AAAA,QACE,oBAAA,EAAsB,KAAK,QAAA,CAAS;AAAA;AACtC,KACF;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,CAAY,MAAA,EAAgB,UAAA,EAAmC;AAC3E,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA;AACxC,IAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,KAAiB,KAAA,EAAO;AAC3C,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA;AACzC,MAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,QACpB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM;AAAA,OAChE,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AACnE,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,CAAK,cAAA,CAAe;AAAA,QAClB,KAAA,EAAO,wBAAA;AAAA,QACP,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,OAAO,CAAA;AAE1D,IAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,UAAA,EAAY,IAAA,CAAK,SAAS,WAAA,EAAa;AAAA,MACnE,oBAAA,EAAsB,KAAK,QAAA,CAAS;AAAA,KACrC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,YAAY,IAAA,EAA6B;AACrD,IAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,CAAC,UAAU,SAAA,EAAW;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,6BACZ,OAAA,EACe;AACf,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA;AACxC,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,eAAA;AAChD,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,kBAAA,EAAoB;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA;AACnB,IAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AACvC,IAAA,IAAA,CAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,OAAO,CAAA;AAC1D,IAAA,MAAM,uBAAA,GAA0B,kBAAA;AAEhC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,qBAAA;AAAA,QACnC,YAAA;AAAA,QACA,uBAAA,CAAwB,EAAA;AAAA,QACxB;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,UACpB,eAAA,EAAiB;AAAA,YACf,GAAG,uBAAA;AAAA,YACH,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,KAAA,EAAO,oCAAA;AAAA,YACL,IAAA,CAAK,MAAM,SAAA,CAAU,KAAA;AAAA,YACrB;AAAA,cACE,GAAG,uBAAA;AAAA,cACH,MAAA,EAAQ;AAAA;AACV;AACF,SACD,CAAA;AACD,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAA,CAAK,wBAAA,CAAyB,YAAA,EAAc,MAAA,CAAO,KAAK,KAAK,CAAA;AACnE,UAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,oBAAA,EAAsB;AAC9C,YAAA,MAAM,WAAA,GACJ,MAAM,IAAA,CAAK,UAAA,CAAW,aAAa,YAAY,CAAA;AACjD,YAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,cAAA;AAAA,YACF;AACA,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,IAAA,CAAK,cAAA,CAAe,EAAE,OAAA,EAAS,WAAA,CAAY,SAAS,CAAA;AACpD,cAAA,IAAA,CAAK,kBAAA;AAAA,gBACH,WAAA,CAAY,KAAA;AAAA,gBACZ,YAAY,eAAA,IAAmB;AAAA,eACjC;AAAA,YACF,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,cAAA,CAAe;AAAA,gBAClB,KAAA,EAAO,gCAAA;AAAA,gBACP,cAAA,EAAgB;AAAA,eACjB,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAA,MAAA,IAAW,iBAAiB,KAAA,EAAO;AACjC,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,aAAa,YAAY,CAAA;AACnE,UAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,YAAA;AAAA,UACF;AACA,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,IAAA,CAAK,cAAA,CAAe,EAAE,OAAA,EAAS,WAAA,CAAY,SAAS,CAAA;AACpD,YAAA,IAAA,CAAK,kBAAA;AAAA,cACH,WAAA,CAAY,KAAA;AAAA,cACZ,YAAY,eAAA,IAAmB;AAAA,aACjC;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,cAAA,CAAe;AAAA,cAClB,KAAA,EAAO,gCAAA;AAAA,cACP,cAAA,EAAgB;AAAA,aACjB,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,cAAA,CAAe;AAAA,UAClB,KAAA,EAAO,OAAO,KAAA,IAAS,0BAAA;AAAA,UACvB,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,EAAK,0BAA0B,CAAA;AACpE,MAAA,IAAA,CAAK,cAAA,CAAe;AAAA,QAClB,OAAO,UAAA,CAAW,WAAA;AAAA,QAClB,gBAAgB,UAAA,CAAW;AAAA,OAC5B,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC/B,QAAA,IAAA,CAAK,gBAAA,CAAiB,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAGxC,QAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO;AAC7B,UAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,4BAAA,GAA8C;AAC1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,gBAAA;AACxC,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,eAAA;AAChD,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,kBAAA,EAAoB;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,sBAAsB,YAAY,CAAA;AACvE,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAM,iBAAA,GAAoB;AAAA,UACxB,GAAG,kBAAA;AAAA,UACH,MAAA,EAAQ;AAAA,SACV;AACA,QAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,UACpB,eAAA,EAAiB,iBAAA;AAAA,UACjB,KAAA,EAAO,oCAAA;AAAA,YACL,IAAA,CAAK,MAAM,SAAA,CAAU,KAAA;AAAA,YACrB;AAAA;AACF,SACD,CAAA;AACD,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAM,IAAA,CAAK,wBAAA,CAAyB,YAAA,EAAc,MAAA,CAAO,KAAK,KAAK,CAAA;AACnE,UAAA,IACE,CAAC,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,oBAAA,IACtB,iBAAiB,KAAA,EACjB;AACA,YAAA,MAAM,WAAA,GACJ,MAAM,IAAA,CAAK,UAAA,CAAW,aAAa,YAAY,CAAA;AACjD,YAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,cAAA;AAAA,YACF;AACA,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,IAAA,CAAK,cAAA,CAAe,EAAE,OAAA,EAAS,WAAA,CAAY,SAAS,CAAA;AACpD,cAAA,IAAA,CAAK,kBAAA;AAAA,gBACH,WAAA,CAAY,KAAA;AAAA,gBACZ,YAAY,eAAA,IAAmB;AAAA,eACjC;AAAA,YACF,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,cAAA,CAAe;AAAA,gBAClB,KAAA,EAAO,gCAAA;AAAA,gBACP,cAAA,EAAgB;AAAA,eACjB,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAA,MAAA,IAAW,iBAAiB,KAAA,EAAO;AACjC,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,aAAa,YAAY,CAAA;AACnE,UAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,YAAA;AAAA,UACF;AACA,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,IAAA,CAAK,cAAA,CAAe,EAAE,OAAA,EAAS,WAAA,CAAY,SAAS,CAAA;AACpD,YAAA,IAAA,CAAK,kBAAA;AAAA,cACH,WAAA,CAAY,KAAA;AAAA,cACZ,YAAY,eAAA,IAAmB;AAAA,aACjC;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,cAAA,CAAe;AAAA,UAClB,KAAA,EAAO,OAAO,KAAA,IAAS,2BAAA;AAAA,UACvB,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,EAAK,2BAA2B,CAAA;AACrE,MAAA,IAAA,CAAK,cAAA,CAAe;AAAA,QAClB,OAAO,UAAA,CAAW,WAAA;AAAA,QAClB,gBAAgB,UAAA,CAAW;AAAA,OAC5B,CAAA;AAAA,IACH,CAAA,SAAE;AAEA,MAAA,IAAI,IAAA,CAAK,gBAAgB,KAAK,CAAA,IAAK,CAAC,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,EAAO;AAC5D,QAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,aAAA,CACN,CAAA,EACA,WAAA,GAA4B,EAAC,EACvB;AACN,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,OAAA;AAC7B,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAK,IAAK,WAAA,CAAY,WAAW,CAAA,EAAG;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AACtC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,oBAAA,GAAqC,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACnE,SAAA,EAAW,GAAA,CAAI,SAAA,IAAa,MAAA,CAAO,UAAA,EAAW;AAAA,MAC9C,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,SAAS,GAAA,CAAI;AAAA,KACf,CAAE,CAAA;AAGF,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,OAAA,EAAS;AAChC,MAAA,MAAM,KAAK,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAA,IAAQ,oBAAoB,CAAA;AAChE,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,EAAA,EAAI,CAAA;AAAA,MACnC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,EAAK,EAAG,oBAAoB,CAAA;AAAA,EACpD;AAAA,EAEQ,cAAA,GAGC;AACP,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAA;AAC/B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,YAAA,EAAc,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,GAAG,CAAA;AACtD,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa,KAAK,WAAA,EAAY;AAAA,EAChE;AAAA,EAEQ,eAAA,CAAgB,SAAiB,WAAA,EAAoC;AAC3E,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAA,CAAa,UAAU,cAAA,EAAgB;AAC1D,MAAA,IAAA,CAAK,YAAA,CAAa,EAAE,UAAA,EAAY,wBAAA,EAA0B,CAAA;AAC1D,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,YAAA,CAAa;AAAA,MAChB,YAAA,EAAc;AAAA,QACZ,GAAG,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAA;AAAA,QACpB,EAAE,SAAS,WAAA;AAAY;AACzB,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,KAAA,EAAqB;AAC5C,IAAA,IAAA,CAAK,YAAA,CAAa;AAAA,MAChB,YAAA,EAAc,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAA,CAAa,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAK;AAAA,KACzE,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAA,CAAiB,OAAe,OAAA,EAAuB;AAC7D,IAAA,IAAA,CAAK,YAAA,CAAa;AAAA,MAChB,YAAA,EAAc,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAA,CAAa,GAAA;AAAA,QAAI,CAAC,MAAM,CAAA,KACrD,CAAA,KAAM,QAAQ,EAAE,GAAG,IAAA,EAAM,OAAA,EAAQ,GAAI;AAAA;AACvC,KACD,CAAA;AAAA,EACH;AACF;AAMA,SAAS,sBAAA,CACP,GACA,CAAA,EACS;AACT,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OACE,CAAA,CAAE,YAAA,KAAiB,CAAA,CAAE,YAAA,IACrB,CAAA,CAAE,gBAAA,KAAqB,CAAA,CAAE,gBAAA,IACzB,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,WAAA,IACpB,CAAA,CAAE,mBAAmB,CAAA,CAAE,cAAA,IACvB,CAAA,CAAE,kBAAA,KAAuB,CAAA,CAAE,kBAAA,IAC3B,CAAA,CAAE,sBAAA,KAA2B,CAAA,CAAE,sBAAA,IAC/B,CAAA,CAAE,iBAAA,KAAsB,CAAA,CAAE,iBAAA;AAE9B;AC5+DA,IAAM,UAAA,GAAavC,oBAAkC,IAAI,CAAA;AA4BzD,IAAM,yBAAA,GAA+C;AAAA,EACnD,WAAA,EAAa,EAAA;AAAA,EACb,QAAA,EAAU;AACZ,CAAA;AAMO,SAAS,mBAAA,CAAoB;AAAA,EAClC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,EAAa,mBAAA;AAAA,EACb,eAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAE3B,EAAA,MAAM,UAAA,GAAaK,aAA2B,IAAI,CAAA;AAClD,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,IAAA,UAAA,CAAW,OAAA,GAAU,IAAI,WAAA,CAAY;AAAA,MACnC,UAAA;AAAA,MACA,WAAA,EACE,mBAAA,IACA,IAAI,WAAA,CAAY,mBAAmB,yBAAyB,CAAA;AAAA,MAC9D;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAG3B,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,YAAA,CAAa,EAAE,UAAA,EAAY,gBAAA,EAAkB,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,gBAAgB,CAAC,CAAA;AAG1C,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,aAAa,SAAS,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAGvB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,uBACET,cAAAA,CAAC,UAAA,CAAW,UAAX,EAAoB,KAAA,EAAO,SACzB,QAAA,EACH,CAAA;AAEJ;AAMA,SAAS,UAAA,GAA0B;AACjC,EAAA,MAAM,OAAA,GAAUC,iBAAW,UAAU,CAAA;AACrC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,cAAA,GAAwC;AACtD,EAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,EAAA,OAAOqB,0BAAA;AAAA,IACL,OAAA,CAAQ,gBAAA;AAAA,IACR,OAAA,CAAQ,kBAAA;AAAA,IACR,OAAA,CAAQ;AAAA;AAAA,GACV;AACF;AAEO,SAAS,gBAAA,GAA4C;AAC1D,EAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,EAAA,OAAOA,0BAAA;AAAA,IACL,OAAA,CAAQ,kBAAA;AAAA,IACR,OAAA,CAAQ,oBAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV;AACF;AAGO,SAAS,wBAAA,GAA2D;AACzE,EAAA,MAAM,OAAA,GAAUrB,iBAAW,UAAU,CAAA;AAErC,EAAA,MAAM,QAAA,GAAWqB,0BAAA;AAAA,IACf,OAAA,GAAU,QAAQ,kBAAA,GAAqB,aAAA;AAAA,IACvC,OAAA,GAAU,QAAQ,oBAAA,GAAuB,YAAA;AAAA,IACzC,OAAA,GAAU,QAAQ,oBAAA,GAAuB;AAAA,GAC3C;AACA,EAAA,OAAO,UAAU,QAAA,GAAW,IAAA;AAC9B;AAEO,SAAS,YAAA,GAAoC;AAClD,EAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,EAAA,OAAOA,0BAAA;AAAA,IACL,OAAA,CAAQ,cAAA;AAAA,IACR,OAAA,CAAQ,gBAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV;AACF;AAGA,SAAS,aAAA,GAA4B;AAAE,EAAA,OAAO,MAAM;AAAA,EAAC,CAAA;AAAG;AACxD,SAAS,YAAA,GAAqB;AAAE,EAAA,OAAO,IAAA;AAAM;;;AChK7C,mBAAA,EAAA;;;ACLA,gBAAA,EAAA;AAEA,mBAAA,EAAA;AAKA,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,GAAWd,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,sBAAsB,CAAA;AAAA,QAChE,WAAA,EAAa,cAAA,CAAe,OAAA,EAAS,WAAA,IAAe,EAAE,4BAA4B,CAAA;AAAA,QAClF;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;AC5CA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,IAAA,IAAA,GAAA,CAAQ,IAAA,IAAQ,KAAK,IAAA,GAAO,IAAA;AAC5B,IAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AACtB;AAOA,IAAM,YAAA,GAAe;AAAA,EACnB,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,EACjC,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA;AAAU;AACnC,CAAA;AAKA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,EAAU,gBAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,SAAA,GAAY;AACd,CAAA,EAAoB;AAElB,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,MAAM,YAAY,SAAA,EAAW,IAAA,EAAK,EAAG,MAAA,CAAO,CAAC,CAAA,IAAK,EAAA;AAClD,IAAA,MAAM,WAAW,QAAA,EAAU,IAAA,EAAK,EAAG,MAAA,CAAO,CAAC,CAAA,IAAK,EAAA;AAChD,IAAA,MAAM,WAAW,CAAA,EAAG,SAAS,CAAA,EAAG,QAAQ,GAAG,IAAA,EAAK;AAChD,IAAA,OAAO,QAAA,IAAY,GAAA;AAAA,EACrB,CAAA,GAAG;AAEH,EAAA,MAAM,QAAA,GAAA,CAAY,gBAAA,EAAkB,IAAA,EAAK,IAAK,iBAAiB,WAAA,EAAY;AAG3E,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,EAAG,QAAQ,CAAA,CAAA;AACxC,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,QAAQ,CAAA,GAAI,YAAA,CAAa,MAAA;AACvD,EAAA,MAAM,MAAA,GAAS,aAAa,UAAU,CAAA;AAEtC,EAAA,uBACER,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW;AAAA,QAAA,EACP,WAAA,CAAY,IAAI,CAAC;AAAA,QAAA,EACjB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MASb,OAAO,EAAE,eAAA,EAAiB,OAAO,EAAA,EAAI,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,MACxD,YAAA,EAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,MACpC,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,MAE9B,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEA,IAAM,kBAAA,GAAqBgB,WAAK,UAAU;AAC1C,kBAAA,CAAmB,WAAA,GAAc,YAAA;ACrFjC,IAAM,cAAA,GAAiB;AAAA,EACrB,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,gBAAA,GAAmB;AAAA,EACvB,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,KAAA;AAAA,EACA,GAAA,GAAM,CAAA;AAAA,EACN,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAqB;AACnB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,GAAA;AAEhC,EAAA,MAAM,WAAA,GAAc,OAAO,OAAA,KAAY,UAAA;AACvC,EAAA,MAAM,OAAA,GAAU,eAAe,IAAI,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,iBAAiB,IAAI,CAAA;AAEvC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2B;AAChD,IAAA,IAAI,gBAAgB,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,CAAA,EAAM;AACvD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,EAAS;AAAA,IACX;AAAA,EACF,CAAA;AAEA,EAAA,uBACEN,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,yBAAA,EAA4B,WAAA,GAAc,oDAAA,GAAuD,EAAE,IAAI,SAAS,CAAA,CAAA;AAAA,MAC3H,OAAA,EAAS,cAAc,OAAA,GAAU,MAAA;AAAA,MACjC,SAAA,EAAW,cAAc,aAAA,GAAgB,MAAA;AAAA,MACzC,IAAA,EAAM,cAAc,QAAA,GAAW,MAAA;AAAA,MAC/B,QAAA,EAAU,cAAc,CAAA,GAAI,MAAA;AAAA,MAC5B,YAAA,EAAY,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,QAAA,CAAA,GAAa,MAAA;AAAA,MAErD,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAClBV,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAW,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,UAAU,EAAE,CAAA,kDAAA,CAAA;AAAA,YAClC,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,CAAQ,SAAS,CAAA,EAAE;AAAA,YAEpC,QAAA,kBAAAA,cAAAA;AAAA,cAAC,kBAAA;AAAA,cAAA;AAAA,gBACC,WAAW,IAAA,CAAK,SAAA;AAAA,gBAChB,UAAU,IAAA,CAAK,QAAA;AAAA,gBACf,UAAU,IAAA,CAAK,QAAA;AAAA,gBACf;AAAA;AAAA;AACF,WAAA;AAAA,UATK,GAAG,IAAA,CAAK,SAAS,IAAI,IAAA,CAAK,QAAQ,IAAI,CAAC,CAAA;AAAA,SAW/C,CAAA;AAAA,QACA,WAAW,CAAA,oBACVU,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,2KAAA,CAAA;AAAA,YAClC,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAE;AAAA,YACpB,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cACG;AAAA;AAAA;AAAA;AACJ;AAAA;AAAA,GAEJ;AAEJ;AAEA,IAAM,WAAA,GAAcM,WAAK,gBAAgB;AACzC,WAAA,CAAY,WAAA,GAAc,aAAA;AH1DnB,SAAS,UAAA,CAAW,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAU,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,cAAA,EAAe,EAAoB;AACzH,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,MAAM,UAAA,GAAa,yBACjBhB,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAU,oOAAA;AAAA,MACV,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,MAElC,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,yEAChB,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,UAAA;AAAA,QACA,IAAA;AAAA,wBACDV,cAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,iDAAA,EACX,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;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,MAAM,uBAAuB,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK,IAAK,EAAE,qBAAqB,CAAA;AAC7E,EAAA,MAAM,cAAA,GAAiB,QAAQ,OAAA,CAAQ,OAAA,IAAY,QAAQ,WAAA,IAAe,OAAA,CAAQ,cAAc,CAAE,CAAA;AAClG,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,CAAA;AAG3C,EAAA,MAAM,aAAa,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,UAAU,EAAC;AAE9D,EAAA,uBACEA,eAAC,QAAA,EAAA,EAAO,SAAA,EAAU,yEAChB,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MACA,IAAA;AAAA,sBACDA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0DAAA,EAA4D,QAAA,EAAA,oBAAA,EAAqB,CAAA;AAAA,UAC9F,OAAA,CAAQ,0BACPA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oDAAA;AAAA,cACV,IAAA,EAAK,cAAA;AAAA,cACL,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,KAAA;AAAA,cACL,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,cAElC,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qaAAA,EAAsa;AAAA;AAAA,WAChb;AAAA,UAED,cAAA,IAAkB,UAAA,CAAW,MAAA,GAAS,CAAA,oBACrCA,cAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,UAAA;AAAA,cACP,GAAA,EAAK,CAAA;AAAA,cACL,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,cAAA;AAAA,cACT,SAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EAEJ,CAAA;AAAA,QACC,cAAA,IAAkB,cAAc,CAAA,oBAC/BA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDACV,QAAA,EAAA,WAAA,KAAgB,CAAA,GACb,EAAE,uBAAuB,CAAA,GACzB,EAAE,yBAAyB,CAAA,CAAE,QAAQ,WAAA,EAAa,MAAA,CAAO,WAAW,CAAC,CAAA,EAC3E;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,oBACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,oBACCV,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gGAAA,EACb,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,MAED,OAAA,CAAQ,MAAA,KAAW,UAAA,oBAClBA,cAAAA,CAAC,UAAK,SAAA,EAAU,yFAAA,EACb,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,MAED;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AIjHO,SAAS,kBAAA,CACd,MACA,CAAA,EACQ;AACR,EAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,IAAI,CAAA;AACjC,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,EAAA,MAAM,QAAA,GAAW0C,2BAAA,CAAoB,GAAA,EAAK,WAAW,CAAA;AACrD,EAAA,MAAM,SAAA,GAAYC,yBAAA,CAAkB,GAAA,EAAK,WAAW,CAAA;AACpD,EAAA,MAAM,QAAA,GAAWC,wBAAA,CAAiB,GAAA,EAAK,WAAW,CAAA;AAElD,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,OAAO,CAAA,GAAI,CAAA,CAAE,6BAA6B,CAAA,GAAI,UAAA;AAAA,EAChD;AACA,EAAA,IAAI,WAAW,EAAA,EAAI;AACjB,IAAA,OAAO,CAAA,GAAI,EAAE,gCAAA,EAAkC,EAAE,OAAO,QAAA,EAAU,CAAA,GAAI,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAA;AAAA,EACnF;AACA,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,OAAO,CAAA,GAAI,EAAE,8BAAA,EAAgC,EAAE,OAAO,SAAA,EAAW,CAAA,GAAI,CAAA,EAAG,SAAS,CAAA,KAAA,CAAA;AAAA,EACnF;AACA,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAO,CAAA,GAAI,EAAE,6BAAA,EAA+B,EAAE,OAAO,QAAA,EAAU,CAAA,GAAI,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAA;AAAA,EAChF;AAEA,EAAA,OAAOC,cAAA,CAAO,aAAa,OAAO,CAAA;AACpC;ACtCA,IAAM,mBAAA,GAAsB,KAAK,IAAA,GAAO,IAAA;AAExC,IAAM,kBAAA,uBAAyB,GAAA,CAAY;AAAA,EACzC,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,yEAAA;AAAA,EACA,0BAAA;AAAA,EACA,mEAAA;AAAA,EACA,UAAA;AAAA,EACA,2BAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,kBAAA,uBAAyB,GAAA,CAAY;AAAA,EACzC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,IAAM,8BAA8B,KAAA,CAAM,IAAA,CAAK,kBAAkB,CAAA,CAAE,KAAK,GAAG;AAE3E,SAAS,gBAAgB,QAAA,EAA2B;AACzD,EAAA,OAAO,QAAA,CAAS,WAAA,EAAY,CAAE,UAAA,CAAW,QAAQ,CAAA;AACnD;AAMO,SAAS,sBAAA,CAAuB,IAAA,EAAY,YAAA,GAAuB,mBAAA,EAA2B;AACnG,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AACvC,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,IAAQ,MAAA;AAC9B,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,IAAA,CAAK,QAAA,CAAS,aAAa,CAAA;AAC7D,EAAA,MAAM,YAAY,cAAA,GAAiB,CAAA,CAAA,EAAI,cAAA,CAAe,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA;AAE7D,EAAA,MAAM,WAAA,GAAc,QAAA,KAAa,EAAA,IAAM,kBAAA,CAAmB,IAAI,QAAQ,CAAA;AACtE,EAAA,MAAM,gBAAA,GAAmB,SAAA,KAAc,EAAA,IAAM,kBAAA,CAAmB,IAAI,SAAS,CAAA;AAE7E,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,gBAAA,EAAkB;AACrC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAA,IAAY,SAAA,IAAa,SAAS,CAAA,CAAE,CAAA;AAAA,EAC5E;AAEA,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;AAKO,SAAS,iBAAA,CAAkB,IAAA,EAAY,YAAA,GAAuB,mBAAA,EAA2B;AAC9F,EAAA,sBAAA,CAAuB,MAAM,YAAY,CAAA;AACzC,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAClF;AACF;AAKA,SAAS,kBAAkB,MAAA,EAA6B;AACtD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,KAAA;AAClB,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,SAAA,EAAW;AAChD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,IAAI,SAAS,CAAA;AAC7C,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,GAAG,KAAK,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAEA,SAAS,8BAA8B,IAAA,EAAkC;AACvE,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,IAAI,MAAA,CAAO,kBAAkB,WAAA,EAAa;AACxC,QAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AAAA,IAC9C,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,CAAO,SAAS,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAC5E,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,uBAAuB,CAAC,CAAA;AAChE,IAAA,MAAA,CAAO,kBAAkB,IAAI,CAAA;AAAA,EAC/B,CAAC,CAAA;AACH;AAEA,SAAS,0BAA0B,IAAA,EAA6B;AAC9D,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,IAAI,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACrC,QAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AAAA,IAC9C,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,CAAO,SAAS,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAC5E,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,uBAAuB,CAAC,CAAA;AAChE,IAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;AAEA,eAAe,eAAe,IAAA,EAAkC;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAI,QAAA,CAAS,IAAI,EAAE,WAAA,EAAY;AAAA,EAC9C,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,KAAK,WAAA,EAAY;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,8BAA8B,IAAI,CAAA;AAAA,EAC3C;AACF;AAEA,SAAS,yBAAyB,OAAA,EAAyB;AACzD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACtC,EAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,KAAe,OAAA,CAAQ,SAAS,CAAA,EAAG;AACvD,IAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AACrC;AAMA,eAAsB,gBAAgB,IAAA,EAA6B;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,yBAAA,CAA0B,IAAI,CAAA;AACpD,IAAA,OAAO,yBAAyB,OAAO,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,IAAI,CAAA;AACxC,MAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,IACjC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAA,CAAA,GAAM,EAAA;AAC7D,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAK,IAAI,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA;AAAA,IAC/D;AAAA,EACF;AACF;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,QAAQ,IAAA,EAAM;AAAC,IAAA,OAAO,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,EAAK;AACvC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM;AAAC,IAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,EAAM;AACnE,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;AAgCO,SAAS,aAAA,CAAc,UAAmB,QAAA,EAA+B;AAC9E,EAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,IAAY,EAAA,EAAI,WAAA,EAAY;AAC1C,EAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,IAAY,EAAA,EAAI,WAAA,EAAY;AAG1C,EAAA,IAAI,KAAK,UAAA,CAAW,QAAQ,KAAK,iCAAA,CAAkC,IAAA,CAAK,IAAI,CAAA,EAAG;AAC7E,IAAA,OAAO;AAAA,MACL,IAAA,EAAMC,WAAA;AAAA,MACN,SAAA,EAAW,sCAAA;AAAA,MACX,OAAA,EAAS,qCAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,QAAA,CAAS,KAAK,KAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACjD,IAAA,OAAO;AAAA,MACL,IAAA,EAAMC,aAAA;AAAA,MACN,SAAA,EAAW,gCAAA;AAAA,MACX,OAAA,EAAS,+BAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAGA,EAAA,IACE,IAAA,KAAS,mEAAA,IACT,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,QAAA,CAAS,aAAa,CAAA,IAC3B,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EACpB;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM9B,aAAA;AAAA,MACN,SAAA,EAAW,wCAAA;AAAA,MACX,OAAA,EAAS,uCAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,eAAe,CAAA,IAAK,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AACvF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM+B,aAAA;AAAA,MACN,SAAA,EAAW,wCAAA;AAAA,MACX,OAAA,EAAS,uCAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,kBAAkB,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAG;AACzF,IAAA,OAAO;AAAA,MACL,IAAA,EAAMC,aAAA;AAAA,MACN,SAAA,EAAW,kCAAA;AAAA,MACX,OAAA,EAAS,iCAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAGA,EAAA,IACE,IAAA,CAAK,SAAS,MAAM,CAAA,IAAK,KAAK,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,KACrE,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,IACzD,2BAAA,CAA4B,IAAA,CAAK,IAAI,CAAA,EACrC;AACA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,GAAI,MAAA,GACxD,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,GAAI,KAAA,GAChD,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA,GACjD,MAAA;AACJ,IAAA,OAAO;AAAA,MACL,IAAA,EAAMC,cAAA;AAAA,MACN,SAAA,EAAW,sCAAA;AAAA,MACX,OAAA,EAAS,qCAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,UAAA,CAAW,OAAO,KAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5D,IAAA,OAAO;AAAA,MACL,IAAA,EAAMC,cAAA;AAAA,MACN,SAAA,EAAW,kCAAA;AAAA,MACX,OAAA,EAAS,8BAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,IAAA,EAAMC,UAAAA;AAAA,IACN,SAAA,EAAW,kCAAA;AAAA,IACX,OAAA,EAAS,8BAAA;AAAA,IACT,KAAA,EAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,MAAA,EAAQ,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA,GAChE;AACF;AAGO,IAAM,YAAA,GAA2B;AAAA,EACtC,IAAA,EAAMC,cAAA;AAAA,EACN,SAAA,EAAW,sCAAA;AAAA,EACX,OAAA,EAAS,qCAAA;AAAA,EACT,KAAA,EAAO;AACT;AC5TA,SAAS,kBAAkB,UAAA,EAAiC;AAC1D,EAAA,OAAO,UAAA,CAAW,QAAA,CAAS,WAAA,EAAY,CAAE,WAAW,QAAQ,CAAA;AAC9D;AAEA,SAAS,oBAAoB,UAAA,EAAgC;AAC3D,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,OAAO,UAAA,CAAW,OAAA;AAAA,EACpB;AACA,EAAA,IAAI,CAAC,iBAAA,CAAkB,UAAU,CAAA,EAAG;AAClC,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,IAAI,UAAA,CAAW,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7C,MAAA,OAAO,UAAA,CAAW,UAAA;AAAA,IACpB;AACA,IAAA,OAAO,CAAA,KAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA,QAAA,EAAW,WAAW,UAAU,CAAA,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,WAAW,GAAA,IAAO,EAAA;AAC3B;AAIA,IAAM,QAAA,GAAW;AAAA,EACf,qDAAA;AAAA,EACA,mDAAA;AAAA,EACA,8BAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAEV,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,QAAA,EAAU,UAAS,EAAuE;AACvH,EAAA,uBACErD,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAAG,CAAA;AAAA,MACxD,SAAA,EAAU,0OAAA;AAAA,MACV,YAAA,EAAY,UAAU,QAAQ,CAAA,CAAA;AAAA,MAE9B,0BAAAA,cAAAA,CAACsD,OAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,GAC7B;AAEJ;AAIA,SAAS,WAAA,GAAc;AACrB,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,UAAA,EAAY,sFAAA;AAAA,IACZ,cAAA,EAAgB,WAAA;AAAA,IAChB,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,uBACE5C,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAU,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAO,EACvD,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,YAAA,EAAc,CAAA,EACtD,CAAA;AAAA,oBACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,YAAA,EAAc,CAAA,EACtD,CAAA;AAAA,sBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,YAAA,EAAc,CAAA,EACtD;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAKN;AAAA,GAAA,EACJ,CAAA;AAEJ;AAWA,SAAS,UAAU,EAAE,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,QAAO,EAAmB;AAC1E,EAAA,MAAM,UAAA,GAAa,oBAAoB,UAAU,CAAA;AACjD,EAAA,MAAM,aAAa,UAAA,KAAe,EAAA;AAClC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIM,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,SAAA,GACJ,UAAA,IAAc,CAAC,SAAA,mBACbN,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,KAAK,UAAA,CAAW,QAAA;AAAA,MAChB,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,MAChC,SAAA,EAAU;AAAA;AAAA,sBAGZA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FACb,QAAA,kBAAAA,cAAAA,CAAC8C,WAAAA,EAAA,EAAU,MAAM,EAAA,EAAI,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,wCAAuC,CAAA,EACzF,CAAA;AAGJ,EAAA,uBACEpC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAA,EACb,QAAA,EAAA;AAAA,IAAA,UAAA,IAAc,CAAC,SAAA,IAAa,MAAA,mBAC3BV,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,MAAA,CAAO,KAAK,CAAA;AAAA,QAC3B,SAAA,EAAU,+JAAA;AAAA,QACV,YAAA,EAAY,CAAA,KAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA,CAAA;AAAA,QAEtC,QAAA,EAAA;AAAA;AAAA,wBAGHA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,oBAG5CU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yEAAA,EACb,qBAAW,QAAA,EACd,CAAA;AAAA,sBACAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDACb,QAAA,EAAA,cAAA,CAAe,UAAA,CAAW,SAAS,CAAA,EACtC;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,QAAA,oBAAYA,cAAAA,CAAC,YAAA,EAAA,EAAa,OAAc,QAAA,EAAoB,QAAA,EAAU,WAAW,QAAA,EAAU;AAAA,GAAA,EAC9F,CAAA;AAEJ;AAUA,SAAS,QAAA,CAAS,EAAE,UAAA,EAAY,KAAA,EAAO,UAAS,EAAkB;AAChE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,CAAW,QAAA,EAAU,WAAW,QAAQ,CAAA;AACrE,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAA,EACd,QAAA,EAAA;AAAA,oBAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,oEAAA,EAAuE,MAAA,CAAO,OAAO,CAAA,CAAA,EACnG,QAAA,kBAAAA,cAAAA,CAAC,IAAA,EAAA,EAAK,MAAM,EAAA,EAAI,MAAA,EAAO,WAAU,SAAA,EAAW,MAAA,CAAO,WAAW,CAAA,EAChE,CAAA;AAAA,oBAEAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yEAAA,EACb,qBAAW,QAAA,EACd,CAAA;AAAA,sBACAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDACb,QAAA,EAAA,cAAA,CAAe,UAAA,CAAW,SAAS,CAAA,EACtC;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,QAAA,oBAAYA,cAAAA,CAAC,YAAA,EAAA,EAAa,OAAc,QAAA,EAAoB,QAAA,EAAU,WAAW,QAAA,EAAU;AAAA,GAAA,EAC9F,CAAA;AAEJ;AAIA,IAAM,YAAA,GAAe,CAAC,CAAA,EAAe,CAAA,KACnC,CAAA,CAAE,SAAA,KAAc,CAAA,CAAE,SAAA,IAClB,CAAA,CAAE,EAAA,KAAO,CAAA,CAAE,EAAA,IACX,CAAA,CAAE,aAAa,CAAA,CAAE,QAAA,IACjB,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,OAAA,IAChB,CAAA,CAAE,UAAA,KAAe,CAAA,CAAE,UAAA,IACnB,CAAA,CAAE,GAAA,KAAQ,CAAA,CAAE,GAAA;AAEd,IAAM,oBAAoBuD,sBAAA,CAAM,IAAA;AAAA,EAAK,SAAA;AAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KACrD,aAAa,IAAA,CAAK,UAAA,EAAY,KAAK,UAAU,CAAA,IAC7C,KAAK,KAAA,KAAU,IAAA,CAAK,SACpB,IAAA,CAAK,QAAA,KAAa,KAAK,QAAA,IACvB,IAAA,CAAK,WAAW,IAAA,CAAK;AACvB,CAAA;AAEA,IAAM,mBAAmBA,sBAAA,CAAM,IAAA;AAAA,EAAK,QAAA;AAAA,EAAU,CAAC,IAAA,EAAM,IAAA,KACnD,YAAA,CAAa,KAAK,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA,IAC7C,KAAK,KAAA,KAAU,IAAA,CAAK,KAAA,IACpB,IAAA,CAAK,aAAa,IAAA,CAAK;AACzB,CAAA;AAIA,SAAS,cAAA,CAAe;AAAA,EACtB,WAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,UAAA;AAAA,EACA,WAAA,GAAc,EAAA;AAAA,EACd,YAAA,GAAe,mBAAA;AAAA,EACf,SAAA,GAAY,KAAA;AAAA,EACZ,YAAA,GAAe;AACjB,CAAA,EAAwB;AACtB,EAAA,MAAM,oBAAA,GAAuB/C,aAAAA;AAAA,IAC3B,MACE,cAAc,WAAA,CAAY,MAAA,GAAS,aAC/B,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,GAC/B,WAAA;AAAA,IACN,CAAC,aAAa,UAAU;AAAA,GAC1B;AAEA,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAA,IAAU,WAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,MAAA,GAAS,CAAA,IAAK,YAAA,GAAe,CAAA;AAErE,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,IAAI,CAAC,SAAA,EAAW;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAC7B,IAAA,uBACER,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAqD,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,EAErF;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,QAAA,IAAY,CAAC,CAAC,QAAA;AAElC,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EACnC,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA;AAAA,MAAA,oBAAA,CAAqB,MAAA;AAAA,MAAO,OAAA;AAAA,MAAM,oBAAA,CAAqB,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,EAAA;AAAA,MAAG;AAAA,KAAA,EAClF,CAAA;AAAA,oBAGFA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA;AAAA,MAAA,oBAAA,CAAqB,GAAA,CAAI,CAAC,UAAA,EAAY,KAAA,KAAU;AAC/C,QAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,UAAU,CAAA,IAAK,oBAAoB,UAAU,CAAA;AAC/E,QAAA,OAAO,0BACLV,cAAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YAEC,UAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA,EAAU,aAAa,QAAA,GAAW,MAAA;AAAA,YAClC;AAAA,WAAA;AAAA,UAJK,UAAA,CAAW;AAAA,4BAOlBA,cAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YAEC,UAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA,EAAU,aAAa,QAAA,GAAW;AAAA,WAAA;AAAA,UAH7B,UAAA,CAAW;AAAA,SAIlB;AAAA,MAEJ,CAAC,CAAA;AAAA,MAGA,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBAC5CA,cAAAA,CAAC,iBAAiB,CAAA,QAAA,EAAW,CAAC,EAAI,CACnC;AAAA,KAAA,EACH,CAAA;AAAA,IAEC,UAAA,IAAc,YAAY,MAAA,GAAS,UAAA,oBAClCU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0CAAA,EAA2C,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MACtD,YAAY,MAAA,GAAS,UAAA;AAAA,MAAW;AAAA,KAAA,EACpC,CAAA;AAAA,IAGD,mBAAmB,UAAA,oBAClBA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4CAAA,EAA6C,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MACjD,WAAA;AAAA,MAAY;AAAA,KAAA,EACvB;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,IAAM,sBAAA,GAAyB6C,sBAAA,CAAM,IAAA,CAAK,cAAc;AACxD,sBAAA,CAAuB,WAAA,GAAc,gBAAA;AAGrC,IAAO,sBAAA,GAAQ,sBAAA;AC/Rf,SAAS,kBAAkB,IAAA,EAAgD;AACzE,EAAA,IAAI,SAAS,IAAA,CAAK,aAAA;AAClB,EAAA,OAAO,MAAA,EAAQ,YAAY,aAAA,EAAe;AACxC,IAAA,MAAA,GAAS,OAAO,UAAA,CAAW,aAAA;AAAA,EAC7B;AACA,EAAA,OAAO,MAAA,YAAkB,cAAc,MAAA,GAAS,IAAA;AAClD;AAcO,SAAS,YAAA,CACd,YAAA,EACA,QAAA,EACA,wBAAA,EACA;AACA,EAAA9C,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,CAAa,OAAA,EAAS;AAAC,MAAA;AAAA,IAAO;AAEhD,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,UAAU,WAAA,EAAY;AACnC,IAAA,MAAM,iBAAA,GAAoB,kBAAkB,IAAI,CAAA;AAGhD,IAAA,MAAM,uBAAuB,MAAqB;AAChD,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,wBAAA;AAAA,QACA,QAAA;AAAA,QACA,uBAAA;AAAA,QACA,wBAAA;AAAA,QACA,0BAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI,CAAA;AAEX,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,QAAQ,CAAC,CAAA;AAAA,IACxD,CAAA;AAMA,IAAA,MAAM,oBAAoB,oBAAA,EAAqB;AAC/C,IAAA,MAAM,gBACJ,SAAA,CAAU,aAAA,CAA2B,kBAAkB,CAAA,IACvD,kBAAkB,CAAC,CAAA;AACrB,IAAA,aAAA,EAAe,KAAA,EAAM;AAGrB,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAqB;AACzC,MAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AAAC,QAAA;AAAA,MAAO;AAE7B,MAAA,MAAM+C,qBAAoB,oBAAA,EAAqB;AAC/C,MAAA,IAAIA,kBAAAA,CAAkB,WAAW,CAAA,EAAG;AAAC,QAAA;AAAA,MAAO;AAE5C,MAAA,MAAM,YAAA,GAAeA,mBAAkB,CAAC,CAAA;AACxC,MAAA,MAAM,WAAA,GAAcA,kBAAAA,CAAkBA,kBAAAA,CAAkB,MAAA,GAAS,CAAC,CAAA;AAClE,MAAA,MAAM,MAAA,GAAS,kBAAkB,IAAI,CAAA;AAErC,MAAA,IAAI,EAAE,QAAA,EAAU;AAEd,QAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,WAAA,CAAY,KAAA,EAAM;AAAA,QACpB;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,YAAA,CAAa,KAAA,EAAM;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,SAAA,CAAU,gBAAA,CAAiB,WAAW,YAAY,CAAA;AAGlD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,mBAAA,CAAoB,WAAW,YAAY,CAAA;AAGrD,MAAA,IAAI,wBAAA,EAA0B;AAC5B,QAAA,wBAAA,CAAyB,KAAA,EAAM;AAAA,MACjC,WAAW,iBAAA,EAAmB;AAC5B,QAAA,iBAAA,CAAkB,KAAA,EAAM;AAAA,MAC1B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,QAAA,EAAU,wBAAwB,CAAC,CAAA;AACvD;AC1FA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAI,qBAAA,GAA6C,IAAA;AAEjD,SAAS,aAAA,GAAsB;AAC7B,EAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,EAAA,MAAM,gBAAA,GAAmB,KAAK,KAAA,CAAM,QAAA;AACpC,EAAA,MAAM,oBAAA,GAAuB,KAAK,KAAA,CAAM,YAAA;AAIxC,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,UAAA,GAAa,QAAA,CAAS,eAAA,CAAgB,WAAA;AAEpE,EAAA,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AACtB,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,MAAM,iBACJ,UAAA,CAAW,MAAA,CAAO,iBAAiB,IAAI,CAAA,CAAE,YAAY,CAAA,IAAK,CAAA;AAC5D,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,CAAA,EAAG,cAAA,GAAiB,cAAc,CAAA,EAAA,CAAA;AAAA,EAC9D;AAEA,EAAA,qBAAA,GAAwB,MAAM;AAC5B,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,gBAAA;AACtB,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,oBAAA;AAAA,EAC5B,CAAA;AACF;AAEO,SAAS,aAAa,MAAA,EAAiB;AAC5C,EAAA/C,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,aAAA,EAAc;AAAA,IAChB;AACA,IAAA,SAAA,IAAa,CAAA;AAEb,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,IAAa,CAAA;AACb,MAAA,IAAI,SAAA,KAAc,KAAK,qBAAA,EAAuB;AAC5C,QAAA,qBAAA,EAAsB;AACtB,QAAA,qBAAA,GAAwB,IAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACb;ACtCA,IAAM,aAAA,GAAgBP,oBAAmC,IAAI,CAAA;AAatD,SAAS,aAAa,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,UAAS,EAAsB;AACtF,EAAA,MAAM,YAAA,GAAeK,aAAuB,IAAI,CAAA;AAKhD,EAAA,YAAA,CAAa,IAAI,CAAA;AACjB,EAAA,YAAA,CAAa,cAAc,IAAI,CAAA;AAI/B,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAqB;AACpC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AACA,IAAA,SAAA,CAAU,gBAAA,CAAiB,WAAW,OAAwB,CAAA;AAC9D,IAAA,OAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,SAAA,EAAW,OAAwB,CAAA;AAAA,EAChF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACET,cAAAA,CAAC,aAAA,CAAc,UAAd,EAAuB,KAAA,EAAO,SAE7B,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA;AAAA,MACA,OAAA,EAAS,OAAA;AAAA,MACT,QAAA,EAAU,EAAA;AAAA,MAET;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAMO,SAAS,qBAAqB,KAAA,EAAuC;AAC1E,EAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAY,MAAA,EAAQ,GAAG,KAAA,EAAO,CAAA;AAC5C;AAMO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmC;AAIjC,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;AAMO,SAAS,kBAAkB,KAAA,EAA2C;AAC3E,EAAA,uBAAOA,cAAAA,CAAC,IAAA,EAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AACxB;AAEO,SAAS,wBAAwB,KAAA,EAA6C;AACnF,EAAA,uBAAOA,cAAAA,CAAC,GAAA,EAAA,EAAG,GAAG,KAAA,EAAO,CAAA;AACvB;AC3GA,mBAAA,EAAA;AAWA,SAAS,aAAA,CAAc;AAAA,EACrB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd;AACF,CAAA,EAKG;AACD,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAU,sSAAA;AAAA,MACV,YAAA,EAAY,SAAA;AAAA,MAEX;AAAA;AAAA,GACH;AAEJ;AAcA,SAAS,aAAA,CAAc;AAAA,EACrB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sKAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,eAAC,aAAA,EAAA,EAAc,OAAA,EAAS,WAAW,QAAA,EAAU,KAAA,IAAS,WAAW,YAAA,EAAY,CAAA,CAAE,sBAAsB,CAAA,EACnG,0BAAAA,cAAAA,CAACyD,0BAAA,EAAA,EAAqB,MAAM,EAAA,EAAI,MAAA,EAAO,QAAO,CAAA,EAChD,CAAA;AAAA,oBAEA/C,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uFAAA,EACb,QAAA,EAAA;AAAA,MAAA,WAAA;AAAA,MAAY;AAAA,KAAA,EACf,CAAA;AAAA,oBAEAV,cAAAA,CAAC,aAAA,EAAA,EAAc,SAAS,QAAA,EAAU,QAAA,EAAU,SAAS,SAAA,EAAW,YAAA,EAAY,EAAE,qBAAqB,CAAA,EACjG,0BAAAA,cAAAA,CAAC0D,yBAAA,EAAA,EAAoB,MAAM,EAAA,EAAI,MAAA,EAAO,QAAO,CAAA,EAC/C,CAAA;AAAA,oBAEA1D,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,oBAE3CA,cAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,YAAA,EAAc,cAAY,CAAA,CAAE,yBAAyB,CAAA,EAC3E,QAAA,kBAAAA,eAAC2D,2BAAA,EAAA,EAAsB,IAAA,EAAM,EAAA,EAAI,MAAA,EAAO,QAAO,CAAA,EACjD,CAAA;AAAA,oBAEA3D,cAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,aAAA,EAAe,cAAY,CAAA,CAAE,0BAA0B,CAAA,EAC7E,QAAA,kBAAAA,eAAC4D,oBAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,MAAA,EAAO,QAAO,CAAA,EAC1C,CAAA;AAAA,IAEC,aAAA,oBACClD,eAAAA,CAAAG,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAb,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBAC3CA,cAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,OAAA,EAAS,cAAY,CAAA,CAAE,wBAAwB,CAAA,EACrE,QAAA,kBAAAA,eAAC6D,cAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,MAAA,EAAO,QAAO,CAAA,EACpC;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,IAAM,SAAA,GAAY,IAAA;AAClB,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,SAAA,GAAY,IAAA;AAElB,SAAS,UAAA,CAAW;AAAA,EAClB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA,GAAe,CAAA;AAAA,EACf;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIvD,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,CAAC,CAAA;AAG1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AACvD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,eAAeC,YAAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAC1C,EAAA,MAAM,cAAcA,YAAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACzC,EAAA,MAAM,QAAA,GAAWA,aAAO,CAAC,CAAA;AACzB,EAAA,MAAM,YAAA,GAAeA,aAAuB,IAAI,CAAA;AAEhD,EAAA,MAAM,iBAAA,GAAoB,cAAA,IAAkB,cAAA,CAAe,MAAA,GAAS,CAAA;AACpE,EAAA,MAAM,eAAA,GAAkB,qBAAqB,YAAA,GAAe,CAAA;AAC5D,EAAA,MAAM,eAAA,GACJ,iBAAA,IAAqB,YAAA,GAAA,CAAgB,cAAA,EAAgB,UAAU,CAAA,IAAK,CAAA;AACtE,EAAA,MAAM,WAAW,KAAA,GAAQ,CAAA;AACzB,EAAA,MAAM,aAAA,GAAgB,YAAY,QAAA,KAAa,CAAA;AAG/C,EAAAE,gBAAU,MAAM;AAAE,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAAA,EAAO,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACtD,EAAAA,gBAAU,MAAM;AAAE,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAAA,EAAU,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAE/D,EAAA,MAAM,UAAA,GAAaN,kBAAY,MAAM;AACnC,IAAA,WAAA,CAAY,CAAC,CAAA,KAAA,CAAA,CAAQ,CAAA,GAAI,EAAA,IAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,EACjD,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACpC,IAAA,WAAA,CAAY,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,EAAA,IAAM,GAAG,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,MAAA;AAAA,IAAO;AAErB,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,UAAA,IAAc,eAAA,EAAiB;AAC1D,QAAA,UAAA,CAAW,MAAM,CAAA;AAAA,MACnB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,YAAA,IAAgB,cAAc,eAAA,EAAiB;AAClE,QAAA,UAAA,CAAW,MAAM,CAAA;AAAA,MACnB,WAAW,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AACzC,QAAA,QAAA,CAAS,OAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,MAClD,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK;AACxB,QAAA,QAAA,CAAS,OAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAA,EAAW,SAAS,CAAC,CAAA;AAChD,QAAA,IAAI,QAAA,CAAS,OAAA,GAAU,SAAA,IAAa,CAAA,EAAG;AAAC,UAAA,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,QAAE;AAAA,MACtE,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK;AACxB,QAAA,QAAA,CAAS,CAAC,CAAA;AACV,QAAA,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAC1B,QAAA,WAAA,CAAY,CAAC,CAAA;AAAA,MACf,WAAW,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAC,EAAE,QAAA,EAAU;AACvC,QAAA,WAAA,EAAY;AAAA,MACd,CAAA,MAAA,IAAW,EAAE,GAAA,KAAQ,GAAA,IAAQ,EAAE,GAAA,KAAQ,GAAA,IAAO,EAAE,QAAA,EAAW;AACzD,QAAA,UAAA,EAAW;AAAA,MACb;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAA,EAAY,iBAAiB,eAAA,EAAiB,UAAA,EAAY,WAAW,CAAC,CAAA;AAGlF,EAAAA,gBAAU,MAAM;AACd,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAC1B,IAAA,WAAA,CAAY,CAAC,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA;AACxB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,MAAA,EAAQ;AAAC,MAAA;AAAA,IAAO;AAE5B,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAC,SAAA,GAAY,SAAA;AAC1C,MAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,MAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,OAAA,GAAU,KAAA,EAAO,SAAS,CAAA,EAAG,SAAS,CAAA;AACzE,MAAA,IAAI,aAAa,OAAA,EAAS;AAAC,QAAA;AAAA,MAAO;AAClC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,IAAI,YAAY,CAAA,EAAG;AAAC,QAAA,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,MAAE;AAAA,IAClD,CAAA;AAEA,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AACxD,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,WAAA,GAAcN,kBAAY,MAAM;AACpC,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,WAAA,CAAY,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,OAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,EAClD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,kBAAY,MAAM;AAChC,IAAA,QAAA,CAAS,OAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAA,EAAW,SAAS,CAAC,CAAA;AAChD,IAAA,IAAI,QAAA,CAAS,OAAA,GAAU,SAAA,IAAa,CAAA,EAAG;AAAC,MAAA,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IAAE;AAAA,EACtE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,kBAAY,MAAM;AAClC,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAC1B,IAAA,WAAA,CAAY,CAAC,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,MAAM;AAC1C,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,QAAA,CAAS,CAAC,CAAA;AACV,MAAA,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAC1B,MAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,CAAC,CAAA;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,CAAA,KAAwB;AAC3D,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AACnC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,YAAA,CAAa,OAAA,GAAU;AAAA,MACrB,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,CAAA;AAAA,MACnC,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ;AAAA,KACrC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,CAAA,KAAwB;AAC3D,IAAA,IAAI,CAAC,UAAA,EAAY;AAAC,MAAA;AAAA,IAAO;AACzB,IAAA,WAAA,CAAY;AAAA,MACV,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,YAAA,CAAa,OAAA,CAAQ,CAAA;AAAA,MACpC,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,YAAA,CAAa,OAAA,CAAQ;AAAA,KACrC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACtC,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,mBAAA,GAAsBA,iBAAAA,CAAY,CAAC,CAAA,KAAwB;AAC/D,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,IAAiB,CAAC,QAAA,EAAU;AAC7C,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,aACJ,UAAA,CAAW,OAAA,IAAW,cAAc,UAAA,CAAW,UAAA,EAAY,WAAW,QAAQ,CAAA;AAEhF,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA;AAE1C,EAAA,uBACEO,eAAAA,CAAC,YAAA,EAAA,EAAa,MAAM,MAAA,EAAQ,OAAA,EAAkB,WAAU,oBAAA,EACtD,QAAA,EAAA;AAAA,oBAAAV,cAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,4CAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA;AAAM;AAAA,KACzB;AAAA,oBAEAU,eAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,6BAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,GAAA,EAAO;AAAA,QACxB,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,aAAA;AAAA,QACX,YAAA,EAAc,aAAA;AAAA,QAGd,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,SAAI,SAAA,EAAU,sCAAA,EACb,0BAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,YAAA,iBAAA,oBACCA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEAAA,EACb,QAAA,EAAA;AAAA,cAAA,YAAA,GAAe,CAAA;AAAA,cAAE,KAAA;AAAA,cAAI,cAAA,EAAgB;AAAA,aAAA,EACxC,CAAA;AAAA,4BAEFV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EAA8C,qBAAW,QAAA,EAAS,CAAA;AAAA,4BAClFA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CACb,QAAA,EAAA,cAAA,CAAe,UAAA,CAAW,SAAS,CAAA,EACtC;AAAA,WAAA,EACF,CAAA,EACF,CAAA;AAAA,0BAGAU,eAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,YAAA;AAAA,cACL,SAAA,EAAU,oEAAA;AAAA,cACV,OAAA,EAAS,mBAAA;AAAA,cACT,OAAO,EAAE,MAAA,EAAQ,WAAY,UAAA,GAAa,UAAA,GAAa,SAAU,SAAA,EAAU;AAAA,cAG3E,QAAA,EAAA;AAAA,gCAAAV,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,OAAA;AAAA,oBACT,SAAA,EAAU,2TAAA;AAAA,oBACV,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,oBAClC,IAAA,EAAK,QAAA;AAAA,oBAEL,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,iBAC7B;AAAA,gBAGC,CAAC,aAAA,IAAiB,CAAC,UAAA,oBAClBtD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EAA+E,CAAA;AAAA,kCAC9FA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uBAAA,EAAyB,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EAAE;AAAA,iBAAA,EAC/D,CAAA,EACF,CAAA;AAAA,gBAID,8BACCU,eAAAA,CAAC,SAAI,IAAA,EAAK,OAAA,EAAQ,WAAU,gEAAA,EAC1B,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+FAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC8D,iBAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,MAAA,EAAO,WAAU,CAAA,EACpE,CAAA;AAAA,kCACA9D,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,wCAAA,EAA0C,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,kCACtFA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EAAkD,qBAAW,QAAA,EAAS,CAAA;AAAA,kCACnFU,eAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,WAAA;AAAA,sBACT,SAAA,EAAU,yPAAA;AAAA,sBACV,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,sBAElC,QAAA,EAAA;AAAA,wCAAAV,cAAAA,CAAC4D,oBAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,wBACvC,EAAE,oBAAoB;AAAA;AAAA;AAAA;AACzB,iBAAA,EACF,CAAA;AAAA,gCAIF5D,cAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBAEC,GAAA,EAAK,UAAA;AAAA,oBACL,KAAK,UAAA,CAAW,QAAA;AAAA,oBAChB,SAAA,EAAW;AAAA,sBACT,2FAAA;AAAA,sBACA,0CAAA;AAAA,sBACA,gBAAgB,aAAA,GAAgB;AAAA,qBAClC,CAAE,KAAK,GAAG,CAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,SAAA,EAAW,CAAA,UAAA,EAAa,QAAA,CAAS,CAAC,CAAA,IAAA,EAAO,SAAS,CAAC,CAAA,UAAA,EAAa,KAAK,CAAA,SAAA,EAAY,QAAQ,CAAA,IAAA,CAAA;AAAA,sBACzF,eAAA,EAAiB,eAAA;AAAA,sBACjB,UAAA,EAAY,aACR,uBAAA,GACA;AAAA,qBACN;AAAA,oBACA,MAAA,EAAQ,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,oBACnC,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,oBACjC,WAAA,EAAa,eAAA;AAAA,oBACb,aAAA,EAAe,iBAAA;AAAA,oBACf,OAAA,EAAQ,MAAA;AAAA,oBACR,SAAA,EAAW;AAAA,mBAAA;AAAA,kBApBN;AAAA,iBAqBP;AAAA,gBAGC,iBAAA,oBACCU,eAAAA,CAAAG,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,kCAAAb,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,MAAM,UAAA,GAAa,MAAM,CAAA;AAAA,sBAClC,QAAA,EAAU,CAAC,eAAA,IAAmB,CAAC,aAAA,IAAiB,UAAA;AAAA,sBAChD,SAAA,EAAW;AAAA,wBACT,+CAAA;AAAA,wBACA,yDAAA;AAAA,wBACA,yGAAA;AAAA,wBACA,eAAA,IAAmB,aAAA,IAAiB,CAAC,UAAA,GACjC,+HAAA,GACA;AAAA,uBACN,CAAE,KAAK,GAAG,CAAA;AAAA,sBACV,YAAA,EAAY,EAAE,uBAAuB,CAAA;AAAA,sBACrC,IAAA,EAAK,QAAA;AAAA,sBAEL,0BAAAA,cAAAA,CAAC+D,eAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,mBACrC;AAAA,kCAEA/D,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,MAAM,UAAA,GAAa,MAAM,CAAA;AAAA,sBAClC,QAAA,EAAU,CAAC,eAAA,IAAmB,CAAC,aAAA,IAAiB,UAAA;AAAA,sBAChD,SAAA,EAAW;AAAA,wBACT,gDAAA;AAAA,wBACA,yDAAA;AAAA,wBACA,yGAAA;AAAA,wBACA,eAAA,IAAmB,aAAA,IAAiB,CAAC,UAAA,GACjC,+HAAA,GACA;AAAA,uBACN,CAAE,KAAK,GAAG,CAAA;AAAA,sBACV,YAAA,EAAY,EAAE,mBAAmB,CAAA;AAAA,sBACjC,IAAA,EAAK,QAAA;AAAA,sBAEL,0BAAAA,cAAAA,CAACgE,gBAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA;AACtC,iBAAA,EACF,CAAA;AAAA,gBAID,aAAA,IAAiB,CAAC,UAAA,oBACjBhE,cAAAA;AAAA,kBAAC,aAAA;AAAA,kBAAA;AAAA,oBACC,KAAA;AAAA,oBACA,WAAA;AAAA,oBACA,aAAA;AAAA,oBACA,QAAA,EAAU,MAAA;AAAA,oBACV,SAAA,EAAW,OAAA;AAAA,oBACX,YAAA,EAAc,UAAA;AAAA,oBACd,aAAA,EAAe,WAAA;AAAA,oBACf,OAAA,EAAS,SAAA;AAAA,oBACT;AAAA;AAAA;AACF;AAAA;AAAA;AAEJ;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAGA,IAAO,kBAAA,GAAQ,UAAA;;;ACrbf,mBAAA,EAAA;AAmGA,IAAM,gBAAA,GAAmB,GAAA;AAMzB,IAAM,iBAAA,GAAqD;AAAA,EACzD,IAAA,EAAM,8BAAA;AAAA,EACN,OAAA,EAAS,+EAAA;AAAA,EACT,MAAA,EAAQ,mHAAA;AAAA,EACR,MAAA,EAAQ,yEAAA;AAAA,EACR,OAAA,EAAS,yDAAA;AAAA,EACT,WAAA,EAAa,aAAA;AAAA,EACb,OAAA,EAAS,8BAAA;AAAA,EACT,YAAA,EAAc,6WAAA;AAAA,EACd,SAAA,EAAW;AACb,CAAA;AAEA,SAAS,eAAA,CACP,UACA,SAAA,EACiC;AACjC,EAAA,IAAI,CAAC,SAAA,EAAW;AAAC,IAAA,OAAO,QAAA;AAAA,EAAS;AACjC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA,CAAU,IAAA,IAAQ,QAAA,CAAS,IAAA;AAAA,IACjC,OAAA,EAAS,SAAA,CAAU,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,IACvC,MAAA,EAAQ,SAAA,CAAU,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,IACrC,MAAA,EAAQ,SAAA,CAAU,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,IACrC,OAAA,EAAS,SAAA,CAAU,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,IACvC,WAAA,EAAa,SAAA,CAAU,WAAA,IAAe,QAAA,CAAS,WAAA;AAAA,IAC/C,OAAA,EAAS,SAAA,CAAU,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,IACvC,YAAA,EAAc,SAAA,CAAU,YAAA,IAAgB,QAAA,CAAS,YAAA;AAAA,IACjD,SAAA,EAAW,SAAA,CAAU,SAAA,IAAa,QAAA,CAAS;AAAA,GAC7C;AACF;AAkBA,SAAS,QAAA,CAAS,EAAE,YAAA,EAAc,aAAA,EAAe,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,WAAA,EAAa,QAAA,EAAU,eAAA,EAAiB,CAAA,EAAE,EAAkB;AACxI,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,aAAA;AAAA,QACV,SAAA;AAAA,QACA,SAAA,EAAU,wQAAA;AAAA,QACV,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,QAC1C,IAAA,EAAM;AAAA;AAAA,KACR;AAAA,oBACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EAAyD,QAAA,EAAA;AAAA,QAAA,WAAA;AAAA,QAChE,OAAO,SAAA,KAAc,WAAA,IAAe,kBAAA,CAAmB,IAAA;AAAA,UAC3D,SAAA,CAAoE,aAAA,EAAe,QAAA,IAC/E,SAAA,EAAW,QAAA,IACX;AAAA,YACH,QAAA,GAAM,MAAA;AAAA,QAAO;AAAA,OAAA,EACnB,CAAA;AAAA,sBACAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,QAAA;AAAA,YACT,SAAA,EAAU,kHAAA;AAAA,YAET,YAAE,uBAAuB;AAAA;AAAA,SAC5B;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,SAAA,EAAU,qMAAA;AAAA,YACV,UAAU,QAAA,IAAY,CAAC,YAAA,CAAa,IAAA,MAAU,YAAA,KAAiB,eAAA;AAAA,YAE9D,YAAE,qBAAqB;AAAA;AAAA;AAC1B,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA,GAAW,GAAA;AAAA,EACX,UAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA,EAAY,kBAAA;AAAA,EACZ,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,WAAA,GAAc,KAAA;AAAA,EACd,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA,GAAY;AACd,CAAA,EAAqB;AACnB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIM,eAAwB,IAAI,CAAA;AAChF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,sBAAA,GAAyBC,aAA6C,IAAI,CAAA;AAChF,EAAA,MAAM,eAAA,GAAkBA,aAA4B,IAAI,CAAA;AACxD,EAAA,MAAM,SAAA,GAAYA,aAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,iBAAA,EAAmB,kBAAkB,CAAA;AAErE,EAAAE,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,uBAAuB,OAAA,EAAS;AAClC,QAAA,YAAA,CAAa,uBAAuB,OAAO,CAAA;AAC3C,QAAA,sBAAA,CAAuB,OAAA,GAAU,IAAA;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,gBAAU,MAAM;AACd,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,IAAa,gBAAgB,OAAA,EAAS;AACxC,MAAA,MAAM,WAAW,eAAA,CAAgB,OAAA;AACjC,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,QAAA,CAAS,cAAA,GAAiB,SAAS,KAAA,CAAM,MAAA;AACzC,MAAA,QAAA,CAAS,YAAA,GAAe,SAAS,KAAA,CAAM,MAAA;AACvC,MAAA,QAAA,CAAS,MAAM,MAAA,GAAS,MAAA;AACxB,MAAA,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,CAAS,YAAA,EAAc,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,IACjE;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAAC,MAAA;AAAA,IAAO;AAExB,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,IAAI,SAAA,CAAU,WAAW,CAAC,SAAA,CAAU,QAAQ,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AACtE,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,eAAe,CAAA;AACtD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,eAAe,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,qBAAA,GAAsCD,aAAAA;AAAA,IAC1C,MACE,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,KAAe;AACnC,MAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7C,QAAA,OAAO,UAAA;AAAA,MACT;AAEA,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,OAAO,UAAA;AAAA,MACT;AACA,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,IAAI,UAAA,CAAW,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7C,UAAA,OAAO;AAAA,YACL,GAAG,UAAA;AAAA,YACH,SAAS,UAAA,CAAW;AAAA,WACtB;AAAA,QACF;AACA,QAAA,OAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH,SAAS,CAAA,KAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA,QAAA,EAAW,WAAW,UAAU,CAAA;AAAA,SACtE;AAAA,MACF;AACA,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAA,OAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH,SAAS,UAAA,CAAW;AAAA,SACtB;AAAA,MACF;AACA,MAAA,OAAO,UAAA;AAAA,IACT,CAAC,CAAA;AAAA,IACH,CAAC,KAAK,WAAW;AAAA,GACnB;AAEA,EAAA,MAAM,EAAE,gBAAA,EAAkB,2BAAA,EAA4B,GAAIA,cAAQ,MAAM;AACtE,IAAA,MAAM,SAA4B,EAAC;AACnC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,IAAA,qBAAA,CAAsB,OAAA,CAAQ,CAAC,UAAA,EAAY,KAAA,KAAU;AACnD,MAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7C,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,WAAW,GAAA,EAAK;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAG,UAAA;AAAA,QACH,UAAA,EAAY,WAAW,UAAA,IAAc,EAAA;AAAA,QACrC,OAAA,EAAS,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,GAAA,IAAO;AAAA,OAClD,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAO,EAAE,gBAAA,EAAkB,MAAA,EAAQ,2BAAA,EAA6B,QAAA,EAAS;AAAA,EAC3E,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAA,MAAM,eAAA,GAAkBL,kBAAY,YAAY;AAC9C,IAAA,IAAI;AACF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAAA,MAClD;AAEA,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,IAAI,uBAAuB,OAAA,EAAS;AAClC,QAAA,YAAA,CAAa,uBAAuB,OAAO,CAAA;AAAA,MAC7C;AACA,MAAA,sBAAA,CAAuB,OAAA,GAAU,WAAW,MAAM;AAChD,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,sBAAA,CAAuB,OAAA,GAAU,IAAA;AAAA,MACnC,GAAG,gBAAgB,CAAA;AAAA,IACrB,SAAS,GAAA,EAAK;AACZ,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AAEzB,EAAA,MAAM,eAAA,GAAkBA,kBAAY,MAAM;AACxC,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,eAAA,CAAgB,KAAK,OAAO,CAAA;AAC5B,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,MAAM;AACzC,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,kBAAY,MAAM;AACvC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ;AAAC,MAAA;AAAA,IAAO;AAChC,IAAA,MAAM,UAAA,GAAa,YAAA;AACnB,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAK,EAAG;AAAC,MAAA;AAAA,IAAO;AAChC,IAAA,IAAI,UAAA,KAAe,KAAK,OAAA,EAAS;AAC/B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,QAAQ,UAAU,CAAA;AACzB,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,GAAG,CAAC,MAAA,EAAQ,QAAQ,YAAA,EAAc,IAAA,CAAK,OAAO,CAAC,CAAA;AAE/C,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA,CAAY,CAAC,CAAA,KAAgD;AACrF,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,gBAAA,EAAiB;AAAA,IACnB,WAAW,CAAA,CAAE,GAAA,KAAQ,YAAY,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,CAAA,EAAU;AACxD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,cAAA,EAAe;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,cAAc,CAAC,CAAA;AAErC,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA,CAAY,CAAC,CAAA,KAA8C;AACnF,IAAA,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9B,IAAA,MAAM,KAAK,CAAA,CAAE,MAAA;AACb,IAAA,EAAA,CAAG,MAAM,MAAA,GAAS,MAAA;AAClB,IAAA,EAAA,CAAG,KAAA,CAAM,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,CAAG,YAAA,EAAc,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,EACrD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,iBAAAA;AAAA,IACrB,CAAC,SAAA,KAA+B;AAC9B,MAAA,IAAI,uBAAuB,IAAA,EAAM;AAAC,QAAA;AAAA,MAAO;AAEzC,MAAA,IAAI,SAAA,KAAc,MAAA,IAAU,kBAAA,GAAqB,CAAA,EAAG;AAClD,QAAA,qBAAA,CAAsB,qBAAqB,CAAC,CAAA;AAAA,MAC9C,WAAW,SAAA,KAAc,MAAA,IAAU,kBAAA,GAAqB,gBAAA,CAAiB,SAAS,CAAA,EAAG;AACnF,QAAA,qBAAA,CAAsB,qBAAqB,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA;AAAA,IACA,CAAC,kBAAA,EAAoB,gBAAA,CAAiB,MAAM;AAAA,GAC9C;AAEA,EAAA,MAAM,iBAAA,GACJ,kBAAA,KAAuB,IAAA,GAAO,gBAAA,CAAiB,kBAAkB,CAAA,GAAI,IAAA;AAEvE,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAGtD,EAAA,MAAM,eAAA,GAA8C,EAAE,QAAA,EAAS;AAC/D,EAAA,MAAM,gBAAA,GAAgD,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AAC9E,EAAA,MAAM,oBAAA,GAAwD;AAAA,IAC5D,WAAA,EAAa,qBAAA;AAAA,IACb,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,MAAA,MAAM,UAAA,GAAa,2BAAA,CAA4B,GAAA,CAAI,KAAK,CAAA;AACxD,MAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,QAAA;AAAA,MACF;AACA,MAAA,qBAAA,CAAsB,UAAU,CAAA;AAAA,IAClC;AAAA,GACF;AACA,EAAA,MAAM,gBAAA,GAAgD;AAAA,IACpD,MAAA,EAAQ,eAAA;AAAA,IACR,MAAA,EAAQ,MAAA,IAAU,MAAA,IAAU,SAAA,GAAY,eAAA,GAAkB,MAAA;AAAA,IAC1D,SAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,SAAS,CAAC,CAAC,MAAA,IAAU,CAAC,CAAC,MAAA,IAAU;AAAA,GACnC;AAGA,EAAA,MAAM,UAAA,GAAa,CACjB,IAAA,EACA,KAAA,EACA,cAAA,KACc;AACd,IAAA,IAAI,SAAS,MAAA,EAAW;AAAC,MAAA,OAAO,cAAA;AAAA,IAAe;AAC/C,IAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAAC,MAAA,OAAO,KAAK,KAAK,CAAA;AAAA,IAAE;AACpD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,uBACEO,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,IAAA,EACtB,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,OAAA,EACrB,QAAA,EAAA;AAAA,MAAA,UAAA,oBACCV,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,OAAA,CAAA;AAAA,UACd,IAAA,EAAK,MAAA;AAAA,UACL,YAAA,EAAY,UAAA;AAAA,UACZ,SAAA,EAAU,mEAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MAGD,qBAAA,CAAsB,SAAS,CAAA,oBAC9BA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,WAAA,EACrB,QAAA,EAAA,UAAA;AAAA,QACC,KAAA,EAAO,WAAA;AAAA,QACP,oBAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,sBAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAa,qBAAA;AAAA,YACb,QAAQ,oBAAA,CAAqB;AAAA;AAAA;AAC/B,OACF,EACF,CAAA;AAAA,MAID,IAAA,CAAK,2BACJA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,SAAA;AAAA,UACL,WAAW,OAAA,CAAQ,MAAA;AAAA,UACnB,kBAAA,EAAkB,UAAA,GAAa,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,OAAA,CAAA,GAAY,MAAA;AAAA,UAErD,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,OAAA,CAAQ,OAAA,EACrB,sCACCA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,YAAA;AAAA,cACA,aAAA,EAAe,iBAAA;AAAA,cACf,MAAA,EAAQ,cAAA;AAAA,cACR,QAAA,EAAU,gBAAA;AAAA,cACV,SAAA,EAAW,iBAAA;AAAA,cACX,WAAA,EAAa,eAAA;AAAA,cACb,QAAA,EAAU,KAAA;AAAA,cACV,iBAAiB,IAAA,CAAK,OAAA;AAAA,cACtB;AAAA;AAAA,cAGF,UAAA,CAAW,KAAA,EAAO,SAAS,gBAAA,EAAkB,IAAA,CAAK,OAAO,CAAA,EAE7D;AAAA;AAAA,OACF;AAAA,MAID,CAAC,WAAA,oBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,QAAA,GAAW,aAAA,GAAgB,EAAE,CAAA,CAAA,EAChE,QAAA,EAAA,UAAA;AAAA,QACC,KAAA,EAAO,OAAA;AAAA,QACP,gBAAA;AAAA,wBACAU,eAAAA,CAAAG,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,CAAC,iCAAiBb,cAAAA,CAAC,UAAK,SAAA,EAAW,OAAA,CAAQ,WAAY,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,0BAElEA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,eAAA;AAAA,cACT,WAAW,CAAA,eAAA,EAAkB,OAAA,CAAQ,YAAY,CAAA,CAAA,EAAI,QAAA,GAAW,uCAAuC,EAAE,CAAA,CAAA;AAAA,cACzG,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,cAC1C,OAAO,QAAA,GAAW,CAAA,CAAE,uBAAuB,CAAA,GAAI,EAAE,qBAAqB,CAAA;AAAA,cACtE,aAAA,EAAa,WAAW,MAAA,GAAS,MAAA;AAAA,cAEhC,QAAA,EAAA,QAAA,mBAAWA,cAAAA,CAACuB,WAAA,EAAA,EAAM,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,CAAA,mBAAKvB,cAAAA,CAACwB,UAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU;AAAA;AAAA,WACnF;AAAA,UAEC,MAAA,IAAU,MAAA,IAAU,SAAA,oBACnBxB,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,eAAA;AAAA,cACT,SAAA,EAAW,CAAA,eAAA,EAAkB,OAAA,CAAQ,YAAY,CAAA,CAAA;AAAA,cACjD,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,cAC1C,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,cACrC,QAAA,EAAU,SAAA;AAAA,cAEV,0BAAAA,cAAAA,CAACiE,kBAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU;AAAA;AAAA;AAC3C,SAAA,EAEJ;AAAA,OACF,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,IAGC,CAAC,UAAA,oBACAjE,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,MAAA,EACrB,QAAA,EAAA,UAAA,CAAW,KAAA,EAAO,MAAA,EAAQ,eAAA,EAAiB,QAAQ,CAAA,EACtD,CAAA;AAAA,IAID,qCACCA,cAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,QAAQ,kBAAA,KAAuB,IAAA;AAAA,QAC/B,OAAA,EAAS,MAAM,qBAAA,CAAsB,IAAI,CAAA;AAAA,QACzC,UAAA,EAAY,iBAAA;AAAA,QACZ,cAAA,EAAgB,gBAAA;AAAA,QAChB,cAAc,kBAAA,IAAsB,CAAA;AAAA,QACpC,UAAA,EAAY;AAAA;AAAA;AACd,GAAA,EAEJ,CAAA;AAEJ;ACngBO,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA,GAAiB;AACnB,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,gBAAA,EAAiB;AACpD,EAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,MAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,EAAQ,SAAA,IAAa,EAAA,EAAI,MAAA,EAAQ,QAAA,IAAY,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAClF,EAAA,MAAM,UAAA,GAAa,cAAA,IAAkB,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,MAAA;AACtE,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,GAAA;AAEzD,EAAA,uBACEA,cAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,MAAM,IAAA,CAAK,QAAA;AAAA,MACX,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA,EAAU,gBAAA;AAAA,MACV,UAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,UAAA;AAAA,MACR,UAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;ACxDA,gBAAA,EAAA;ACCA,mBAAA,EAAA;AAMA,SAAS,SAAS,GAAA,EAAqB;AAErC,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY,CAAE,OAAO,GAAG,CAAA;AAC1C,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAEA,SAAS,gBAAA,CAAiB,EAAE,OAAA,EAAQ,EAA0B;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEnD,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACZ,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAC9B,CAAA;AAAA,oBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACpBU,eAAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,MAAA,CAAO,SAAS,OAAA,oBACfA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EACE,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,GAC7B,MAAA,CAAO,OAAA,GACP,CAAA,KAAA,EAAQ,MAAA,CAAO,QAAA,IAAY,WAAW,CAAA,QAAA,EAAW,OAAO,OAAO,CAAA,CAAA;AAAA,YAErE,GAAA,EAAK,MAAA,CAAO,QAAA,IAAY,CAAA,CAAE,8BAA8B,CAAA;AAAA,YACxD,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QAEC,MAAA,CAAO,QAAA,oBACNA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yIAAA,EACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,iBAAO,QAAA,EAAS,CAAA;AAAA,UAC3C,MAAA,CAAO,SAAA,oBACNA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,eAAA,EAAiB,QAAA,EAAA,cAAA,CAAe,MAAA,CAAO,SAAS,CAAA,EAAE;AAAA,SAAA,EAEtE,CAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,MAED,MAAA,CAAO,IAAA,KAAS,MAAA,oBACfU,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2GAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,MAAA,CAAO,OAAA,EAAQ,CAAA,EACrE,CAAA;AAAA,QAEC,OAAO,QAAA,oBACNU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,QAAQ,MAAA,CAAO,QAAA,IAAY,YAAY,CAAA,QAAA,EAAW,QAAA,CAAS,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAAA,cAChF,UAAU,MAAA,CAAO,QAAA;AAAA,cACjB,SAAA,EAAU,0EAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAACkE,cAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,gBACjC,MAAA,CAAO;AAAA;AAAA;AAAA,WACV;AAAA,UACC,OAAO,SAAA,oBACNxD,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kCAAA,EAAmC,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAC/C,cAAA,CAAe,OAAO,SAAS,CAAA;AAAA,YAAE;AAAA,WAAA,EACrC;AAAA,SAAA,EAEJ;AAAA,OAAA,EAEJ,CAAA;AAAA,MAED,OAAO,IAAA,KAAS,OAAA,oBACfA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2HAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,wBAC7DA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,iBAAO,OAAA,EAAQ;AAAA,OAAA,EACvD;AAAA,KAAA,EAAA,EAtDM,KAwDV,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAGA,IAAO,wBAAA,GAAQ,gBAAA;;;ACnGf,mBAAA,EAAA;AAEA,SAAS,eAAA,GAAkB;AACzB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,uBACEA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,gFAAA;AAAA,MACV,YAAA,EAAY,EAAE,wBAAwB;AAAA;AAAA,GACxC;AAEJ;AAGA,IAAO,uBAAA,GAAQ,eAAA;;;ACQf,cAAA,EAAA;;;ACvBA,mBAAA,EAAA;;;ACMA,IAAM,WAAA,GAAc,eAAA;AACpB,IAAM,gBAAA,GAAmB,6EAAA;AACzB,IAAM,UAAA,GAAa,EAAA;AAInB,SAAS,cAAc,CAAA,EAAqB;AAC1C,EAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAAC,IAAA,OAAO,OAAO,SAAA,CAAU,CAAC,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,IAAK,GAAA;AAAA,EAAI;AAC7E,EAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAAC,IAAA,OAAO,WAAA,CAAY,IAAA,CAAK,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,EAAE;AAC9D,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,eAAA,CAAgB,QAAmB,WAAA,EAAkC;AACnF,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,IAAA,IAAQ,MAAM,MAAS,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AAG1C,EAAA,IAAI,WAAA,KAAgB,YAAY,MAAA,CAAO,MAAA,GAAS,KAAK,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,EAAG;AAChF,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,QAAQ,WAAA;AAAa,MACnB,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,SAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT;AACE,QAAA,OAAO,QAAA;AAAA;AACX,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,MAAA;AAAA,EAAO;AAEzC,EAAA,IAAI,MAAA,CAAO,MAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAA,IAAa,OAAO,CAAA,KAAM,QAAA,IAAY,EAAE,IAAA,EAAK,KAAM,MAAM,CAAC,KAAA,CAAM,OAAO,CAAC,CAAC,CAAE,CAAA,EAAG;AACjH,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA,EAAG;AAC/B,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,SAAA,IAAa,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,OAAO,CAAA,EAAG;AAChF,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAA,IAAY,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AAC1E,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,MAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAA,IAAY,WAAA,CAAY,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG;AAC1F,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,eAAA,CAAgB,OAAgB,IAAA,EAAiC;AAC/E,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAK,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,EAC3D;AAEA,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC5D,MAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,QAAA,OAAO,EAAE,SAAS,MAAA,CAAO,KAAK,GAAG,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,MACnE;AAGA,MAAA,IAAI,MAAA,CAAO,UAAU,GAAG,CAAA,IAAK,KAAK,GAAA,CAAI,GAAG,KAAK,GAAA,EAAK;AACjD,QAAA,OAAO,EAAE,SAAS,MAAA,CAAO,GAAG,GAAG,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,MACjE;AACA,MAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAW;AAAA,QAC/C,qBAAA,EAAuB;AAAA,OACxB,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA;AACb,MAAA,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,IACpD;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,IAAA,GAAO,OAAO,KAAA,KAAU,SAAA,GAAY,QAAQ,MAAA,CAAO,KAAK,CAAA,CAAE,WAAA,EAAY,KAAM,MAAA;AAClF,MAAA,OAAO,EAAE,SAAS,IAAA,GAAO,MAAA,GAAS,SAAS,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IAC7E;AAAA,IAEA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG;AACzB,QAAA,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,KAAK,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,MACzD;AACA,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,YAAA,EAAa,KAAM,IAAI,YAAA,EAAa;AACjE,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,OAAA,GAAU,IAAA,CAAK,mBAAmB,MAAA,EAAW,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,CAAA;AAAA,MACrF,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,OAAA,EAAQ,GAAI,IAAA,CAAK,OAAA,EAAS,CAAA,IAAK,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,CAAA;AAC9E,QAAA,IAAI,WAAW,GAAA,EAAK;AAClB,UAAA,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAW,EAAE,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AAAA,QACrH,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAW,EAAE,IAAA,EAAM,WAAW,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,CAAA;AAAA,QAClG;AAAA,MACF;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,IACpD;AAAA,IAEA,KAAK,KAAA,EAAO;AACV,MAAA,OAAO,EAAE,SAAS,MAAA,CAAO,KAAK,GAAG,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IACnE;AAAA,IAEA,SAAS;AACP,MAAA,MAAM,GAAA,GAAM,OAAO,KAAA,KAAU,QAAA,GACzB,KAAK,SAAA,CAAU,KAAK,CAAA,GACpB,MAAA,CAAO,KAAK,CAAA;AAChB,MAAA,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,KAAK,KAAA,EAAO,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,IACzD;AAAA;AAEJ;;;AC5FA,IAAM,oBAAoB,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,KAAK,GAAG,CAAA;AAmCxC,SAAS,YAAA,CACd,OACA,OAAA,EACoB;AACpB,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAA,IAAY,OAAA,EAAS,eAAA,IAAmB,EAAA,EAAI,CAAC,CAAA,EAAG,GAAG,CAAA;AACnG,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIM,eAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,eAAe,CAAA;AACxD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAA2B,IAAI,CAAA;AACvD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,IAAIA,cAAAA,iBAA+B,IAAI,KAAK,CAAA;AACxF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIA,cAAAA,iBAA8B,IAAI,KAAK,CAAA;AAG/E,EAAAG,gBAAU,MAAM;AACd,IAAA,OAAA,CAAQ,CAAC,CAAA;AACT,IAAA,WAAA,CAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAA,IAAY,OAAA,EAAS,eAAA,IAAmB,EAAA,EAAI,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AACxF,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,cAAA,CAAe,EAAE,CAAA;AACjB,IAAA,mBAAA,iBAAoB,IAAI,KAAK,CAAA;AAC7B,IAAA,eAAA,iBAAgB,IAAI,KAAK,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AAGb,EAAA,MAAM,WAAA,GAAcD,cAAQ,MAAM;AAChC,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,KAAA,KAAU;AACrC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,GAAc,KAAK,CAAA;AAC7C,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAC,CAAA;AACvD,MAAA,OAAO,eAAA,CAAgB,cAAc,WAAW,CAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAA,CAAM,OAAA,EAAS,MAAM,IAAA,EAAM,KAAA,CAAM,WAAW,CAAC,CAAA;AAGjD,EAAA,MAAM,OAAA,GAAwBA,cAAQ,MAAM;AAC1C,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAM,KAAA,MAAW;AAAA,MACzC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,IAAA;AAAA,MAChC,IAAA,EAAM,YAAY,KAAK,CAAA;AAAA,MACvB,KAAA,EAAO,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA;AAAA,MAClC,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,KAAK,CAAA,IAAK;AAAA,KAC1C,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,KAAA,CAAM,OAAA,EAAS,MAAM,OAAA,EAAS,WAAA,EAAa,YAAA,EAAc,gBAAgB,CAAC,CAAA;AAE9E,EAAA,MAAM,cAAA,GAAiBA,aAAAA,CAAQ,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGhF,EAAA,MAAM,kBAAA,GAAqBA,cAAQ,MAAM;AACvC,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG;AAAC,MAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IAAK;AAC5C,IAAA,MAAM,KAAA,GAAQ,YAAY,WAAA,EAAY;AACtC,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,cAAA,CAAe,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AACjE,IAAA,OAAO,MAAM,IAAA,CAAK,MAAA;AAAA,MAAO,CAAC,GAAA,KACxB,GAAA,CAAI,IAAA,CAAK,CAAC,MAAM,CAAA,KAAM;AACpB,QAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,EAAG;AAAC,UAAA,OAAO,KAAA;AAAA,QAAM;AAC1C,QAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW;AAAC,UAAA,OAAO,KAAA;AAAA,QAAM;AACvD,QAAA,OAAO,OAAO,IAAI,CAAA,CAAE,WAAA,EAAY,CAAE,SAAS,KAAK,CAAA;AAAA,MAClD,CAAC;AAAA,KACH;AAAA,EACF,GAAG,CAAC,KAAA,CAAM,IAAA,EAAM,WAAA,EAAa,cAAc,CAAC,CAAA;AAG5C,EAAA,MAAM,UAAA,GAAaA,cAAQ,MAAM;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AAAC,MAAA,OAAO,kBAAA;AAAA,IAAmB;AAEtC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AAAC,MAAA,OAAO,kBAAA;AAAA,IAAmB;AAErC,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,kBAAkB,CAAA;AACrC,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA;AACpB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,KAAc,KAAA,GAAQ,CAAA,GAAI,EAAA;AAE3C,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,MAAA,MAAM,IAAA,GAAO,EAAE,MAAM,CAAA;AACrB,MAAA,MAAM,IAAA,GAAO,EAAE,MAAM,CAAA;AAGrB,MAAA,MAAM,KAAA,GAAQ,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA;AACxC,MAAA,IAAI,SAAS,KAAA,EAAO;AAAC,QAAA,OAAO,CAAA;AAAA,MAAE;AAC9B,MAAA,IAAI,KAAA,EAAO;AAAC,QAAA,OAAO,CAAA;AAAA,MAAE;AACrB,MAAA,IAAI,KAAA,EAAO;AAAC,QAAA,OAAO,EAAA;AAAA,MAAG;AAEtB,MAAA,QAAQ,IAAI,IAAA;AAAM,QAChB,KAAK,QAAA,EAAU;AACb,UAAA,MAAM,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,OAAO,IAAI,CAAA;AAC1D,UAAA,MAAM,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,OAAO,IAAI,CAAA;AAC1D,UAAA,IAAI,KAAA,CAAM,IAAI,CAAA,IAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAAC,YAAA,OAAO,CAAA;AAAA,UAAE;AAC1C,UAAA,IAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAAC,YAAA,OAAO,CAAA;AAAA,UAAE;AAC3B,UAAA,IAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAAC,YAAA,OAAO,EAAA;AAAA,UAAG;AAC5B,UAAA,OAAA,CAAQ,OAAO,IAAA,IAAQ,GAAA;AAAA,QACzB;AAAA,QACA,KAAK,MAAA,EAAQ;AACX,UAAA,MAAM,QAAQ,IAAI,IAAA,CAAK,OAAO,IAAI,CAAC,EAAE,OAAA,EAAQ;AAC7C,UAAA,MAAM,QAAQ,IAAI,IAAA,CAAK,OAAO,IAAI,CAAC,EAAE,OAAA,EAAQ;AAC7C,UAAA,IAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA,EAAG;AAAC,YAAA,OAAO,CAAA;AAAA,UAAE;AAC5C,UAAA,IAAI,KAAA,CAAM,KAAK,CAAA,EAAG;AAAC,YAAA,OAAO,CAAA;AAAA,UAAE;AAC5B,UAAA,IAAI,KAAA,CAAM,KAAK,CAAA,EAAG;AAAC,YAAA,OAAO,EAAA;AAAA,UAAG;AAC7B,UAAA,OAAA,CAAQ,QAAQ,KAAA,IAAS,GAAA;AAAA,QAC3B;AAAA,QACA,KAAK,SAAA,EAAW;AACd,UAAA,MAAM,KAAA,GAAQ,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,SAAS,CAAA,GAAI,CAAA;AACrD,UAAA,MAAM,KAAA,GAAQ,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,SAAS,CAAA,GAAI,CAAA;AACrD,UAAA,OAAA,CAAQ,QAAQ,KAAA,IAAS,GAAA;AAAA,QAC3B;AAAA,QACA,SAAS;AACP,UAAA,OAAO,OAAO,IAAI,CAAA,CAAE,cAAc,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,GAAA;AAAA,QACpD;AAAA;AACF,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAA,EAAoB,IAAA,EAAM,OAAO,CAAC,CAAA;AAEtC,EAAA,MAAM,oBAAoB,UAAA,CAAW,MAAA;AAGrC,EAAA,MAAM,WAAA,GAAcA,cAAkC,MAAM;AAC1D,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAC3C,IAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AAAC,QAAA;AAAA,MAAS;AACrC,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,IAAI,GAAA,GAAM,QAAA;AACV,MAAA,IAAI,GAAA,GAAM,CAAA,QAAA;AACV,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,MAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AACzB,QAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AACrC,UAAA,SAAA,EAAA;AACA,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAM,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,OAAO,GAAG,CAAA;AACtD,QAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AAAC,UAAA;AAAA,QAAS;AAC1B,QAAA,GAAA,IAAO,GAAA;AACP,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AACvB,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AACvB,QAAA,KAAA,EAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,KAAA,CAAM,GAAA,CAAI,IAAI,KAAA,EAAO;AAAA,UACnB,GAAA;AAAA,UACA,KAAK,GAAA,GAAM,KAAA;AAAA,UACX,GAAA;AAAA,UACA,GAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,cAAA,EAAgB,UAAU,CAAC,CAAA;AAG/B,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,iBAAA,GAAoB,QAAQ,CAAC,CAAA;AAEtE,EAAAC,gBAAU,MAAM;AACd,IAAA,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,UAAU,CAAC,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,QAAA,GAAWD,cAAQ,MAAM;AAC7B,IAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,IAAK,QAAA;AAC3B,IAAA,OAAO,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,QAAQ,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,IAAA,EAAM,QAAA,EAAU,UAAU,CAAC,CAAA;AAE/B,EAAA,MAAM,eAAA,GAAkBA,cAAQ,MAAM;AACpC,IAAA,MAAM,sBAAM,IAAI,GAAA,CAAI,CAAC,GAAG,iBAAA,EAAmB,eAAe,CAAC,CAAA;AAC3D,IAAA,OAAO,CAAC,GAAG,GAAG,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,EAAAC,gBAAU,MAAM;AACd,IAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,EACX,CAAA,EAAG,CAAC,WAAA,EAAa,IAAI,CAAC,CAAA;AAGtB,EAAA,MAAM,UAAA,GAAaN,iBAAAA;AAAA,IACjB,CAAC,WAAA,KAAwB;AACvB,MAAA,IAAI,OAAA,EAAS,eAAe,KAAA,EAAO;AAAC,QAAA;AAAA,MAAO;AAC3C,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChB,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,WAAA,KAAgB,WAAA,EAAa;AAC7C,UAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,KAAA,EAAM;AAAA,QACzC;AACA,QAAA,IAAI,IAAA,CAAK,cAAc,KAAA,EAAO;AAC5B,UAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,MAAA,EAAO;AAAA,QAC1C;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,SAAS,UAAU;AAAA,GACtB;AAEA,EAAA,MAAM,oBAAA,GAAuBA,iBAAAA;AAAA,IAC3B,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,OAAA,EAAS,iBAAiB,KAAA,EAAO;AAAC,QAAA;AAAA,MAAO;AAC7C,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,SAAS,YAAY;AAAA,GACxB;AAEA,EAAA,MAAM,sBAAA,GAAyBA,iBAAAA;AAAA,IAC7B,CAAC,WAAA,KAAwB;AACvB,MAAA,IAAI,OAAA,EAAS,2BAA2B,KAAA,EAAO;AAAC,QAAA;AAAA,MAAO;AACvD,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,MAAA;AACjC,MAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS;AAC5B,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,IAAK,IAAA;AAClD,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,IAAI,YAAA,GAAe,CAAA;AACnB,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,YAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,IAAK,IAAA,EAAM;AAAC,cAAA,YAAA,EAAA;AAAA,YAAe;AAAA,UAC3C;AACA,UAAA,IAAI,gBAAgB,CAAA,EAAG;AAAC,YAAA,OAAO,IAAA;AAAA,UAAK;AAAA,QACtC;AACA,QAAA,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,CAAC,gBAAgB,CAAA;AACvC,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,sBAAA,EAAwB,KAAA,CAAM,QAAQ,MAAM;AAAA,GACxD;AAEA,EAAA,MAAM,qBAAA,GAAwBA,kBAAY,MAAM;AAC9C,IAAA,mBAAA,iBAAoB,IAAI,KAAK,CAAA;AAAA,EAC/B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA;AAAA,IACvB,CAAC,aAAqB,KAAA,KAAkB;AACtC,MAAA,IAAI,OAAA,EAAS,iBAAiB,KAAA,EAAO;AAAC,QAAA;AAAA,MAAO;AAC7C,MAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,IAAA,CAAK,IAAI,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAK,CAAC,CAAA;AACzC,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,SAAS,YAAY;AAAA,GACxB;AAEA,EAAA,MAAM,UAAA,GAAaA,iBAAAA;AAAA,IACjB,CAAC,OAAgB,WAAA,KAAuC;AACtD,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,WAAW,CAAA,IAAK,QAAA;AACzC,MAAA,OAAO,eAAA,CAAgB,OAAO,IAAI,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA;AAAA,IACvB,CAAC,WAAA,KAA0C;AACzC,MAAA,OAAO,WAAA,CAAY,WAAW,CAAA,KAAM,QAAA,GAAW,OAAA,GAAU,MAAA;AAAA,IAC3D,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,YAAYA,iBAAAA,CAAY,MAAM,QAAQ,IAAI,CAAA,EAAG,EAAE,CAAA;AAErD,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA;AAAA,IACxB,CAAC,IAAA,KAAiB;AAChB,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IACX,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAc;AAC9C,IAAA,MAAM,SAAS,CAAC,CAAA,KAAc,CAAA,CAAE,OAAA,CAAQ,aAAa,GAAG,CAAA;AACxD,IAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAC/C,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAI,CAAA;AAChE,IAAA,MAAM,WAAW,UAAA,CAAW,GAAA;AAAA,MAAI,CAAC,GAAA,KAC/B,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AACvB,QAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AAAC,UAAA,OAAO,EAAA;AAAA,QAAG;AAClD,QAAA,OAAO,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,MAC3B,CAAC,CAAA,CAAE,IAAA,CAAK,GAAI;AAAA,KACd;AACA,IAAA,OAAO,CAAC,SAAA,EAAW,GAAG,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,cAAA;AAAA,IAEA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,iBAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA,EAAa,iBAAA;AAAA,IAEb,IAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IAEA,WAAA;AAAA,IACA,cAAA,EAAgB,oBAAA;AAAA,IAEhB,WAAA;AAAA,IAEA,sBAAA;AAAA,IACA,qBAAA;AAAA,IAEA,cAAA,EAAgB,gBAAA;AAAA,IAEhB,UAAA;AAAA,IACA,gBAAA;AAAA,IAEA;AAAA,GACF;AACF;;;AFrXA,sBAAA,EAAA;;;AGDA,mBAAA,EAAA;AAEA,IAAM,gBAAA,GAAmB,EAAA;AAclB,IAAM,eAAA,GAAkBa,UAAAA,CAAK,SAASmD,gBAAAA,CAAgB;AAAA,EAC3D,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,uBACEnE,eAAC,OAAA,EAAA,EAAM,SAAA,EAAU,kDACf,QAAA,kBAAAU,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+CAAA,EACX,QAAA,EAAA;AAAA,IAAA,cAAA,oBACCV,cAAAA,CAAC,IAAA,EAAA,EAAG,OAAM,KAAA,EAAM,SAAA,EAAU,8IAA6I,QAAA,EAAA,GAAA,EAEvK,CAAA;AAAA,IAED,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAK,2BACjBA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QAEC,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA;AAAA,QACA,kBAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA,EAAe,MAAA,KAAW,CAAA,IAAK,CAAC,CAAC;AAAA,OAAA;AAAA,MAR5B,CAAA,EAAG,OAAO,CAAA,QAAA,EAAW,GAAA,CAAI,KAAK,CAAA;AAAA,KAUtC;AAAA,GAAA,EACH,CAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AAaD,IAAM,UAAA,GAAagB,UAAAA,CAAK,SAASoD,WAAAA,CAAW;AAAA,EAC1C,MAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,KAAA,GAAQ7D,aAA6B,IAAI,CAAA;AAC/C,EAAA,MAAM,iBAAA,GAAoBA,aAA4B,IAAI,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,IAAA,EAAM,WAAA,KAAgB,MAAA,CAAO,KAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,QAAA,GAAW,IAAA,CAAK,SAAA,GAAY,IAAA;AAE9C,EAAAE,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,iBAAA,CAAkB,OAAA,IAAU;AAC5B,MAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAAA,IAC9B,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoBN,iBAAAA;AAAA,IACxB,CAAC,CAAA,KAA0B;AACzB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,MAAA,IAAI,CAAC,EAAA,EAAI;AAAC,QAAA;AAAA,MAAO;AAEjB,MAAA,MAAM,SAAS,CAAA,CAAE,OAAA;AACjB,MAAA,MAAM,aAAa,EAAA,CAAG,WAAA;AACtB,MAAA,MAAM,YAAY,CAAA,CAAE,SAAA;AACpB,MAAA,MAAM,SAAS,CAAA,CAAE,aAAA;AAEjB,MAAA,MAAM,MAAA,GAAS,CAAC,SAAA,KAA4B;AAC1C,QAAA,MAAM,KAAA,GAAQ,UAAU,OAAA,GAAU,MAAA;AAClC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,aAAa,KAAK,CAAA;AAC9D,QAAA,cAAA,CAAe,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,MACvC,CAAA;AAEA,MAAA,MAAM,WAAW,MAAM;AACrB,QAAA,QAAA,CAAS,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAClD,QAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC9C,QAAA,QAAA,CAAS,mBAAA,CAAoB,iBAAiB,IAAI,CAAA;AAClD,QAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,sBAAsB,SAAS,CAAA;AAAA,QACxC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAS;AAE5B,MAAA,iBAAA,CAAkB,OAAA,GAAU,QAAA;AAC5B,MAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,MAAM,CAAA;AAC/C,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,IAAI,CAAA;AAC3C,MAAA,QAAA,CAAS,gBAAA,CAAiB,iBAAiB,IAAI,CAAA;AAC/C,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,kBAAkB,SAAS,CAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,CAAO,KAAA,EAAO,cAAc;AAAA,GAC/B;AAEA,EAAA,uBACEO,eAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,KAAA;AAAA,MACL,KAAA,EAAM,KAAA;AAAA,MACN,aAAW,SAAA,KAAc,KAAA,GAAQ,WAAA,GAAc,SAAA,KAAc,SAAS,YAAA,GAAe,MAAA;AAAA,MACrF,SAAA,EAAW,CAAA,4IAAA,EACT,aAAA,GAAgB,wDAAA,GAA2D,EAC7E,CAAA,CAAA;AAAA,MACA,KAAA,EAAO,MAAA,CAAO,KAAA,GAAQ,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,QAAA,EAAU,MAAA,CAAO,KAAA,EAAM,GAAI,MAAA;AAAA,MAExE,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,kFAAA;AAAA,cACV,OAAA,EAAS,MAAM,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AAAA,cACxC,cAAY,CAAA,CAAE,yBAAA,EAA2B,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAAA,cAElE,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,CAAO,MAAA,EAAO,CAAA;AAAA,gBACpB,SAAA,KAAc,yBAASA,cAAAA,CAACqE,iBAAQ,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,gBACxD,SAAA,KAAc,0BAAUrE,cAAAA,CAACsE,mBAAU,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,gBAC3D,CAAC,SAAA,oBACAtE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EACd,QAAA,kBAAAA,cAAAA,CAACqE,aAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA,EACrB;AAAA;AAAA;AAAA,WAEJ;AAAA,UAEC,aAAA,oBACC3D,eAAAA,CAAC6D,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAvE,cAAAA;AAAA,cAACwE,kBAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,qHAAA;AAAA,gBACV,YAAA,EAAY,EAAE,gCAAgC,CAAA;AAAA,gBAE9C,QAAA,kBAAAxE,cAAAA,CAACyE,uBAAA,EAAA,EAAkB,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,aAC/B;AAAA,4BACA/D,eAAAA;AAAA,cAACgE,iBAAA;AAAA,cAAA;AAAA,gBACC,MAAA,EAAO,YAAA;AAAA,gBACP,SAAA,EAAU,+IAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA1E,eAAC2E,gBAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,KAAA,uBACF3E,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,SAAA,EAAW,CAAA,6BAAA,EAAgC,KAAA,GAAQ,8BAAA,GAAiC,EAAE,CAAA,iCAAA,CAAA;AAAA,sBACtF,QAAA,EAAU,YAAA;AAAA,sBACV,OAAA,EAAS,MAAM,aAAA,CAAc,CAAA,CAAE,yCAAA,EAA2C,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AAAA,sBAEnG,YAAE,kCAAkC;AAAA;AAAA,mBACvC,EAEJ,CAAA;AAAA,kCACAA,cAAAA,CAAC2E,gBAAA,EAAA,EACE,WAAC,EAAE,KAAA,uBACF3E,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,SAAA,EAAW,CAAA,6BAAA,EAAgC,KAAA,GAAQ,8BAAA,GAAiC,EAAE,CAAA,iCAAA,CAAA;AAAA,sBACtF,QAAA,EAAU,YAAA;AAAA,sBACV,OAAA,EAAS,MACP,aAAA,CAAc,CAAA,CAAE,sCAAA,EAAwC,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AAAA,sBAGnF,YAAE,+BAA+B;AAAA;AAAA,mBACpC,EAEJ,CAAA;AAAA,kCACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAqD,CAAA;AAAA,kCACpEA,cAAAA,CAAC2E,gBAAA,EAAA,EACE,WAAC,EAAE,KAAA,uBACF3E,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,SAAA,EAAW,CAAA,6BAAA,EAAgC,KAAA,GAAQ,8BAAA,GAAiC,EAAE,CAAA,iCAAA,CAAA;AAAA,sBACtF,OAAA,EAAS,MAAM,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AAAA,sBAE7C,YAAE,6BAA6B;AAAA;AAAA,mBAClC,EAEJ;AAAA;AAAA;AAAA;AACF,WAAA,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAGAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,WAAA;AAAA,YACL,kBAAA,EAAiB,UAAA;AAAA,YACjB,YAAA,EAAY,EAAE,+BAA+B,CAAA;AAAA,YAC7C,SAAA,EAAU,6IAAA;AAAA,YACV,aAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,GACF;AAEJ,CAAC,CAAA;;;AChOD,mBAAA,EAAA;AAiBA,IAAM,kBAAA,GAAqB,CAAC,OAAA,EAAS,QAAA,EAAU,SAAS,CAAA;AAExD,SAAS,SAAS,KAAA,EAAuB;AACvC,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AAAC,IAAA,OAAO,GAAA;AAAA,EAAI;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,EAAO,qBAAqB,CAAA;AAChD,IAAA,OAAO,mBAAmB,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAI,IAAA,GAAO,GAAA;AAAA,EAChE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEA,IAAM,aAAA,GAA8C;AAAA,EAClD,OAAA,EAAS,CAAC,EAAE,SAAA,uBACVA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,sEAAA,EACT,SAAA,CAAU,GAAA,KAAQ,IAAA,GACd,yEACA,8DACN,CAAA,CAAA;AAAA,MAEC,QAAA,EAAA,SAAA,CAAU;AAAA;AAAA,GACb;AAAA,EAEF,KAAK,CAAC,EAAE,WAAW,UAAA,EAAY,YAAA,EAAc,cAAa,KAAM;AAC9D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,SAAA,CAAU,OAAO,CAAA;AACvC,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,uBACEA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,UAAA;AAAA,UACL,SAAA,EAAU,+DAAA;AAAA,UACV,YAAA;AAAA,UACA,YAAA;AAAA,UAEC,QAAA,EAAA,SAAA,CAAU;AAAA;AAAA,OACb;AAAA,IAEJ;AACA,IAAA,uBACEA,cAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,MAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAI,qBAAA;AAAA,QACJ,SAAA,EAAU,yFAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QAElC,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,UAAA;AAAA,YACL,SAAA,EAAU,8BAAA;AAAA,YACV,YAAA;AAAA,YACA,YAAA;AAAA,YAEC,QAAA,EAAA,SAAA,CAAU;AAAA;AAAA;AACb;AAAA,KACF;AAAA,EAEJ,CAAA;AAAA,EACA,MAAA,EAAQ,CAAC,EAAE,SAAA,EAAW,YAAY,YAAA,EAAc,YAAA,uBAC9CA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAU,+DAAA;AAAA,MACV,YAAA;AAAA,MACA,YAAA;AAAA,MAEC,QAAA,EAAA,SAAA,CAAU;AAAA;AAAA,GACb;AAAA,EAEF,IAAA,EAAM,CAAC,EAAE,SAAA,EAAW,YAAY,YAAA,EAAc,YAAA,uBAC5CA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAU,wCAAA;AAAA,MACV,YAAA;AAAA,MACA,YAAA;AAAA,MAEC,QAAA,EAAA,SAAA,CAAU;AAAA;AAAA;AAGjB,CAAA;AAEA,IAAM,eAAA,GAAgC,CAAC,EAAE,SAAA,EAAW,YAAY,YAAA,EAAc,YAAA,uBAC5EA,cAAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,GAAA,EAAK,UAAA;AAAA,IACL,SAAA,EAAU,+DAAA;AAAA,IACV,YAAA;AAAA,IACA,YAAA;AAAA,IAEC,QAAA,EAAA,SAAA,CAAU;AAAA;AACb,CAAA;AAGK,IAAM,aAAA,GAAgBgB,UAAAA,CAAK,SAAS4D,cAAAA,CAAc;AAAA,EACvD,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAItE,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,eAAeC,YAAAA,EAAsC;AAE3D,EAAA,MAAM,UAAA,GAAaJ,iBAAAA,CAAY,CAAC,CAAA,KAAwB;AACtD,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,MAAA;AAAA,IAAO;AACrB,IAAA,MAAM,IAAA,GAAO,UAAU,MAAA,GAAS,EAAA,GAAK,OAAO,SAAA,CAAU,GAAA,IAAO,UAAU,OAAO,CAAA;AAC9E,IAAA,MAAA,CAAO,IAAI,CAAA;AACX,IAAA,YAAA,CAAa,aAAa,OAAO,CAAA;AACjC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,YAAA,CAAa,UAAU,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,GAAG,GAAI,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAEtB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIG,eAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,UAAA,GAAaC,aAAwB,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,eAA0C,IAAI,CAAA;AAC5E,EAAA,MAAM,kBAAkBC,YAAAA,EAAsC;AAE9D,EAAA,MAAM,gBAAA,GAAmBJ,kBAAY,MAAM;AACzC,IAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,IAAA,IAAI,CAAC,EAAA,IAAM,EAAA,CAAG,WAAA,IAAe,GAAG,WAAA,EAAa;AAAC,MAAA;AAAA,IAAO;AACrD,IAAA,eAAA,CAAgB,OAAA,GAAU,WAAW,MAAM;AACzC,MAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,MAAA,UAAA,CAAW;AAAA,QACT,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA;AAAA,QAC5B,CAAA,EAAG,KAAK,MAAA,GAAS;AAAA,OAClB,CAAA;AAAA,IACH,GAAG,GAAG,CAAA;AAAA,EACR,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,MAAM;AACzC,IAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAM,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,MAAA,YAAA,CAAa,aAAa,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,IAAA,KAAS,QAAA,IAAY,SAAA,CAAU,IAAA,KAAS,KAAA,IAAS,SAAA,CAAU,IAAA,KAAS,MAAA,IAAU,SAAA,CAAU,IAAA,KAAS,QAAA;AAC/H,EAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,GAAS,IAAA,GAAQ,UAAU,IAAA,KAAS,QAAA,IAAY,SAAA,CAAU,IAAA,KAAS,MAAA,GAAU,MAAA,CAAO,SAAA,CAAU,GAAG,IAAI,SAAA,CAAU,OAAA;AAEhJ,EAAA,MAAM,gBAAgB,EAAE,SAAA,EAAW,YAAY,YAAA,EAAc,gBAAA,EAAkB,cAAc,gBAAA,EAAiB;AAE9G,EAAA,MAAM,cAAA,GAAiB,MAAA,KAAW,OAAA,IAAW,MAAA,CAAA,IAAW,CAAC,SAAA,CAAU,MAAA;AAEnE,EAAA,uBACEC,eAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,6BAAA,EAAgC,SAAA,KAAc,OAAA,GAAU,YAAA,GAAe,WAAW,CAAA,CAAA,EAAI,QAAA,GAAW,eAAA,IAAmB,EAAA,GAAK,EAAE,CAAA,CAAA;AAAA,MACtI,YAAA,EAAc,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,MACnC,YAAA,EAAc,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,MAEnC,QAAA,EAAA;AAAA,QAAA,SAAA,CAAU,MAAA,mBACTV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA2C,QAAA,EAAA,QAAA,EAAO,CAAA,GAAA,CAEjE,aAAA,CAAc,SAAA,CAAU,IAAI,CAAA,IAAK,iBAAiB,aAAa,CAAA;AAAA,QAEjE,kCACCA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,UAAA;AAAA,YACT,SAAA,EAAW,CAAA,sEAAA,EACT,MAAA,GACI,oCAAA,GACA,+EACN,CAAA,CAAA;AAAA,YACA,cAAY,MAAA,GAAS,CAAA,CAAE,uBAAuB,CAAA,GAAI,EAAE,uBAAuB,CAAA;AAAA,YAE1E,QAAA,EAAA,MAAA,mBAASA,cAAAA,CAACuB,WAAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,oBAAKvB,cAAAA,CAACwB,UAAAA,EAAA,EAAK,MAAM,EAAA,EAAI;AAAA;AAAA,SAChE;AAAA,QAED,OAAA,IAAW,eAAe,cAAA,IAAkBqD,qBAAA;AAAA,0BAC3C7E,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,oIAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,MAAA,EAAQ,MAAA;AAAA,gBACR,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG,MAAA,CAAO,aAAa,GAAG,CAAA;AAAA,gBACjD,KAAK,OAAA,CAAQ,CAAA;AAAA,gBACb,SAAA,EAAW;AAAA,eACb;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACA,QAAA,CAAS;AAAA;AACX;AAAA;AAAA,GACF;AAEJ,CAAC,CAAA;;;AC9MD,mBAAA,EAAA;AAgBO,IAAM,gBAAA,GAAmBgB,UAAAA,CAAK,SAAS8D,iBAAAA,CAAiB;AAAA,EAC7D,OAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,wBAAA;AAAA,EACA,uBAAA;AAAA,EACA,gBAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIxE,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,eAAeC,YAAAA,EAAsC;AAE3D,EAAAE,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,YAAA,CAAa,YAAY,MAAA,EAAW;AACtC,QAAA,YAAA,CAAa,aAAa,OAAO,CAAA;AACjC,QAAA,YAAA,CAAa,OAAA,GAAU,MAAA;AAAA,MACzB;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoBN,kBAAY,MAAM;AAC1C,IAAA,cAAA,CAAe,EAAE,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACnC,IAAA,WAAA,IAAc;AACd,IAAA,YAAA,CAAa,aAAa,OAAO,CAAA;AACjC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,YAAA,CAAa,UAAU,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,GAAG,GAAI,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,SAAA,GAAY,YAAY,MAAA,GAAS,CAAA;AAEvC,EAAA,uBACEO,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,SAAI,SAAA,EAAW,CAAA,0CAAA,EAA6C,iBAAiB,SAAA,GAAY,MAAA,GAAS,MAAM,CAAA,CAAA,EACvG,QAAA,EAAA;AAAA,sBAAAV,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,WAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC9C,OAAA,EAAS,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,UACpC,MAAA,EAAQ,MAAM,gBAAA,CAAiB,KAAK,CAAA;AAAA,UACpC,WAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,UACxC,SAAA,EAAU,yOAAA;AAAA,UACV,YAAA,EAAY,EAAE,6BAA6B;AAAA;AAAA,OAC7C;AAAA,MACC,6BACCA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,iBAAA;AAAA,UACT,SAAA,EAAU,8FAAA;AAAA,UACV,YAAA,EAAY,EAAE,8BAA8B,CAAA;AAAA,UAE5C,QAAA,kBAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,MAAM,EAAA,EAAI;AAAA;AAAA;AACf,KAAA,EAEJ,CAAA;AAAA,oBAGA5C,eAAAA,CAACqE,eAAA,EAAA,EAAQ,SAAA,EAAU,UAAA,EACjB,QAAA,EAAA;AAAA,sBAAArE,eAAAA;AAAA,QAACsE,qBAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAA,6FAAA,EACT,gBAAA,GACI,sGAAA,GACA,+GACN,CAAA,CAAA;AAAA,UACA,YAAA,EAAY,EAAE,gCAAgC,CAAA;AAAA,UAE9C,QAAA,EAAA;AAAA,4BAAAhF,cAAAA,CAACiF,aAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,4BACnBjF,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAAE;AAAA;AAAA;AAAA,OACvC;AAAA,sBACAU,eAAAA;AAAA,QAACwE,oBAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAO,cAAA;AAAA,UACP,SAAA,EAAU,kJAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,gBAAA,oBACCxE,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAb,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAU,2HAAA;AAAA,kBACV,OAAA,EAAS,uBAAA;AAAA,kBAER,YAAE,iCAAiC;AAAA;AAAA,eACtC;AAAA,8BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAqD;AAAA,aAAA,EACtE,CAAA;AAAA,YAED,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,qBACZU,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,UAAA;AAAA,gBACL,gBAAc,GAAA,CAAI,OAAA;AAAA,gBAClB,SAAA,EAAU,2JAAA;AAAA,gBACV,OAAA,EAAS,MAAM,wBAAA,CAAyB,GAAA,CAAI,KAAK,CAAA;AAAA,gBAEjD,QAAA,EAAA;AAAA,kCAAAV,cAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,aAAA,EAAY,MAAA;AAAA,sBACZ,SAAA,EAAW,CAAA,4EAAA,EACT,GAAA,CAAI,OAAA,GACA,2BACA,uEACN,CAAA,CAAA;AAAA,sBAEC,QAAA,EAAA,GAAA,CAAI,2BAAWA,cAAAA,CAACuB,aAAA,EAAM,IAAA,EAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO;AAAA;AAAA,mBACjD;AAAA,kCACAvB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,cAAI,MAAA,EAAO;AAAA;AAAA,eAAA;AAAA,cAjBlC,GAAA,CAAI;AAAA,aAmBZ;AAAA;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,IAGC,+BACCU,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,SAAA,EAAW,CAAA,6FAAA,EACT,MAAA,GACI,4GAAA,GACA,+GACN,CAAA,CAAA;AAAA,QACA,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,QAEzC,QAAA,EAAA;AAAA,UAAA,MAAA,mBAASV,cAAAA,CAACuB,WAAAA,EAAA,EAAM,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,CAAA,mBAAKvB,cAAAA,CAACwB,UAAAA,EAAA,EAAK,MAAM,EAAA,EAAI,CAAA;AAAA,0BAC9DxB,eAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,GAAS,EAAE,uBAAuB,CAAA,GAAI,CAAA,CAAE,uBAAuB,CAAA,EAAE;AAAA;AAAA;AAAA,KAC1E;AAAA,IAID,sCACCU,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,kBAAA;AAAA,QACT,SAAA,EAAU,4MAAA;AAAA,QACV,cAAY,YAAA,GAAe,CAAA,CAAE,2BAA2B,CAAA,GAAI,EAAE,yBAAyB,CAAA;AAAA,QAEtF,QAAA,EAAA;AAAA,UAAA,YAAA,mBAAeV,cAAAA,CAAC6D,cAAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA,mBAAK7D,cAAAA,CAACmF,eAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,0BAC9DnF,eAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,GAAe,EAAE,2BAA2B,CAAA,GAAI,CAAA,CAAE,yBAAyB,CAAA,EAAE;AAAA;AAAA;AAAA,KACtF;AAAA,IAID,QAAQ,WAAA,oBACPU,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6KAAA,EACd,QAAA,EAAA;AAAA,sBAAAV,eAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,6BAA6B,EAAE,MAAA,EAAQ,QAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,IAAA,CAAK,WAAW,GAAG,MAAA,IAAU,EAAA,EAAI,CAAA,EAAE,CAAA;AAAA,MAClH,KAAK,SAAA,KAAc,KAAA,mBAAQA,cAAAA,CAACqE,aAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA,mBAAKrE,cAAAA,CAACsE,eAAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,sBACrGtE,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,SAAA,EAAU,mFAAA;AAAA,UACV,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,UAE1C,QAAA,kBAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,MAAM,EAAA,EAAI;AAAA;AAAA;AACf,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAC,CAAA;;;ACzLD,mBAAA,EAAA;AAQA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAW,EAAE,uBAAuB,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACpF;AAWA,IAAM,OAAA,GAAUtC,UAAAA,CAAK,SAASoE,QAAAA,CAAQ;AAAA,EACpC,KAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,KAAA,GAAQ,MAAM,8BAAA,GAAiC,6BAAA;AACrD,EAAA,uBACE1E,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,KAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,iBAAiB,CAAA,GAAI,CAAA;AAAA,QAC9B,SAAA,EAAW,6GAA6G,KAAK,CAAA,CAAA;AAAA,QAE5H,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,IACC,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,EAAK,MAAA,KAAW;AACnC,MAAA,IAAI,MAAA,KAAW,KAAK,cAAA,EAAgB;AAAC,QAAA,OAAO,IAAA;AAAA,MAAK;AACjD,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAC7B,MAAA,uBACEA,cAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,WAAW,CAAA,oBAAA,EACT,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,eAAe,WACzC,CAAA,iCAAA,CAAA;AAAA,UAEC,QAAA,EAAA,CAAA,mBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA,UAAA,CAAW,QAAA,CAAS,CAAC,CAAC,CAAA,EACzB,CAAA,GACE;AAAA,SAAA;AAAA,QATC,GAAA,CAAI;AAAA,OAUX;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAEM,IAAM,eAAA,GAAkBgB,UAAAA,CAAK,SAASqE,gBAAAA,CAAgB;AAAA,EAC3D,cAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEnC,EAAA,uBACE3E,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sEAAA,EACf,QAAA,EAAA;AAAA,oBAAAV,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,QACpC,cAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA;AAAA,QACnB;AAAA;AAAA,KACF;AAAA,oBACAA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,QACpC,cAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA;AAAA,QACnB,cAAA;AAAA,QACA,GAAA,EAAG;AAAA;AAAA,KACL;AAAA,oBACAA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,QACpC,cAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA;AAAA,QACnB;AAAA;AAAA,KACF;AAAA,oBACAA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,QACpC,cAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA;AAAA,QACnB,cAAA;AAAA,QACA,GAAA,EAAG;AAAA;AAAA;AACL,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;ACrFM,SAAS,kBAAkB,EAAE,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,UAAS,EAA2B;AAClG,EAAA,MAAM,QAAA,GAAWO,aAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAaA,aAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAIrB,EAAA,YAAA,CAAa,IAAI,CAAA;AACjB,EAAA,YAAA,CAAa,UAAU,IAAI,CAAA;AAE3B,EAAAE,gBAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,UAAA,CAAW,OAAA,EAAQ;AAAA,MACrB;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEC,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAgB,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAM,EAEpD,QAAA,EAAA;AAAA,oBAAAV,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,+CAAA;AAAA,QACV,OAAA,EAAS,OAAA;AAAA,QACT,aAAA,EAAW;AAAA;AAAA,KACb;AAAA,oBAEAU,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,MAAA;AAAA,QACX,YAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU,EAAA;AAAA,QACV,SAAA,EAAU,0JAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAV,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,OAAA;AAAA,cACT,SAAA,EAAU,iKAAA;AAAA,cACV,YAAA,EAAY,UAAA;AAAA,cAEZ,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,WAC7B;AAAA,UACC;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AP1DA,IAAM,gBAAA,GAAmB,2BAAA;AAEzB,SAAS,cAAA,CAAe,SAAiB,KAAA,EAAwC;AAC/E,EAAA,IAAI,SAAS,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,IAAS,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EAAE;AACvE,EAAA,MAAM,KAAA,GAAiC,CAAC,CAAC,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA;AACpC,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,UAAU,CAAC,CAAA;AAC7C,EAAA,IAAI,OAAO,CAAA,EAAG;AAAC,IAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,EAAE;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAAC,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAAE;AACnD,EAAA,IAAI,KAAA,GAAQ,QAAQ,CAAA,EAAG;AAAC,IAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,EAAE;AAC/C,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAOG;AACD,EAAA,uBACEtD,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW,CAAA,0FAAA,EACT,MAAA,GACI,wBAAA,GACA,2EACN,CAAA,gDAAA,CAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;AAiBO,IAAM,oBAAA,GAAuBgB,UAAAA,CAAK,SAASsE,qBAAAA,CAAqB;AAAA,EACrE,KAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,OAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AAEtC,EAAA,MAAM,qBAAqB,CAAC,CAAC,aAAA,IAAiB,CAAC,CAAC,KAAA,CAAM,YAAA;AACtD,EAAA,MAAM,iBAAiB,YAAA,IAAiB,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAC,kBAAA;AAE/D,EAAA,MAAM,YAAA,GAAenF,kBAAY,MAAM;AACrC,IAAA,IAAI,KAAA,CAAM,QAAQ,GAAA,EAAK;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAA,CAAM,OAAO,GAAA,EAAK,MAAA,CAAO,SAAS,MAAM,CAAA;AAC/D,QAAA,IAAI,CAAC,CAAC,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC3D,UAAA,OAAA,CAAQ,IAAA,CAAK,iEAAA,EAAmE,MAAA,CAAO,QAAQ,CAAA;AAC/F,UAAA;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,KAAK,qDAAqD,CAAA;AAClE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,MAAA,IAAA,CAAK,IAAA,GAAO,MAAM,MAAA,CAAO,GAAA;AACzB,MAAA,IAAA,CAAK,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,mBAAA;AACzC,MAAA,IAAA,CAAK,GAAA,GAAM,qBAAA;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,kBAAA,IAAsB,MAAM,YAAA,EAAc;AAC5C,MAAA,aAAA,GAAgB,MAAM,YAAY,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,aAAA,EAAe,MAAM,MAAA,EAAQ,KAAA,CAAM,YAAY,CAAC,CAAA;AAExE,EAAA,MAAM,cAAA,GAAiBA,iBAAAA;AAAA,IACrB,CAAC,IAAA,KAAiB;AAChB,MAAA,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA,CAAE,MAAM,MAAM;AAAA,MAEhD,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,eAAA,GAAkBA,kBAAY,MAAM;AACxC,IAAA,MAAM,GAAA,GAAM,GAAG,aAAA,EAAc;AAC7B,IAAA,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,GAAG,CAAA,CAAE,MAAM,MAAM;AAAA,IAE/C,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAEP,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIG,eAAS,KAAK,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,IAAA,GAAO,IAAA,CAAK,YAAA,GAAe,kBAAA;AAChD,EAAA,MAAM,gBAAA,GAAmB,OAAO,IAAA,CAAK,kBAAA,GAAqB,MAAM,qBAAA,CAAsB,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAE/F,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEhE,EAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,KACb,UAAA,KAAe,WACX,iCAAA,GACA,QAAA,GAAW,CAAA,KAAM,CAAA,GAAI,6BAAA,GAAgC,2BAAA;AAE3D,EAAA,MAAM,gBAAA,GAAmB,GAAG,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,GAAG,iBAAA,KAAsB,CAAA,GAAI,KAAK,EAAA,CAAG,IAAA,GAAO,CAAA,IAAK,EAAA,CAAG,QAAA,GAAW,CAAA;AAC5E,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA,CAAG,OAAO,EAAA,CAAG,QAAA,EAAU,GAAG,iBAAiB,CAAA;AAC/D,EAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,MAAA;AACnC,EAAA,MAAM,oBAAoB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,GAAG,eAAe,CAAA;AAExE,EAAA,MAAM,aAAA,GAAgB,sBACpBN,cAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,CAAG,OAAA;AAAA,MACZ,aAAa,EAAA,CAAG,WAAA;AAAA,MAChB,gBAAgB,EAAA,CAAG,cAAA;AAAA,MACnB,0BAA0B,EAAA,CAAG,sBAAA;AAAA,MAC7B,yBAAyB,EAAA,CAAG,qBAAA;AAAA,MAC5B,gBAAA;AAAA,MACA,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,aAAa,EAAA,CAAG,SAAA;AAAA,MAChB,WAAA,EAAa,eAAA;AAAA,MACb,YAAA;AAAA,MACA,kBAAA,EAAoB;AAAA;AAAA,GACtB;AAGF,EAAA,MAAM,eAAe,sBACnBU,eAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,2GAAA,EAChB,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,QAAG,SAAA,EAAU,iEAAA,EACX,gBAAM,KAAA,IAAS,CAAA,CAAE,2BAA2B,CAAA,EAC/C,CAAA;AAAA,sBACAU,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EACV,QAAA,EAAA;AAAA,QAAA,EAAA,CAAG,sBAAsB,eAAA,GACtB,eAAA,KAAoB,oBAClB,eAAA,KAAoB,CAAA,GAClB,EAAE,2BAA2B,CAAA,GAC7B,EAAE,yBAAA,EAA2B,EAAE,OAAO,MAAA,CAAO,eAAe,GAAG,CAAA,GACjE,EAAE,+BAAA,EAAiC;AAAA,UACjC,QAAA,EAAU,OAAO,eAAe,CAAA;AAAA,UAChC,KAAA,EAAO,OAAO,iBAAiB;AAAA,SAChC,CAAA,GACH,CAAA,CAAE,+BAAA,EAAiC;AAAA,UACjC,QAAA,EAAU,MAAA,CAAO,EAAA,CAAG,iBAAiB,CAAA;AAAA,UACrC,KAAA,EAAO,OAAO,eAAe;AAAA,SAC9B,CAAA;AAAA,QACJ,MAAM,SAAA,GAAY,CAAA,CAAA,EAAI,CAAA,CAAE,8BAA8B,CAAC,CAAA,CAAA,GAAK;AAAA,OAAA,EAC/D;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAV,cAAAA;AAAA,MAACe,yBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,YAAA;AAAA,QACT,QAAA,EAAU,cAAA;AAAA,QACV,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,QACrC,iBAAiB,YAAA,GAAe,CAAA,CAAE,yBAAyB,CAAA,GAAI,EAAE,gCAAgC;AAAA;AAAA;AACnG,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,cAAc,CAAC,WAAA,qBACnBf,cAAAA,CAAC,SAAI,SAAA,EAAW,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAChD,QAAA,kBAAAU,eAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,oCAAA,EACf,QAAA,EAAA;AAAA,oBAAAV,cAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAS,KAAA,CAAM,EAAA;AAAA,QACf,SAAS,EAAA,CAAG,cAAA;AAAA,QACZ,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,cAAc,EAAA,CAAG,UAAA;AAAA,QACjB,gBAAgB,EAAA,CAAG,cAAA;AAAA,QACnB,oBAAoB,EAAA,CAAG,sBAAA;AAAA,QACvB,aAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA,EAAc;AAAA;AAAA,KAChB;AAAA,oBACAU,gBAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,EAAA,CAAG,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,6BACrBA,eAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,CAAA,8CAAA,EAAiD,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA;AAAA,UAC3E,YAAA,EAAc,MAAM,aAAA,CAAc,QAAQ,CAAA;AAAA,UAC1C,YAAA,EAAc,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,UAEtC,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,gHAAA,EAAmH,MAAM,QAAQ,CAAC,CAAA,CAAA,EAC7I,QAAA,EAAA,CAAA,EAAA,CAAG,IAAA,GAAO,CAAA,IAAK,EAAA,CAAG,QAAA,GAAW,WAAW,CAAA,EAC5C,CAAA;AAAA,YACC,GAAG,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,EAAK,2BAC3BA,cAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAW,GAAG,UAAA,CAAW,GAAA,CAAI,IAAI,KAAK,CAAA,EAAG,IAAI,KAAK,CAAA;AAAA,gBAClD,SAAA,EAAW,EAAA,CAAG,gBAAA,CAAiB,GAAA,CAAI,KAAK,CAAA;AAAA,gBACxC,MAAA,EAAQ,cAAA;AAAA,gBACR,UAAU,MAAA,KAAW,CAAA;AAAA,gBACrB,eAAA,EAAiB,CAAA,2BAAA,EAA8B,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,eAAA;AAAA,cALzD,GAAG,KAAA,CAAM,EAAE,SAAS,QAAQ,CAAA,CAAA,EAAI,IAAI,KAAK,CAAA;AAAA,aAOjD;AAAA;AAAA,SAAA;AAAA,QAjBI,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,KAAA,EAAQ,QAAQ,CAAA;AAAA,OAmBnC,CAAA;AAAA,MACA,GAAG,QAAA,CAAS,MAAA,KAAW,qBACtBA,cAAAA,CAAC,QACC,QAAA,kBAAAA,cAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,EAAA,CAAG,cAAA,CAAe,MAAA,GAAS,CAAA;AAAA,UACpC,SAAA,EAAU,wBAAA;AAAA,UAET,aAAG,WAAA,mBACFU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,eAACuF,qBAAA,EAAA,EAAgB,IAAA,EAAM,IAAI,SAAA,EAAU,kCAAA,EAAmC,QAAO,SAAA,EAAU,CAAA;AAAA,4BACzFvF,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,sDAAA,EACV,QAAA,EAAA,CAAA,CAAE,iCAAiC,CAAA,EACtC,CAAA;AAAA,4BACAA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,EAAA,CAAG,cAAA,CAAe,EAAE,CAAA;AAAA,gBACnC,SAAA,EAAU,kHAAA;AAAA,gBAET,YAAE,oCAAoC;AAAA;AAAA;AACzC,WAAA,EACF,CAAA,mBAEAA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0CAAA,EACb,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;AAAA;AAAA,OAEJ,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBACAA,cAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,gBAAgB,EAAA,CAAG,cAAA;AAAA,QACnB,OAAO,EAAA,CAAG,WAAA;AAAA,QACV,cAAA,EAAc;AAAA;AAAA;AAChB,GAAA,EACF,CAAA,EACF,CAAA;AAGF,EAAA,MAAM,mBAAmB,CAAC,QAAA,qBACxBU,eAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,2GAAA,EAChB,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,YAAE,sBAAA,EAAwB;AAAA,QACzB,IAAA,EAAM,OAAO,IAAI,CAAA;AAAA,QACjB,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,QACb,KAAA,EAAO,MAAA,CAAO,EAAA,CAAG,iBAAiB;AAAA,OACnC,CAAA,EACH,CAAA;AAAA,sBACAA,cAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,0CAAA,EAA2C,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,UAAA,CAAA,EAC7E,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI,GAAG,QAAQ,CAAA,UAAA,CAAA;AAAA,UACf,OAAO,EAAA,CAAG,QAAA;AAAA,UACV,QAAA,EAAU,CAAC,KAAA,KAAU,EAAA,CAAG,YAAY,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC9D,SAAA,EAAU,kIAAA;AAAA,UAET,aAAG,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,qBACvBA,cAAAA,CAAC,QAAA,EAAA,EAA0C,KAAA,EAAO,MAAA,EAC/C,oBADU,CAAA,EAAG,QAAQ,CAAA,MAAA,EAAS,MAAM,EAEvC,CACD;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,oBAEAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,cAAW,YAAA,EAClD,QAAA,EAAA;AAAA,sBAAAV,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA;AAAA,UAC3B,QAAA,EAAU,GAAG,IAAA,IAAQ,CAAA;AAAA,UACrB,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,UAC3C,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,CAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,UAClD,QAAA,EAAU,GAAG,IAAA,IAAQ,CAAA;AAAA,UACrB,YAAA,EAAY,EAAE,mBAAmB,CAAA;AAAA,UAClC,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MACC,cAAA,CAAe,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,UAAU,CAAA,CAAE,GAAA;AAAA,QAAI,CAAC,IAAA,EAAM,CAAA,KACjD,IAAA,KAAS,UAAA,mBACPA,cAAAA,CAAC,MAAA,EAAA,EAA2B,SAAA,EAAU,4BAAA,EAA6B,eAAW,IAAA,EAAC,QAAA,EAAA,QAAA,EAAA,EAApE,YAAY,CAAC,CAAA,CAExB,oBAEAA,cAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YAEC,OAAA,EAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,IAAI,CAAA;AAAA,YAC9B,MAAA,EAAQ,SAAS,EAAA,CAAG,IAAA;AAAA,YACpB,cAAA,EAAc,IAAA,KAAS,EAAA,CAAG,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,YAEzC,QAAA,EAAA;AAAA,WAAA;AAAA,UALI;AAAA;AAMP,OAEJ;AAAA,sBACAA,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,UAAA,EAAY,EAAA,CAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,UAC9D,QAAA,EAAU,EAAA,CAAG,IAAA,IAAQ,EAAA,CAAG,UAAA;AAAA,UACxB,YAAA,EAAY,EAAE,mBAAmB,CAAA;AAAA,UAClC,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBACAA,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,EAAA,CAAG,OAAA,CAAQ,GAAG,UAAU,CAAA;AAAA,UACvC,QAAA,EAAU,EAAA,CAAG,IAAA,IAAQ,EAAA,CAAG,UAAA;AAAA,UACxB,YAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,UAC1C,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,sBAAA,GAAyB,MAC7B,KAAA,CAAM,SAAA,mBACJA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0IAAA,EACV,QAAA,EAAA,CAAA,CAAE,8BAA8B,CAAA,EACnC,CAAA,GACE,IAAA;AAEN,EAAA,MAAM,UAAA,GAAa,MAAM,YAAA,IAAgB,KAAA;AAEzC,EAAA,MAAM,gBAAA,GAAmB,IAAA,GACrB,CAAA,EAAG,gBAAgB,CAAA,gBAAA,EAAmB,aAAa,uBAAA,GAA0B,EAAE,CAAA,CAAA,GAC/E,CAAA,EAAG,gBAAgB,CAAA,oGAAA,CAAA;AAEvB,EAAA,uBACEU,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,eAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,gBAAA,EACjB,QAAA,EAAA;AAAA,MAAA,aAAA,EAAc;AAAA,MACd,CAAC,QAAQ,YAAA,EAAa;AAAA,MACtB,WAAA,CAAY,UAAA,GAAa,sBAAA,GAAyB,6BAA6B,CAAA;AAAA,MAC/E,gBAAA,CAAiB,MAAM,EAAE,CAAA;AAAA,MACzB,sBAAA;AAAuB,KAAA,EAC1B,CAAA;AAAA,IAGC,CAAC,IAAA,IAAQ,YAAA,oBACRA,eAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,CAAA,CAAE,2BAA2B,CAAA;AAAA,QACnD,OAAA,EAAS,MAAM,qBAAA,CAAsB,KAAK,CAAA;AAAA,QAC1C,UAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,QAExC,QAAA,EAAA;AAAA,UAAA,aAAA,EAAc;AAAA,UACd,YAAA,EAAa;AAAA,UACb,YAAY,sBAAsB,CAAA;AAAA,UAClC,gBAAA,CAAiB,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,GAAA,CAAK,CAAA;AAAA,UACjC,sBAAA;AAAuB;AAAA;AAAA;AAC1B,GAAA,EAEJ,CAAA;AAEJ,CAAC;;;AQjXD,mBAAA,EAAA;ACEA,SAAS,OAAO,EAAE,IAAA,EAAM,WAAW,WAAA,EAAa,OAAA,GAAU,OAAM,EAAgB;AAC9E,EAAA,MAAM,aAAaL,WAAAA,EAAM;AACzB,EAAA,MAAM,UAAA,GAAaE,aAAuB,IAAI,CAAA;AAE9C,EAAA,MAAM,aAAA,GAAgBJ,iBAAAA;AAAA,IACpB,CAAC,CAAA,KAA2C;AAC1C,MAAA,MAAM,eAAe,IAAA,CAAK,SAAA,CAAU,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAO,SAAS,CAAA;AACjE,MAAA,IAAI,eAAe,CAAA,EAAG;AAAC,QAAA;AAAA,MAAO;AAE9B,MAAA,IAAI,SAAA,GAA2B,IAAA;AAE/B,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,YAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,SAAA,GAAA,CAAa,YAAA,GAAe,KAAK,IAAA,CAAK,MAAA;AACtC,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,SAAA,GAAA,CAAa,YAAA,GAAe,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA;AACpD,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,SAAA,GAAY,CAAA;AACZ,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,SAAA,GAAY,KAAK,MAAA,GAAS,CAAA;AAC1B,UAAA;AAAA;AAGJ,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA,CAAE,EAAE,CAAA;AAE9B,QAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,gBAAA,CAA8B,cAAc,CAAA;AACpE,UAAA,OAAA,CAAQ,SAAS,GAAG,KAAA,EAAM;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,SAAA,EAAW,WAAW;AAAA,GAC/B;AAEA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAW,CAAA,wEAAA,EAA2E,OAAA,GAAU,gBAAA,GAAmB,gBAAgB,CAAA,CAAA;AAAA,MACnI,IAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAW,aAAA;AAAA,MAEV,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACTA,cAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UAEC,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,QAAA,EAAU,cAAc,GAAA,CAAI,EAAA;AAAA,UAC5B,OAAA,EAAS,MAAM,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,UACjC,UAAU,UAAA,GAAa,MAAA;AAAA,UACvB;AAAA,SAAA;AAAA,QANK,GAAA,CAAI;AAAA,OAQZ;AAAA;AAAA,GACH;AAEJ;AAWA,SAAS,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,UAAU,OAAA,EAAS,QAAA,EAAU,SAAQ,EAAmB;AACtF,EAAA,uBACEU,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,IAAA,EAAK,KAAA;AAAA,MACL,eAAA,EAAe,QAAA;AAAA,MACf,eAAA,EAAe,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,MACpB,QAAA,EAAU,WAAW,CAAA,GAAI,EAAA;AAAA,MACzB,OAAA;AAAA,MACA,SAAA,EAAW;AAAA;AAAA,QAAA,EAEP,OAAA,GAAU,wBAAwB,mBAAmB;AAAA,QAAA,EAErD,QAAA,GACI,2CACA,+EACN;AAAA,MAAA,CAAA;AAAA,MAGD,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,QAGA,4BACCV,cAAAA;AAAA,UAACwF,mBAAA,CAAO,GAAA;AAAA,UAAP;AAAA,YACC,QAAA;AAAA,YACA,SAAA,EAAU,2EAAA;AAAA,YACV,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AAAE;AAAA;AACtD;AAAA;AAAA,GAEJ;AAEJ;AAEA,IAAM,cAAA,GAAiBxE,WAAK,MAAM,CAAA;AAClC,cAAA,CAAe,WAAA,GAAc,QAAA;ADxG7B,IAAM,YAAA,GAAe,oHAAA;AACrB,IAAM,gBAAA,GAAmB,0IAAA;AAElB,IAAM,gBAAA,GAAmBA,UAAAA,CAAK,SAASyE,iBAAAA,CAAiB;AAAA,EAC7D,MAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,aAAa,cAAc,CAAA,GAAInF,eAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAA,IAAM,EAAE,CAAA;AAClE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,YAAA,GAAeC,aAAoB,IAAI,CAAA;AAE7C,EAAA,MAAM,gBAAA,GAAmBJ,iBAAAA,CAAY,MAAM,eAAA,CAAgB,CAAC,MAAM,CAAC,CAAC,CAAA,EAAG,EAAE,CAAA;AAGzE,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,EAAc;AAAC,MAAA;AAAA,IAAO;AAC3B,IAAA,YAAA,CAAa,SAAS,KAAA,EAAM;AAC5B,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,IAAA,GAAOD,aAAAA;AAAA,IACX,MACE,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,MACxB,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,KAAA,EAAO,GAAG,KAAA,CAAM,KAAA,IAAS,GAAG,CAAA,CAAE,2BAA2B,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,EAAA,EAAK,KAAK,GAAA,CAAI,KAAA,CAAM,aAAa,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAAA,KAC7H,CAAE,CAAA;AAAA,IACJ,CAAC,QAAQ,CAAC;AAAA,GACZ;AAEA,EAAA,MAAM,IAAA,GAAOA,aAAAA;AAAA,IACX,OAAO,EAAE,kBAAA,EAAoB,gBAAA,EAAkB,YAAA,EAAa,CAAA;AAAA,IAC5D,CAAC,kBAAkB,YAAY;AAAA,GACjC;AAGA,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAA,KAAO,WAAW,CAAA,GAC9D,WAAA,GACA,IAAA,CAAK,CAAC,GAAG,EAAA,IAAM,EAAA;AAEnB,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEtC,EAAA,uBACEE,eAAAA,CAAAG,mBAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,YAAA,oBACCb,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,4CAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAM;AAAA,QACvB,OAAA,EAAS,gBAAA;AAAA,QACT,aAAA,EAAW;AAAA;AAAA,KACb;AAAA,oBAGFU,eAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,QAAA,EAAU,eAAe,EAAA,GAAK,MAAA;AAAA,QAC9B,SAAA,EAAW,eAAe,gBAAA,GAAmB,YAAA;AAAA,QAC7C,KAAA,EAAO,YAAA,GAAe,EAAE,MAAA,EAAQ,OAAM,GAAI,MAAA;AAAA,QAGzC,QAAA,EAAA;AAAA,UAAA,YAAA,oBACCV,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,gBAAA;AAAA,cACT,SAAA,EAAU,iKAAA;AAAA,cACV,YAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,cAEzC,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,WAC7B;AAAA,0BAGFtD,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA;AAAA,cACA,SAAA,EAAW,gBAAA;AAAA,cACX,WAAA,EAAa,cAAA;AAAA,cACb,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,UAEC,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACrB,YAAA,MAAM,QAAA,GAAW,MAAM,EAAA,KAAO,gBAAA;AAC9B,YAAA,uBACAA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,EAAA,EAAI,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,MAAA,CAAA;AAAA,gBACf,IAAA,EAAK,UAAA;AAAA,gBACL,mBAAiB,KAAA,CAAM,EAAA;AAAA,gBACvB,QAAQ,CAAC,QAAA;AAAA,gBACT,SAAA,EAAW,QAAA,IAAY,YAAA,GAAe,8BAAA,GAAiC,WAAW,MAAA,GAAY,QAAA;AAAA,gBAE9F,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,oBAAA;AAAA,kBAAA;AAAA,oBACC,KAAA;AAAA,oBACA,aAAA;AAAA,oBACA,YAAA;AAAA,oBACA;AAAA;AAAA;AACF,eAAA;AAAA,cAZK,KAAA,CAAM;AAAA,aAab;AAAA,UAEF,CAAC;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ,CAAC;;;AExHD,mBAAA,EAAA;AAEA,cAAA,EAAA;AAMA,IAAM0F,aAAAA,GAAe,oHAAA;AACrB,IAAMC,iBAAAA,GAAmB,0IAAA;AAElB,IAAM,gBAAA,GAAmB3E,UAAAA,CAAK,SAAS4E,iBAAAA,CAAiB;AAAA,EAC7D;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAItF,eAAS,SAAS,CAAA;AACxD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,YAAA,GAAeC,aAAoB,IAAI,CAAA;AAC7C,EAAA,MAAM,oBAAA,GAAuBA,aAA2B,IAAI,CAAA;AAE5D,EAAA,MAAM,gBAAA,GAAmBJ,kBAAY,MAAM;AACzC,IAAA,eAAA,CAAgB,CAAC,CAAA,KAAM;AACrB,MAAA,IAAI,CAAC,CAAA,EAAG;AACN,QAAA,oBAAA,CAAqB,OAAA,GAAU,QAAA,CAAS,aAAA,YAAyB,WAAA,GAAc,SAAS,aAAA,GAAgB,IAAA;AAAA,MAC1G;AACA,MAAA,OAAO,CAAC,CAAA;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,EAAc;AAAC,MAAA;AAAA,IAAO;AAC3B,IAAA,YAAA,CAAa,SAAS,KAAA,EAAM;AAC5B,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,IAAgB,oBAAA,CAAqB,OAAA,EAAS;AACjD,MAAA,MAAM,KAAK,oBAAA,CAAqB,OAAA;AAChC,MAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAC/B,MAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,UAAA,EAAY;AAAC,QAAA,EAAA,CAAG,KAAA,EAAM;AAAA,MAAE;AAAA,IAClD;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,IAAA,GAAOD,aAAAA;AAAA,IACX,MACE,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,MACxB,EAAA,EAAI,SAAS,CAAC,CAAA,CAAA;AAAA,MACd,KAAA,EAAO,MAAM,KAAA,IAAS,CAAA,EAAG,EAAE,oBAAoB,CAAC,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA;AAAA,KAC3D,CAAE,CAAA;AAAA,IACJ,CAAC,QAAQ,CAAC;AAAA,GACZ;AAEA,EAAA,MAAM,IAAA,GAAOA,aAAAA;AAAA,IACX,OAAO,EAAE,YAAA,EAAa,CAAA;AAAA,IACtB,CAAC,YAAY;AAAA,GACf;AAGA,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAA,KAAO,WAAW,CAAA,GAC9D,WAAA,GACA,IAAA,CAAK,CAAC,GAAG,EAAA,IAAM,EAAA;AAEnB,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEtC,EAAA,uBACEE,eAAAA,CAAAG,mBAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,YAAA,oBACCb,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,4CAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAM;AAAA,QACvB,OAAA,EAAS,gBAAA;AAAA,QACT,aAAA,EAAW;AAAA;AAAA,KACb;AAAA,oBAGFU,eAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,QAAA,EAAU,eAAe,EAAA,GAAK,MAAA;AAAA,QAC9B,SAAA,EAAW,eAAeiF,iBAAAA,GAAmBD,aAAAA;AAAA,QAC7C,KAAA,EAAO,YAAA,GAAe,EAAE,MAAA,EAAQ,OAAM,GAAI,MAAA;AAAA,QAGzC,QAAA,EAAA;AAAA,UAAA,YAAA,oBACC1F,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,gBAAA;AAAA,cACT,SAAA,EAAU,iKAAA;AAAA,cACV,YAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,cAEzC,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,WAC7B;AAAA,0BAGFtD,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA;AAAA,cACA,SAAA,EAAW,gBAAA;AAAA,cACX,WAAA,EAAa,cAAA;AAAA,cACb,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,UAEC,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM;AACxB,YAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA,CAAA;AACxB,YAAA,MAAM,WAAW,KAAA,KAAU,gBAAA;AAC3B,YAAA,uBACAA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,EAAA,EAAI,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,gBACZ,IAAA,EAAK,UAAA;AAAA,gBACL,iBAAA,EAAiB,KAAA;AAAA,gBACjB,QAAQ,CAAC,QAAA;AAAA,gBACT,SAAA,EAAW,QAAA,IAAY,YAAA,GAAe,8BAAA,GAAiC,WAAW,MAAA,GAAY,QAAA;AAAA,gBAE9F,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,KAAA;AAAA,oBACX;AAAA;AAAA;AACF,eAAA;AAAA,cAVK;AAAA,aAWP;AAAA,UAEF,CAAC;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ,CAAC;;;ACzID,mBAAA,EAAA;AAQA,SAAS,cAAc,GAAA,EAAqB;AAC1C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,GAAG,EAAE,QAAA,CAAS,OAAA,CAAQ,UAAU,EAAE,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEA,IAAM,OAAA,GAAU;AAAA,EACd,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EACjC,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW;AACnC,CAAA;AAEA,SAAS,YAAY,MAAA,EAAwB;AAC3C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAAC,IAAA,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,IAAA,CAAM,KAAK,CAAA,IAAK,CAAA,CAAA;AAAA,EAAG;AACnF,EAAA,OAAO,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,QAAQ,MAAM,CAAA;AAC7C;AAIO,SAAS,YAAA,CAAa,EAAE,SAAA,EAAU,EAAsB;AAC7D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIM,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,OAAOH,iBAAAA,CAAY,MAAM,UAAU,IAAI,CAAA,EAAG,EAAE,CAAA;AAClD,EAAA,MAAM,QAAQA,iBAAAA,CAAY,MAAM,UAAU,KAAK,CAAA,EAAG,EAAE,CAAA;AAEpD,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAErC,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAI,GAAA;AAAA,IACtB,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA,CAAE,OAAO,OAAO;AAAA,GAC3E,CAAA;AACD,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAGzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBACEH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAU,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAU,6YAAA;AAAA,QAMT,QAAA,EAAA;AAAA,UAAA,cAAA,CAAe,MAAA,GAAS,CAAA,oBACvBV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,EAAQ,CAAA,qBAC3BA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAU,sKAAA;AAAA,cAEV,KAAA,EAAO,EAAE,eAAA,EAAiB,WAAA,CAAY,MAAM,CAAA,EAAG,MAAA,EAAQ,cAAA,CAAe,MAAA,GAAS,CAAA,EAAE;AAAA,cACjF,aAAA,EAAY,MAAA;AAAA,cAEX,QAAA,EAAA,MAAA,CAAO,CAAC,CAAA,EAAG,WAAA;AAAY,aAAA;AAAA,YANnB;AAAA,WAQR,CAAA,EACH,CAAA;AAAA,0BAEFU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mEAAA,EACb,QAAA,EAAA;AAAA,YAAA,SAAA,CAAU,MAAA;AAAA,YAAO,GAAA;AAAA,YAAE,CAAA,CAAE,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,0BAA0B,wBAAwB;AAAA,WAAA,EACnG;AAAA;AAAA;AAAA,KACF,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oHAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAU,8WAAA;AAAA,UAKV,YAAA,EAAY,EAAE,sBAAsB,CAAA;AAAA,UAEpC,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA;AAC7B,KAAA,EACF,CAAA;AAAA,oBAGAtD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,KAAU;AAClC,MAAA,MAAM,SAAS,QAAA,CAAS,GAAA,GAAM,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA,GAAI,EAAA;AAE5D,MAAA,MAAM,WAAA,mBACJU,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAb,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8GAAA,EACX,mBAAS,KAAA,IAAS,CAAA,CAAE,wBAAA,EAA0B,EAAE,GAAG,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,EAAG,CAAA,EACzE,CAAA;AAAA,QACC,QAAA,CAAS,2BACRA,cAAAA,CAAC,OAAE,SAAA,EAAU,8EAAA,EACV,mBAAS,OAAA,EACZ,CAAA;AAAA,QAED,MAAA,oBACCU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,iHAAA;AAAA,cACV,KAAA,EAAO,EAAE,eAAA,EAAiB,WAAA,CAAY,MAAM,CAAA,EAAE;AAAA,cAC9C,aAAA,EAAY,MAAA;AAAA,cAEX,QAAA,EAAA,MAAA,CAAO,CAAC,CAAA,EAAG,WAAA;AAAY;AAAA,WAC1B;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDACb,QAAA,EAAA,MAAA,EACH;AAAA,SAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAGF,MAAA,MAAM,SAAA,GAAY,kEAAA;AAElB,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,uBACEA,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YAEC,MAAM,QAAA,CAAS,GAAA;AAAA,YACf,MAAA,EAAO,QAAA;AAAA,YACP,GAAA,EAAI,qBAAA;AAAA,YACJ,SAAA,EAAW,GAAG,SAAS,CAAA;AAAA,wIAAA,CAAA;AAAA,YAGtB,QAAA,EAAA;AAAA,WAAA;AAAA,UAPI,QAAA,CAAS;AAAA,SAQhB;AAAA,MAEJ;AAEA,MAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAsB,WAAW,SAAA,EAC/B,QAAA,EAAA,WAAA,EAAA,EADO,SAAS,EAEnB,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AC1JA,IAAM,YAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,mEAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAEO,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAsB;AAC5D,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,YAAA,EAAc,QAAA,EAAU,aAAY,GAAI,QAAA;AACrE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,YAAA,CAAa,IAAI,GAAG,QAAQ,CAAA;AACzD,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,EAAA,uBACEU,eAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW;AAAA,QACT,+CAAA;AAAA,QACA,mDAAA;AAAA,QACA,8BAAA;AAAA,QACA,aAAA;AAAA,QACA,6BAAA;AAAA,QACA,kDAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,GAAG,CAAA;AAAA,MAGV,QAAA,EAAA;AAAA,wBAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,oEAAA,EAAuE,MAAA,CAAO,OAAO,CAAA,CAAA,EACnG,QAAA,kBAAAA,cAAAA,CAAC,IAAA,EAAA,EAAK,MAAM,EAAA,EAAI,MAAA,EAAO,WAAU,SAAA,EAAW,MAAA,CAAO,WAAW,CAAA,EAChE,CAAA;AAAA,wBAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mEAAA,EACb,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,4BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sJAAA,EACb,iBAAO,KAAA,EACV;AAAA,WAAA,EACF,CAAA;AAAA,UAAA,CACE,gBAAgB,QAAA,KAAa,MAAA,qBAC7BU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wEAAA,EACZ,QAAA,EAAA;AAAA,YAAA,YAAA,oBAAgBV,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,YACpC,gBAAgB,QAAA,KAAa,MAAA,oBAC5BA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uDAAA,EAAwD,CAAA;AAAA,YAEzE,QAAA,KAAa,MAAA,oBACZU,eAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,cAAA,EAAe;AAAA,cAAE;AAAA,aAAA,EAAK;AAAA,WAAA,EAE1C,CAAA;AAAA,UAED,+BACCV,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oEACV,QAAA,EAAA,WAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oJACb,QAAA,kBAAAA,cAAAA;AAAA,UAACc,oBAAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,EAAA;AAAA,YACN,MAAA,EAAO,MAAA;AAAA,YACP,SAAA,EAAU;AAAA;AAAA,SACZ,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AC7DA,mBAAA,EAAA;AAMO,SAAS,kBAAA,CAAmB;AAAA,EACjC;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,2BAAA,EAA6B,2BAAA,EAA6B,OAAA,KAChE,gBAAA,EAAiB;AACnB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIR,eAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAAiC,EAAE,CAAA;AAEvE,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,eAAA,CAAgB,SAAS,CAAA,GACrD,eAAA,CAAgB,YAChB,EAAC;AACL,EAAA,MAAM,eAAA,GAAkB,UAAU,WAAW,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,WAAA,KAAgB,SAAA,CAAU,MAAA,GAAS,CAAA;AACtD,EAAA,MAAM,cAAc,WAAA,KAAgB,CAAA;AACpC,EAAA,MAAM,aAAa,SAAA,CAAU,MAAA;AAC7B,EAAA,MAAM,aAAA,GACJ,eAAA,CAAgB,MAAA,KAAW,sBAAA,IAC3B,gBAAgB,MAAA,KAAW,sBAAA;AAG7B,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA;AACjD,EAAA,MAAM,gBAAA,GAAmB,UAAA,CAAW,eAAA,EAAiB,EAAE,CAAA,IAAK,EAAA;AAE5D,EAAA,MAAM,kBAAA,GAAqBH,iBAAAA;AAAA,IACzB,CAAC,UAAkB,OAAA,KAAqB;AACtC,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,aAAa,eAAA,CAAgB,EAAA;AACnC,MAAA,MAAM,iBAAiB,OAAA,CAAQ,UAAU,KAAK,EAAE,OAAA,EAAS,EAAC,EAAE;AAC5D,MAAA,MAAM,gBAAgB,QAAA,KAAa,WAAA;AACnC,MAAA,MAAM0F,cAAAA,GAAgB,gBAAgB,IAAA,KAAS,iBAAA;AAG/C,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,UAAA,CAAW;AAAA,UACT,GAAG,OAAA;AAAA,UACH,CAAC,UAAU,GAAG;AAAA,YACZ,SAAS,EAAC;AAAA,YACV,UAAA,EAAY,UAAU,gBAAA,GAAmB;AAAA;AAC3C,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,UAAA;AACJ,MAAA,IAAIA,cAAAA,EAAe;AAEjB,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,UAAA,GAAa,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,QAAQ,CAAA;AAAA,QAClE,CAAA,MAAA,IAAW,cAAA,CAAe,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG;AACpD,UAAA,UAAA,GAAa,cAAA,CAAe,OAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,UAAA,GAAa,CAAC,GAAG,cAAA,CAAe,OAAA,EAAS,QAAQ,CAAA;AAAA,QACnD;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,UAAA,GAAa,OAAA,GAAU,CAAC,QAAQ,CAAA,GAAI,EAAC;AAAA,MACvC;AAEA,MAAA,UAAA,CAAW;AAAA,QACT,GAAG,OAAA;AAAA,QACH,CAAC,UAAU,GAAG;AAAA,UACZ,OAAA,EAAS,UAAA;AAAA,UACT,UAAA,EAAY;AAAA;AACd,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,OAAA,EAAS,gBAAgB;AAAA,GAC7C;AAEA,EAAA,MAAM,qBAAA,GAAwB1F,iBAAAA;AAAA,IAC5B,CAAC,IAAA,KAAiB;AAChB,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,aAAa,eAAA,CAAgB,EAAA;AACnC,MAAA,aAAA,CAAc,EAAE,GAAG,UAAA,EAAY,CAAC,UAAU,GAAG,MAAM,CAAA;AAGnD,MAAA,UAAA,CAAW;AAAA,QACT,GAAG,OAAA;AAAA,QACH,CAAC,UAAU,GAAG;AAAA,UACZ,SAAS,EAAC;AAAA,UACV,UAAA,EAAY;AAAA;AACd,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,OAAA,EAAS,UAAU;AAAA,GACvC;AAEA,EAAA,MAAM,uBAAuB,MAAe;AAC1C,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,eAAA,CAAgB,EAAE,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,gBAAgB,QAAA,IAAY,IAAA;AAE7C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,CAAC,QAAA;AAAA,IACV;AAEA,IAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA;AACnD,IAAA,MAAM,gBAAA,GAAmB,OAAO,UAAA,KAAe,MAAA;AAC/C,IAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA,EAAY,IAAA,EAAK,CAAE,UAAU,CAAA,IAAK,CAAA;AAE/D,IAAA,IAAI,CAAC,kBAAA,IAAsB,CAAC,gBAAA,EAAkB;AAC5C,MAAA,OAAO,CAAC,QAAA;AAAA,IACV;AAEA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,CAAC,QAAA,IAAY,YAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,sBAAqB,EAAG;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,2BAAA,CAA4B,OAAO,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,cAAc,CAAC,CAAA;AAAA,IAChC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,cAAA,CAAe,cAAc,CAAC,CAAA;AAAA,IAChC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,UAAA,EAAW;AAAA,EACb,CAAA;AAEA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,uBACEO,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mMAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDAAA,EACV,QAAA,EAAA,CAAA,CAAE,iCAAiC,CAAA,EACtC,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,CAAA,CAAE,8BAA8B,CAAA,EACnC,CAAA;AAAA,sBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAU,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,2BAAA;AAAA,UACT,QAAA,EAAU,OAAA;AAAA,UACV,SAAA,EAAU,2MAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAV,eAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,YAC1B,EAAE,+BAA+B;AAAA;AAAA;AAAA,OACpC,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,aAAA,GAAgB,gBAAgB,IAAA,KAAS,iBAAA;AAC/C,EAAA,MAAM,WAAW,eAAA,CAAgB,OAAA,IAAW,EAAC,EAC1C,MAAA,CAAO,CAAC,MAAA,KAAW,OAAA,CAAQ,UAAU,OAAO,MAAA,CAAO,UAAU,QAAQ,CAAC,EACtE,GAAA,CAAI,CAAC,QAAQ,KAAA,MAAW;AAAA,IACvB,IAAI,MAAA,CAAO,EAAA,IAAM,GAAG,eAAA,CAAgB,EAAE,WAAW,KAAK,CAAA,CAAA;AAAA,IACtD,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,KAAA,EACE,OAAO,KAAA,IAAS,MAAA,CAAO,MAAM,CAAA,EAAG,eAAA,CAAgB,EAAE,CAAA,QAAA,EAAW,KAAK,CAAA;AAAA,GACtE,CAAE,CAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,eAAe,UAAA,KAAe,MAAA;AACtD,EAAA,MAAM,aAAa,oBAAA,EAAqB;AAExC,EAAA,uBACEtD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mMACb,QAAA,kBAAAU,eAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAEd,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC8F,oBAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,gDAAA;AAAA,UACV,MAAA,EAAO;AAAA;AAAA,OACT,EACF,CAAA;AAAA,sBACA9F,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sFAAA,EACb,QAAA,EAAA,CAAA,CAAE,mCAAmC,CAAA,EACxC,CAAA;AAAA,QACC,aAAa,CAAA,oBACZU,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2DAAA,EACb,QAAA,EAAA;AAAA,UAAA,WAAA,GAAc,CAAA;AAAA,UAAE,GAAA;AAAA,UAAE;AAAA,SAAA,EACrB;AAAA,OAAA,EAEJ,CAAA,EACF,CAAA;AAAA,sBACAV,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,2BAAA;AAAA,UACT,QAAA,EAAU,OAAA;AAAA,UACV,SAAA,EAAU,4LAAA;AAAA,UACV,YAAA,EAAY,EAAE,+BAA+B,CAAA;AAAA,UAE7C,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA;AAC7B,KAAA,EACF,CAAA;AAAA,IAEC,aAAA,oBACC5C,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qHAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wDAAA,EAAyD,QAAA,EAAA,6CAAA,EAEtE,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yDAAwD,QAAA,EAAA,qFAAA,EAGrE;AAAA,KAAA,EACF,CAAA;AAAA,IAID,UAAA,GAAa,CAAA,oBACZA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,KAAU;AAC3B,MAAA,MAAM,cAAc,KAAA,GAAQ,WAAA;AAC5B,MAAA,MAAM,YAAY,KAAA,KAAU,WAAA;AAC5B,MAAA,uBACEA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW;AAAA,YACT,8CAAA;AAAA,YACA,YACI,6CAAA,GACA,QAAA;AAAA,YACJ,WAAA,GACI,oCAAA,GACA,CAAC,SAAA,GACC,8BAAA,GACA;AAAA,WACR,CAAE,KAAK,GAAG;AAAA,SAAA;AAAA,QAXL;AAAA,OAYP;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBAIFU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8DAAA,EACV,0BAAgB,IAAA,EACnB,CAAA;AAAA,MACC,aAAA,oBACCA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,CAAA,CAAE,0CAA0C,CAAA,EAC/C;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,QAAA,MAAM,aACJ,aAAA,EAAe,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,IAAK,KAAA;AAChD,QAAA,uBACEA,eAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAW;AAAA,cACT,yEAAA;AAAA,cACA,oCAAA;AAAA,cACA,aACI,2FAAA,GACA;AAAA,aACN,CAAE,KAAK,GAAG,CAAA;AAAA,YAGV,QAAA,EAAA;AAAA,8BAAAV,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW;AAAA,oBACT,oFAAA;AAAA,oBACA,gBAAgB,YAAA,GAAe,cAAA;AAAA,oBAC/B,aACI,oGAAA,GACA;AAAA,mBACN,CAAE,KAAK,GAAG,CAAA;AAAA,kBAET,QAAA,EAAA,UAAA,oBAAcA,cAAAA,CAACuB,WAAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,eAChD;AAAA,8BACAvB,cAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,gBAAgB,UAAA,GAAa,OAAA;AAAA,kBACnC,IAAA,EAAM,CAAA,SAAA,EAAY,eAAA,CAAgB,EAAE,CAAA,CAAA;AAAA,kBACpC,OAAO,MAAA,CAAO,KAAA;AAAA,kBACd,OAAA,EAAS,UAAA;AAAA,kBACT,QAAA,EAAU,CAAC,CAAA,KACT,kBAAA,CAAmB,OAAO,EAAA,EAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,kBAEhD,SAAA,EAAU;AAAA;AAAA,eACZ;AAAA,8BACAA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW;AAAA,oBACT,wCAAA;AAAA,oBACA,aACI,8CAAA,GACA;AAAA,mBACN,CAAE,KAAK,GAAG,CAAA;AAAA,kBAET,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV;AAAA,WAAA;AAAA,UAxCK,MAAA,CAAO;AAAA,SAyCd;AAAA,MAEJ,CAAC,CAAA;AAAA,sBAGDU,eAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW;AAAA,YACT,yEAAA;AAAA,YACA,oCAAA;AAAA,YACA,kBACI,2FAAA,GACA;AAAA,WACN,CAAE,KAAK,GAAG,CAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAV,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW;AAAA,kBACT,oFAAA;AAAA,kBACA,gBAAgB,YAAA,GAAe,cAAA;AAAA,kBAC/B,kBACI,oGAAA,GACA;AAAA,iBACN,CAAE,KAAK,GAAG,CAAA;AAAA,gBAET,6CAAmBA,cAAAA,CAAC+F,0BAAiB,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,aAChE;AAAA,4BACA/F,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,gBAAgB,UAAA,GAAa,OAAA;AAAA,gBACnC,IAAA,EAAM,CAAA,SAAA,EAAY,eAAA,CAAgB,EAAE,CAAA,CAAA;AAAA,gBACpC,KAAA,EAAM,WAAA;AAAA,gBACN,OAAA,EAAS,eAAA;AAAA,gBACT,UAAU,CAAC,CAAA,KACT,mBAAmB,WAAA,EAAa,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,gBAElD,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW;AAAA,kBACT,wCAAA;AAAA,kBACA,kBACI,8CAAA,GACA;AAAA,iBACN,CAAE,KAAK,GAAG,CAAA;AAAA,gBAET,YAAE,mCAAmC;AAAA;AAAA;AACxC;AAAA;AAAA,OACF;AAAA,sBAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,gBAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,qBAAA,CAAsB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACrD,WAAA,EAAa,EAAE,sCAAsC,CAAA;AAAA,UACrD,SAAA,EAAU;AAAA;AAAA,OACZ,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA,CAAC,WAAA,oBACAU,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,kNAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAACgG,eAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,YAClC,EAAE,4BAA4B;AAAA;AAAA;AAAA,OACjC,EAEJ,CAAA;AAAA,sBAEAhG,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,WAAW,CAAC,UAAA;AAAA,UACtB,SAAA,EAAW;AAAA,YACT,gGAAA;AAAA,YACA,+GAAA;AAAA,YACA,aACI,4GAAA,GACA;AAAA,WACN,CAAE,KAAK,GAAG,CAAA;AAAA,UAET,QAAA,EAAA,UAAA,mBACCU,eAAAA,CAAAG,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,eAAe,CAAA;AAAA,4BAClBb,cAAAA,CAACiG,oBAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA,WAAA,EAC1C,CAAA,mBAEAvF,eAAAA,CAAAG,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,4BAA4B,CAAA;AAAA,4BAC/Bb,cAAAA,CAACkG,gBAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA,WAAA,EACtC;AAAA;AAAA;AAEJ,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;AC5aA,mBAAA,EAAA;AAOO,IAAM,eAAA,GAAkBlF,UAAAA,CAAK,SAASmF,gBAAAA,CAAgB;AAAA,EAC3D;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,uBACEnG,cAAAA;AAAA,IAACwF,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,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,IAAA,EAAK;AAAA,MAC7B,SAAA,EAAU,oBAAA;AAAA,MAEV,QAAA,kBAAA9E,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,wFAAA;AAAA,UACV,IAAA,EAAK,QAAA;AAAA,UACL,WAAA,EAAU,QAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,8BAAAV,cAAAA;AAAA,gBAACoG,aAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,0DAAA;AAAA,kBACV,MAAA,EAAO;AAAA;AAAA,eACT;AAAA,8BACApG,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0CAAA,EACb,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAC5B;AAAA,aAAA,EACF,CAAA;AAAA,4BACAU,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,gTAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAAC4D,oBAAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,kBACzB,EAAE,qBAAqB;AAAA;AAAA;AAAA;AAC1B;AAAA;AAAA;AACF;AAAA,GACF;AAEJ,CAAC;;;ACvDM,SAAS,yBAAyB,YAAA,EAA8B;AACrE,EAAA,OAAO,YAAA,GAAe,GAAA,GAAO,CAAA,EAAA,CAAI,YAAA,GAAe,GAAA,EAAM,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG,YAAY,CAAA,EAAA,CAAA;AACvF;AAEO,SAAS,eAAe,UAAA,EAA4B;AACzD,EAAA,OAAO,UAAA,GAAa,GAAA,GAAO,CAAA,EAAA,CAAI,UAAA,GAAa,GAAA,EAAM,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA;AACjF;AAEO,SAAS,kCAAA,CACd,OACA,YAAA,EACe;AACf,EAAA,IAAI,CAAC,SAAS,CAAC,YAAA,IAAgB,gBAAgB,CAAA,IAAK,KAAA,CAAM,oBAAoB,CAAA,EAAG;AAC/E,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,oBAAoB,YAAA,GAAe,GAAA,CAAA;AAClD;AAEO,SAAS,4BAAA,CACd,cACA,kBAAA,EACe;AACf,EAAA,IAAI,CAAC,kBAAA,IAAsB,kBAAA,IAAsB,CAAA,IAAK,gBAAgB,CAAA,EAAG;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAQ,eAAe,kBAAA,GAAsB,GAAA;AAC/C;ACeA,SAAS,eAAA,GAAyC;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAItD,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAWC,aAAsD,IAAI,CAAA;AAE3E,EAAA,MAAM,IAAA,GAAOJ,iBAAAA,CAAY,OAAO,IAAA,KAAiB;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAAC,QAAA,MAAA,CAAO,YAAA,CAAa,SAAS,OAAO,CAAA;AAAA,MAAE;AACtE,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACzC,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,MACrB,GAAG,GAAI,CAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,gBAAgB,GAAG,CAAA;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAM,eAAAA,CAAU,MAAM,MAAM;AACpB,IAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAAC,MAAA,MAAA,CAAO,YAAA,CAAa,SAAS,OAAO,CAAA;AAAA,IAAE;AAAA,EACxE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AACxB;AAEA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAK,EAAqB;AAC5C,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,eAAA,EAAgB;AAEzC,EAAA,MAAM,UAAA,GAAa,OAAO,CAAA,KAAwB;AAChD,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,MAAM,KAAK,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,uBACEC,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,UAAA;AAAA,MACT,SAAA,EAAW;AAAA,QACT,wEAAA;AAAA,QACA,6BAAA;AAAA,QACA,SACI,8EAAA,GACA;AAAA,OACN,CAAE,KAAK,GAAG,CAAA;AAAA,MAET,QAAA,EAAA;AAAA,QAAA,MAAA,mBAASV,cAAAA,CAACuB,WAAAA,EAAA,EAAM,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,CAAA,mBAAKvB,cAAAA,CAACwB,UAAAA,EAAA,EAAK,MAAM,EAAA,EAAI,CAAA;AAAA,wBAC9DxB,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,GAAS,YAAY,MAAA,EAAO;AAAA;AAAA;AAAA,GACrC;AAEJ;AAIA,SAAS,gBAAA,CAAiB,EAAE,IAAA,EAAK,EAAqB;AACpD,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,eAAA,EAAgB;AAEzC,EAAA,MAAM,UAAA,GAAa,OAAO,CAAA,KAAwB;AAChD,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,MAAM,KAAK,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,UAAA;AAAA,MACT,YAAA,EAAY,SAAS,QAAA,GAAW,MAAA;AAAA,MAChC,SAAA,EAAW;AAAA,QACT,0DAAA;AAAA,QACA,SACI,wCAAA,GACA;AAAA,OACN,CAAE,KAAK,GAAG,CAAA;AAAA,MAET,QAAA,EAAA,MAAA,mBAASA,cAAAA,CAACuB,WAAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,oBAAKvB,cAAAA,CAACwB,UAAAA,EAAA,EAAK,MAAM,EAAA,EAAI;AAAA;AAAA,GAChE;AAEJ;AAUA,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,KAAA,EAAO,OAAM,EAAoB;AAC3D,EAAA,uBACEd,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+GAAA,EACb,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,oBACDV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAA0D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAChFA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAoC,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAC5D,CAAA;AAEJ;AAIA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAK,EAAgC;AACvD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIM,eAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,YAAY,CAAC,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,KAAA;AACzC,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,IAAA,CAAK,KAAA;AAExB,EAAA,MAAM,SAAS,QAAA,GACX;AAAA,IACE,sBAAMN,cAAAA,CAACqG,iBAAQ,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,IACvC,MAAA,EAAQ,8BAAA;AAAA,IACR,QAAA,EAAU,gCAAA;AAAA,IACV,WAAA,EAAa;AAAA,MAEf,SAAA,GACA;AAAA,IACE,sBAAMrG,cAAAA,CAACsG,qBAAY,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,IAC3C,MAAA,EAAQ,sCAAA;AAAA,IACR,QAAA,EAAU,wCAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACf,GACA;AAAA,IACE,IAAA,kBAAMtG,cAAAA,CAACuG,iBAAA,EAAA,EAAY,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,IACpE,MAAA,EAAQ,8BAAA;AAAA,IACR,QAAA,EAAU,kCAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACf;AAEJ,EAAA,uBACE7F,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW;AAAA,QACT,4BAAA;AAAA,QACA,mDAAA;AAAA,QACA,YAAA;AAAA,QAAc,MAAA,CAAO,WAAA;AAAA,QACrB,8BAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,GAAG,CAAA;AAAA,MAGV,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,YACpC,eAAA,EAAe,QAAA;AAAA,YACf,YAAA,EAAY,GAAG,IAAA,CAAK,IAAI,WAAM,QAAA,GAAW,OAAA,GAAU,SAAA,GAAY,SAAA,GAAY,SAAS,CAAA,CAAA;AAAA,YACpF,SAAA,EAAU,6HAAA;AAAA,YAGV,QAAA,EAAA;AAAA,8BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,sDAAA,EAAyD,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,CAAA,CAAA,EACvG,QAAA,EAAA,MAAA,CAAO,IAAA,EACV,CAAA;AAAA,8BAGAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kGAAA,EACb,eAAK,IAAA,EACR,CAAA;AAAA,cAGC,IAAA,CAAK,UAAA,KAAe,MAAA,oBACnBA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wJAAA,EACb,QAAA,EAAA,cAAA,CAAe,IAAA,CAAK,UAAU,CAAA,EACjC,CAAA;AAAA,8BAIFA,cAAAA;AAAA,gBAACsE,eAAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,EAAA;AAAA,kBACN,MAAA,EAAO,MAAA;AAAA,kBACP,SAAA,EAAW;AAAA,oBACT,gDAAA;AAAA,oBACA,mCAAA;AAAA,oBACA,WAAW,YAAA,GAAe;AAAA,mBAC5B,CAAE,KAAK,GAAG;AAAA;AAAA;AACZ;AAAA;AAAA,SACF;AAAA,wBAGAtE,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW;AAAA,cACT,4DAAA;AAAA,cACA,WAAW,iBAAA,GAAoB;AAAA,aACjC,CAAE,KAAK,GAAG,CAAA;AAAA,YAEV,QAAA,kBAAAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAEZ,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,SAAA,oBACJA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wGAAA,EACb,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,WAAA,EAEjF,CAAA;AAAA,kCACAA,cAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,KAAK,SAAA,EAAW;AAAA,iBAAA,EAClC,CAAA;AAAA,gCACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gIAAA,EACZ,eAAK,SAAA,EACR;AAAA,eAAA,EACF,CAAA;AAAA,cAID,KAAK,MAAA,oBACJU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wGAAA,EACb,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,QAAA,EAEjF,CAAA;AAAA,kCACAA,cAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,KAAK,MAAA,EAAQ;AAAA,iBAAA,EAC/B,CAAA;AAAA,gCACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gIAAA,EACZ,eAAK,MAAA,EACR;AAAA,eAAA,EACF,CAAA;AAAA,cAID,KAAK,KAAA,oBACJU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oFAAA,EACb,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,OAAA,EAEhF,CAAA,EACF,CAAA;AAAA,gCACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sGAAA,EACZ,eAAK,KAAA,EACR;AAAA,eAAA,EACF;AAAA,aAAA,EAEJ,CAAA,EACF;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAIO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAM,EAAoB;AACrD,EAAA,MAAM,OAAA,GAAU,CAAC,CAAC,KAAA,IAAS,cAAc,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,KAAA,EAAO,OAAA,EAAS,IAAA,EAAK,IAAK,EAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK,IAAK,EAAA;AAC5C,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,CAAC,QAAA,EAAU;AAAC,MAAA,OAAO,EAAA;AAAA,IAAG;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC/B,MAAA,IAAI,MAAA,CAAO,QAAA,KAAa,OAAA,IAAW,MAAA,CAAO,aAAa,QAAA,EAAU;AAAC,QAAA,OAAO,EAAA;AAAA,MAAG;AAC5E,MAAA,OAAO,OAAO,QAAA,EAAS;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,MAAM,eAAA,GAAkB,kCAAA,CAAmC,KAAA,EAAO,KAAA,EAAO,OAAO,YAAY,CAAA;AAG5F,EAAA,MAAM,UAA6B,EAAC;AAEpC,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,IAAI,KAAA,CAAM,iBAAiB,MAAA,EAAW;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,kBAAMA,cAAAA,CAACwG,WAAA,EAAA,EAAM,MAAM,EAAA,EAAI,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,oCAAA,EAAqC,CAAA;AAAA,QACvF,KAAA,EAAO,wBAAA,CAAyB,KAAA,CAAM,YAAY,CAAA;AAAA,QAClD,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AACA,IAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,kBAAMxG,cAAAA,CAACyG,eAAA,EAAA,EAAU,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,sCAAA,EAAuC,CAAA;AAAA,QAC1F,KAAA,EAAO,CAAA,EAAG,eAAA,CAAgB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,QACpC,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AACA,IAAA,IAAI,kBAAA,CAAmB,KAAA,CAAM,KAAK,CAAA,IAAK,MAAM,KAAA,EAAO;AAClD,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,UACE,IAAA,kBAAMzG,cAAAA,CAAC0G,WAAA,EAAA,EAAM,MAAM,EAAA,EAAI,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,sCAAA,EAAuC,CAAA;AAAA,UACzF,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,WAAA,CAAY,cAAA,EAAe;AAAA,UAC9C,KAAA,EAAO;AAAA,SACT;AAAA,QACA;AAAA,UACE,IAAA,kBAAM1G,cAAAA,CAAC2G,aAAA,EAAA,EAAQ,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,kCAAA,EAAmC,CAAA;AAAA,UACpF,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,YAAA,CAAa,cAAA,EAAe;AAAA,UAC/C,KAAA,EAAO;AAAA,SACT;AAAA,QACA;AAAA,UACE,IAAA,kBAAM3G,cAAAA,CAAC4G,eAAA,EAAA,EAAU,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,sCAAA,EAAuC,CAAA;AAAA,UAC1F,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,gBAAA,CAAiB,cAAA,EAAe;AAAA,UACnD,KAAA,EAAO;AAAA;AACT,OACF;AACA,MAAA,IAAI,MAAM,KAAA,CAAM,YAAA,KAAiB,UAAa,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA,EAAG;AAC1E,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,kBAAM5G,cAAAA,CAAC6G,cAAA,EAAA,EAAS,MAAM,EAAA,EAAI,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,kCAAA,EAAmC,CAAA;AAAA,UACxF,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,YAAA,CAAa,cAAA,EAAe;AAAA,UAC/C,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,uBACEnG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC8G,SAAA,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,oCAAmC,CAAA,EAC/E,CAAA;AAAA,wBACA9G,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wFAAuF,QAAA,EAAA,OAAA,EAErG;AAAA,OAAA,EACF,CAAA;AAAA,MACC,OAAA,IAAW,KAAA,oBACVA,cAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,KAAA,EAEpD,CAAA;AAAA,IAEC,WAAW,KAAA,mBACVU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACX,QAAA,EAAA;AAAA,MAAA,CAAA,OAAA,IAAW,MAAM,SAAA,qBACjBA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sHAAA,EACZ,QAAA,EAAA;AAAA,QAAA,OAAA,oBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0FAAA,EAA2F,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,0BAChHA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gFAAA,EAAiF,KAAA,EAAO,SAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BAC1HA,cAAAA,CAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,OAAA,EAAS;AAAA,SAAA,EACnC,CAAA;AAAA,QAED,MAAM,SAAA,oBACLU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0FAAA,EAA2F,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,0BAClHA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kFAAiF,KAAA,EAAO,KAAA,CAAM,SAAA,EAAY,QAAA,EAAA,KAAA,CAAM,SAAA,EAAU,CAAA;AAAA,0BAC1IA,cAAAA,CAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,MAAM,SAAA,EAAW;AAAA,SAAA,EAC3C,CAAA;AAAA,QAED,YAAA,oBACCU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,0BACrCU,eAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,YAAA;AAAA,cACN,MAAA,EAAO,QAAA;AAAA,cACP,GAAA,EAAI,qBAAA;AAAA,cACJ,YAAA,EAAW,kBAAA;AAAA,cACX,SAAA,EAAU,uKAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC+G,oBAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,gCACxC/G,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,kBAAA,EAAgB;AAAA;AAAA;AAAA;AACxB,SAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,MAAA,CAGA,KAAA,CAAM,YAAY,KAAA,CAAM,iBAAA,qBACxBU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8GAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,iBAAA,oBACLA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gDAAA,EAAiD,QAAA,EAAA;AAAA,UAAA,eAAA;AAAA,0BACjDV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAa,gBAAM,iBAAA,EAAkB;AAAA,SAAA,EACpE,CAAA;AAAA,QAED,KAAA,CAAM,QAAA,oBACLU,eAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EAA6E,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,0BACrGA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uHAAA,EACZ,gBAAM,QAAA,EACT;AAAA,SAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,MAAA,CAGC,KAAA,CAAM,YAAY,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAC1C,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,KACpC,KAAA,CAAM,MAAA,IAAU,MAAM,MAAA,CAAO,MAAA,GAAS,sBACvCU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8GAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EAAwE,QAAA,EAAA,aAAA,EAEvF,CAAA;AAAA,wBACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,CAAC,CAAC,MAAM,QAAA,EAAU,MAAA,oBACjBA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iGAAA,EAAkG,QAAA,EAAA;AAAA,YAAA,YAAA;AAAA,YACrG,MAAM,QAAA,CAAS;AAAA,WAAA,EAC5B,CAAA;AAAA,UAED,CAAC,CAAC,KAAA,CAAM,KAAA,EAAO,0BACdA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iGAAA,EAAkG,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,YACxG,MAAM,KAAA,CAAM;AAAA,WAAA,EACtB,CAAA;AAAA,UAED,CAAC,CAAC,KAAA,CAAM,MAAA,EAAQ,0BACfA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iGAAA,EAAkG,QAAA,EAAA;AAAA,YAAA,UAAA;AAAA,YACvG,MAAM,MAAA,CAAO;AAAA,WAAA,EACxB;AAAA,SAAA,EAEJ,CAAA;AAAA,QACC,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,oBACzCV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACZ,QAAA,EAAA;AAAA,UACC,MAAM,QAAA,CAAS,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA;AAAA,UAC1C,MAAM,QAAA,CAAS,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,CAAE,QAAA;AAAA,UAC1C,MAAM,QAAA,CAAS,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,CAAE;AAAA,UAEzC,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,UAAK,CAAA,EACf;AAAA,OAAA,EAEJ,CAAA;AAAA,MAID,OAAA,CAAQ,SAAS,CAAA,oBAChBA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACfA,cAAAA,CAAC,UAAA,EAAA,EAAoB,GAAG,CAAA,EAAA,EAAP,CAAU,CAC5B,CAAA,EACH,CAAA;AAAA,MAID,MAAM,KAAA,CAAM,MAAA,GAAS,CAAA,oBACpBU,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,eAACgH,YAAA,EAAA,EAAO,IAAA,EAAM,IAAI,MAAA,EAAO,SAAA,EAAU,WAAU,kCAAA,EAAmC,CAAA;AAAA,0BAChFhH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAA2D,QAAA,EAAA,YAAA,EAE3E,CAAA;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yIAAA,EACb,QAAA,EAAA,KAAA,CAAM,MAAM,MAAA,EACf;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,gBAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,qBACtBA,eAAC,QAAA,EAAA,EAAoD,IAAA,EAAA,EAAtC,CAAA,EAAG,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAgB,CAClE,CAAA,EACH;AAAA,OAAA,EACF;AAAA,KAAA,EAGJ,oBAEAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAkD,QAAA,EAAA,wBAAA,EAE/D;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;AjBxbA,mBAAA,EAAA;AAGA,IAAMiH,iBAAAA,GAAmB5E,UAAAA;AAAA,EAAK,MAC5B,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,qBAAA,EAAA,EAAA,wBAAA,CAAA,CAAA,CAA6B,IAAA,CAAK,CAAC,MAAA,MAAY;AAAA,IAC7C,SAAS,MAAA,CAAO;AAAA,GAClB,CAAE;AACJ,CAAA;AA4LA,IAAM6E,iBAAAA,GAAmB,GAAA;AAMzB,IAAMC,kBAAAA,GAA0D;AAAA,EAC9D,IAAA,EAAM,0BAAA;AAAA,EACN,OAAA,EACE,gGAAA;AAAA,EACF,MAAA,EACE,mHAAA;AAAA,EACF,MAAA,EACE,yEAAA;AAAA,EACF,WAAA,EAAa,EAAA;AAAA,EACb,MAAA,EAAQ,aAAA;AAAA,EACR,MAAA,EAAQ,kCAAA;AAAA,EACR,SAAA,EAAW,2BAAA;AAAA,EACX,OAAA,EAAS,EAAA;AAAA,EACT,WAAA,EAAa,yDAAA;AAAA,EACb,OAAA,EAAS,yBAAA;AAAA,EACT,YAAA,EACE,6WAAA;AAAA,EACF,SAAA,EAAW;AACb,CAAA;AAEA,SAASC,gBAAAA,CACP,UACA,SAAA,EACsC;AACtC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA,CAAU,IAAA,IAAQ,QAAA,CAAS,IAAA;AAAA,IACjC,OAAA,EAAS,SAAA,CAAU,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,IACvC,MAAA,EAAQ,SAAA,CAAU,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,IACrC,MAAA,EAAQ,SAAA,CAAU,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,IACrC,WAAA,EAAa,SAAA,CAAU,WAAA,IAAe,QAAA,CAAS,WAAA;AAAA,IAC/C,MAAA,EAAQ,SAAA,CAAU,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,IACrC,MAAA,EAAQ,SAAA,CAAU,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,IACrC,SAAA,EAAW,SAAA,CAAU,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,IAC3C,OAAA,EAAS,SAAA,CAAU,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,IACvC,WAAA,EAAa,SAAA,CAAU,WAAA,IAAe,QAAA,CAAS,WAAA;AAAA,IAC/C,OAAA,EAAS,SAAA,CAAU,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,IACvC,YAAA,EAAc,SAAA,CAAU,YAAA,IAAgB,QAAA,CAAS,YAAA;AAAA,IACjD,SAAA,EAAW,SAAA,CAAU,SAAA,IAAa,QAAA,CAAS;AAAA,GAC7C;AACF;AAMO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,WAAA,GAAc,KAAA;AAAA,EACd,eAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA,EAAY,kBAAA;AAAA,EACZ,MAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,UAAA,GAAa,KAAA;AAAA,EACb,WAAA,GAAc,KAAA;AAAA,EACd,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA,GAAY;AACd,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI9G,eAAS,KAAK,CAAA;AACpE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,cAAA,GAAiBC,aAA8B,IAAI,CAAA;AACzD,EAAA,MAAM,sBAAA,GAAyBA,YAAAA;AAAA,IAC7B;AAAA,GACF;AACA,EAAA,MAAM,OAAA,GAAU6G,gBAAAA,CAAgBD,kBAAAA,EAAmB,kBAAkB,CAAA;AACrE,EAAA,MAAM,eAAA,GAAkB,KAAK,IAAA,KAAS,QAAA;AACtC,EAAA,MAAM,eAAA,GAAkB,eAAA,GACpB,iIAAA,GACA,OAAA,CAAQ,MAAA;AACZ,EAAA,MAAM,eAAA,GAAkB,eAAA,GACpB,gEAAA,GACA,OAAA,CAAQ,MAAA;AAEZ,EAAA1G,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,uBAAuB,OAAA,EAAS;AAClC,QAAA,YAAA,CAAa,uBAAuB,OAAO,CAAA;AAC3C,QAAA,sBAAA,CAAuB,OAAA,GAAU,IAAA;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,EAAS,IAAA,GAAO,MAAA,GAAS,CAAA;AACjD,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,IAAA,CAAK,aAAa,IAAA,EAAK;AAChD,EAAA,MAAM,oBAAA,GAAuB,KAAK,SAAA,KAAc,yBAAA;AAChD,EAAA,MAAM,wBAAwB,eAAA,EAAiB,MAAA;AAC/C,EAAA,MAAM,0BAAA,GACJ,CAAC,CAAC,eAAA,KACD,0BAA0B,SAAA,IACzB,qBAAA,KAA0B,kBAAA,IAC1B,qBAAA,KAA0B,kBAAA,IAC1B,qBAAA,KAA0B,0BAC1B,qBAAA,KAA0B,sBAAA,CAAA,KAC3B,eAAA,CAAgB,MAAA,KAAW,MAAA,IAC1B,eAAA,CAAgB,WAAW,IAAA,CAAK,EAAA,IAC/B,CAAC,eAAA,CAAgB,MAAA,IAAU,UAAA,CAAA;AAChC,EAAA,MAAM,kBAAA,GAAqB,0BAAA,IAA8B,CAAC,CAAC,eAAA;AAC3D,EAAA,MAAM,mBACJ,kBAAA,KACC,qBAAA,KAA0B,SAAA,IACzB,qBAAA,KAA0B,0BAC1B,qBAAA,KAA0B,sBAAA,CAAA;AAC9B,EAAA,MAAM,eAAA,GACJ,kBAAA,KACC,qBAAA,KAA0B,kBAAA,IACzB,qBAAA,KAA0B,kBAAA,CAAA;AAC9B,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,IAAA,CAAK,WAAA,EAAa,MAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,IAAA,CAAK,MAAA,EAAQ,MAAA;AAChC,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,IAAA,CAAK,YAAA,EAAc,MAAA;AACvC,EAAA,MAAM,YAAA,GAAe,CAAC,CAAC,IAAA,CAAK,SAAA,EAAW,MAAA;AACvC,EAAA,MAAM,QAAA,GAAW,SAAA,IAAa,CAAC,CAAC,IAAA,CAAK,KAAA;AACrC,EAAA,MAAM,wBACJ,UAAA,IACA,cAAA,IACA,cAAA,IACA,QAAA,IACA,aACA,YAAA,IACA,QAAA;AACF,EAAA,MAAM,aAAA,GACJ,CAAC,CAAC,YAAA,IAAgB,CAAC,CAAC,MAAA,IAAU,CAAC,eAAA,IAAmB,UAAA;AACpD,EAAA,MAAM,eAAA,GACJ,uBAAA,CAAwB,IAAA,EAAM,aAAa,KAAK,CAAC,qBAAA;AACnD,EAAA,MAAM,UAAA,GAAkC,gBAAA,GACpC,WAAA,GACA,eAAA,GACE,eAAA,GACA,uBACE,cAAA,GACA,qBAAA,GACE,SAAA,GACA,eAAA,GACE,OAAA,GACA,OAAA;AAEZ,EAAA,MAAM,eAAA,GAAkBN,kBAAY,YAAY;AAC9C,IAAA,IAAI;AACF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAAA,MAClD;AAEA,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,IAAI,uBAAuB,OAAA,EAAS;AAClC,QAAA,YAAA,CAAa,uBAAuB,OAAO,CAAA;AAAA,MAC7C;AACA,MAAA,sBAAA,CAAuB,OAAA,GAAU,WAAW,MAAM;AAChD,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,sBAAA,CAAuB,OAAA,GAAU,IAAA;AAAA,MACnC,GAAG+G,iBAAgB,CAAA;AAAA,IACrB,SAAS,GAAA,EAAK;AACZ,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AAEzB,EAAA,MAAM,eAAA,GAAA,CAAmB,gBAAA,EAAkB,MAAA,IAAU,CAAA,KAAM,CAAA;AAE3D,EAAA,MAAM,qBAAA,GAAwB/G,kBAAY,YAAY;AACpD,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,MAAA,EAAQ;AAC5B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAClC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,aAAa,MAAM,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,YAAA,EAAc,MAAA,EAAQ,eAAe,CAAC,CAAA;AAE1C,EAAA,MAAM,yBAAA,GAA4BA,iBAAAA;AAAA,IAChC,OAAO,OAAA,KAAoB;AACzB,MAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,MAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,QAAA,MAAM,YAAA,CAAa,QAAQ,OAAO,CAAA;AAAA,MACpC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,cAAc,MAAM;AAAA,GACvB;AAGA,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA+B;AACpD,MAAA,MAAM,OAAO,cAAA,CAAe,OAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,EAAM;AAAC,QAAA;AAAA,MAAO;AAInB,MAAA,MAAM,IAAA,GACJ,OAAO,CAAA,CAAE,YAAA,KAAiB,aAAa,CAAA,CAAE,YAAA,KAAiB,EAAC;AAC7D,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACxC,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA;AACxD,MAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,iBAAA,EAAmB;AACxC,QAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AACA,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,aAAa,CAAA;AACpD,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,aAAa,CAAA;AACrD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,aAAa,CAAA;AACvD,MAAA,QAAA,CAAS,mBAAA,CAAoB,cAAc,aAAa,CAAA;AACxD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAGtD,EAAA,MAAM,eAAA,GAAmD;AAAA,IACvD,IAAA,EAAM,kBAAkB,KAAA,GAAQ;AAAA,GAClC;AACA,EAAA,MAAM,gBAAA,GAAqD;AAAA,IACzD,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB;AAAA,GACF;AACA,EAAA,MAAM,gBAAA,GAAqD;AAAA,IACzD,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa;AAAC,GAChC;AACA,EAAA,MAAM,eAAA,GAAmD;AAAA,IACvD,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU;AAAC,GAC1B;AACA,EAAA,MAAM,oBAAA,GAA6D;AAAA,IACjE,OAAA,EAAS,IAAA,CAAK,WAAA,IAAe;AAAC,GAChC;AACA,EAAA,MAAM,eAAA,GAAmD;AAAA,IACvD,MAAA,EAAQ,IAAA,CAAK,YAAA,IAAgB;AAAC,GAChC;AACA,EAAA,MAAM,kBAAA,GAAyD;AAAA,IAC7D,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa;AAAC,GAChC;AACA,EAAA,MAAM,gBAAA,GAAqD;AAAA,IACzD,MAAA,EAAQ,eAAA;AAAA,IACR,YAAA,EAAc,aAAA,GACV,CAAC,KAAA,KAAU;AACT,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,MAAA,EAAQ;AAC5B,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAK,0BAA0B,KAAK,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,KAAK,qBAAA,EAAsB;AAAA,MAC7B;AAAA,IACF,CAAA,GACA,MAAA;AAAA,IACJ,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,UAAA;AAAA,IACT;AAAA,GACF;AACA,EAAA,MAAM,oBAAA,GAA6D;AAAA,IACjE,WAAA,EAAa,KAAK,WAAA,IAAe,EAAA;AAAA,IACjC,UAAA,EAAY,mBAAA;AAAA,IACZ,QAAA,EAAU,MAAM,sBAAA,CAAuB,CAAC,mBAAmB;AAAA,GAC7D;AAGA,EAAA,MAAM,UAAA,GAAa,CACjB,IAAA,EACA,KAAA,EACA,cAAA,KACc;AACd,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,OAAO,cAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,MAAA,OAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,IAAA,EAErB,QAAA,EAAA;AAAA,IAAA,CAAC,UAAA,oBACAV,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,eAAA,EACb,QAAA,EAAA,UAAA;AAAA,MACC,KAAA,EAAO,MAAA;AAAA,MACP,eAAA;AAAA,MACA,kBAAkB,KAAA,GAAQ;AAAA,KAC5B,EACF,CAAA;AAAA,oBAGFU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,OAAA,EAEtB,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAACqH,4BAAA,EAAA,EACE,QAAA,EAAA,eAAA,oBACCrH,cAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UAEC,SAAS,MAAM;AACb,YAAA,KAAK,qBAAA,EAAsB;AAAA,UAC7B;AAAA,SAAA;AAAA,QAHI;AAAA,OAIN,EAEJ,CAAA;AAAA,MAGC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,oBAC7CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,WAAA,EACrB,QAAA,EAAA,UAAA;AAAA,QACC,KAAA,EAAO,WAAA;AAAA,QACP,oBAAA;AAAA,wBACAA,cAAAA,CAAC,wBAAA,EAAA,EAAiB,OAAA,EAAS,KAAK,WAAA,EAAa;AAAA,OAC/C,EACF,CAAA;AAAA,MAID,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,oBACnCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,MAAA,EACrB,QAAA,EAAA,UAAA;AAAA,QACC,KAAA,EAAO,MAAA;AAAA,QACP,eAAA;AAAA,QACA,KAAK,MAAA,CAAO,MAAA,KAAW,oBACrBA,cAAAA,CAAC,aAAU,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,CAAC,GAAG,CAAA,mBAEtCA,eAAC,gBAAA,EAAA,EAAiB,MAAA,EAAQ,KAAK,MAAA,EAAQ;AAAA,OAE3C,EACF,CAAA;AAAA,MAID,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,oBAC/CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,MAAA,EACrB,QAAA,EAAA,UAAA;AAAA,QACC,KAAA,EAAO,MAAA;AAAA,QACP,eAAA;AAAA,QACA,IAAA,CAAK,YAAA,CAAa,MAAA,KAAW,CAAA,mBAC3BA,cAAAA;AAAA,UAAC,oBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,CAAC,CAAA;AAAA,YAC1B,aAAA;AAAA,YACA,cAAc,YAAA,IAAgB;AAAA;AAAA,4BAGhCA,cAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,QAAQ,IAAA,CAAK,YAAA;AAAA,YACb,aAAA;AAAA,YACA,cAAc,YAAA,IAAgB;AAAA;AAAA;AAChC,OAEJ,EACF,CAAA;AAAA,MAID,UAAA,oBACCU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,eAAA,EACb,QAAA,EAAA;AAAA,QAAA,UAAA;AAAA,UACC,KAAA,EAAO,OAAA;AAAA,UACP,gBAAA;AAAA,0BACAV,cAAAA;AAAA,YAAC+B,cAAAA;AAAA,YAAA;AAAA,cACC,QAAA,kBACErB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kEAAA,EACb,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sGAAA,EAAuG,CAAA;AAAA,gBACrH,EAAE,uBAAuB;AAAA,eAAA,EAC5B,CAAA;AAAA,cAGF,QAAA,kBAAAA,cAAAA;AAAA,gBAACiH,iBAAAA;AAAA,gBAAA;AAAA,kBACC,SAAS,IAAA,CAAK,OAAA;AAAA,kBACd,WAAW,IAAA,CAAK,SAAA;AAAA,kBAChB,WAAA,EAAa,aAAA;AAAA,kBACb,cAAc,YAAA,IAAgB;AAAA;AAAA;AAChC;AAAA;AACF,SACF;AAAA,QAGC,WAAA,oBAAejH,cAAAA,CAAC,uBAAA,EAAA,EAAgB,CAAA;AAAA,QAGhC,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,oBACzCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,OAAA,EACrB,QAAA,EAAA,UAAA;AAAA,UACC,KAAA,EAAO,OAAA;AAAA,UACP,gBAAA;AAAA,0BACAA,cAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAW,KAAK,SAAA,EAAW;AAAA,SAC3C,EACF,CAAA;AAAA,QAID,kCACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,WAAA,EACrB,QAAA,EAAA,UAAA;AAAA,UACC,KAAA,EAAO,WAAA;AAAA,UACP,oBAAA;AAAA,0BACAU,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAH,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MACP,sBAAA,CAAuB,CAAC,mBAAmB,CAAA;AAAA,gBAE7C,SAAA,EAAU,mQAAA;AAAA,gBACV,eAAA,EAAe,mBAAA;AAAA,gBAEf,QAAA,EAAA;AAAA,kCAAAV,cAAAA;AAAA,oBAACgE,gBAAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAM,EAAA;AAAA,sBACN,MAAA,EAAO,MAAA;AAAA,sBACP,SAAA,EAAW,CAAA,kCAAA,EACT,mBAAA,GAAsB,WAAA,GAAc,EACtC,CAAA;AAAA;AAAA,mBACF;AAAA,kCACAhE,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,aAAA,EACb,QAAA,EAAA,CAAA,CAAE,8BAA8B,CAAA,EACnC;AAAA;AAAA;AAAA,aACF;AAAA,YACC,uCACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAAA,cAAAA;AAAA,cAAC+B,cAAAA;AAAA,cAAA;AAAA,gBACC,0BAAU/B,cAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAAE,CAAA;AAAA,gBAE3C,0BAAAA,cAAAA,CAACiH,iBAAAA,EAAA,EAAiB,OAAA,EAAS,KAAK,WAAA,EAAc;AAAA;AAAA,aAChD,EACF;AAAA,WAAA,EAEJ;AAAA,SACF,EACF,CAAA;AAAA,QAGD,6BAAajH,cAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,KAAK,KAAA,EAAO;AAAA,OAAA,EAC/C,CAAA;AAAA,MAID,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,oBACzCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,SAAA,EACrB,QAAA,EAAA,UAAA;AAAA,QACC,KAAA,EAAO,SAAA;AAAA,QACP,kBAAA;AAAA,QACA,KAAK,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,0BAC5BA,cAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YAEC;AAAA,WAAA;AAAA,UADK,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,SAGrC;AAAA,OACH,EACF,CAAA;AAAA,MAID,eAAe,cAAA,oBACdU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2LAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAAA,EACV,QAAA,EAAA,CAAA,CAAE,mCAAmC,CAAA,EACxC,CAAA;AAAA,wBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,CAAA,CAAE,yCAAyC,CAAA,EAC9C;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,UAAA,KAAe,mCACdU,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,WAAA,EAAU,QAAA;AAAA,UACV,SAAA,EAAU,8MAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAV,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,6EAAA;AAAA,gBACV,aAAA,EAAY;AAAA;AAAA,aACd;AAAA,4BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EACb,QAAA,EAAA,eAAA,EAAiB,MAAA,KAAW,kBAAA,GACzB,CAAA,CAAE,0CAA0C,CAAA,GAC5C,CAAA,CAAE,uCAAuC,CAAA,EAC/C,CAAA;AAAA,4BACAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,8CAAA;AAAA,gBACV,aAAA,EAAY,MAAA;AAAA,gBACb,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8CAAA,EACb,QAAA,EAAA,CAAA,CAAE,wCAAwC,CAAA,EAC7C;AAAA;AAAA;AAAA,OACF;AAAA,MAID,eAAe,WAAA,IAAe,eAAA,oBAC7BA,cAAAA,CAAC,sBAAmB,eAAA,EAAkC,CAAA;AAAA,MAIvD,UAAA,IAAc,CAAC,WAAA,oBACdA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,WAAW,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,QAAA,GAAW,gBAAgB,EAAE,CAAA,CAAA;AAAA,UAE7D,QAAA,EAAA,UAAA;AAAA,YACC,KAAA,EAAO,OAAA;AAAA,YACP,gBAAA;AAAA,4BACAU,eAAAA,CAAAG,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,CAAC,iCACAb,cAAAA,CAAC,UAAK,SAAA,EAAW,OAAA,CAAQ,WAAY,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,cAGhD,aAAa,IAAA,CAAK,KAAA,EAAO,QAAA,GAAW,CAAC,GAAG,KAAA,oBACvCA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yJAAA,EACb,QAAA,EAAA,IAAA,CAAK,MAAM,QAAA,CAAS,CAAC,EAAE,KAAA,EAC1B,CAAA;AAAA,8BAGFA,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,eAAA;AAAA,kBACT,WAAW,CAAA,eAAA,EAAkB,OAAA,CAAQ,YAAY,CAAA,CAAA,EAC/C,QAAA,GAAW,uCAAuC,EACpD,CAAA,CAAA;AAAA,kBACA,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,kBAC1C,OACE,QAAA,GACI,CAAA,CAAE,uBAAuB,CAAA,GACzB,EAAE,qBAAqB,CAAA;AAAA,kBAG5B,qCACCA,cAAAA,CAACuB,WAAAA,EAAA,EAAM,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,CAAA,mBAE/BvB,cAAAA,CAACwB,UAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU;AAAA;AAAA,eAErC;AAAA,cAEC,iCACCd,eAAAA,CAAC,SAAI,GAAA,EAAK,cAAA,EAAgB,WAAU,sBAAA,EAClC,QAAA,EAAA;AAAA,gCAAAV,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,qBAAA;AAAA,oBACT,WAAW,CAAA,eAAA,EAAkB,OAAA,CAAQ,YAAY,CAAA,CAAA,EAC/C,eAAA,GACI,kEACA,EACN,CAAA,CAAA;AAAA,oBACA,YAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,oBACzC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,oBACpC,eAAA,EAAe,kBAAkB,MAAA,GAAS,MAAA;AAAA,oBAC1C,eAAA,EACE,kBAAkB,eAAA,GAAkB,MAAA;AAAA,oBAGtC,0BAAAA,cAAAA,CAACsH,qBAAA,EAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU;AAAA;AAAA,iBAC9C;AAAA,gBACC,eAAA,IAAmB,mCAClBtH,cAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,MAAA;AAAA,oBACL,YAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,oBACzC,SAAA,EAAU,0KAAA;AAAA,oBAET,QAAA,EAAA,gBAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAC/B,sBAAA,MAAM,SAAS,CAAA,KAAM,CAAA;AACrB,sBAAA,MAAM,IAAA,GAAO,SAASyG,eAAAA,GAAYc,WAAA;AAClC,sBAAA,MAAM,MAAA,GAAS,SACX,oCAAA,GACA,kCAAA;AACJ,sBAAA,uBACE7G,eAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BAEC,IAAA,EAAK,UAAA;AAAA,0BACL,IAAA,EAAK,QAAA;AAAA,0BACL,SAAS,MAAM;AACb,4BAAA,KAAK,yBAAA,CAA0B,EAAE,EAAE,CAAA;AAAA,0BACrC,CAAA;AAAA,0BACA,SAAA,EAAU,iMAAA;AAAA,0BAEV,QAAA,EAAA;AAAA,4CAAAV,cAAAA;AAAA,8BAAC,IAAA;AAAA,8BAAA;AAAA,gCACC,IAAA,EAAM,EAAA;AAAA,gCACN,MAAA,EAAO,MAAA;AAAA,gCACP,SAAA,EAAW;AAAA;AAAA,6BACb;AAAA,4CACAA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,CAAA,CAAE,KAAK,CAAA,EAAE;AAAA;AAAA,yBAAA;AAAA,wBAbb,CAAA,CAAE;AAAA,uBAcT;AAAA,oBAEJ,CAAC;AAAA;AAAA;AACH,eAAA,EAEJ;AAAA,aAAA,EAEJ;AAAA;AACF;AAAA;AACF,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AkB90BA,mBAAA,EAAA;AAEA,IAAMiH,iBAAAA,GAAmB5E,UAAAA;AAAA,EAAK,MAC5B,kFAA6B,IAAA,CAAK,CAAC,YAAY,EAAE,OAAA,EAAS,MAAA,CAAO,gBAAA,EAAiB,CAAE;AACtF,CAAA;AAEA,IAAM6E,iBAAAA,GAAmB,GAAA;AACzB,IAAM,gBAAA,GAAmB,GAAA;AAUlB,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,aAAA,GAAgB;AAClB,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI5G,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAA6B,MAAS,CAAA;AAChF,EAAA,MAAM,sBAAA,GAAyBC,aAA6C,IAAI,CAAA;AAChF,EAAA,MAAM,UAAA,GAAaA,aAA8B,IAAI,CAAA;AAErD,EAAAE,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,uBAAuB,OAAA,EAAS;AAClC,QAAA,YAAA,CAAa,uBAAuB,OAAO,CAAA;AAC3C,QAAA,sBAAA,CAAuB,OAAA,GAAU,IAAA;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,OAAO,UAAA,CAAW,OAAA;AACxB,IAAA,IAAI,CAAC,IAAA,EAAM;AAAC,MAAA;AAAA,IAAO;AAEnB,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAM,UAAU,IAAA,CAAK,YAAA;AACrB,MAAA,gBAAA,CAAiB,OAAO,CAAA;AACxB,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,eAAA,CAAgB,OAAA,GAAU,mBAAmB,CAAC,CAAA;AAAA,MAChD;AAAA,IACF,CAAA;AAEA,IAAA,OAAA,EAAQ;AAER,IAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AACzC,MAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,OAAO,CAAA;AAC3C,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,MAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,IACnC;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,OAAO,CAAA;AACzC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAAA,EAC3D,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,MAAM,eAAA,GAAkBN,kBAAY,YAAY;AAC9C,IAAA,IAAI;AACF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,OAAO,OAAO,CAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA;AAAA,MAC7C;AAEA,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,IAAI,uBAAuB,OAAA,EAAS;AAClC,QAAA,YAAA,CAAa,uBAAuB,OAAO,CAAA;AAAA,MAC7C;AACA,MAAA,sBAAA,CAAuB,OAAA,GAAU,WAAW,MAAM;AAChD,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,sBAAA,CAAuB,OAAA,GAAU,IAAA;AAAA,MACnC,GAAG+G,iBAAgB,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,MAAM,CAAC,CAAA;AAEpB,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,SAAA,EAAW,CAAC,CAAA;AAEjD,EAAA,MAAM,cAAA,GAAiB,aAAa,aAAA,GAAgB,gBAAA;AAEpD,EAAA,uBACElH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6PAAA,EAEb,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qHAAA,EAAsH,CAAA;AAAA,oBAGrIU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAACwH,2BAAA,EAAA,EAAsB,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,wBAC/CxH,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oDAAA,EACb,QAAA,EAAA,CAAA,CAAE,mCAAmC,CAAA,EACxC;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,MAEvB,CAAC,eAAe,CAAC,aAAA,oBAChBA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2DAAA,EACb,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,MAGD,CAAC,+BACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,eAAA;AAAA,UACT,SAAA,EAAW;AAAA;AAAA;AAAA,kBAAA,EAGP,QAAA,GACE,uCACA,8HACJ;AAAA,gBAAA,CAAA;AAAA,UAEF,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,UAC1C,OAAO,QAAA,GAAW,CAAA,CAAE,uBAAuB,CAAA,GAAI,EAAE,qBAAqB,CAAA;AAAA,UAErE,qCAAWA,cAAAA,CAACuB,WAAAA,EAAA,EAAM,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,CAAA,mBAAKvB,cAAAA,CAACwB,UAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU;AAAA;AAAA;AACnF,KAAA,EAEJ,CAAA;AAAA,oBAGAxB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EAA2D,CAAA;AAAA,oBAG1EU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,UAAA;AAAA,UACL,SAAA,EAAU,yIAAA;AAAA,UACV,OAAO,EAAE,SAAA,EAAW,iBAAiB,CAAA,EAAG,cAAc,OAAO,MAAA,EAAU;AAAA,UAEvE,QAAA,kBAAAA,cAAAA;AAAA,YAAC+B,cAAAA;AAAA,YAAA;AAAA,cACC,QAAA,kBACErB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gHAAA,EAAiH,CAAA;AAAA,gCAChIA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,SAAA,EAAW,QAAA,EAAA,CAAA,CAAE,8BAA8B,CAAA,EAAE;AAAA,eAAA,EAC/D,CAAA;AAAA,cAGF,0BAAAA,cAAAA,CAACiH,iBAAAA,EAAA,EAAiB,OAAA,EAAkB,cAAY,IAAA,EAAC;AAAA;AAAA;AACnD;AAAA,OACF;AAAA,MAGC,gBAAgB,CAAC,UAAA,oBAChBjH,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kKAAA,EAAmK;AAAA,KAAA,EAEtL,CAAA;AAAA,IAGC,gCACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACb,QAAA,kBAAAU,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,aAAA,CAAc,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,QAC5C,eAAA,EAAe,UAAA;AAAA,QACf,SAAA,EAAU,uQAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,UAAM,QAAA,EAAA,UAAA,GAAa,CAAA,CAAE,wBAAwB,CAAA,GAAI,CAAA,CAAE,wBAAwB,CAAA,EAAE,CAAA;AAAA,0BAC9EA,cAAAA;AAAA,YAACsE,eAAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,EAAA;AAAA,cACN,MAAA,EAAO,MAAA;AAAA,cACP,SAAA,EAAW,CAAA,kCAAA,EAAqC,UAAA,GAAa,YAAA,GAAe,EAAE,CAAA;AAAA;AAAA;AAChF;AAAA;AAAA,KACF,EACF,CAAA;AAAA,IAID,CAAC,YAAA,oBAAgBtE,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAO;AAAA,GAAA,EAC1C,GACF,CAAA,EACF,CAAA;AAEJ;ArBlJO,SAAS,iBAAA,CAAkB;AAAA,EAChC,IAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,WAAA,GAAc,KAAA;AAAA,EACd,KAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA,GAAkB;AACpB,CAAA,EAA2B;AACzB,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,cAAA,EAAe;AACrC,EAAA,MAAM,EAAE,YAAY,gBAAA,EAAkB,eAAA,EAAiB,aAAAoB,YAAAA,EAAa,OAAA,KAAY,gBAAA,EAAiB;AACjG,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,MAAM,gBAAA,GAAmBZ,cAA6C,MAAM;AAC1E,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,UAAA,EAAY,GAAA,EAAK,MAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAAC,MAAA,OAAO,MAAA;AAAA,IAAU;AACpD,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AAAA,EACzD,GAAG,CAAC,WAAA,CAAY,UAAA,EAAY,GAAA,EAAK,MAAM,CAAC,CAAA;AAExC,EAAA,MAAM,gBAAgB,IAAA,CAAK,aAAA;AAC3B,EAAA,IAAI,CAAC,aAAA,EAAe;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEjC,EAAA,IAAI,aAAA,CAAc,SAAS,QAAA,EAAU;AACnC,IAAA,uBACER,cAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,SAAS,aAAA,CAAc,OAAA;AAAA,QACvB,WAAW,aAAA,CAAc,SAAA;AAAA,QACzB,MAAA,EAAQ,UAAA;AAAA,QACR,WAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,aAAA;AAAA,MACN,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,UAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,YAAA,EAAc,kBAAkB,gBAAA,GAAmB,MAAA;AAAA,MACnD,gBAAA,EAAkB,kBAAkB,gBAAA,GAAmB,MAAA;AAAA,MACvD,aAAA,EAAeoB,YAAAA;AAAA,MACf,cAAc,OAAA,IAAW,WAAA;AAAA,MACzB,UAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA,EAAW;AAAA;AAAA,GACb;AAEJ;AsB7CA,IAAM+F,kBAAAA,GAAoD;AAAA,EACxD,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,EAAA;AAAA,EACV,aAAA,EAAe;AACjB,CAAA;AAEO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,0BAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAAoB;AAClB,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,IAAA,EAAM,UAAA,EAAY,IAAA,IAAQA,kBAAAA,CAAkB,IAAA;AAAA,IAC5C,QAAA,EAAU,UAAA,EAAY,QAAA,IAAYA,kBAAAA,CAAkB,QAAA;AAAA,IACpD,aAAA,EAAe,UAAA,EAAY,aAAA,IAAiBA,kBAAAA,CAAkB;AAAA,GAChE;AACA,EAAA,MAAM,WAAA,GAAc,OAAO,IAAA,CAAK,QAAA,EAAU,YAAY,QAAA,GAAW,IAAA,CAAK,SAAS,OAAA,GAAU,EAAA;AACzF,EAAA,MAAM,sBACJ,WAAA,CAAY,IAAA,OAAW,EAAA,IAAM,IAAA,CAAK,eAAe,IAAA,KAAS,QAAA;AAE5D,EAAA,uBACEzG,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,IAAA,EAAM,cAAA,EAAc,KAAK,EAAA,EAE9C,QAAA,EAAA;AAAA,IAAA,CAAC,mBAAA,oBACAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,QAAA,EACrB,QAAA,EAAA,cAAA,GACC,cAAA,CAAe,IAAI,CAAA,mBAEnBA,cAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,KAAA,EAAO,gBAAA;AAAA,QACP,UAAA,EAAY,qBAAA;AAAA,QACX,GAAG;AAAA;AAAA,KACN,EAEJ,CAAA;AAAA,IAID,IAAA,CAAK,aAAA,oBACJA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,aAAA,EACrB,QAAA,EAAA,mBAAA,GACC,mBAAA,CAAoB,IAAI,CAAA,mBAExBA,cAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA,EAAO,qBAAA;AAAA,QACP,UAAA,EAAY,0BAAA;AAAA,QACX,GAAG;AAAA;AAAA,KACN,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;AC3GO,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,EAAE,QAAA,EAAU,GAAA;AAAI,GAC9B;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA;AAAK;AAEjC;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,GAAA;AAAA,MACV,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,EAAE,QAAA,EAAU,IAAA;AAAK;AAEjC;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,EAAE,QAAA,EAAU,IAAA;AAAK,GAC/B;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA;AAAI;AAEhC;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,EAAE,QAAA,EAAU,IAAA;AAAK,GAC/B;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA;AAAK;AAEjC;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,GAAA;AAAA,MACV,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,EAAE,QAAA,EAAU,IAAA;AAAK;AAEjC;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,CAAA;AAAA,MACV,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM;AAAA;AACR;AAEJ;AAMO,IAAM,sBAAA,GAAyB;AAAA,EACpC,OAAA,EAAS;AAAA,IACP,CAAA,EAAG,EAAA;AAAA,IACH,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,CAAA,EAAG,CAAA;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,CAAA,EAAG,GAAA;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA;AAAK;AAEjC;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,EAAE,QAAA,EAAU,GAAA;AAAI,GAC9B;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,KAAA,EAAO,GAAA;AAAA,IACP,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA;AAAK;AAEjC;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,IAAA;AAAK,GAC/B;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,mBAAA,GAAsB;AAAA,EACjC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,EAC9B,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA;AAAI,GAC9B;AAAA,EACA,KAAA,EAAO;AAAA,IACL,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,GAAA;AAAA,IACH,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA;AAAI;AAEhC;AAKO,IAAM,oBAAA,GAAuB;AAAA,EAClC,SAAS,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,GAAA,EAAK,QAAQ,CAAA,EAAE;AAAA,EACzC,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,GAAA;AAAA,MACV,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,GAAA;AAAA,IACH,MAAA,EAAQ,CAAA;AAAA,IACR,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA;AAAI;AAEhC;;;ACpQA,mBAAA,EAAA;AAYA,IAAM,aAAA,GAAgB;AAAA,EACpB,0BAAA;AAAA,EACA,4BAAA;AAAA,EACA,2BAAA;AAAA,EACA,8BAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACF,CAAA;AAGA,IAAM,uBAAuB,MAAM;AACjC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACjD,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC/D,CAAA;AAGA,IAAM,aAAA,GAAgB,CAAC,KAAA,EAAiB,OAAA,KAA4B;AAClE,EAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,OAAO,CAAA;AACnD,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAA,IAAW,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAAA,EAChC;AACA,EAAA,OAAO,SAAA,CAAU,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,SAAA,CAAU,MAAM,CAAC,CAAA;AAC/D,CAAA;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA,EAAO,SAAA;AAAA,EACP,gBAAA,GAAmB,GAAA;AAAA,EACnB,SAAA,GAAY;AACd,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,MAAM,KAAA,GAAQQ,cAAQ,MAAM;AAC1B,IAAA,IAAI,SAAA,EAAW;AAAC,MAAA,OAAO,SAAA;AAAA,IAAU;AACjC,IAAA,OAAO,cAAc,GAAA,CAAI,CAACJ,IAAAA,KAAQ,CAAA,CAAEA,IAAG,CAAC,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,SAAA,EAAW,CAAC,CAAC,CAAA;AAEjB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,eAAS,MAAM,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AAEtF,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,sBAAqB,EAAG;AAAC,MAAA;AAAA,IAAO;AAEpC,IAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS,aAAA,CAAc,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IAC9C,GAAG,gBAAgB,CAAA;AAEnB,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAE5B,EAAA,uBACEC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,8DAA8D,SAAS,CAAA,CAAA;AAAA,MAElF,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,eAAY,MAAA,EACnD,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uHAAA,EAAwH,CAAA;AAAA,0BACxIA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yHAAA,EAA0H,CAAA;AAAA,0BAC1IA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yHAAA,EAA0H;AAAA,SAAA,EAC5I,CAAA;AAAA,wBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,kBAAAA,cAAAA,CAACqH,4BAAAA,EAAA,EAAgB,IAAA,EAAK,MAAA,EACpB,QAAA,kBAAA3G,eAAAA;AAAA,UAAC8E,mBAAAA,CAAO,IAAA;AAAA,UAAP;AAAA,YAEC,QAAA,EAAU,sBAAA;AAAA,YACV,OAAA,EAAQ,SAAA;AAAA,YACR,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,uCAAA;AAAA,YACV,YAAA,EAAY,CAAA,CAAE,2BAAA,EAA6B,EAAE,MAAM,CAAA;AAAA,YAElD,QAAA,EAAA;AAAA,cAAA,IAAA;AAAA,cAAK;AAAA;AAAA,WAAA;AAAA,UARD;AAAA,WAUT,CAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,IAAM,uBAAA,GAA0BxE,WAAK,eAAe;AACpD,uBAAA,CAAwB,WAAA,GAAc,iBAAA;;;ACrFtC,mBAAA,EAAA;;;ACNA,IAAM,QAAA,mBAAW,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,IAAI,CAAC,CAAA;AAEhF,SAAS,iBAAiB,IAAA,EAAsB;AAC9C,EAAA,OAAO,IAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAU,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA,CAAK,WAAA,KAAgB,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA,CACtG,IAAA,CAAK,GAAG,CAAA;AACb;AAUO,SAAS,YAAA,CACd,CAAA,EACA,IAAA,EACA,IAAA,EACA,MAAA,EACQ;AAER,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAMZ,IAAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC7B,IAAA,MAAM,QAAQ,CAAA,CAAEA,IAAAA,EAAK,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAC,CAAA;AAChD,IAAA,IAAI,UAAUA,IAAAA,EAAK;AAAC,MAAA,OAAO,KAAA;AAAA,IAAM;AAAA,EACnC;AAGA,EAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA,CAAA;AACnC,EAAA,MAAM,WAAW,CAAA,CAAE,MAAA,EAAQ,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAC,CAAA;AACtD,EAAA,IAAI,aAAa,MAAA,EAAQ;AAAC,IAAA,OAAO,QAAA;AAAA,EAAS;AAG1C,EAAA,OAAO,iBAAiB,IAAI,CAAA;AAC9B;AAKA,SAAS,eAAA,CACP,MACA,IAAA,EACoC;AACpC,EAAA,IAAI,IAAA,KAAS,UAAU,IAAA,EAAM;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,OAAO,EAAE,OAAO,MAAA,CAAO,MAAA,CAAO,eAAe,MAAA,CAAO,aAAA,IAAiB,YAAY,CAAA,EAAE;AAAA,IACrF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,OAAO,YAAA,EAAa;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;ACtDO,SAAS,WAAW,KAAA,EAGzB;AACA,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA4B;AAEjD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAS,KAAK,EAAC;AAC/C,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AACjD,EAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AACjC;AFNA,SAASqH,gBAAe,EAAA,EAAoB;AAC1C,EAAA,OAAO,EAAA,GAAK,GAAA,GAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA,GAAO,IAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC1D;AAkBA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,eAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAG7B,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAIjH,aAAAA,CAAQ,MAAM,UAAA,CAAW,WAAW,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEtF,EAAA,MAAM,UAAA,GAAa,eAAA,IAAmB,WAAA,CAAY,MAAA,GAAS,CAAA;AAC3D,EAAA,IAAI,CAAC,UAAA,EAAY;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAE9B,EAAA,MAAM,iBAAiB,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA;AAEpE,EAAA,uBACER,cAAAA,CAAC0H,yBAAA,EAAA,EAAa,aAAA,EAAc,QAC1B,QAAA,kBAAAhH,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,cAAc,SAAS,CAAA,CAAA;AAAA,MAGlC,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mHAAA,EAAoH,QAAA,EAAA,IAAA,EAEnI,CAAA;AAAA,wBAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAEb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAACqH,4BAAAA,EAAA,EACE,QAAA,EAAA,eAAA,oBACCrH,cAAAA;AAAA,YAACwF,mBAAAA,CAAO,GAAA;AAAA,YAAP;AAAA,cAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,cACjC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,cACtC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,cAC9B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA,EAAE;AAAA,cACpD,SAAA,EAAU,iBAAA;AAAA,cAEV,QAAA,kBAAAxF,cAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAS,eAAA,EAAiB;AAAA,aAAA;AAAA,YAPtC;AAAA,WAQN,EAEJ,CAAA;AAAA,0BAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAACqH,8BAAA,EAAgB,OAAA,EAAS,OACvB,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,qBACbrH,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,CAAA;AAAA,gBACA;AAAA,eAAA;AAAA,cAHK,IAAA,CAAK;AAAA,aAKb,CAAA,EACH,CAAA;AAAA,4BAGAA,cAAAA,CAACqH,4BAAAA,EAAA,EAAgB,OAAA,EAAS,KAAA,EACvB,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,KAAK,sBACjCrH,cAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBAEC,SAAA;AAAA,gBACA,KAAA;AAAA,gBACA,CAAA;AAAA,gBACA;AAAA,eAAA;AAAA,cAJK;AAAA,aAMR,CAAA,EACH,CAAA;AAAA,YAGC,cAAA,IAAkB,CAAC,eAAA,oBAClBU,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAmC,aAAA,EAAY,MAAA,EAC5D,QAAA,EAAA;AAAA,8BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uHAAA,EAAwH,CAAA;AAAA,8BACxIA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yHAAA,EAA0H,CAAA;AAAA,8BAC1IA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yHAAA,EAA0H;AAAA,aAAA,EAC5I;AAAA,WAAA,EAEJ;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAMA,SAAS,cAAA,CAAe,EAAE,OAAA,EAAQ,EAAwB;AAExD,EAAA,MAAM,SAAA,GAAYQ,cAAQ,MAAM;AAC9B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA;AACvC,IAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACtC,IAAA,OAAO,KAAK,MAAA,GAAS,GAAA,GAAM,WAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,EACtD,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,uBACEE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iEAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gFAAA,EAAiF,CAAA;AAAA,oBACjGA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA,SAAA,EACH,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAYA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,CAAA,EAAG,iBAAgB,EAAkB;AAC7D,EAAA,MAAM,KAAA,GAAQQ,aAAAA;AAAA,IACZ,MACE,IAAA,CAAK,IAAA,KAAS,UAAA,GACV,CAAA,CAAE,0BAA0B,CAAA,GAC5B,YAAA,CAAa,CAAA,EAAG,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,WAAW,eAAe,CAAA;AAAA,IACpE,CAAC,KAAK,IAAA,EAAM,IAAA,CAAK,UAAU,IAAA,CAAK,SAAA,EAAW,GAAG,eAAe;AAAA,GAC/D;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,MAAA,KAAW,WAAA;AACpC,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,KAAW,QAAA;AACjC,EAAA,MAAM,WAAW,IAAA,CAAK,UAAA,IAAc,OAAOiH,eAAAA,CAAe,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA;AAE7E,EAAA,uBACE/G,eAAAA;AAAA,IAAC8E,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,MAAA,EAAM,IAAA;AAAA,MACN,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,EAAK,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA,EAAE;AAAA,MACpD,WAAW,CAAA,+DAAA,EACT,QAAA,GACI,gCAAA,GACA,WAAA,GACE,qCACA,kCACR,CAAA,CAAA;AAAA,MACA,YAAA,EAAY,GAAG,KAAK,CAAA,EAAA,EAAK,WAAW,QAAA,GAAW,WAAA,GAAc,cAAc,aAAa,CAAA,CAAA;AAAA,MAExF,QAAA,EAAA;AAAA,wBAAAxF,cAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,wBACtCA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAW,eAAe,QAAA,GAAW,EAAA,GAAK,eAAgB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACrE,IAAA,CAAK,yBACJA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,6CAAA;AAAA,YACV,OAAO,IAAA,CAAK,KAAA;AAAA,YAEX,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,SACR;AAAA,QAED,4BACCA,cAAAA;AAAA,UAACwF,mBAAAA,CAAO,IAAA;AAAA,UAAP;AAAA,YACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,YACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,YACtB,SAAA,EAAU,uDAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ;AAaA,SAAS,WAAW,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,EAAG,iBAAgB,EAAoB;AAC7E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIlF,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAErE,EAAA,uBACEI,eAAAA;AAAA,IAAC8E,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,MAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,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,SAAA,EAAU,2EAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAA9E,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM,YAAA,CAAa,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,YACrC,SAAA,EAAU,wKAAA;AAAA,YACV,iBAAe,CAAC,SAAA;AAAA,YAEhB,QAAA,EAAA;AAAA,8BAAAV,cAAAA;AAAA,gBAACgE,gBAAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,EAAA;AAAA,kBACN,MAAA,EAAO,MAAA;AAAA,kBACP,SAAA,EAAW,CAAA,2CAAA,EAA8C,SAAA,GAAY,EAAA,GAAK,WAAW,CAAA;AAAA;AAAA,eACvF;AAAA,8BACAtD,gBAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,gBAAA,SAAA;AAAA,gBACA,SAAA,oBACCA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uCAAA,EAAwC,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBACpD,cAAA;AAAA,kBAAe,GAAA;AAAA,kBAAE,KAAA,CAAM,MAAA;AAAA,kBAAO;AAAA,iBAAA,EAClC;AAAA,eAAA,EAEJ;AAAA;AAAA;AAAA,SACF;AAAA,QACC,CAAC,6BACAV,cAAAA,CAACqH,8BAAA,EAAgB,OAAA,EAAS,OACvB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVrH,eAAC,QAAA,EAAA,EAAuB,IAAA,EAAY,GAAM,eAAA,EAAA,EAA3B,IAAA,CAAK,EAAwD,CAC7E,CAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAMA,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAO,EAAuC;AACvE,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,uBACEA,cAAAA;AAAA,MAACwF,mBAAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,KAAA,EAAO,GAAA,EAAK,SAAS,CAAA,EAAE;AAAA,QAClC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,QAChC,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA,QAC1D,SAAA,EAAU,UAAA;AAAA,QAEV,QAAA,kBAAAxF,eAACqG,aAAAA,EAAA,EAAQ,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,gCAAA,EAAiC;AAAA;AAAA,KAC9E;AAAA,EAEJ;AAEA,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,uBACErG,cAAAA;AAAA,MAACwF,mBAAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,KAAA,EAAO,GAAA,EAAK,SAAS,CAAA,EAAE;AAAA,QAClC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,QAChC,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA,QAC1D,SAAA,EAAU,yDAAA;AAAA,QACV,OAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QAEL,QAAA,kBAAAxF,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,oBAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EACd,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mHAAA,EAAoH,CAAA;AAAA,oBACpIA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EAA2D;AAAA,GAAA,EAC7E,CAAA;AAEJ;AAMO,IAAM,aAAA,GAAgBgB,WAAK,kBAAkB;AACpD,aAAA,CAAc,WAAA,GAAc,eAAA;;;AG5T5B,mBAAA,EAAA;AAWA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,IAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA,EACd,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,uBACEhB,cAAAA,CAACqH,4BAAAA,EAAA,EACE,kCACCrH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,4CAAA;AAAA,MACV,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,WAAW,kBAAA,EAAmB;AAAA,MAEpD,QAAA,kBAAAA,cAAAA;AAAA,QAACwF,mBAAAA,CAAO,MAAA;AAAA,QAAP;AAAA,UACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,UAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,UAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,UAC1B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAI;AAAA,UAC5B,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,UAChC,QAAA;AAAA,UACA,SAAA,EAAW,CAAA,iZAAA,EACT,KAAA,GACI,gOAAA,GACA,8CACN,CAAA,CAAA;AAAA,UACA,YAAA,EAAY,KAAA,IAAS,CAAA,CAAE,8BAA8B,CAAA;AAAA,UAEpD,QAAA,EAAA,KAAA,mBACC9E,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAb,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,4BACxDA,eAAC4G,eAAAA,EAAA,EAAU,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,YAAA,EAAa;AAAA,WAAA,EAC5D,CAAA,mBAEAlG,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAAC4G,iBAAA,EAAU,IAAA,EAAM,IAAI,MAAA,EAAO,MAAA,EAAO,WAAU,kCAAA,EAAmC,CAAA;AAAA,YAG/E,WAAA,GAAc,qBACb5G,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uKAAA;AAAA,gBACV,WAAA,EAAU,QAAA;AAAA,gBACV,aAAA,EAAY,MAAA;AAAA,gBAEX,QAAA,EAAA,WAAA,GAAc,KAAK,KAAA,GAAQ;AAAA;AAAA;AAC9B,WAAA,EAEJ;AAAA;AAAA;AAEJ;AAAA,GACF,EAEJ,CAAA;AAEJ;AAGA,IAAO,4BAAA,GAAQ,oBAAA;;;ACpEf,mBAAA,EAAA;AAMO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAK,EAAuB;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,MAAM,KAAA,GAAQQ,cAAQ,MAAM;AAC1B,IAAA,IAAImH,eAAA,CAAQ,IAAI,CAAA,EAAG;AAAC,MAAA,OAAO,EAAE,wBAAwB,CAAA;AAAA,IAAE;AACvD,IAAA,IAAIC,mBAAA,CAAY,IAAI,CAAA,EAAG;AAAC,MAAA,OAAO,EAAE,4BAA4B,CAAA;AAAA,IAAE;AAC/D,IAAA,OAAO/E,cAAAA,CAAO,MAAM,OAAO,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,IAAA,EAAM,CAAC,CAAC,CAAA;AAEZ,EAAA,uBACEnC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAA2C,cAAY,KAAA,EACpE,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAA2C,CAAA;AAAA,oBAC1DA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oFACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAA2C;AAAA,GAAA,EAC5D,CAAA;AAEJ;;;ACzBO,SAAS,2BAA2B,IAAA,EAAsB;AAI/D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,UAAA,GAAa,EAAA;AAEjB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,EAAU;AAC/B,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAC3C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,UAAA,GAAa,WAAW,CAAC,CAAA;AAAA,MAC3B,CAAA,MAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,IAAK,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,CAAE,IAAA,EAAK,KAAM,EAAA,EAAI;AAC3F,QAAA,WAAA,GAAc,KAAA;AACd,QAAA,UAAA,GAAa,EAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAA,IAAQ,IAAA,GAAO,UAAA;AAAA,EACjB;AAEA,EAAA,OAAO,IAAA;AACT;ACTO,SAAS,qBAAqB,SAAA,EAA6B;AAChE,EAAAS,gBAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAE1C,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IACE,MAAA,YAAkB,gBAAA,IAClB,MAAA,YAAkB,mBAAA,IAClB,OAAO,iBAAA,EACP;AAEA,QAAA,MAAM,eAAe,SAAA,CAAU,IAAA;AAAA,UAAK,CAAA,CAAA,KAClC,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,IAC1C,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM;AAAA,SAC1B;AACA,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM;AAC7C,QAAA,MAAM,aAAa,CAAA,CAAE,GAAA,CAAI,aAAY,KAAM,CAAA,CAAE,IAAI,WAAA,EAAY;AAC7D,QAAA,MAAM,aAAa,CAAA,CAAE,IAAA,GACjB,EAAE,OAAA,IAAW,CAAC,EAAE,OAAA,GAChB,CAAA,CAAE,IAAA,GACA,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,GACf,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,OAAA;AACvB,QAAA,MAAM,eAAe,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,QAAA,GAAW,CAAC,CAAA,CAAE,QAAA;AAC/C,QAAA,MAAM,aAAa,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAEzC,QAAA,OAAO,UAAA,IAAc,cAAc,YAAA,IAAgB,UAAA;AAAA,MACrD,CAAC,CAAA;AAED,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,IAAI,gBAAA,CAAiB,mBAAmB,KAAA,EAAO;AAC7C,UAAA,CAAA,CAAE,cAAA,EAAe;AAAA,QACnB;AACA,QAAA,gBAAA,CAAiB,QAAA,EAAS;AAAA,MAC5B;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB;;;AC5DA,IAAM,cAAA,GAAiB,GAAA;AAqBhB,SAAS,oBAAA,CAAqB;AAAA,EACnC,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAsD;AACpD,EAAA,MAAM,YAAA,GAAeF,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,cAAA,GAAiBA,aAAuB,IAAI,CAAA;AAClD,EAAA,MAAM,uBAAA,GAA0BA,aAA2B,MAAS,CAAA;AACpE,EAAA,MAAM,kBAAA,GAAqBA,aAAO,WAAW,CAAA;AAC7C,EAAA,MAAM,eAAA,GAAkBA,aAAO,IAAI,CAAA;AAEnC,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAID,eAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,CAAC,CAAA;AAIhD,EAAA,MAAM,cAAA,GAAiBH,iBAAAA,CAAY,CAAC,QAAA,GAA2B,QAAA,KAAa;AAC1E,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,SAAS,EAAE,GAAA,EAAK,SAAA,CAAU,YAAA,EAAc,UAAU,CAAA;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,EAAE,QAAA,EAAU,CAAA;AAAA,EACrD,CAAA,EAAG,EAAE,CAAA;AAIL,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAAC,MAAA;AAAA,IAAO;AACtC,IAAA,cAAA,CAAe,gBAAA,GAAmB,SAAS,QAAQ,CAAA;AAAA,EACrD,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAA,EAAkB,cAAc,CAAC,CAAA;AAIlD,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,QAAA,IAAY,CAAC,gBAAA,IAAoB,gBAAA,KAAqB,KAAA,EAAO;AAAC,MAAA;AAAA,IAAO;AACzE,IAAA,IAAI,uBAAA,CAAwB,YAAY,gBAAA,EAAkB;AAAC,MAAA;AAAA,IAAO;AAElE,IAAA,MAAM,mBAAmB,MAAM;AAC7B,MAAA,cAAA,CAAe,MAAM,CAAA;AACrB,MAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,qBAAA,CAAsB,MAAM,qBAAA,CAAsB,gBAAgB,CAAC,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,UAAA,CAAW,gBAAA,EAAkB,EAAE,CAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,UAAA,CAAW,gBAAA,EAAkB,GAAG,CAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,UAAA,CAAW,gBAAA,EAAkB,GAAG,CAAA;AAE3C,IAAA,uBAAA,CAAwB,OAAA,GAAU,gBAAA;AAClC,IAAA,OAAO,MAAM;AAAE,MAAA,YAAA,CAAa,EAAE,CAAA;AAAG,MAAA,YAAA,CAAa,EAAE,CAAA;AAAG,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IAAG,CAAA;AAAA,EACvE,GAAG,CAAC,gBAAA,EAAkB,QAAA,EAAU,WAAA,EAAa,cAAc,CAAC,CAAA;AAI5D,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAAC,MAAA;AAAA,IAAO;AAExB,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,EAAa,GAAI,SAAA;AAClD,MAAA,MAAM,UAAA,GAAa,YAAA,GAAe,SAAA,GAAY,YAAA,GAAe,cAAA;AAC7D,MAAA,eAAA,CAAgB,OAAA,GAAU,UAAA;AAC1B,MAAA,mBAAA,CAAoB,CAAC,UAAU,CAAA;AAC/B,MAAA,IAAI,UAAA,EAAY;AAAC,QAAA,cAAA,CAAe,CAAC,CAAA;AAAA,MAAE;AAAA,IACrC,CAAA;AAEA,IAAA,SAAA,CAAU,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AAC7C,IAAA,OAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC/D,CAAA,EAAG,EAAE,CAAA;AAIL,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,OAAO,kBAAA,CAAmB,OAAA;AAChC,IAAA,kBAAA,CAAmB,OAAA,GAAU,WAAA;AAC7B,IAAA,IAAI,WAAA,GAAc,QAAQ,gBAAA,EAAkB;AAC1C,MAAA,cAAA,CAAe,CAAA,CAAA,KAAK,CAAA,IAAK,WAAA,GAAc,IAAA,CAAK,CAAA;AAAA,IAC9C;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAIlC,EAAA,MAAM,SAAA,GAAYD,aAAAA,CAA0B,MAAM,CAAC;AAAA,IACjD,GAAA,EAAK,KAAA;AAAA,IACL,UAAU,MAAM;AAAE,MAAA,cAAA,CAAe,QAAQ,CAAA;AAAG,MAAA,cAAA,CAAe,CAAC,CAAA;AAAA,IAAG,CAAA;AAAA,IAC/D,WAAA,EAAa;AAAA,GACd,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AACpB,EAAA,oBAAA,CAAqB,SAAS,CAAA;AAI9B,EAAA,MAAM,oBAAA,GAAuBL,kBAAY,MAAM;AAC7C,IAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,IAAA,cAAA,CAAe,CAAC,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,OAAO,EAAE,YAAA,EAAc,cAAA,EAAgB,gBAAA,EAAkB,aAAa,oBAAA,EAAqB;AAC7F;;;AC/GA,mBAAA,EAAA;AAIA,IAAM,cAAA,GAAiB,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,qBAAA,EAAA,EAAA,wBAAA,CAAA,CAAA;AACvB,IAAM8G,iBAAAA,GAAmB5E,UAAAA;AAAA,EAAK,MAC5B,eAAe,IAAA,CAAK,CAAC,OAAO,EAAE,OAAA,EAAS,CAAA,CAAE,gBAAA,EAAiB,CAAE;AAC9D,CAAA;AAMA,SAAS,mBAAA,GAAsB;AAC7B,EAAA,uBACE3B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,eAAY,MAAA,EACrC,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,SAAI,SAAA,EAAU,kBAAA,EACb,0BAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAgE,CAAA;AAAA,sBAC/EA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EAA+D;AAAA,KAAA,EAChF,CAAA,EACF,CAAA;AAAA,oBACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EAA2E,CAAA;AAAA,sBAC1FU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAgE,CAAA;AAAA,wBAC/EA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EAA+D,CAAA;AAAA,wBAC9EA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EAA+D;AAAA,OAAA,EAChF;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAgE,GACjF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,OAAA,EAAS,iBAAA,EAAkB,EAAmD;AACvG,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mHAAA,EAAoH,QAAA,EAAA,IAAA,EAEnI,CAAA;AAAA,oBACAU,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6JAA4J,KAAA,EAAO,EAAE,QAAA,EAAU,+CAAA,EAAgD,EAC5O,QAAA,EAAA;AAAA,sBAAAV,cAAAA;AAAA,QAAC+B,cAAAA;AAAA,QAAA;AAAA,UACC,0BACE/B,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEACZ,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,UAGF,0BAAAA,cAAAA,CAACiH,iBAAAA,EAAA,EAAiB,OAAA,EAAS,iBAAA,EAAmB,cAAY,IAAA,EAAC;AAAA;AAAA,OAC7D;AAAA,sBACAjH,eAAC,uBAAA,EAAA,EAAgB;AAAA,KAAA,EACnB;AAAA,GAAA,EACF,CAAA;AAEJ;AAaO,SAAS,YAAY,EAAE,cAAA,EAAgB,mBAAA,EAAqB,aAAA,EAAe,UAAS,EAAqB;AAC9G,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,OAAA,EAAS,gBAAA,EAAkB,QAAA,KAAa,cAAA,EAAe;AAC/D,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IAAO,gBAAA;AAAA,IAAkB,WAAA;AAAA,IACzB,eAAA;AAAA,IAAiB,WAAA;AAAA,IACjB,iBAAA;AAAA,IAAmB;AAAA,MACjB,gBAAA,EAAiB;AAErB,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAgB,gBAAA,EAAkB,aAAa,oBAAA,EAAqB,GACxF,oBAAA,CAAqB,EAAE,kBAAkB,QAAA,EAAU,WAAA,EAAa,KAAA,CAAM,MAAA,EAAQ,kBAAkB,CAAA;AAElG,EAAA,MAAM,mBAAA,GAAsBQ,aAAAA;AAAA,IAC1B,MAAO,gBAAA,GAAmB,0BAAA,CAA2B,gBAAgB,CAAA,GAAI,EAAA;AAAA,IACzE,CAAC,gBAAgB;AAAA,GACnB;AACA,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAEhD,EAAA,MAAM,gBAAgB,iBAAA,IAAqB,mBAAA;AAE3C,EAAA,uBACEE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,SAAA,EAAU,sDAChC,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,IAAY,KAAA,CAAM,MAAA,KAAW,CAAA,oBAAKV,eAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,MAEvD,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AAC1B,QAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACxC,QAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,CAAA,GAAI,IAAI,IAAA,CAAK,MAAM,KAAA,GAAQ,CAAC,CAAA,CAAE,SAAS,CAAA,GAAI,IAAA;AACpE,QAAA,MAAM,oBAAoB,CAAC,CAAC,YAAY,CAAC6H,iBAAA,CAAU,UAAU,QAAQ,CAAA;AACrE,QAAA,MAAM,MAAA,GAAS,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,CAAA;AACxC,QAAA,MAAM,aAAA,GAAgB;AAAA,UACpB,SAAA,EAAW,WAAW,KAAA,GAAQ,MAAA;AAAA,UAC9B,cAAA,EAAgB;AAAA,SAClB;AAEA,QAAA,uBACEnH,eAAAA,CAACG,cAAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,iBAAA,oBAAqBb,cAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,0BACrDA,cAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA;AAAA,cACA,UAAA,EAAY,MAAA;AAAA,cACZ,cAAA;AAAA,cACA,mBAAA;AAAA,cACA,aAAA;AAAA,cACA,kBAAA,EAAoB,QAAA,GAAW,EAAE,eAAA,EAAiB,OAAM,GAAI;AAAA;AAAA;AAC9D,SAAA,EAAA,EATa,KAAK,EAUpB,CAAA;AAAA,MAEJ,CAAC,CAAA;AAAA,MAEA,WAAA,IAAe,oCACdA,cAAAA,CAAC,mBAAgB,OAAA,EAAS,gBAAA,EAAkB,mBAAmB,mBAAA,EAAqB,CAAA;AAAA,sBAGtFA,cAAAA,CAACqH,4BAAAA,EAAA,EACE,2CACC3G,eAAAA;AAAA,QAAC8E,mBAAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,UAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,UAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,UACnB,YAAY,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,EAAA,EAAI,WAAW,GAAA,EAAI;AAAA,UAEzD,QAAA,EAAA;AAAA,YAAA,iBAAA,oBACCxF,cAAAA,CAAC,aAAA,EAAA,EAAc,eAAA,EAAkC,WAAA,EAA0B,CAAA;AAAA,YAE5E,mBAAA,oBAAuBA,cAAAA,CAAC,uBAAA,EAAA,EAAgB,OAAO,aAAA,EAAe;AAAA;AAAA,SAAA;AAAA,QAT3D;AAAA,OAUN,EAEJ,CAAA;AAAA,sBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAA,EAAgB;AAAA,KAAA,EAC5B,CAAA,EACF,CAAA;AAAA,oBAEAA,cAAAA;AAAA,MAAC,4BAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,oBAAA;AAAA,QACT,WAAA;AAAA,QACA,KAAA,EAAO,WAAA,IAAe,gBAAA,GAAmB,CAAA,CAAE,mCAAmC,CAAA,GAAI;AAAA;AAAA;AACpF,GAAA,EACF,CAAA;AAEJ;;;ACtKA,mBAAA,EAAA;AAQO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,QAAA,EAAU,UAAS,EAA0B;AACrF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIM,eAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,EAAE,CAAA;AAE7C,EAAA,MAAM,SAAA,GAAYH,iBAAAA,CAAY,CAAC,KAAA,KAAkB;AAC/C,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,QAAA,GAAWA,kBAAY,MAAM;AACjC,IAAA,IAAI,iBAAiB,IAAA,EAAM;AAAC,MAAA;AAAA,IAAO;AACnC,IAAA,MAAM,OAAA,GAAU,UAAU,IAAA,EAAK;AAC/B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,CAAS,cAAc,OAAO,CAAA;AAAA,IAChC;AACA,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,YAAA,CAAa,EAAE,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,YAAA,EAAc,SAAA,EAAW,QAAQ,CAAC,CAAA;AAEtC,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACnC,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,YAAA,CAAa,EAAE,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAErC,EAAA,uBACEO,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,CAAA,CAAE,+BAA+B,EAAE,KAAA,EAAO,MAAM,MAAA,EAAQ,GAAE,CAAA,EAC3F,CAAA;AAAA,oBACAA,cAAAA,CAACqH,4BAAAA,EAAA,EAAgB,OAAA,EAAS,KAAA,EACvB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChBrH,cAAAA;AAAA,MAACwF,mBAAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,QACjC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,QACtC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,QAC9B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,QAC7B,SAAA,EAAU,iBAAA;AAAA,QAEV,QAAA,kBAAA9E,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qHAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+KAAA,EACb,kBAAQ,CAAA,EACX,CAAA;AAAA,UACC,iBAAiB,KAAA,mBAChBU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sCAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,SAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC5C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AAAE,oBAAA,CAAA,CAAE,cAAA,EAAe;AAAG,oBAAA,QAAA,EAAS;AAAA,kBAAG;AACxE,kBAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAC,oBAAA,UAAA,EAAW;AAAA,kBAAE;AAAA,gBACxC,CAAA;AAAA,gBACA,SAAA,EAAU,8LAAA;AAAA,gBACV,IAAA,EAAM,CAAA;AAAA,gBACN,SAAA,EAAS;AAAA;AAAA,aACX;AAAA,4BACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,QAAA;AAAA,kBACT,SAAA,EAAU,uOAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAV,eAACuB,WAAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,oBAC9B,EAAE,qBAAqB;AAAA;AAAA;AAAA,eAC1B;AAAA,8BACAb,eAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,UAAA;AAAA,kBACT,SAAA,EAAU,mLAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAV,cAAAA,CAAC2D,2BAAAA,EAAA,EAAsB,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,oBAChC,EAAE,uBAAuB;AAAA;AAAA;AAAA;AAC5B,aAAA,EACF;AAAA,WAAA,EACF,CAAA,mBAEAjD,eAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0DAAA,EACV,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,OAAA;AAAA,YACL,IAAA,CAAK,YAAY,MAAA,GAAS,CAAA,oBACzBA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yCAAA,EAA0C,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cACtD,KAAK,WAAA,CAAY,MAAA;AAAA,cAAO,GAAA;AAAA,cAAE,CAAA,CAAE,0BAA0B,CAAA,CAAE,WAAA;AAAY,aAAA,EACxE;AAAA,WAAA,EAEJ,CAAA;AAAA,UAED,iBAAiB,KAAA,oBAChBA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,gBAC9B,SAAA,EAAU,qKAAA;AAAA,gBACV,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,gBAC1C,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,gBAErC,QAAA,kBAAAA,cAAAA,CAACiE,kBAAAA,EAAA,EAAa,MAAM,EAAA,EAAI;AAAA;AAAA,aAC1B;AAAA,4BACAjE,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,QAAA,CAAS,KAAK,CAAA;AAAA,gBAC7B,SAAA,EAAU,mKAAA;AAAA,gBACV,YAAA,EAAY,EAAE,8BAA8B,CAAA;AAAA,gBAC5C,KAAA,EAAO,EAAE,8BAA8B,CAAA;AAAA,gBAEvC,QAAA,kBAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,MAAM,EAAA,EAAI;AAAA;AAAA;AACf,WAAA,EACF;AAAA,SAAA,EAEJ;AAAA,OAAA;AAAA,MA3EK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,KA6EnD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC/GA,mBAAA,EAAA;AA6CA,SAAS,eAAA,CAAgB,EAAE,iBAAA,EAAmB,WAAA,EAAY,EAAyB;AACjF,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA0B,IAAI,KAAK,YAAA,EAAa,CAAE,OAAO,KAAK,CAAA;AACpF,EAAA,MAAM,kBAAA,GAAqB,mBAAmB,kBAAA,IAAsB,CAAA;AACpE,EAAA,MAAM,kBAAA,GAAqB,mBAAmB,WAAA,IAAe,CAAA;AAC7D,EAAA,MAAM,mBAAA,GAAsB,mBAAmB,YAAA,IAAgB,CAAA;AAC/D,EAAA,MAAM,uBAAA,GAA0B,mBAAmB,gBAAA,IAAoB,CAAA;AACvE,EAAA,MAAM,QAAA,GAAA,CAAY,iBAAA,EAAmB,cAAA,IAAkB,CAAA,IAAK,CAAA;AAC5D,EAAA,MAAM,eAAA,GAAkB,aAAa,eAAA,IAAmB,CAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,aAAa,cAAA,IAAkB,CAAA;AACtD,EAAA,MAAM,kBAAA,GAAqB,aAAa,kBAAA,IAAsB,CAAA;AAC9D,EAAA,MAAM,mBAAA,GAAsB,4BAAA,CAA6B,kBAAA,EAAoB,kBAAkB,CAAA;AAC/F,EAAA,MAAM,iBAAiB,mBAAA,KAAwB,IAAA,GAAO,mBAAA,CAAoB,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA;AACvF,EAAA,MAAM,oBAAA,GAAuB,UAAA,CAAW,cAAA,IAAkB,GAAG,CAAA;AAC7D,EAAA,MAAM,kBACJ,oBAAA,GAAuB,EAAA,GACnB,SAAA,GACA,oBAAA,GAAuB,KACvB,SAAA,GACA,SAAA;AAEN,EAAA,uBACE5C,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wJAAA,EACd,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,eAAY,MAAA,EACtD,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sFAAA,EAAuF,CAAA;AAAA,wBACvGA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAAA,EAA6D;AAAA,OAAA,EAC/E,CAAA;AAAA,sBACAA,cAAAA,CAAC8G,SAAAA,EAAA,EAAI,MAAM,EAAA,EAAI,CAAA;AAAA,MAAE;AAAA,KAAA,EAEnB,CAAA;AAAA,oBAGApG,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oHAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,mBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC2G,eAAA,EAAQ,IAAA,EAAM,IAAI,MAAA,EAAO,MAAA,EAAO,WAAU,kCAAA,EAAmC,CAAA;AAAA,0BAC9E3G,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EAA0D,QAAA,EAAA,YAAA,CAAa,mBAAmB,CAAA,EAAE,CAAA;AAAA,UAAO;AAAA,SAAA,EAErH,CAAA;AAAA,wBACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC4G,iBAAA,EAAU,IAAA,EAAM,IAAI,MAAA,EAAO,MAAA,EAAO,WAAU,sCAAA,EAAuC,CAAA;AAAA,0BACpF5G,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EAA0D,QAAA,EAAA,YAAA,CAAa,uBAAuB,CAAA,EAAE,CAAA;AAAA,UAAO;AAAA,SAAA,EAEzH,CAAA;AAAA,wBACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC0G,aAAA,EAAM,IAAA,EAAM,IAAI,MAAA,EAAO,MAAA,EAAO,WAAU,sCAAA,EAAuC,CAAA;AAAA,0BAChF1G,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EAA0D,QAAA,EAAA,YAAA,CAAa,kBAAkB,CAAA,EAAE,CAAA;AAAA,UAAO;AAAA,SAAA,EAEpH;AAAA,OAAA,EACF,oBAEAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mEAAkE,QAAA,EAAA,2BAAA,EAE/E,CAAA;AAAA,MAGD,WAAA,oBACCU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uGAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,gBAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,YAAA;AAAA,UACO,GAAA;AAAA,0BACXV,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EAA0D,QAAA,EAAA,YAAA,CAAa,eAAe,CAAA,EAAE;AAAA,SAAA,EAC1G,CAAA;AAAA,wBACAU,gBAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,UACM,GAAA;AAAA,0BACVV,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EAA0D,QAAA,EAAA,YAAA,CAAa,cAAc,CAAA,EAAE;AAAA,SAAA,EACzG,CAAA;AAAA,wBACAU,gBAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,UACM,GAAA;AAAA,0BACVV,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EAA0D,QAAA,EAAA,YAAA,CAAa,kBAAkB,CAAA,EAAE;AAAA,SAAA,EAC7G;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,qBAAqB,CAAA,oBACpBU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EAA+C,QAAA,EAAA,eAAA,EAE/D,CAAA;AAAA,0BACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qEAAA,EACb,QAAA,EAAA;AAAA,cAAA,YAAA,CAAa,kBAAkB,CAAA;AAAA,cAAE,KAAA;AAAA,cAAI,aAAa,kBAAkB;AAAA,aAAA,EACvE,CAAA;AAAA,YACC,cAAA,oBACCA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW;AAAA,cACf,mEAAA;AAAA,cACA,oBAAA,GAAuB,EAAA,GACnB,8DAAA,GACA,oBAAA,GAAuB,KACvB,sEAAA,GACA;AAAA,aACN,CAAE,IAAA,CAAK,GAAG,CAAA,EACP,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAe;AAAA,aAAA,EAClB;AAAA,WAAA,EAEJ;AAAA,SAAA,EACF,CAAA;AAAA,wBACAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,0DAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,cAAA,GAAiB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,WAAW,cAAc,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,IAAA;AAAA,cAC1E,eAAA,EAAiB;AAAA;AACnB;AAAA,SACF,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAMA,IAAM,iBAAA,GAA4C;AAAA,EAChD,GAAA,EAAK,iCAAA;AAAA,EACL,MAAA,EAAQ,oCAAA;AAAA,EACR,IAAA,EAAM,kCAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AASA,SAAS,wBAAwB,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,UAAS,EAAiC;AACrG,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,WAAW,KAAA,IAAS,OAAA,CAAQ,CAAC,CAAA,IAAK,QAAQ,CAAC,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,EAAE,8BAA8B,CAAA;AAC9C,EAAA,MAAM,aAAA,GAAgB,CAAA,CAAE,iBAAA,CAAkB,QAAQ,KAAK,QAAQ,CAAA;AAE/D,EAAA,uBACEU,eAAAA,CAAC6D,YAAAA,EAAA,EAAK,EAAA,EAAG,KAAA,EAAM,WAAU,oCAAA,EACvB,QAAA,EAAA;AAAA,oBAAA7D,eAAAA;AAAA,MAAC8D,kBAAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,SAAA,EAAW;AAAA,UACT,kHAAA;AAAA,UACA,wGAAA;AAAA,UACA,oHAAA;AAAA,UACA,2DAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG,CAAA;AAAA,QACV,YAAA,EAAY,KAAA;AAAA,QACZ,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,aAAa,CAAA,CAAA;AAAA,QAEjC,QAAA,EAAA;AAAA,0BAAAxE,cAAAA,CAACuH,aAAA,EAAM,IAAA,EAAM,IAAI,MAAA,EAAO,SAAA,EAAU,WAAU,wCAAA,EAAyC,CAAA;AAAA,0BACrFvH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAyB,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,0BACvDA,cAAAA,CAAC8H,iBAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI,WAAU,kCAAA,EAAmC;AAAA;AAAA;AAAA,KACtE;AAAA,oBAEA9H,cAAAA;AAAA,MAAC0E,iBAAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAO,SAAA;AAAA,QACP,SAAA,EAAU,qLAAA;AAAA,QAET,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACpB,UAAA,MAAM,WAAA,GAAc,CAAA,CAAE,iBAAA,CAAkB,GAAG,KAAK,GAAG,CAAA;AACnD,UAAA,MAAM,aAAa,GAAA,KAAQ,QAAA;AAE3B,UAAA,uBACE1E,eAAC2E,gBAAAA,EAAA,EACE,WAAC,EAAE,KAAA,uBACFjE,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AAAA,cAC3B,SAAA,EAAW;AAAA,gBACT,2GAAA;AAAA,gBACA,QACI,6EAAA,GACA;AAAA,eACN,CAAE,KAAK,GAAG,CAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,gBAC9C,UAAA,oBACCA,cAAAA,CAACuB,WAAAA,EAAA,EAAM,MAAM,EAAA,EAAI,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC;AAAA;AAAA;AAAA,eAd3E,GAkBf,CAAA;AAAA,QAEJ,CAAC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,qBAAA,GAAwB,KAAK,IAAA,GAAO,IAAA;AAC1C,IAAM,UAAA,GAAa,GAAA;AAEZ,IAAM,YAAA,GAAewG,gBAAA;AAAA,EAC1B,CACE;AAAA,IACE,OAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA,GAAc,KAAA;AAAA,IACd,QAAA,GAAW,KAAA;AAAA,IACX,QAAA,GAAW,KAAA;AAAA,IACX,YAAA,GAAe,IAAA;AAAA,IACf,SAAA,GAAY,KAAA;AAAA,IACZ,iBAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,eAAe,EAAC;AAAA,IAChB,mBAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA,EAAa,mBAAA;AAAA,IACb,QAAA,GAAW,iBAAA;AAAA,IACX,WAAA,GAAc,qBAAA;AAAA,IACd,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,sBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIzH,cAAAA,CAAuB,EAAE,CAAA;AAC/D,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;AAChD,IAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtE,IAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC9D,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC1D,IAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAG9E,IAAA,MAAM,WAAA,GAAc,mBAAA,IAAuB,CAAA,CAAE,0BAA0B,CAAA;AAEvE,IAAA,MAAM,WAAA,GAAcC,aAA4B,IAAI,CAAA;AACpD,IAAA,MAAM,YAAA,GAAeA,aAAyB,IAAI,CAAA;AAClD,IAAA,MAAM,YAAA,GAAeA,aAAuB,IAAI,CAAA;AAChD,IAAA,MAAM,OAAA,GAAUA,aAAwB,IAAI,CAAA;AAC5C,IAAA,MAAM,eAAA,GAAkBA,YAAAA,CAAoC,EAAE,CAAA;AAC9D,IAAA,MAAM,eAAA,GAAkBA,aAAO,KAAK,CAAA;AACpC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,SAAA,EAAU,CAAE,WAAW,GAAG,CAAA;AACtD,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,SAAA,EAAU,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,aAAY,IAAK,EAAA;AAEpF,IAAA,MAAM,aAAA,GAAgBC,aAAAA;AAAA,MACpB,MAAM;AAAA,QACJ,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,CAAA,CAAE,+BAA+B,CAAA,EAAE;AAAA,QAClE,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,CAAA,CAAE,+BAA+B,CAAA,EAAE;AAAA,QAClE,EAAE,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,CAAA,CAAE,iCAAiC,CAAA;AAAE,OACxE;AAAA,MACA,CAAC,CAAC;AAAA,KACJ;AACA,IAAA,MAAM,gBAAA,GAAmBA,aAAAA;AAAA,MACvB,MACE,aAAA,CAAc,MAAA;AAAA,QAAO,CAAC,QACpB,GAAA,CAAI,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,WAAW,YAAY;AAAA,OAC3C;AAAA,MACF,CAAC,cAAc,aAAa;AAAA,KAC9B;AACA,IAAA,MAAM,uBAAuB,WAAA,IAAe,CAAC,oBAAA,IAAwB,CAAC,WAAW,CAAC,QAAA;AAElF,IAAAC,gBAAU,MAAM;AACd,MAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,MAAA,IAAI,CAAC,QAAA,EAAU;AAAC,QAAA;AAAA,MAAO;AAEvB,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,eAAA,CAAgB,OAAA,IAAW,OAAA,IAAW,QAAA,IAAY,QAAA,EAAU;AAAC,QAAA;AAAA,MAAO;AAExE,MAAA,MAAM,KAAA,GAAQ,sBAAsB,MAAM;AACxC,QAAA,WAAA,CAAY,SAAS,KAAA,EAAM;AAC3B,QAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,MAC5B,CAAC,CAAA;AAED,MAAA,OAAO,MAAM,qBAAqB,KAAK,CAAA;AAAA,IACzC,CAAA,EAAG,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAC,CAAA;AAEhC,IAAAA,gBAAU,MAAM;AACd,MAAA,IAAI,CAAC,KAAA,EAAO;AAAC,QAAA;AAAA,MAAO;AACpB,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,IAAAA,gBAAU,MAAM;AACd,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAEzB,IAAAA,gBAAU,MAAM;AACd,MAAA,IAAI,CAAC,oBAAA,EAAsB;AAAC,QAAA;AAAA,MAAO;AAEnC,MAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,QAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAAC,UAAA;AAAA,QAAO;AACnC,QAAA,IAAI,KAAA,CAAM,kBAAkB,IAAA,IAAQ,CAAC,aAAa,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG;AAChF,UAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA;AAEA,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,IAC3E,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAEzB,IAAAA,gBAAU,MAAM;AACd,MAAA,qBAAA,CAAsB,CAAC,CAAA;AAAA,IACzB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,IAAAA,gBAAU,MAAM;AACd,MAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,QAAA,qBAAA,CAAsB,CAAC,CAAA;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,qBAAA,CAAsB,CAAC,IAAA,KAAS;AAC9B,QAAA,IAAI,OAAO,CAAA,EAAG;AAAC,UAAA,OAAO,CAAA;AAAA,QAAE;AACxB,QAAA,IAAI,IAAA,IAAQ,iBAAiB,MAAA,EAAQ;AAAC,UAAA,OAAO,iBAAiB,MAAA,GAAS,CAAA;AAAA,QAAE;AACzE,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,CAAC,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAE5B,IAAAA,gBAAU,MAAM;AACd,MAAA,IAAI,CAAC,oBAAA,IAAwB,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG;AAAC,QAAA;AAAA,MAAO;AACpE,MAAA,eAAA,CAAgB,OAAA,CAAQ,kBAAkB,CAAA,EAAG,cAAA,CAAe;AAAA,QAC1D,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,GAAG,CAAC,kBAAA,EAAoB,gBAAA,CAAiB,MAAA,EAAQ,oBAAoB,CAAC,CAAA;AAEtE,IAAA,MAAM,gBAAA,GAAmB,OAAO,KAAA,KAAsD;AACpF,MAAA,IAAI,CAAC,KAAA,EAAO;AAAC,QAAA,OAAO,KAAA;AAAA,MAAM;AAC1B,MAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,KAAK,IAAI,KAAA,GAAQ,KAAA,CAAM,KAAK,KAAK,CAAA;AACrE,MAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAAC,QAAA,OAAO,KAAA;AAAA,MAAM;AAE9C,MAAA,IAAI;AACF,QAAA,iBAAA,CAAkB,WAAA,CAAY,MAAA,EAAQ,aAAA,CAAc,MAAA,EAAQ,QAAQ,CAAA;AAIpE,QAAA,MAAM,YAAoB,EAAC;AAC3B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA,EAAA,EAAK;AAC7C,UAAA,MAAM,IAAA,GAAO,cAAc,CAAC,CAAA;AAC5B,UAAA,sBAAA,CAAuB,MAAM,WAAW,CAAA;AACxC,UAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,QACrB;AAGA,QAAA,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAGpC,QAAA,MAAM,gBAAgB,MAAM,OAAA,CAAQ,IAAI,SAAA,CAAU,GAAA,CAAI,eAAe,CAAC,CAAA;AAEtE,QAAA,MAAM,cAAA,GAA+B,SAAA,CAAU,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AAC9D,UAAA,MAAM,UAAA,GAAyB;AAAA,YAC7B,SAAA,EAAW,OAAO,UAAA,EAAW;AAAA,YAC7B,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,WAAW,IAAA,CAAK,IAAA;AAAA,YAChB,UAAA,EAAY,cAAc,CAAC;AAAA,WAC7B;AACA,UAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9B,YAAA,UAAA,CAAW,UAAU,aAAA,CAAc,aAAA,CAAc,CAAC,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,UAChE;AACA,UAAA,OAAO,UAAA;AAAA,QACT,CAAC,CAAA;AAED,QAAA,cAAA,CAAe,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,cAAc,CAAC,CAAA;AACrD,QAAA,mBAAA,CAAoB,CAAC,CAAA;AACrB,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,mBAAA,CAAoB,CAAC,CAAA;AACrB,QAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,+BAA+B,CAAA;AAC7E,QAAA,OAAO,KAAA;AAAA,MACT;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,IAAAuH,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,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;AAGA,IAAA,MAAM,gBAAA,GAAmBxH,aAAAA;AAAA,MACvB,MAAM,WAAA,CAAY,MAAA;AAAA,QAAO,CAAC,CAAA,KACxB,CAAA,CAAE,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,IAAK,CAAC,EAAE,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,OAAA;AAAA,OAC1D;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,MAAM,oBAAA,GAAuBL,iBAAAA,CAAY,CAAC,KAAA,KAAkB;AAC1D,MAAA,MAAM,UAAA,GAAa,YAAY,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,WAAW,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AAAC,QAAA;AAAA,MAAO;AACtE,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,UAAA,CAAW,QAAA,IAAY,CAAA,CAAE,OAAA,KAAY,UAAA,CAAW,OAAO,CAAA;AACvH,MAAA,IAAI,UAAU,CAAA,EAAG;AAAC,QAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,MAAE;AAAA,IACjD,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAElC,IAAA,MAAM,mBAAA,GAAsBA,iBAAAA,CAAY,CAAC,SAAA,KAA+B;AACtE,MAAA,oBAAA,CAAqB,CAAC,IAAA,KAAS;AAC7B,QAAA,IAAI,SAAS,IAAA,EAAM;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AAChC,QAAA,MAAM,MAAM,gBAAA,CAAiB,MAAA;AAC7B,QAAA,IAAI,OAAO,CAAA,EAAG;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AAC3B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,CAAA,EAAG,IAAA,IAAQ,SAAA,KAAc,MAAA,GAAS,EAAA,GAAK,EAAE,CAAC,CAAA;AACtF,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,CAAC,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAE5B,IAAAM,gBAAU,MAAM;AACd,MAAA,oBAAA,CAAqB,CAAC,IAAA,KAAS;AAC7B,QAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AAChD,QAAA,IAAI,QAAQ,IAAA,KAAS,IAAA,GAAO,CAAA,IAAK,IAAA,IAAQ,iBAAiB,MAAA,CAAA,EAAS;AACjE,UAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,EAAM,gBAAA,CAAiB,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,QAChE;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,CAAC,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAG5B,IAAA,MAAM,WAAA,GAAcN,iBAAAA,CAAY,CAAC,CAAA,KAAiD;AAChF,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,cAAc,KAAK,CAAA;AAC9C,MAAA,MAAM,UAAA,GAAa,KAAA,CAChB,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,CACvE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,SAAA,EAAW,CAAA,CAC9B,MAAA,CAAO,CAAC,IAAA,KAAuB,IAAA,KAAS,IAAI,CAAA;AAE/C,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,gBAAA,CAAiB,UAAU,CAAA;AAAA,MAC7B;AAAA,IACF,GAAG,CAAC,WAAA,CAAY,MAAA,EAAQ,QAAA,EAAU,WAAW,CAAC,CAAA;AAE9C,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,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,YAAA,CAAa,KAAA,IAAS,EAAE,CAAA,CACpD,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,MAAM,CAAA,CACrC,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,SAAA,EAAW,CAAA,CAC9B,MAAA,CAAO,CAAC,IAAA,KAAuB,IAAA,KAAS,IAAI,CAAA;AAC/C,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,YAAA,CAAa,KAAA,IAAS,EAAE,CAAA;AAC7F,MAAA,MAAM,EAAA,GAAK,MAAM,gBAAA,CAAiB,YAAY,CAAA;AAC9C,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA,UAAA,CAAW,MAAM,cAAA,CAAe,KAAK,CAAA,EAAG,IAAI,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,sBAAA,GAAyB,CAAC,OAAA,KAAoB;AAClD,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,MAAA,qBAAA,CAAsB,CAAC,CAAA;AACvB,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,OAAA,CAAQ,SAAS,aAAA,EAAc;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAgD;AACrE,MAAA,IAAI,WAAA,IAAe,CAAA,CAAE,WAAA,CAAY,WAAA,EAAa;AAC5C,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,YAAA,eAAA,CAAgB,gBAAA,CAAiB,kBAAkB,CAAA,CAAE,IAAI,CAAA;AACzD,YAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,UAC9B;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,YAAA,qBAAA,CAAsB,CAAC,IAAA,KAAA,CAAU,IAAA,GAAO,CAAA,IAAK,iBAAiB,MAAM,CAAA;AAAA,UACtE;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAA,CAAE,QAAQ,SAAA,EAAW;AACvB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,YAAA,qBAAA;AAAA,cAAsB,CAAC,IAAA,KACrB,IAAA,KAAS,IAAI,gBAAA,CAAiB,MAAA,GAAS,IAAI,IAAA,GAAO;AAAA,aACpD;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,YAAA,sBAAA,CAAuB,gBAAA,CAAiB,kBAAkB,CAAA,CAAE,IAAI,CAAA;AAChE,YAAA;AAAA,UACF;AACA,UAAA,gBAAA,CAAiB,CAA+B,CAAA;AAChD,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,OAAA,CAAQ,IAAA,EAAK,IAAK,WAAA,CAAY,SAAS,CAAA,EAAG;AAC5C,UAAA,gBAAA,CAAiB,CAA+B,CAAA;AAAA,QAClD;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,aAAA,CAAc,KAAK,CAAA;AAAA,QACrB,WAAW,WAAA,EAAa;AACtB,UAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,WAAA,CAAY,SAAS,IAAA,EAAK;AAAA,QAC5B;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,WAAA,EAAa;AAAC,QAAA;AAAA,MAAO;AACzB,MAAA,IAAI,YAAa,CAAC,OAAA,CAAQ,MAAK,IAAK,WAAA,CAAY,WAAW,CAAA,EAAI;AAC7D,QAAA;AAAA,MACF;AAEA,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,MAAA,QAAA,CAAS,GAAG,WAAW,CAAA;AACvB,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,YAAY,CAAC,QAAA,KAAa,QAAQ,IAAA,EAAK,IAAK,YAAY,MAAA,GAAS,CAAA,CAAA;AACvE,IAAA,MAAM,eAAe,KAAA,IAAS,YAAA;AAC9B,IAAA,MAAM,gBAAA,GAAmB,YAAA,GAAe,CAAA,CAAE,YAAY,CAAA,GAAI,EAAA;AAC1D,IAAA,MAAM,0BAA0B,sBAAA,IAA0B,sBAAA,CAAuB,MAAA,GAAS,CAAA,GACtF,uBAAuB,QAAA,CAAS,eAAA,IAAmB,EAAE,CAAA,GACnD,kBACA,sBAAA,CAAuB,CAAC,CAAA,IAAK,sBAAA,CAAuB,CAAC,CAAA,GACvD,MAAA;AAEJ,IAAAM,gBAAU,MAAM;AACd,MAAA,IAAI,CAAC,uBAAA,IAA2B,CAAC,sBAAA,EAAwB,MAAA,EAAQ;AAAC,QAAA;AAAA,MAAO;AACzE,MAAA,IAAI,CAAC,uBAAA,IAA2B,uBAAA,KAA4B,eAAA,EAAiB;AAC3E,QAAA;AAAA,MACF;AACA,MAAA,uBAAA,CAAwB,uBAAuB,CAAA;AAAA,IACjD,GAAG,CAAC,eAAA,EAAiB,uBAAA,EAAyB,sBAAA,EAAwB,uBAAuB,CAAC,CAAA;AAE9F,IAAA,MAAM,yBAAA,GAA4B,yBAAA;AAElC,IAAA,uBACET,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,WAAW,kBAAA,IAAsB,yBAAA;AAAA,QAEjC,QAAA,kBAAAU,gBAAC,MAAA,EAAA,EAAK,GAAA,EAAK,SAAS,QAAA,EAAU,gBAAA,EAAkB,SAAA,EAAW,aAAA,IAAiB,SAAA,EAEzE,QAAA,EAAA;AAAA,UAAA,YAAA,oBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qJAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0GAAA,EACb,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC,MAAA,EAAO,QAAO,CAAA,EACxE,CAAA;AAAA,4BACAtD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAiE,QAAA,EAAA,gBAAA,EAAiB,CAAA;AAAA,4BAClGA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAS,MAAM;AACb,kBAAA,QAAA,CAAS,IAAI,CAAA;AACb,kBAAA,mBAAA,IAAsB;AAAA,gBACxB,CAAA;AAAA,gBACA,SAAA,EAAU,qLAAA;AAAA,gBACV,YAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,gBAEzC,QAAA,kBAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,MAAM,EAAA,EAAI;AAAA;AAAA;AACf,WAAA,EACF,CAAA;AAAA,UAID,YAAA,CAAa,MAAA,GAAS,CAAA,IAAK,iBAAA,IAAqB,qCAC/CtD,cAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,YAAA;AAAA,cACP,QAAA,EAAU,iBAAA;AAAA,cACV,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,UAGD,6BACCA,cAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,iBAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,UAAA,CAIA,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,gBAAA,GAAmB,CAAA,qBAC7CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,sBAAA;AAAA,YAAA;AAAA,cACC,WAAA;AAAA,cACA,QAAA,EAAU,sBAAA;AAAA,cACV,MAAA,EAAQ,oBAAA;AAAA,cACR,YAAA,EAAc;AAAA;AAAA,WAChB,EACF,CAAA;AAAA,0BAIFU,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,oBACCV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wJACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4FAAA,EACb,QAAA,kBAAAA,cAAAA,CAACiI,eAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC,CAAA,EAC1E,CAAA;AAAA,kCACAjI,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4DAAA,EACb,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B;AAAA,iBAAA,EACF,CAAA,EACF,CAAA;AAAA,gBAID,WAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oKAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA,CAAA,CAAE,yBAAyB,GAC9B,CAAA,EACF,CAAA;AAAA,gCAIFU,eAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,CAAA,sHAAA,EACT,SAAA,GACI,wIAAA,GACA,uGACN,CAAA,CAAA;AAAA,oBAGA,QAAA,EAAA;AAAA,sCAAAV,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,kPAAA;AAAA,0BACV,YAAA,EAAY,EAAE,0BAA0B,CAAA;AAAA,0BACxC,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,0BAEnC,QAAA,kBAAAA,cAAAA,CAACiI,eAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,uBACvB;AAAA,sCAGAjI,cAAAA;AAAA,wBAAC,OAAA;AAAA,wBAAA;AAAA,0BACC,GAAA,EAAK,YAAA;AAAA,0BACL,IAAA,EAAK,MAAA;AAAA,0BACL,MAAA,EAAQ,2BAAA;AAAA,0BACR,QAAA,EAAQ,IAAA;AAAA,0BACR,QAAA,EAAU,qBAAA;AAAA,0BACV,SAAA,EAAU,QAAA;AAAA,0BACV,YAAA,EAAY,EAAE,wBAAwB;AAAA;AAAA,uBACxC;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,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,4BAAA,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9B,4BAAA,mBAAA,IAAsB;AAAA,0BACxB,CAAA;AAAA,0BACA,SAAA,EAAW,aAAA;AAAA,0BACX,OAAA,EAAS,WAAA;AAAA,0BACT,kBAAA,EAAoB,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,0BAC7C,gBAAA,EAAkB,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,0BAC5C,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,0BAChC,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,4BAAA,YAAA,CAAa,KAAK,CAAA;AAClB,4BAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAAC,8BAAA;AAAA,4BAAO;AACnC,4BAAA,IAAI,CAAC,EAAE,aAAA,IAAiB,CAAC,aAAa,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAE,aAAa,CAAA,EAAG;AACvE,8BAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,4BAC9B;AAAA,0BACF,CAAA;AAAA,0BACA,WAAA;AAAA,0BACA,SAAA,EAAU,2KAAA;AAAA,0BACV,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA,EAAK;AAAA,0BACtC,IAAA,EAAM,CAAA;AAAA,0BACN,QAAA;AAAA,0BACA,WAAA,EAAW,OAAA;AAAA,0BACX,YAAA,EAAY,EAAE,2BAA2B;AAAA;AAAA,uBAC3C,EACF,CAAA;AAAA,sBAGC,sBAAA,IAA0B,sBAAA,CAAuB,MAAA,GAAS,CAAA,IAAK,2CAC9DA,cAAAA;AAAA,wBAAC,uBAAA;AAAA,wBAAA;AAAA,0BACC,OAAA,EAAS,sBAAA;AAAA,0BACT,KAAA,EAAO,uBAAA;AAAA,0BACP,QAAA,EAAU,uBAAA;AAAA,0BACV,UAAU,QAAA,IAAY;AAAA;AAAA,uBACxB;AAAA,sBAID,WAAA,IAAe,oCACdA,cAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,OAAA,EAAS,iBAAA;AAAA,0BACT,UAAU,QAAA,IAAY,QAAA;AAAA,0BACtB,SAAA,EAAU,2RAAA;AAAA,0BACV,YAAA,EAAY,EAAE,sBAAsB,CAAA;AAAA,0BACpC,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,0BAE/B,0BAAAA,cAAAA,CAACkI,UAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,0CAGhClI,cAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,UAAU,CAAC,SAAA;AAAA,0BACX,SAAA,EAAU,qPAAA;AAAA,0BACV,cAAY,OAAA,GAAU,CAAA,CAAE,yBAAyB,CAAA,GAAI,EAAE,0BAA0B,CAAA;AAAA,0BAEhF,QAAA,EAAA,OAAA,mBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EAA4F,CAAA,mBAE3GA,cAAAA,CAACmI,qBAAA,EAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA;AAE7C;AAAA;AAAA,iBAEJ;AAAA,gBAGC,SAAA,IAAa,CAAC,OAAA,IAAW,CAAC,OAAA,oBACzBnI,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qHAAA,EACb,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAClC,CAAA;AAAA,gBAGD,oBAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gNACZ,QAAA,EAAA,gBAAA,CAAiB,MAAA,GAAS,CAAA,mBACzBA,cAAAA,CAAC,IAAA,EAAA,EAAG,MAAK,SAAA,EAAU,YAAA,EAAY,CAAA,CAAE,2BAA2B,CAAA,EAAG,SAAA,EAAU,aACtE,QAAA,EAAA,gBAAA,CAAiB,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU;AACxC,kBAAA,MAAM,WAAW,KAAA,KAAU,kBAAA;AAC3B,kBAAA,uBACEU,eAAAA;AAAA,oBAAC,IAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,QAAA;AAAA,sBACL,eAAA,EAAe,QAAA;AAAA,sBACf,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,wBAAA,eAAA,CAAgB,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,sBACnC,CAAA;AAAA,sBACA,YAAA,EAAc,MAAM,qBAAA,CAAsB,KAAK,CAAA;AAAA,sBAC/C,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,wBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,wBAAA,sBAAA,CAAuB,QAAQ,IAAI,CAAA;AAAA,sBACrC,CAAA;AAAA,sBACA,SAAA,EAAW,CAAA,8FAAA,EACT,QAAA,GACI,8BAAA,GACA,4CACN,CAAA,CAAA;AAAA,sBAEA,QAAA,EAAA;AAAA,wCAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yEAAA,EACd,QAAA,EAAA;AAAA,0CAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,0BAAQ,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC;AAAA,yBAAA,EAClF,CAAA;AAAA,wCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EACb,kBAAQ,WAAA,EACX;AAAA;AAAA,qBAAA;AAAA,oBAtBK,OAAA,CAAQ;AAAA,mBAuBf;AAAA,gBAEJ,CAAC,CAAA,EACH,CAAA,mBAEAA,cAAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,OAAE,SAAA,EAAU,8CAAA,EACV,YAAE,wBAAwB,CAAA,EAC7B,GACF,CAAA,EAEJ;AAAA;AAAA;AAAA,WAEJ;AAAA,UAGC,sBAAsB,IAAA,IACrB,iBAAA,IAAqB,KACrB,iBAAA,GAAoB,gBAAA,CAAiB,0BACrCA,cAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAM,IAAA;AAAA,cACN,OAAA,EAAS,MAAM,oBAAA,CAAqB,IAAI,CAAA;AAAA,cACxC,UAAA,EAAY,iBAAiB,iBAAiB,CAAA;AAAA,cAC9C,cAAA,EAAgB,gBAAA;AAAA,cAChB,YAAA,EAAc,iBAAA;AAAA,cACd,UAAA,EAAY;AAAA;AAAA;AACd,SAAA,EAEJ;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,YAAA,CAAa,WAAA,GAAc,cAAA;ACr5BpB,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,QAAA,EAAS,EAA0B;AAC3E,EAAA,uBACEU,eAAAA;AAAA,IAAC8E,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,SAAS,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,MACzC,SAAS,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,MACtC,MAAM,EAAE,OAAA,EAAS,GAAG,CAAA,EAAG,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,MACtC,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA,MAC1D,SAAA,EAAU,+JAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAA9E,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gFAAA,EAAiF,CAAA;AAAA,0BACjGA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EAA2D;AAAA,SAAA,EAC7E,CAAA;AAAA,wBACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAA,EAAwD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAC9EA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAgD,QAAA,EAAA,QAAA,EAAS;AAAA,SAAA,EAC3E;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,IAAO,wBAAA,GAAQ,gBAAA;;;ACpBf,mBAAA,EAAA;AAkBA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAE,WAAA,EAAa,gCAAA,EAAkC,OAAA,EAAS,4BAAA,EAA8B,MAAMqD,cAAAA,EAAU,eAAA,EAAiB,eAAA,EAAiB,WAAA,EAAa,kCAAA,EAAmC;AAAA,EAC1L,EAAE,WAAA,EAAa,gCAAA,EAAkC,OAAA,EAAS,4BAAA,EAA8B,MAAMF,cAAAA,EAAU,eAAA,EAAiB,SAAA,EAAW,WAAA,EAAa,0CAAA,EAA2C;AAAA,EAC5L,EAAE,WAAA,EAAa,gCAAA,EAAkC,OAAA,EAAS,4BAAA,EAA8B,MAAMiF,eAAA,EAAW,eAAA,EAAiB,UAAA,EAAY,WAAA,EAAa,2CAAA;AACrJ,CAAA;AAEA,IAAM,aAAA,GAAmD;AAAA,EACvD;AAAA,IACE,KAAA,EAAO,kGAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,wGAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,8GAAA;AAAA,IACP,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,wBAAA,GAA2B;AAAA,EAC/B,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,EACrB,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,eAAA,EAAiB,CAAA;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;AAEA,IAAM,mBAAA,GAAsB;AAAA,EAC1B,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,EACrB,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,CAAA;AAAA,IACT,CAAA,EAAG,CAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,QAAA,EAAU;AAAA;AACZ;AAEJ,CAAA;AAGA,SAAS,GAAA,CAAI,CAAA,EAA4BhI,IAAAA,EAAa,YAAA,EAA8B;AAClF,EAAA,MAAM,CAAA,GAAI,EAAEA,IAAG,CAAA;AACf,EAAA,OAAO,CAAA,KAAMA,OAAM,CAAA,GAAI,YAAA;AACzB;AAEA,IAAM,gBAAwB,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAE3D,SAAS,cAAA,CAAe;AAAA,EACtB,cAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,EAAS;AACX,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,qBAAqBiI,6BAAA,EAAiB;AAC5C,EAAA,MAAM,gBAAgB,KAAA,IAAS,EAAA;AAC/B,EAAA,MAAM,sBAAsB,WAAA,IAAe,EAAA;AAE3C,EAAA,MAAM,UAA2B,aAAA,EAAe,MAAA,GAC5C,cAAc,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,IAC3B,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,MAAM,CAAA,CAAE,IAAA,IAAQ,aAAA,CAAc,CAAA,GAAI,cAAc,MAAM;AAAA,GACxD,CAAE,CAAA,GACF,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACxB,UAAU,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,WAAA,EAAa,IAAI,eAAe,CAAA;AAAA,IACrD,MAAM,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,OAAA,EAAS,IAAI,WAAW,CAAA;AAAA,IACzC,MAAM,GAAA,CAAI;AAAA,GACZ,CAAE,CAAA;AAEN,EAAA,MAAM,iBAAA,GAAoB,CAAC,MAAA,KAAmB;AAC5C,IAAA,IAAI,cAAA,IAAkB,CAAC,QAAA,EAAU;AAC/B,MAAA,cAAA,CAAe,MAAM,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,qBAAqB,wBAAA,GAA2B,iBAAA;AAChF,EAAA,MAAM,kBAAA,GAAqB,qBAAqB,mBAAA,GAAsB,YAAA;AAEtE,EAAA,uBACE3H,eAAAA;AAAA,IAAC8E,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,SAAA,EAAU,oDAAA;AAAA,MACV,QAAA,EAAU,uBAAA;AAAA,MACV,OAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAQ,SAAA;AAAA,MAEP,QAAA,EAAA;AAAA,QAAA,aAAA,oBACCxF,cAAAA;AAAA,UAACwF,mBAAAA,CAAO,EAAA;AAAA,UAAP;AAAA,YACC,SAAA,EAAU,gFAAA;AAAA,YACV,QAAA,EAAU,kBAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAGD,uCACCxF,cAAAA;AAAA,UAACwF,mBAAAA,CAAO,CAAA;AAAA,UAAP;AAAA,YACC,SAAA,EAAU,oFAAA;AAAA,YACV,QAAA,EAAU,kBAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAIF9E,eAAAA,CAAC8E,mBAAAA,CAAO,GAAA,EAAP,EAAW,UAAU,kBAAA,EACpB,QAAA,EAAA;AAAA,0BAAA9E,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EAAgF,CAAA;AAAA,4BAC/FA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oGAAA,EACb,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAChC,CAAA;AAAA,4BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EAAgF;AAAA,WAAA,EACjG,CAAA;AAAA,0BAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAc,OAAA,CAAQ,MAAA,IAAU,CAAA,GAAI,gBAAA,GAAmB,+BAA+B,CAAA,CAAA,EACnG,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,KAAU;AAC9B,YAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,GAAQ,aAAA,CAAc,MAAM,CAAA;AACxD,YAAA,uBACEU,eAAAA;AAAA,cAAC8E,mBAAAA,CAAO,MAAA;AAAA,cAAP;AAAA,gBAEC,OAAA,EAAS,MAAM,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AAAA,gBAC5C,QAAA;AAAA,gBACA,SAAA,EAAU,2cAAA;AAAA,gBACV,QAAA,EAAU,kBAAA;AAAA,gBACV,YAAY,QAAA,IAAY,kBAAA,GAAqB,EAAC,GAAI,EAAE,GAAG,EAAA,EAAG;AAAA,gBAC1D,UAAU,QAAA,IAAY,kBAAA,GAAqB,EAAC,GAAI,EAAE,OAAO,IAAA,EAAK;AAAA,gBAC9D,cAAY,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK,OAAO,IAAI,CAAA,CAAA;AAAA,gBAE9C,QAAA,EAAA;AAAA,kCAAA9E,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,oCAAAV,cAAAA;AAAA,sBAAC,MAAA,CAAO,IAAA;AAAA,sBAAP;AAAA,wBACC,IAAA,EAAM,EAAA;AAAA,wBACN,MAAA,EAAO,SAAA;AAAA,wBACP,SAAA,EAAW,OAAO,IAAA,IAAQ;AAAA;AAAA,qBAC5B;AAAA,oCACAA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAW,CAAA,8FAAA,EAAiG,KAAA,EAAO,KAAA,IAAS,4CAA4C,CAAA,CAAA;AAAA,wBAEvK,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV,mBAAA,EACF,CAAA;AAAA,kCAEAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mJAAA,EACV,iBAAO,IAAA,EACV;AAAA;AAAA,eAAA;AAAA,cAxBK;AAAA,aAyBP;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAGA,IAAO,sBAAA,GAAQ,cAAA;ACvMf,mBAAA,EAAA;AAcA,IAAM,aAAA,GAAgB;AAAA,EACpB,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,6CAAA;AAAA,IACX,KAAA,EAAO,gCAAA;AAAA,IACP,OAAA,EAAS,gCAAA;AAAA,IACT,IAAA,EAAM,gCAAA;AAAA,IACN,MAAA,EAAQ,yDAAA;AAAA,IACR,WAAA,EAAa,8EAAA;AAAA,IACb,IAAA,EAAMqG;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EAAW,yDAAA;AAAA,IACX,KAAA,EAAO,wCAAA;AAAA,IACP,OAAA,EAAS,wCAAA;AAAA,IACT,IAAA,EAAM,wCAAA;AAAA,IACN,MAAA,EAAQ,qEAAA;AAAA,IACR,WAAA,EAAa,8FAAA;AAAA,IACb,IAAA,EAAMC;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EAAW,mDAAA;AAAA,IACX,KAAA,EAAO,oCAAA;AAAA,IACP,OAAA,EAAS,oCAAA;AAAA,IACT,IAAA,EAAM,oCAAA;AAAA,IACN,MAAA,EAAQ,+DAAA;AAAA,IACR,WAAA,EAAa,sFAAA;AAAA,IACb,IAAA,EAAMF;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,gDAAA;AAAA,IACX,KAAA,EAAO,kCAAA;AAAA,IACP,OAAA,EAAS,kCAAA;AAAA,IACT,IAAA,EAAM,kCAAA;AAAA,IACN,MAAA,EAAQ,4DAAA;AAAA,IACR,WAAA,EAAa,kFAAA;AAAA,IACb,IAAA,EAAMkC;AAAA;AAEV,CAAA;AAEA,SAAS,KAAA,CAAM;AAAA,EACb,OAAA,GAAU,MAAA;AAAA,EACV,OAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,WAAA,GAAc;AAChB,CAAA,EAAe;AACb,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,EAAA,MAAM,gBAAgB,MAAA,CAAO,IAAA;AAE7B,EAAA,uBACEtI,cAAAA,CAACqH,4BAAAA,EAAA,EACE,kCACCrH,cAAAA;AAAA,IAACwF,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,QAAA,EAAU,oBAAA;AAAA,MACV,OAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAW,CAAA,gBAAA,EAAmB,MAAA,CAAO,SAAS,CAAA,UAAA,CAAA;AAAA,MAC9C,IAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAU,WAAA;AAAA,MAEV,QAAA,kBAAA9E,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAEb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,iBAAc,IAAA,EAAM,EAAA,EAAI,WAAW,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,qBAAA,CAAA,EAAyB,CAAA;AAAA,0BAGnFU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,oBAASV,eAAC,GAAA,EAAA,EAAE,SAAA,EAAW,WAAW,MAAA,CAAO,KAAK,gBAAiB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,4BACtEA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,QAAA,EAAW,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,KAAA,GAAQ,MAAA,GAAS,EAAE,CAAA,CAAA,EAAK,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,YAG1E,2BACCA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAW,CAAA,iCAAA,EAAoC,MAAA,CAAO,WAAW,CAAA,8BAAA,CAAA;AAAA,gBAEhE,YAAE,mBAAmB;AAAA;AAAA;AACxB,WAAA,EAEJ;AAAA,SAAA,EACF,CAAA;AAAA,QAGC,WAAA,IAAe,6BACdA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,SAAA;AAAA,YACT,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,gCAAA,CAAA;AAAA,YAC3B,YAAA,EAAY,EAAE,iCAAiC,CAAA;AAAA,YAE/C,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU;AAAA;AAAA;AACnC,OAAA,EAEJ;AAAA;AAAA,GACF,EAEJ,CAAA;AAEJ;AAEA,IAAO,aAAA,GAAQtC,WAAK,KAAK;;;ACpHzB,mBAAA,EAAA;AASA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA,GAAO,IAAA;AAAA,EACP,SAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIV,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,gBAAgB,YAAY;AAChC,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,SAAA,EAAU;AAAA,MAClB;AACA,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,iBAAA,EAAkB;AAAA,MACpB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,EAAE,8BAA8B,CAAA;AACrF,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEI,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAb,cAAAA,CAACqH,4BAAAA,EAAA,EACE,QAAA,EAAA,IAAA,oBACCrH,cAAAA;AAAA,MAACwF,mBAAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,QAAA,EAAU,oBAAA;AAAA,QACV,OAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAU,0EAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,EAAE,uBAAuB,CAAA;AAAA,QAErC,QAAA,kBAAA9E,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAEb,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAACuI,aAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,WAAU,+DAAA,EAAgE,CAAA;AAAA,4BAG7FvI,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EACV,QAAA,EAAA,CAAA,CAAE,yBAAyB,GAC9B,CAAA,EACF;AAAA,WAAA,EACF,CAAA;AAAA,0BAGAA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,aAAA;AAAA,cACT,QAAA,EAAU,SAAA;AAAA,cACV,SAAA,EAAU,yOAAA;AAAA,cACV,YAAA,EAAY,EAAE,wBAAwB,CAAA;AAAA,cAErC,QAAA,EAAA,SAAA,mBACCU,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAAb,cAAAA,CAACwI,aAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,WAAU,sBAAA,EAAuB,CAAA;AAAA,gBACnD,EAAE,0BAA0B;AAAA,eAAA,EAC/B,CAAA,GAEA,EAAE,wBAAwB;AAAA;AAAA;AAE9B,SAAA,EACF;AAAA;AAAA,KACF,EAEJ,CAAA;AAAA,IAGC,yBACCxI,cAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,EAAE,8BAA8B,CAAA;AAAA,QACvC,SAAA,EAAW,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,QAC9B,WAAA,EAAW;AAAA;AAAA;AACb,GAAA,EAEJ,CAAA;AAEJ;AAEA,IAAO,qBAAA,GAAQgB,WAAK,aAAa;;;AC9EjC,mBAAA,EAAA;;;ACvBA,mBAAA,EAAA;;;ACOA,mBAAA,EAAA;;;ACRO,IAAM,sBAAA,GAAyB,mBAAA;AAE/B,SAAS,gBAAgB,QAAA,EAAmC;AACjE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,IAAA,EAAK;AACjC,EAAA,OAAO,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,sBAAA;AAC1C;AAEO,SAAS,gBAAgB,QAAA,EAAoC;AAClE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,EAAU,WAAA,EAAY,IAAK,EAAA;AACjD,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,QAAQ,CAAA,CAAE,WAAA,EAAY;AACnD,EAAA,OAAO,KAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,iCAAA,CAAkC,KAAK,IAAI,CAAA;AACjF;AAEO,SAAS,cAAc,QAAA,EAAoC;AAChE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,EAAU,WAAA,EAAY,IAAK,EAAA;AACjD,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,QAAQ,CAAA,CAAE,WAAA,EAAY;AACnD,EAAA,OAAO,KAAK,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AACrD;AAEO,SAAS,yBAAyB,QAAA,EAAoC;AAC3E,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,EAAU,WAAA,EAAY,IAAK,EAAA;AACjD,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,QAAQ,CAAA,CAAE,WAAA,EAAY;AACnD,EAAA,OACE,KAAK,QAAA,CAAS,kBAAkB,KAChC,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IACtB,IAAA,CAAK,QAAA,CAAS,OAAO,KACrB,IAAA,CAAK,QAAA,CAAS,aAAa,CAAA,IAC3B,4BAAA,CAA6B,KAAK,IAAI,CAAA;AAE1C;AAEO,SAAS,eAAe,QAAA,EAAoC;AACjE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,EAAU,WAAA,EAAY,IAAK,EAAA;AACjD,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,QAAQ,CAAA,CAAE,WAAA,EAAY;AACnD,EAAA,OACE,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,IACvB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IACpB,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IACnB,IAAA,CAAK,SAAS,MAAM,CAAA,IACpB,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IACnB,IAAA,CAAK,QAAA,CAAS,eAAe,CAAA,IAC7B,4CAAA,CAA6C,IAAA,CAAK,IAAI,CAAA;AAE1D;ADzBA,IAAM,eAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,8BAAA;AAAA,EACP,KAAA,EAAO,8BAAA;AAAA,EACP,WAAA,EAAa,mCAAA;AAAA,EACb,MAAA,EAAQ,+BAAA;AAAA,EACR,UAAA,EAAY,mCAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,aAAa,IAAA,EAAyB;AAC7C,EAAA,MAAM,GAAA,GAAM,aAAA;AACZ,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,uBAAOhB,cAAAA,CAACqD,cAAAA,EAAA,EAAS,SAAA,EAAW,GAAA,EAAK,QAAO,MAAA,EAAO,CAAA;AAAA,IACjD,KAAK,OAAA;AACH,MAAA,uBAAOrD,cAAAA,CAACyI,WAAA,EAAA,EAAU,SAAA,EAAW,GAAA,EAAK,QAAO,MAAA,EAAO,CAAA;AAAA,IAClD,KAAK,aAAA;AACH,MAAA,uBAAOzI,cAAAA,CAAC0I,UAAA,EAAA,EAAK,SAAA,EAAW,GAAA,EAAK,QAAO,MAAA,EAAO,CAAA;AAAA,IAC7C,KAAK,QAAA;AACH,MAAA,uBAAO1I,cAAAA,CAACgD,aAAAA,EAAA,EAAQ,SAAA,EAAW,GAAA,EAAK,QAAO,MAAA,EAAO,CAAA;AAAA,IAChD,KAAK,YAAA;AACH,MAAA,uBAAOhD,cAAAA,CAAC8C,WAAAA,EAAA,EAAU,SAAA,EAAW,GAAA,EAAK,QAAO,MAAA,EAAO,CAAA;AAAA,IAClD;AACE,MAAA,uBAAO9C,cAAAA,CAAC2I,aAAA,EAAA,EAAQ,SAAA,EAAW,GAAA,EAAK,QAAO,MAAA,EAAO,CAAA;AAAA;AAEpD;AAEA,SAAS,cAAA,CAAe,EAAE,GAAA,EAAK,GAAA,EAAI,EAAiC;AAClE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIrI,eAAS,KAAK,CAAA;AAC1C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBACEN,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oGAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC8C,WAAAA,EAAA,EAAU,SAAA,EAAU,8CAAA,EAA+C,MAAA,EAAO,WAAU,CAAA,EACvF,CAAA;AAAA,EAEJ;AACA,EAAA,uBACE9C,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,MAC7B,SAAA,EAAU;AAAA;AAAA,GACZ;AAEJ;AAEA,SAAS,sBAAsB,QAAA,EAAuC;AACpE,EAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAAC,IAAA,OAAO,YAAA;AAAA,EAAa;AACpD,EAAA,IAAI,QAAA,CAAS,SAAS,aAAA,EAAe;AACnC,IAAA,MAAM,IAAI,aAAA,CAAc,QAAA,CAAS,QAAA,EAAU,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAEpE,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,MAAA,IAAU,CAAA,CAAE,UAAU,MAAA,EAAQ;AAC5C,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,SAAA,EAAW,gCAAA,EAAkC,SAAS,+BAAA,EAAgC;AAAA,IACvG;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,aAAA,CAAc,QAAA,CAAS,QAAA,EAAU,eAAA,CAAgB,QAAQ,CAAC,CAAA;AACnE;AAEA,SAAS,qBAAqB,SAAA,EAAiF;AAC7G,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA+B;AAEnD,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,OAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AACtB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,CAAC,QAAQ,CAAC,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,CAChC,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,MAAO;AAAA,IACvB,IAAA;AAAA,IACA,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS,CAAC;AAAA,GAC/E,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAChD;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,SAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,OAAA,GAAUQ,cAAQ,MAAM,oBAAA,CAAqB,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAE1E,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,uBACEE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC2I,aAAA,EAAA,EAAQ,SAAA,EAAU,0CAAA,EAA2C,MAAA,EAAO,SAAA,EAAU,CAAA,EACjF,CAAA;AAAA,sBACAjI,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAV,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDAAA,EACV,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B,CAAA;AAAA,wBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,iDAAA,EACV,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EACrC,CAAA;AAAA,wBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EACjC;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,qBACZU,eAAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAoC,QAAA,EAAA,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA,EAAE,CAAA;AAAA,sBAC7EA,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uFACX,QAAA,EAAA,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,CAAE,gBAAgB,KAAA,CAAM,IAAI,CAAC,CAAA,GAAI,KAAA,CAAM,KAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,EAC9F,CAAA;AAAA,sBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mEAAA,EACb,QAAA,EAAA,KAAA,CAAM,MAAM,MAAA,EACf;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,QAAA,KAAa;AAC7B,MAAA,MAAM,UAAA,GAAa,SAAS,EAAA,KAAO,kBAAA;AACnC,MAAA,MAAM,MAAA,GAAS,sBAAsB,QAAQ,CAAA;AAC7C,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,MAAM,YAAA,GAAe,gBAAgB,QAAQ,CAAA;AAC7C,MAAA,uBACEA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,QAAA,CAAS,QAAQ,CAAA;AAAA,UAChC,SAAA,EAAW,CAAA,qLAAA,EACT,UAAA,GACI,iGAAA,GACA,6JACN,CAAA,CAAA;AAAA,UAEC,0BAAgB,QAAQ,CAAA,IAAK,SAAS,GAAA,mBACrCU,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAV,eAAC,cAAA,EAAA,EAAe,GAAA,EAAK,QAAA,CAAS,GAAA,EAAK,KAAK,YAAA,EAAc,CAAA;AAAA,4BACtDU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,8BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,8BACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wEAAA,EACd,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,cAAA,CAAe,QAAA,CAAS,SAAS,CAAA,EAAE,CAAA;AAAA,gBACzC,QAAA,CAAS,WAAA,oBACRU,eAAAA,CAAAG,qBAAA,EACE,QAAA,EAAA;AAAA,kCAAAb,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EAAwD,CAAA;AAAA,kCACxEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,mBAAS,WAAA,EAAY;AAAA,iBAAA,EACnD;AAAA,eAAA,EAEJ;AAAA,aAAA,EACF;AAAA,WAAA,EACF,CAAA,mBAEAU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,eAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,oEAAA,EAAuE,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,CAAA,EACxH,0BAAAA,cAAAA,CAAC,IAAA,EAAA,EAAK,MAAM,EAAA,EAAI,MAAA,EAAO,WAAU,CAAA,EACnC,CAAA;AAAA,4BACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,8BAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,8BACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wEAAA,EACd,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,cAAA,CAAe,QAAA,CAAS,SAAS,CAAA,EAAE,CAAA;AAAA,gBACzC,QAAA,CAAS,WAAA,oBACRU,eAAAA,CAAAG,qBAAA,EACE,QAAA,EAAA;AAAA,kCAAAb,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EAAwD,CAAA;AAAA,kCACxEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,mBAAS,WAAA,EAAY;AAAA,iBAAA,EACnD;AAAA,eAAA,EAEJ;AAAA,aAAA,EACF;AAAA,WAAA,EACF;AAAA,SAAA;AAAA,QA9CG,QAAA,CAAS;AAAA,OAgDhB;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EAAA,EArEY,KAAA,CAAM,IAsEpB,CACD,CAAA,EACH,CAAA;AAEJ;AExMA,mBAAA,EAAA;;;ACHA,cAAA,EAAA;;;ACDA,SAASkB,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,WAAW,KAAA,EAA+B;AACjD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAC5C,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,IAAA;AACxC;AAEA,SAAS,oBAAoB,KAAA,EAA+B;AAC1D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AACzC,IAAA,MAAM,MAAA,GAAS,OAAO,OAAO,CAAA;AAC7B,IAAA,OAAO,OAAO,aAAA,CAAc,MAAM,CAAA,IAAK,MAAA,GAAS,IAAI,MAAA,GAAS,IAAA;AAAA,EAC/D;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AACvE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC1B,EAAA,OAAO,CAAA,GAAI,IAAI,CAAA,GAAI,IAAA;AACrB;AAEA,SAAS,cAAc,KAAA,EAA6B;AAClD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAAC,IAAA,OAAO,EAAC;AAAA,EAAE;AAEtC,EAAA,MAAM,OAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AACnC,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACf;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAA+C;AAClE,EAAA,IAAI,CAACA,SAAAA,CAAS,KAAK,CAAA,EAAG;AAAC,IAAA,OAAO,MAAA;AAAA,EAAU;AACxC,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAChC,EAAA,IAAI,CAAC,GAAA,EAAK;AAAC,IAAA,OAAO,MAAA;AAAA,EAAU;AAE5B,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,QAAA,EAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,IAAK,mBAAA;AAAA,IACxC,QAAA,EAAU,oBAAoB,KAAA,CAAM,SAAS,KAAK,mBAAA,CAAoB,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAAA,IACzF,UAAA,EAAY,oBAAoB,KAAA,CAAM,YAAY,KAAK,mBAAA,CAAoB,KAAA,CAAM,UAAU,CAAA,IAAK;AAAA,GAClG;AACF;AAKO,SAAS,gCAAA,CACd,UACA,UAAA,EACwB;AACxB,EAAA,IAAI,CAACA,SAAAA,CAAS,QAAQ,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AACtC,EAAA,OAAO,8BAAA,CAA+B,UAAU,UAAU,CAAA;AAC5D;AAEA,SAAS,8BAAA,CAA+B,QAAiC,UAAA,EAA4C;AACnH,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,GACxC,MAAA,CAAO,QACJ,GAAA,CAAI,CAAC,WAAW,UAAA,CAAW,MAAM,CAAC,CAAA,CAClC,MAAA,CAAO,CAAC,MAAA,KAA6B,MAAA,KAAW,IAAI,CAAA,GACvD,EAAC;AACL,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEvC,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAEtC,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,GAC3C,MAAA,CAAO,QACJ,GAAA,CAAI,CAAC,WAAW,UAAA,CAAW,MAAM,CAAC,CAAA,CAClC,MAAA,CAAO,CAAC,MAAA,KAA6B,MAAA,KAAW,IAAI,CAAA,GACvD,EAAC;AACL,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,MAAA,KAAW,OAAA,CAAQ,SAAS,UAAA,GAAa,OAAA;AAEpE,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA,GACpD,MAAA,CAAO,YAAA,GACP,KAAA,CAAM,QAAQ,MAAA,CAAO,WAAW,CAAA,GAC9B,MAAA,CAAO,cACP,EAAC;AACP,EAAA,MAAM,WAAA,GACJ,cAAA,CAAe,MAAA,KAAW,OAAA,CAAQ,MAAA,GAC9B,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,IAAK,QAAQ,CAAA,GACnD,MAAA;AAEN,EAAA,MAAM,YACJ,mBAAA,CAAoB,MAAA,CAAO,UAAU,CAAA,IACrC,oBAAoB,MAAA,CAAO,SAAS,CAAA,IACpC,mBAAA,CAAoB,OAAO,SAAS,CAAA,IACpC,oBAAoB,MAAA,CAAO,QAAQ,KACnC,IAAA,CAAK,MAAA;AACP,EAAA,MAAM,QAAA,GAAW,oBAAoB,MAAA,CAAO,SAAS,KAAK,mBAAA,CAAoB,MAAA,CAAO,QAAQ,CAAA,IAAK,EAAA;AAElG,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA,IAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAC/D,EAAA,IAAI,CAAC,KAAA,EAAO;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEzB,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,UAAA,CAAW,MAAA,CAAO,EAAE,CAAA,IAAK,UAAA;AAAA,IAC7B,KAAA,EAAO,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA,IAAK,MAAA;AAAA,IACnC,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,OAAO,SAAA,KAAc,IAAA;AAAA,IAChC,eAAA,EAAiB,WAAW,MAAA,CAAO,gBAAgB,KAAK,UAAA,CAAW,MAAA,CAAO,eAAe,CAAA,IAAK,MAAA;AAAA,IAC9F,MAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA;AAAA,IACjC,YAAA,EAAc,WAAW,MAAA,CAAO,aAAa,KAAK,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA,IAAK;AAAA,GACvF;AACF;AAEO,SAAS,kCAAA,CACd,MACA,UAAA,EACwB;AACxB,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,OAAA,EAAS;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAE3B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAACA,SAAAA,CAAS,MAAM,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AACpC,EAAA,OAAO,8BAAA,CAA+B,QAAQ,UAAU,CAAA;AAC1D;;;AD7HA,cAAA,EAAA;AAEA,mBAAA,EAAA;AAaA,IAAM,sBAAA,GAAyB,IAAA;AAE/B,SAAS,2BAA2B,QAAA,EAA2B;AAC7D,EAAA,MAAM,WAAW,QAAA,CAAS,QAAA;AAC1B,EAAA,IAAI,CAAC,QAAA,IAAY,CAACA,SAAAA,CAAS,QAAQ,CAAA,EAAG;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAOA,SAAAA,CAAS,QAAA,CAAS,IAAI,CAAA,GAAI,SAAS,IAAA,GAAO,QAAA;AACvD,EAAA,IAAI,CAACA,SAAAA,CAAS,IAAI,CAAA,EAAG;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,sBAAA,CAAuB,IAAA,EAAM,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAC/D;AAEA,SAAS,kBAAkB,GAAA,EAAsB;AAC/C,EAAA,OAAO,eAAA,CAAgB,KAAK,GAAG,CAAA;AACjC;AAEA,SAAS,UAAA,CAAW,EAAE,OAAA,EAAQ,EAAwB;AACpD,EAAA,uBACER,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yKAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC4I,mBAAA,EAAA,EAAc,SAAA,EAAU,yBAAA,EAA0B,QAAO,SAAA,EAAU,CAAA;AAAA,oBACpE5I,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAmB,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EAC7C,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,GAAA,EAAI,EAAoB;AACjD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,SAAA,GAAY,EAAE,+BAA+B,CAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,EAAE,2BAA2B,CAAA;AAEnD,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,GAAA;AAAA,QACN,MAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAI,YAAA;AAAA,QACJ,SAAA,EAAU,kNAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAV,eAAC+G,oBAAAA,EAAA,EAAe,SAAA,EAAU,aAAA,EAAc,QAAO,MAAA,EAAO,CAAA;AAAA,UACrD;AAAA;AAAA;AAAA,KACH;AAAA,oBACArG,eAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,GAAA;AAAA,QACN,MAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAI,YAAA;AAAA,QACJ,QAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAU,sJAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAV,eAACc,oBAAAA,EAAA,EAAe,SAAA,EAAU,aAAA,EAAc,QAAO,MAAA,EAAO,CAAA;AAAA,UACrD;AAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAS,EAAkC;AACxE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIR,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,GAAA,EAAK;AACjB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,QAAA,CAAS,CAAA,CAAE,oCAAoC,CAAC,CAAA;AAChD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,UAAA,CAAW,EAAE,CAAA;AACb,IAAA,YAAA,CAAa,KAAK,CAAA;AAElB,IAAA,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,CAAA,CACtE,IAAA,CAAK,OAAO,QAAA,KAAa;AACxB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC3C;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,SAAS,sBAAA,EAAwB;AACxC,QAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,sBAAsB,CAAC,CAAA;AAChD,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA;AAAA,MACF;AACA,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACjB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,CAAA,CAAE,oCAAoC,CAAC,CAAA;AAAA,IAClD,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,CAAS,GAAA,EAAK,CAAC,CAAC,CAAA;AAEpB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kLAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC6I,gBAAA,EAAA,EAAW,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,MACjD,EAAE,iCAAiC;AAAA,KAAA,EACtC,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBAAO7I,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,EACrC;AAEA,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iLACZ,QAAA,EAAA,OAAA,IAAW,CAAA,CAAE,qCAAqC,CAAA,EACrD,CAAA;AAAA,IACC,SAAA,oBACCA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0CAAA,EAA4C,QAAA,EAAA,CAAA,CAAE,uCAAuC,CAAA,EAAE;AAAA,GAAA,EAExG,CAAA;AAEJ;AAEO,SAAS,sBAAA,CAAuB,EAAE,QAAA,EAAS,EAAgC;AAChF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,YAAA,GAAe,gBAAgB,QAAQ,CAAA;AAE7C,EAAA,MAAM,eAAA,GAAkBQ,cAAQ,MAAM;AACpC,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,IAAO,CAAC,iBAAA,CAAkB,QAAA,CAAS,GAAG,CAAA,EAAG;AACrD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA,mDAAA,EAAsD,kBAAA,CAAmB,QAAA,CAAS,GAAG,CAAC,CAAA,CAAA;AAAA,EAC/F,CAAA,EAAG,CAAC,QAAA,CAAS,GAAG,CAAC,CAAA;AAEjB,EAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,IAAA,MAAM,SAAA,GAAY,2BAA2B,QAAQ,CAAA;AACrD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,uBAAOR,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAsB,CAAA;AAAA,IAC1C;AACA,IAAA,uBAAOA,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,CAAA,CAAE,mCAAmC,CAAA,EAAG,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,QAAA,CAAS,SAAS,OAAA,IAAW,QAAA,CAAS,YAAY,OAAO,QAAA,CAAS,aAAa,QAAA,EAAU;AAC3F,IAAA,MAAM,SAAA,GAAY,gCAAA;AAAA,MAChB,QAAA,CAAS,QAAA;AAAA,MACT,QAAA,CAAS;AAAA,KACX;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,0BAAAA,cAAAA,CAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,SAAA,EAAW,CAAA,EAC1C,CAAA;AAAA,IAEJ;AACA,IAAA,uBAAOA,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,CAAA,CAAE,qCAAqC,CAAA,EAAG,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC7B,IAAA,IAAI,CAAC,SAAS,GAAA,EAAK;AACjB,MAAA,uBAAOA,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,CAAA,CAAE,mCAAmC,CAAA,EAAG,CAAA;AAAA,IACtE;AAEA,IAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gHAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAK,QAAA,CAAS,GAAA;AAAA,UACd,GAAA,EAAK,YAAA;AAAA,UACL,SAAA,EAAU,2CAAA;AAAA,UACV,OAAA,EAAQ;AAAA;AAAA,OACV,EACF,CAAA;AAAA,sBACAA,cAAAA,CAAC,eAAA,EAAA,EAAgB,GAAA,EAAK,SAAS,GAAA,EAAK;AAAA,KAAA,EACtC,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,EAAG;AAC3B,IAAA,IAAI,CAAC,SAAS,GAAA,EAAK;AACjB,MAAA,uBAAOA,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,CAAA,CAAE,sCAAsC,CAAA,EAAG,CAAA;AAAA,IACzE;AAEA,IAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0GAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAK,QAAA,CAAS,GAAA;AAAA,UACd,KAAA,EAAO,YAAA;AAAA,UACP,SAAA,EAAU;AAAA;AAAA,OACZ,EACF,CAAA;AAAA,sBACAA,cAAAA,CAAC,eAAA,EAAA,EAAgB,GAAA,EAAK,SAAS,GAAA,EAAK;AAAA,KAAA,EACtC,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,wBAAA,CAAyB,QAAQ,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,SAAS,GAAA,EAAK;AACjB,MAAA,uBAAOA,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,CAAA,CAAE,sCAAsC,CAAA,EAAG,CAAA;AAAA,IACzE;AAEA,IAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,MAAA,eAAA,mBACCV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4GACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,eAAA;AAAA,UACL,KAAA,EAAO,YAAA;AAAA,UACP,SAAA,EAAU;AAAA;AAAA,OACZ,EACF,oBAEAA,cAAAA,CAAC,cAAW,OAAA,EAAS,CAAA,CAAE,2CAA2C,CAAA,EAAG,CAAA;AAAA,sBAEvEA,cAAAA,CAAC,eAAA,EAAA,EAAgB,GAAA,EAAK,SAAS,GAAA,EAAK;AAAA,KAAA,EACtC,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC5B,IAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,uBAAoB,QAAA,EAAoB,CAAA;AAAA,MACxC,SAAS,GAAA,oBAAOA,eAAC,eAAA,EAAA,EAAgB,GAAA,EAAK,SAAS,GAAA,EAAK;AAAA,KAAA,EACvD,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qKAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,eAACmD,cAAAA,EAAA,EAAS,SAAA,EAAU,0CAAA,EAA2C,QAAO,SAAA,EAAU,CAAA;AAAA,wBAChFnD,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2DAAA,EAA6D,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAAA,EAAE,CAAA;AAAA,wBACnHA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EAAiD,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAAA,EAAE;AAAA,OAAA,EAC1G,CAAA;AAAA,sBACAA,cAAAA,CAAC,eAAA,EAAA,EAAgB,GAAA,EAAK,SAAS,GAAA,EAAK;AAAA,KAAA,EACtC,CAAA;AAAA,EAEJ;AAEA,EAAA,uBAAOA,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,CAAA,CAAE,sCAAsC,CAAA,EAAG,CAAA;AACzE;AD5PO,SAAS,2BAAA,CAA4B;AAAA,EAC1C,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAqC;AACnC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIM,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAAG,gBAAU,MAAM;AACd,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,IAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,QAAA,EAAU,QAAQ,EAAE,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,oBAAoB,gBAAA,EAAkB;AACxC,MAAA;AAAA,IACF;AACA,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,UAAU,IAAA,EAAK;AAChC,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,KAAa,QAAA,CAAS,IAAA,EAAM;AAC3C,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,YAAA,CAAa,SAAS,IAAI,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,CAAS,UAAU,QAAQ,CAAA;AACjC,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,CAAA,CAAE,+BAA+B,CAAC,CAAA;AAAA,IAClF,CAAA,SAAE;AACA,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAE,gCAAgC,CAAC,CAAA,EAAG;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,QAAQ,CAAA;AACvB,MAAA,OAAA,EAAQ;AAAA,IACV,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,CAAA,CAAE,+BAA+B,CAAC,CAAA;AAAA,IAClF,CAAA,SAAE;AACA,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEC,gBAAC,YAAA,EAAA,EAAa,IAAA,EAAM,QAAQ,OAAA,EAAS,WAAA,EAAa,WAAU,eAAA,EAC1D,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,oBAAA,EAAA,EAAqB,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,oBAE7EA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,kBAAAU,eAAAA,CAAC,iBAAA,EAAA,EAAkB,WAAU,+IAAA,EAC3B,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,aAAA,mBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,SAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC5C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,kBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA,KAAK,YAAA,EAAa;AAAA,kBACpB;AACA,kBAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,oBAAA,YAAA,CAAa,SAAS,IAAI,CAAA;AAAA,kBAC5B;AAAA,gBACF,CAAA;AAAA,gBACA,SAAA,EAAU,uNAAA;AAAA,gBACV,YAAA,EAAY,EAAE,yBAAyB,CAAA;AAAA,gBACvC,SAAA,EAAS;AAAA;AAAA,aACX;AAAA,4BACAU,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAS,MAAM;AACb,kBAAA,KAAK,YAAA,EAAa;AAAA,gBACpB,CAAA;AAAA,gBACA,QAAA,EAAU,gBAAA;AAAA,gBACV,SAAA,EAAU,6MAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAAC8I,gBAAA,EAAA,EAAW,SAAA,EAAU,aAAA,EAAc,QAAO,MAAA,EAAO,CAAA;AAAA,kBACjD,EAAE,qBAAqB;AAAA;AAAA;AAAA,aAC1B;AAAA,4BACA9I,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAS,MAAM;AACb,kBAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,kBAAA,YAAA,CAAa,SAAS,IAAI,CAAA;AAAA,gBAC5B,CAAA;AAAA,gBACA,QAAA,EAAU,gBAAA;AAAA,gBACV,SAAA,EAAU,oPAAA;AAAA,gBAET,YAAE,uBAAuB;AAAA;AAAA;AAC5B,WAAA,EACF,oBAEAA,cAAAA,CAAC,QAAG,SAAA,EAAU,mEAAA,EACX,mBAAS,IAAA,EACZ,CAAA;AAAA,UAED,QAAA,CAAS,+BACRA,cAAAA,CAAC,OAAE,SAAA,EAAU,wDAAA,EACV,mBAAS,WAAA,EACZ;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA;AAAA,UAAA,SAAA,IAAa,QAAA,IAAY,CAAC,aAAA,oBACzBV,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM;AACb,gBAAA,QAAA,CAAS,IAAI,CAAA;AACb,gBAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,cACvB,CAAA;AAAA,cACA,SAAA,EAAU,mNAAA;AAAA,cACV,YAAA,EAAY,EAAE,yBAAyB,CAAA;AAAA,cACvC,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,cAElC,0BAAAA,cAAAA,CAACiE,kBAAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU,QAAO,SAAA,EAAU;AAAA;AAAA,WACrD;AAAA,UAED,SAAA,IAAa,4BACZjE,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM;AACb,gBAAA,KAAK,YAAA,EAAa;AAAA,cACpB,CAAA;AAAA,cACA,QAAA,EAAU,gBAAA;AAAA,cACV,SAAA,EAAU,iQAAA;AAAA,cACV,YAAA,EAAY,EAAE,yBAAyB,CAAA;AAAA,cACvC,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,cAElC,0BAAAA,cAAAA,CAAC+I,WAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,QAAO,SAAA,EAAU;AAAA;AAAA,WAC9C;AAAA,0BAEF/I,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,WAAA;AAAA,cACT,SAAA,EAAU,mNAAA;AAAA,cACV,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,cACnC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,cAE9B,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU,QAAO,MAAA,EAAO;AAAA;AAAA;AACvC,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBAEA5C,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,oBACCV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8IACZ,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,wBAEFA,cAAAA,CAAC,sBAAA,EAAA,EAAuB,QAAA,EAAoB;AAAA,OAAA,EAC9C;AAAA,KAAA,EACF,GACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AHtMA,IAAM,SAAA,GAAY,EAAA;AAElB,SAAS,cAAA,CAAe,UAA6B,QAAA,EAAgD;AACnG,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,QAAQ,CAAA;AAC3B,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE,CAAC,CAAA;AAEnE,EAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,EAAG;AAChC,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AACpB,IAAA,WAAA,CAAY,GAAA,CAAI,SAAS,EAAE,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,SAAA,GAAY,EAAA;AAAA,EACZ,4BAAA,EAA8B;AAChC,CAAA,EAA+B;AAC7B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,YAAY,wBAAA,EAAyB;AAC3C,EAAA,MAAM,+BACJ,OAAO,gCAAA,KAAqC,QAAA,GACxC,gCAAA,GACA,WAAW,4BAAA,IAAgC,CAAA;AAEjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIM,eAAS,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,cAAAA,CAA4B,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAC9E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,UAAA,GAAaC,aAAO,CAAC,CAAA;AAC3B,EAAA,MAAM,YAAA,GAAeA,aAAO,KAAK,CAAA;AACjC,EAAA,MAAM,gBAAA,GAAmBA,aAAO,WAAW,CAAA;AAC3C,EAAA,MAAM,YAAA,GAAeA,YAAAA,CAA0B,EAAE,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgBA,aAAO,CAAC,CAAA;AAC9B,EAAA,MAAM,YAAA,GAAeA,aAAO,CAAC,CAAA;AAC7B,EAAA,MAAM,mBAAA,GAAsBA,aAAsB,IAAI,CAAA;AAEtD,EAAA,MAAM,iBAAA,GAAoB,OAAO,UAAA,CAAW,qBAAA,KAA0B,UAAA;AACtE,EAAA,MAAM,YAAA,GAAe,SAAA,IAAa,OAAO,UAAA,CAAW,sBAAA,KAA2B,UAAA;AAE/E,EAAA,MAAM,IAAA,GAAOA,aAAO,CAAC,CAAA;AACrB,EAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAEf,EAAA,MAAM,cAAA,GAAiBJ,iBAAAA;AAAA,IACrB,OAAO,IAAA,KAA8C;AACnD,MAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,UAAA,CAAW,qBAAA,EAAuB;AAC3D,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,YAAA,CAAa,EAAE,CAAA;AACf,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA,aAAA,CAAc,OAAA,GAAU,CAAA;AACxB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,EAAE,UAAA,CAAW,OAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,aAAA,CAAc,OAAA;AAE9C,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA,IAAW,IAAA,CAAK,KAAA,EAAO;AACvC,QAAA,IAAI,IAAA,CAAK,MAAA,IAAU,YAAA,CAAa,OAAA,EAAS;AACvC,UAAA,aAAA,CAAc,IAAI,CAAA;AAAA,QACpB,CAAA,MAAO;AACL,UAAA,WAAA,CAAY,IAAI,CAAA;AAAA,QAClB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,IAAI,CAAA;AAAA,MACrB;AACA,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,qBAAA,CAAsB,SAAA,EAAW;AAAA,UACjE,KAAA,EAAO,SAAA;AAAA,UACP;AAAA,SACD,CAAA;AACD,QAAA,IAAI,SAAA,KAAc,WAAW,OAAA,EAAS;AACpC,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,OAAO,CAAC,GAAI,SAAS,SAAA,IAAa,EAAG,CAAA,CAAE,IAAA;AAAA,UAC3C,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAS;AAAA,SAC5D;AAEA,QAAA,MAAM,WAAW,IAAA,CAAK,KAAA,GAAQ,OAAO,cAAA,CAAe,YAAA,CAAa,SAAS,IAAI,CAAA;AAE9E,QAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,QAAA,YAAA,CAAa,OAAA,GAAU,QAAA;AACvB,QAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAEvB,QAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAChD,QAAA,MAAM,kBAAA,GACJ,OAAO,QAAA,CAAS,UAAA,KAAe,WAC3B,QAAA,CAAS,UAAA,GACT,SAAS,IAAA,CAAK,MAAA;AAEpB,QAAA,UAAA,CAAW,eAAe,CAAA;AAC1B,QAAA,aAAA,CAAc,OAAA,GAAU,kBAAA;AAAA,MAC1B,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,SAAA,KAAc,WAAW,OAAA,EAAS;AACpC,UAAA;AAAA,QACF;AACA,QAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,IAAA,CAAK,OAAA,CAAQ,+BAA+B,CAAC,CAAA;AAAA,MAC7F,CAAA,SAAE;AACA,QAAA,IAAI,SAAA,KAAc,WAAW,OAAA,EAAS;AACpC,UAAA,WAAA,CAAY,KAAK,CAAA;AACjB,UAAA,aAAA,CAAc,KAAK,CAAA;AACnB,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,iBAAA,EAAmB,UAAA,EAAY,SAAS;AAAA,GAC3C;AAEA,EAAAM,gBAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,YAAA,CAAa,UAAU,EAAC;AACxB,IAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,aAAA,CAAc,OAAA,GAAU,CAAA;AACxB,IAAA,KAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,cAAA,EAAgB,SAAS,CAAC,CAAA;AAE9B,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,eAAe,gBAAA,CAAiB,OAAA;AACtC,IAAA,IAAI,YAAA,IAAgB,CAAC,WAAA,EAAa;AAChC,MAAA,KAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,gBAAA,CAAiB,OAAA,GAAU,WAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,cAAA,EAAgB,WAAW,CAAC,CAAA;AAEhC,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,4BAAA,GAA+B,CAAA,IAAK,SAAA,IAAa,iBAAA,EAAmB;AACtE,MAAA,KAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,4BAAA,EAA8B,SAAA,EAAW,iBAAA,EAAmB,cAAc,CAAC,CAAA;AAE/E,EAAA,MAAM,kBAAA,GAAqBF,aAAO,cAAc,CAAA;AAChD,EAAA,kBAAA,CAAmB,OAAA,GAAU,cAAA;AAC7B,EAAA,MAAM,YAAA,GAAeA,aAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AACvB,EAAA,MAAM,WAAA,GAAcA,aAAO,iBAAiB,CAAA;AAC5C,EAAA,WAAA,CAAY,OAAA,GAAU,iBAAA;AAEtB,EAAAE,gBAAU,MAAM;AACd,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IACE,SAAS,eAAA,KAAoB,SAAA,IAC7B,YAAA,CAAa,OAAA,IACb,YAAY,OAAA,EACZ;AACA,QAAA,KAAK,mBAAmB,OAAA,CAAQ,EAAE,OAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,MAChE;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,OAAO,CAAA;AACrD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,OAAO,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBD,aAAAA;AAAA,IACtB,MAAM,UAAU,IAAA,CAAK,CAAC,aAAa,QAAA,CAAS,EAAA,KAAO,iBAAiB,CAAA,IAAK,IAAA;AAAA,IACzE,CAAC,WAAW,iBAAiB;AAAA,GAC/B;AAEA,EAAA,MAAM,qBAAA,GAAwBL,kBAAY,MAAM;AAC9C,IAAA,IAAI,mBAAA,CAAoB,YAAY,IAAA,EAAM;AAAC,MAAA;AAAA,IAAO;AAClD,IAAA,MAAA,CAAO,YAAA,CAAa,oBAAoB,OAAO,CAAA;AAC/C,IAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAM,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,qBAAA,EAAsB;AAAA,IACxB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAA,MAAM,mBAAA,GAAsBN,kBAAY,MAAM;AAC5C,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,qBAAA,EAAsB;AACtB,IAAA,mBAAA,CAAoB,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACpD,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAAA,IAChC,GAAG,IAAI,CAAA;AAAA,EACT,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,CAAC,CAAA,KAAgC;AAChE,IAAA,OAAO,KAAA,CAAM,KAAK,CAAA,CAAE,YAAA,CAAa,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,CAAA,KAAuB;AAC1D,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,YAAA,CAAa,CAAC,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AAC/C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,YAAA,CAAa,OAAA,IAAW,CAAA;AACxB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAE/B,EAAA,MAAM,cAAA,GAAiBA,iBAAAA,CAAY,CAAC,CAAA,KAAuB;AACzD,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,YAAA,CAAa,CAAC,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AAC/C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,CAAA,CAAE,aAAa,UAAA,GAAa,MAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAE/B,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,CAAA,KAAuB;AAC1D,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,YAAA,CAAa,CAAC,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AAC/C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,YAAA,CAAa,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,CAAa,UAAU,CAAC,CAAA;AAC3D,IAAA,IAAI,YAAA,CAAa,YAAY,CAAA,EAAG;AAC9B,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAE/B,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,OAAO,CAAA,KAAuB;AAC3D,IAAA,IAAI,CAAC,gBAAgB,CAAC,UAAA,CAAW,0BAA0B,CAAC,YAAA,CAAa,CAAC,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AACrF,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,YAAA,CAAa,KAAA,IAAS,EAAE,CAAA,CACpD,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,MAAM,CAAA,CACrC,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,SAAA,EAAW,CAAA,CAC9B,MAAA,CAAO,CAAC,IAAA,KAAuB,IAAA,KAAS,IAAI,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,YAAA,CAAa,KAAA,IAAS,EAAE,CAAA;AAE7F,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,sBAAA,CAAuB,WAAW,YAAY,CAAA;AAC9E,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,EAAC,EAAG,SAAS,CAAA,EAAG;AACvC,QAAA,mBAAA,EAAoB;AACpB,QAAA,KAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,MACpD;AACA,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,IAAA,CAAK,OAAA,CAAQ,+BAA+B,CAAC,CAAA;AAAA,IAC7F;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,UAAA,EAAY,gBAAgB,YAAA,EAAc,SAAA,EAAW,mBAAmB,CAAC,CAAA;AAE3F,EAAA,MAAM,kBAAA,GAAqB,OAAO,UAAA,CAAW,qBAAA,KAA0B,UAAA;AACvE,EAAA,MAAM,kBAAA,GAAqB,OAAO,UAAA,CAAW,qBAAA,KAA0B,UAAA;AAEvE,EAAA,MAAM,oBAAA,GAAuBA,iBAAAA;AAAA,IAC3B,OAAO,UAA2B,IAAA,KAAiB;AACjD,MAAA,IAAI,CAAC,WAAW,qBAAA,EAAuB;AACrC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,eAAA,GAAkB,MAAM,UAAA,CAAW,qBAAA;AAAA,QACvC,QAAA,CAAS,EAAA;AAAA,QACT,IAAA;AAAA,QACA,SAAS,WAAA,IAAe;AAAA,OAC1B;AACA,MAAA,YAAA,CAAa,CAAC,IAAA,KAAS;AACrB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAU,KAAK,EAAA,KAAO,eAAA,CAAgB,EAAA,GAAK,eAAA,GAAkB,IAAK,CAAA;AACzF,QAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA,CAAY,CAAC,QAAA,KAAuC;AAC5E,IAAA,OAAO,QAAA,CAAS,IAAA,KAAS,YAAA,IAAgB,CAAC,QAAA,CAAS,SAAA;AAAA,EACrD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,oBAAA,GAAuBA,iBAAAA;AAAA,IAC3B,OAAO,QAAA,KAA8B;AACnC,MAAA,IAAI,CAAC,UAAA,CAAW,qBAAA,IAAyB,CAAC,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AACrE,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,CAAW,qBAAA,CAAsB,QAAA,CAAS,EAAE,CAAA;AAClD,MAAA,YAAA,CAAa,CAAC,IAAA,KAAS;AACrB,QAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,EAAA,KAAO,SAAS,EAAE,CAAA;AAC1D,QAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,oBAAA,CAAqB,CAAC,OAAA,KAAa,OAAA,KAAY,QAAA,CAAS,EAAA,GAAK,OAAO,OAAQ,CAAA;AAAA,IAC9E,CAAA;AAAA,IACA,CAAC,mBAAmB,UAAU;AAAA,GAChC;AAEA,EAAA,MAAM,YAAA,GAAeI,aAAyB,IAAI,CAAA;AAElD,EAAA,MAAM,iBAAA,GAAoBJ,kBAAY,MAAM;AAC1C,IAAA,YAAA,CAAa,SAAS,KAAA,EAAM;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,qBAAA,GAAwBA,iBAAAA;AAAA,IAC5B,OAAO,CAAA,KAAqC;AAC1C,MAAA,IAAI,CAAC,UAAA,CAAW,sBAAA,IAA0B,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,MAAA,EAAQ;AAAC,QAAA;AAAA,MAAO;AAC3E,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,sBAAA,CAAuB,WAAW,KAAK,CAAA;AACvE,QAAA,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,EAAC,EAAG,SAAS,CAAA,EAAG;AACvC,UAAA,mBAAA,EAAoB;AACpB,UAAA,KAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,QACpD;AACA,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,SAAS,GAAA,EAAK;AACZ,QAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,IAAA,CAAK,OAAA,CAAQ,+BAA+B,CAAC,CAAA;AAAA,MAC7F,CAAA,SAAE;AAEA,QAAA,CAAA,CAAE,OAAO,KAAA,GAAQ,EAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,cAAA,EAAgB,SAAA,EAAW,mBAAmB;AAAA,GAC7D;AAEA,EAAA,uBACEO,eAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW;AAAA,QACT,kHAAA;AAAA,QACA,aAAa,yCAAA,GAA4C,EAAA;AAAA,QACzD;AAAA,OACF,CAAE,KAAK,GAAG,CAAA;AAAA,MACV,YAAA,EAAY,EAAE,wBAAwB,CAAA;AAAA,MACtC,WAAA,EAAa,eAAA;AAAA,MACb,UAAA,EAAY,cAAA;AAAA,MACZ,WAAA,EAAa,eAAA;AAAA,MACb,MAAA,EAAQ,UAAA;AAAA,MAEN,QAAA,EAAA;AAAA,QAAA,CAAA,UAAA,IAAc,gCACdV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8GACb,QAAA,kBAAAU,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW;AAAA,cACT,+GAAA;AAAA,cACA,cACI,wHAAA,GACA;AAAA,aACN,CAAE,KAAK,GAAG,CAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAV,eAACiI,eAAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,QAAO,MAAA,EAAO,CAAA;AAAA,8BAC7CjI,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,WAAA,GAAc,CAAA,CAAE,yBAAyB,CAAA,GAAI,CAAA,CAAE,wBAAwB,CAAA,EAC1E;AAAA;AAAA;AAAA,SACF,EACF,CAAA;AAAA,wBAGFU,eAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,8FAAA,EAChB,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,SAAI,SAAA,EAAU,gBAAA,EACb,0BAAAU,eAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,iEAAA,EACX,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,wBAAwB,CAAA;AAAA,YAAE,IAAA;AAAA,YAAG,SAAA,CAAU,MAAA;AAAA,YAAO;AAAA,WAAA,EACnD,CAAA,EACF,CAAA;AAAA,UACC,YAAA,oBACCA,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAb,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,iBAAA;AAAA,gBACT,SAAA,EAAU,gQAAA;AAAA,gBACV,YAAA,EAAY,EAAE,8BAA8B,CAAA;AAAA,gBAC5C,KAAA,EAAO,EAAE,8BAA8B,CAAA;AAAA,gBAEvC,0BAAAA,cAAAA,CAACgJ,UAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAO,MAAA,EAAO;AAAA;AAAA,aAC1C;AAAA,4BACAhJ,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,YAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,QAAA,EAAQ,IAAA;AAAA,gBACR,SAAA,EAAU,QAAA;AAAA,gBACV,QAAA,EAAU,qBAAA;AAAA,gBACV,YAAA,EAAY,EAAE,8BAA8B;AAAA;AAAA;AAC9C,WAAA,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACZ,QAAA,EAAA,QAAA,mBACCA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFACZ,QAAA,EAAA,CAAA,CAAE,0BAA0B,GAC/B,CAAA,GACE,KAAA,mBACFU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oDAAA,EAAsD,QAAA,EAAA,CAAA,CAAE,+BAA+B,CAAA,EAAE,CAAA;AAAA,0BACtGA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAA0C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAC7DA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM;AACb,gBAAA,KAAK,eAAe,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,cACnD,CAAA;AAAA,cACA,SAAA,EAAU,0PAAA;AAAA,cAET,YAAE,oBAAoB;AAAA;AAAA;AACzB,SAAA,EACF,CAAA,GACE,CAAC,iBAAA,mBACHA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6IAAA,EACZ,QAAA,EAAA,CAAA,CAAE,8BAA8B,CAAA,EACnC,CAAA,mBAEAU,eAAAA,CAAAG,qBAAA,EACE,QAAA,EAAA;AAAA,0BAAAb,cAAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,SAAA;AAAA,cACA,oBAAoB,iBAAA,IAAqB,MAAA;AAAA,cACzC,QAAA,EAAU,CAAC,QAAA,KAAa,oBAAA,CAAqB,SAAS,EAAE;AAAA;AAAA,WAC1D;AAAA,UAEC,2BACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM;AACb,gBAAA,KAAK,eAAe,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AAAA,cACpD,CAAA;AAAA,cACA,QAAA,EAAU,eAAe,UAAA,IAAc,QAAA;AAAA,cACvC,SAAA,EAAU,oUAAA;AAAA,cAET,QAAA,EAAA,WAAA,GAAc,CAAA,CAAE,8BAA8B,CAAA,GAAI,EAAE,2BAA2B;AAAA;AAAA,WAClF,EACF;AAAA,SAAA,EAEJ,CAAA,EAEJ,CAAA;AAAA,wBAEAA,cAAAA;AAAA,UAAC,2BAAA;AAAA,UAAA;AAAA,YACC,QAAQ,eAAA,KAAoB,IAAA;AAAA,YAC5B,QAAA,EAAU,eAAA;AAAA,YACV,OAAA,EAAS,MAAM,oBAAA,CAAqB,IAAI,CAAA;AAAA,YACxC,SAAA,EAAW,kBAAA;AAAA,YACX,WAAW,OAAA,CAAQ,eAAA,IAAmB,kBAAA,IAAsB,iBAAA,CAAkB,eAAe,CAAC,CAAA;AAAA,YAC9F,QAAA,EAAU,qBAAqB,oBAAA,GAAuB,MAAA;AAAA,YACtD,QAAA,EAAU,qBAAqB,oBAAA,GAAuB;AAAA;AAAA;AACxD;AAAA;AAAA,GACF;AAEJ;AMncA,mBAAA,EAAA;ACAA,mBAAA,EAAA;AAqBA,SAAS,gBAAA,CAAiB;AAAA,EACxB,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,sBAAsB,WAAA,EAAa,IAAA,EAAK,GAAI,WAAA,GAAc,EAAE,uBAAuB,CAAA;AACzF,EAAA,MAAM,qBAAqB,UAAA,EAAY,IAAA,EAAK,GAAI,UAAA,GAAa,EAAE,sBAAsB,CAAA;AACrF,EAAA,uBACEU,gBAAC,YAAA,EAAA,EAAa,IAAA,EAAM,QAAQ,OAAA,EAAS,QAAA,EAAU,WAAU,eAAA,EAEvD,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,oBAAA,EAAA,EAAqB,SAAA,EAAU,6FAAA,EAA8F,CAAA;AAAA,oBAG9HA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DACb,QAAA,kBAAAU,eAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,sHAAA,EAC3B,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,SAAI,SAAA,EAAU,gBAAA,EAEb,0BAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,QAAA,oBACCV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oJACb,QAAA,kBAAAA,cAAAA,CAAC4I,mBAAAA,EAAA,EAAc,MAAM,EAAA,EAAI,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,kCAAiC,CAAA,EACvF,CAAA;AAAA,wBAEFlI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,uEAAA,EAC1B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,0BACAA,cAAAA,CAAC,uBAAA,EAAA,EAAwB,SAAA,EAAU,iEAChC,QAAA,EAAA,OAAA,EACH;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,QAAA;AAAA,YACR,GAAI,QAAA,GAAW,EAAE,gBAAA,EAAkB,IAAA,KAAS,EAAC;AAAA,YAC9C,SAAA,EAAU,mYAAA;AAAA,YACV,aAAA,EAAY,sBAAA;AAAA,YAEX,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACJ,GAAI,CAAC,QAAA,GAAW,EAAE,gBAAA,EAAkB,IAAA,KAAS,EAAC;AAAA,YAC/C,OAAA,EAAS,SAAA;AAAA,YACT,SAAA,EAAW;AAAA,cACT,oEAAA;AAAA,cACA,oDAAA;AAAA,cACA,qHAAA;AAAA,cACA,WACI,6EAAA,GACA;AAAA,aACN,CAAE,KAAK,GAAG,CAAA;AAAA,YACV,aAAA,EAAY,uBAAA;AAAA,YAEX,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,IAAM,YAAA,GAAegB,WAAK,gBAAgB;AAC1C,YAAA,CAAa,WAAA,GAAc,cAAA;AAG3B,IAAO,oBAAA,GAAQ,YAAA;ADpFf,IAAM,KAAA,GAAuC,CAAC,QAAA,EAAU,QAAQ,CAAA;AAEhE,SAAS,oBAAA,CAAqB;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP;AACF,CAAA,EAMG;AACD,EAAA,MAAM,OAAA,GAAU,IAAA,KAAS,IAAA,GACrB,yBAAA,GACA,mBAAA;AACJ,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAExC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2B;AAChD,IAAA,IAAI,QAAA,EAAU;AAAC,MAAA;AAAA,IAAO;AACtB,IAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAChD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,SAAA,GAAY,YAAA,IAAgB,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,IAAI,YAAA,GAAe,CAAA;AAAA,IACpE,WAAW,CAAA,CAAE,GAAA,KAAQ,YAAA,IAAgB,CAAA,CAAE,QAAQ,WAAA,EAAa;AAC1D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,SAAA,GAAY,YAAA,IAAgB,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,IAAI,YAAA,GAAe,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,MAAM,QAAA,GAAW,MAAM,SAAS,CAAA;AAChC,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,MAAM,SAAS,CAAA,CAAE,aAAA,CAAc,aAAA,CAAc,CAAA,YAAA,EAAe,QAAQ,CAAA,EAAA,CAAI,CAAA;AACxE,MAAA,MAAA,EAAQ,KAAA,EAAM;AAAA,IAChB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEhB,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,YAAA;AAAA,MACL,YAAA,EAAY,EAAE,wBAAwB,CAAA;AAAA,MACtC,SAAA,EAAU,yGAAA;AAAA,MACV,SAAA,EAAW,aAAA;AAAA,MAEV,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,OAAA;AAAA,UACL,gBAAc,KAAA,KAAU,IAAA;AAAA,UACxB,QAAA,EAAU,KAAA,KAAU,IAAA,GAAO,CAAA,GAAI,EAAA;AAAA,UAC/B,WAAA,EAAW,IAAA;AAAA,UACX,QAAA;AAAA,UACA,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,UAC5B,WAAW,CAAA,EAAG,OAAO,wMACnB,KAAA,KAAU,IAAA,GACN,wCACA,+EACN,CAAA,CAAA;AAAA,UAEC,mBAAS,QAAA,GAAW,CAAA,CAAE,yBAAyB,CAAA,GAAI,EAAE,yBAAyB;AAAA,SAAA;AAAA,QAd1E;AAAA,OAgBR;AAAA;AAAA,GACH;AAEJ;AAMA,SAAS,cAAA,GAAiB;AACxB,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAiD,eAAY,MAAA,EAC1E,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EAAgF,CAAA;AAAA,oBAC/FU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EAA8D,CAAA;AAAA,sBAC7EA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EAAgE;AAAA,KAAA,EACjF,CAAA;AAAA,oBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EAAiE;AAAA,GAAA,EAClF,CAAA;AAEJ;AAMO,SAAS,oBAAoB,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,SAAQ,EAA6B;AACxG,EAAA,MAAM,YAAYK,WAAAA,EAAM;AACxB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,iBAAiBE,YAAAA,EAAsC;AAC7D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,cAAAA,CAAwB,EAAE,CAAA;AACpD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAA6B,IAAI,CAAA;AACzE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAA8B,QAAQ,CAAA;AAC9E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAA+B,IAAI,CAAA;AAC7E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAIA,eAAS,CAAC,CAAA;AACtE,EAAA,MAAM,kBAAA,GAAqBC,YAAAA,CAAqC,EAAE,CAAA;AAElE,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,UAAA,CAAW,aACR,UAAA,CAAW,kBAAA,IACX,WAAW,gBAAA,IACX,UAAA,CAAW,2BACX,UAAA,CAAW;AAAA,GAChB;AAEA,EAAA,MAAM,OAAA,GAAUJ,kBAAY,YAAY;AACtC,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,gBAAA,EAAkB;AACnC,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,SAAA,EAAW,WAAW,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACjD,WAAW,SAAA,EAAW;AAAA,QACtB,UAAA,CAAW,mBAAoB,SAAS;AAAA,OACzC,CAAA;AACD,MAAA,QAAA,CAAS,SAAS,CAAA;AAClB,MAAA,UAAA,CAAW,WAAW,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,CAAA,CAAE,yBAAyB,CAAC,CAAA;AAAA,IACvC,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,gBAAA,EAAkB,UAAA,EAAY,SAAA,EAAW,CAAC,CAAC,CAAA;AAE/C,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AACA,IAAA,KAAK,OAAA,EAAQ;AAAA,EACf,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAGpB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,MAAA,yBAAA,CAA0B,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,YAAYD,aAAAA,CAAQ,MAAM,IAAI,GAAA,CAAI,QAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,EAAE,CAAC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACjF,EAAA,MAAM,cAAA,GAAiBA,aAAAA;AAAA,IACrB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACpD,CAAC,OAAO,SAAS;AAAA,GACnB;AAEA,EAAA,MAAM,aAAA,GAAgBA,cAAQ,MAAM;AAClC,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AACjB,MAAA,OAAO,cAAA;AAAA,IACT;AACA,IAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,IAAA,OAAO,cAAA,CAAe,MAAA;AAAA,MACpB,CAAC,CAAA,KACC,CAAA,CAAE,SAAA,CAAU,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAA,IACjC,CAAA,CAAE,QAAA,CAAS,WAAA,EAAY,CAAE,SAAS,CAAC,CAAA,IACnC,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,CAAA,CAAA,CAAG,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC;AAAA,KAC9D;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,EAAgB,KAAK,CAAC,CAAA;AAG1B,EAAAC,gBAAU,MAAM;AACd,IAAA,yBAAA;AAAA,MAA0B,CAAC,CAAA,KACzB,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,aAAA,CAAc,MAAA,GAAS,CAAC,CAAC;AAAA,KAChE;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,CAAc,MAAM,CAAC,CAAA;AAEzB,EAAAA,eAAAA,CAAU,MAAM,MAAM,YAAA,CAAa,eAAe,OAAO,CAAA,EAAG,EAAE,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAcN,iBAAAA,CAAY,CAAC,GAAA,KAAgB;AAC/C,IAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AACnC,IAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,IAAA,cAAA,CAAe,UAAU,UAAA,CAAW,MAAM,gBAAA,CAAiB,IAAI,GAAG,GAAI,CAAA;AAAA,EACxE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,kBAAY,YAAY;AACxC,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,YAAA,IAAgB,CAAC,WAAW,gBAAA,EAAkB;AAC/D,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,gBAAA,CAAiB,SAAA,EAAW,YAAA,CAAa,IAAI,YAAY,CAAA;AAC1E,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,WAAA,CAAY,CAAA,CAAE,0BAA0B,CAAC,CAAA;AACzC,MAAA,MAAM,OAAA,EAAQ;AAAA,IAChB,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,CAAA,CAAE,wBAAwB,CAAC,CAAA;AAAA,IACtC,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,YAAA,EAAc,YAAA,EAAc,WAAW,gBAAA,EAAkB,OAAA,EAAS,CAAA,EAAG,WAAW,CAAC,CAAA;AAEhG,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,OAAO,MAAA,EAAgB,IAAA,KAA8B;AACxF,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,CAAW,uBAAA,EAAyB;AACrD,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,uBAAA,CAAwB,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAA;AAChE,MAAA,MAAM,OAAA,EAAQ;AAAA,IAChB,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,CAAA,CAAE,2BAA2B,CAAC,CAAA;AAAA,IACzC,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,UAAA,CAAW,uBAAA,EAAyB,OAAO,CAAC,CAAA;AAE3D,EAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,OAAO,MAAA,KAAmB;AACzD,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,CAAW,mBAAA,EAAqB;AACjD,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,mBAAA,CAAoB,SAAA,EAAW,MAAM,CAAA;AACtD,MAAA,WAAA,CAAY,CAAA,CAAE,4BAA4B,CAAC,CAAA;AAC3C,MAAA,MAAM,OAAA,EAAQ;AAAA,IAChB,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,CAAA,CAAE,2BAA2B,CAAC,CAAA;AAAA,IACzC,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,WAAW,mBAAA,EAAqB,OAAA,EAAS,WAAW,CAAC,CAAA;AAEpE,EAAA,uBACEO,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,gBAAC,YAAA,EAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAkB,WAAU,eAAA,EACtD,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,oBAAA,EAAA,EAAqB,SAAA,EAAU,6FAAA,EAA8F,CAAA;AAAA,sBAE9HA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DACb,QAAA,kBAAAU,eAAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,iBAAA,EAAiB,SAAA;AAAA,UACjB,SAAA,EAAU,sGAAA;AAAA,UAGV,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kJAAA,EACb,QAAA,kBAAAA,cAAAA,CAACiJ,gBAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,0CAAyC,CAAA,EAC5F,CAAA;AAAA,gCACAjJ,eAAC,iBAAA,EAAA,EAAkB,EAAA,EAAI,WAAW,SAAA,EAAU,0DAAA,EACzC,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EACzB;AAAA,eAAA,EACF,CAAA;AAAA,8BACAA,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,SAAA,EAAU,0NAAA;AAAA,kBACV,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,kBAEnC,QAAA,kBAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,MAAM,EAAA,EAAI;AAAA;AAAA;AACf,aAAA,EACF,CAAA;AAAA,4BAGA5C,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,cAAA,CAAC,gBAAA,oBACAV,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qJAAA,EACZ,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAC/B,CAAA;AAAA,cAGD,yBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2IACZ,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,8BAIFA,eAAC,KAAA,EAAA,EAAI,WAAA,EAAU,UAAS,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,SAAA,EAClD,QAAA,EAAA,aAAA,EACH,CAAA;AAAA,8BAGAU,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qFAAA,EACX,QAAA,EAAA;AAAA,kBAAA,CAAA,CAAE,sBAAsB,CAAA;AAAA,kBAAG,CAAC,WAAW,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAM,CAAA,CAAA,CAAA,GAAM;AAAA,iBAAA,EACxF,CAAA;AAAA,gCAEAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACZ,QAAA,EAAA,OAAA,mBACCU,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,kCAAAb,eAAC,cAAA,EAAA,EAAe,CAAA;AAAA,kCAChBA,eAAC,cAAA,EAAA,EAAe,CAAA;AAAA,kCAChBA,eAAC,cAAA,EAAA,EAAe;AAAA,iBAAA,EAClB,CAAA,GACE,QAAQ,MAAA,KAAW,CAAA,mBACrBU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iFAAA,EACb,QAAA,EAAA;AAAA,kCAAAV,eAACiJ,gBAAA,EAAA,EAAW,IAAA,EAAM,IAAI,MAAA,EAAO,MAAA,EAAO,WAAU,MAAA,EAAO,CAAA;AAAA,kCACrDjJ,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,SAAA,EAAW,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE;AAAA,iBAAA,EAClD,CAAA,GAEA,OAAA,CAAQ,GAAA,CAAI,CAAC,2BACXU,eAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBAEC,SAAA,EAAU,2GAAA;AAAA,oBAEV,QAAA,EAAA;AAAA,sCAAAV,cAAAA;AAAA,wBAAC,kBAAA;AAAA,wBAAA;AAAA,0BACC,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,0BACvB,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAAA,0BACtB,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAAA,0BACtB,IAAA,EAAK;AAAA;AAAA,uBACP;AAAA,sCACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACZ,QAAA,EAAA;AAAA,wBAAA,MAAA,CAAO,IAAA,CAAK,SAAA;AAAA,wBAAU,GAAA;AAAA,wBAAE,OAAO,IAAA,CAAK;AAAA,uBAAA,EACvC,CAAA,EACF,CAAA;AAAA,sBAEC,OAAO,IAAA,KAAS,OAAA,mBACfA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2MAAA,EACd,QAAA,EAAA;AAAA,wCAAAV,cAAAA,CAACkJ,WAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,QAAO,SAAA,EAAU,CAAA;AAAA,wBACjC,EAAE,wBAAwB;AAAA,uBAAA,EAC7B,CAAA,mBAEAxI,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,wCAAAV,cAAAA;AAAA,0BAAC,oBAAA;AAAA,0BAAA;AAAA,4BACC,OAAO,MAAA,CAAO,IAAA;AAAA,4BACd,UAAU,CAAC,IAAA,KAAS,iBAAiB,MAAA,CAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,4BACzD,QAAA,EAAU,MAAA;AAAA,4BACV,IAAA,EAAK,IAAA;AAAA,4BACL;AAAA;AAAA,yBACF;AAAA,wCACAA,cAAAA;AAAA,0BAAC,QAAA;AAAA,0BAAA;AAAA,4BACC,IAAA,EAAK,QAAA;AAAA,4BACL,QAAA,EAAU,MAAA;AAAA,4BACV,OAAA,EAAS,MAAM,gBAAA,CAAiB,MAAM,CAAA;AAAA,4BACtC,SAAA,EAAU,mRAAA;AAAA,4BACV,YAAA,EAAY,CAAA,EAAG,CAAA,CAAE,qBAAqB,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,4BAExF,QAAA,kBAAAA,cAAAA,CAAC+I,WAAAA,EAAA,EAAM,MAAM,EAAA,EAAI;AAAA;AAAA;AACnB,uBAAA,EACF;AAAA;AAAA,mBAAA;AAAA,kBAtCG,OAAO,IAAA,CAAK;AAAA,iBAyCpB,CAAA,EAEL;AAAA,eAAA,EACF,CAAA;AAAA,cAGC,gBAAA,oBACCrI,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sEAAA,EACb,QAAA,EAAA;AAAA,gCAAAV,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gFAAA,EACX,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B,CAAA;AAAA,gCAGAU,eAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,UAAA;AAAA,oBACV,MAAA,EAAQ,CAAC,CAAA,KAAwC;AAC/C,sBAAA,IAAI,CAAC,CAAA,CAAE,aAAA,CAAc,QAAA,CAAS,CAAA,CAAE,aAAqB,CAAA,EAAG;AACtD,wBAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,sBACvB;AAAA,oBACF,CAAA;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wCAAAV,cAAAA;AAAA,0BAACuF,qBAAAA;AAAA,0BAAA;AAAA,4BACC,IAAA,EAAM,EAAA;AAAA,4BACN,SAAA,EAAU;AAAA;AAAA,yBACZ;AAAA,wCACAvF,cAAAA;AAAA,0BAAC,OAAA;AAAA,0BAAA;AAAA,4BACC,IAAA,EAAK,MAAA;AAAA,4BACL,SAAA,EAAU,sUAAA;AAAA,4BACV,WAAA,EAAa,EAAE,0BAA0B,CAAA;AAAA,4BACzC,KAAA,EAAO,eAAe,CAAA,EAAG,YAAA,CAAa,SAAS,CAAA,CAAA,EAAI,YAAA,CAAa,QAAQ,CAAA,CAAA,GAAK,KAAA;AAAA,4BAC7E,SAAS,MAAM;AAAE,8BAAA,eAAA,CAAgB,IAAI,CAAA;AAAG,8BAAA,yBAAA,CAA0B,CAAC,CAAA;AAAG,8BAAA,IAAI,YAAA,EAAc;AAAE,gCAAA,eAAA,CAAgB,IAAI,CAAA;AAAG,gCAAA,QAAA,CAAS,EAAE,CAAA;AAAA,8BAAG;AAAA,4BAAE,CAAA;AAAA,4BACjI,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,8BAAA,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAG,8BAAA,eAAA,CAAgB,IAAI,CAAA;AAAG,8BAAA,eAAA,CAAgB,IAAI,CAAA;AAAG,8BAAA,yBAAA,CAA0B,CAAC,CAAA;AAAA,4BAAG,CAAA;AAAA,4BACzH,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,8BAAA,IAAI,CAAC,YAAA,IAAgB,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AAC/C,gCAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,kCAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,gCAAG;AAClD,gCAAA;AAAA,8BACF;AACA,8BAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,gCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gCAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,gCAAA,yBAAA,CAA0B,CAAC,CAAA;AAC3B,gCAAA;AAAA,8BACF;AACA,8BAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,gCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gCAAA,MAAM,IAAA,GAAA,CAAQ,sBAAA,GAAyB,CAAA,IAAK,aAAA,CAAc,MAAA;AAC1D,gCAAA,yBAAA,CAA0B,IAAI,CAAA;AAC9B,gCAAA,UAAA,CAAW,MAAM,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA,EAAG,KAAA,IAAS,CAAC,CAAA;AAC7D,gCAAA;AAAA,8BACF;AACA,8BAAA,IAAI,CAAA,CAAE,QAAQ,SAAA,EAAW;AACvB,gCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gCAAA,MAAM,OAAO,sBAAA,IAA0B,CAAA,GAAI,aAAA,CAAc,MAAA,GAAS,IAAI,sBAAA,GAAyB,CAAA;AAC/F,gCAAA,yBAAA,CAA0B,IAAI,CAAA;AAC9B,gCAAA,UAAA,CAAW,MAAM,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA,EAAG,KAAA,IAAS,CAAC,CAAA;AAC7D,gCAAA;AAAA,8BACF;AACA,8BAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,gCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gCAAA,MAAM,IAAA,GAAO,cAAc,sBAAsB,CAAA;AACjD,gCAAA,IAAI,IAAA,EAAM;AACR,kCAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,kCAAA,QAAA,CAAS,EAAE,CAAA;AACX,kCAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,gCACvB;AAAA,8BACF;AAAA,4BACF;AAAA;AAAA;AACF,uBAAA,EACF,CAAA;AAAA,sBAEC,YAAA,IAAgB,CAAC,YAAA,oBAChBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kJAAA,EACZ,QAAA,EAAA,aAAA,CAAc,MAAA,KAAW,CAAA,mBACxBA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACZ,QAAA,EAAA,cAAA,CAAe,MAAA,KAAW,CAAA,GACvB,CAAA,CAAE,+BAA+B,IACjC,CAAA,CAAE,8BAA8B,CAAA,EACtC,CAAA,GAEA,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,EAAM,0BACvBU,eAAAA;AAAA,wBAAC,QAAA;AAAA,wBAAA;AAAA,0BAEC,IAAA,EAAK,QAAA;AAAA,0BACL,GAAA,EAAK,CAAC,EAAA,KAAO;AAAE,4BAAA,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA;AAAA,0BAAI,CAAA;AAAA,0BACvD,SAAA,EAAW,CAAA,6HAAA,EAAgI,KAAA,KAAU,sBAAA,GAAyB,yCAAyC,EAAE,CAAA,CAAA;AAAA,0BACzN,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,0BACrC,SAAS,MAAM;AAAE,4BAAA,eAAA,CAAgB,IAAI,CAAA;AAAG,4BAAA,QAAA,CAAS,EAAE,CAAA;AAAG,4BAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,0BAAG,CAAA;AAAA,0BAE9E,QAAA,EAAA;AAAA,4CAAAV,cAAAA;AAAA,8BAAC,kBAAA;AAAA,8BAAA;AAAA,gCACC,WAAW,IAAA,CAAK,SAAA;AAAA,gCAChB,UAAU,IAAA,CAAK,QAAA;AAAA,gCACf,UAAU,IAAA,CAAK,QAAA;AAAA,gCACf,IAAA,EAAK;AAAA;AAAA,6BACP;AAAA,4CACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAK,SAAA;AAAA,8BAAU,GAAA;AAAA,8BAAE,IAAA,CAAK;AAAA,6BAAA,EACzB;AAAA;AAAA,yBAAA;AAAA,wBAfK,IAAA,CAAK;AAAA,uBAiBb,CAAA,EAEL;AAAA;AAAA;AAAA,iBAEJ;AAAA,gCAGAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,kCAAAV,cAAAA;AAAA,oBAAC,oBAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO,YAAA;AAAA,sBACP,QAAA,EAAU,eAAA;AAAA,sBACV,QAAA,EAAU,MAAA;AAAA,sBACV;AAAA;AAAA,mBACF;AAAA,kCACAU,eAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,SAAA;AAAA,sBACT,QAAA,EAAU,UAAU,CAAC,YAAA;AAAA,sBACrB,SAAA,EAAU,0ZAAA;AAAA,sBAEV,QAAA,EAAA;AAAA,wCAAAV,cAAAA,CAACmJ,cAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,wBACnB,EAAE,kBAAkB;AAAA;AAAA;AAAA;AACvB,iBAAA,EACF;AAAA,eAAA,EACF;AAAA,aAAA,EAEJ;AAAA;AAAA;AAAA,OACF,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAnJ,cAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,CAAC,CAAC,aAAA;AAAA,QACV,QAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,EAAE,iCAAiC,CAAA;AAAA,QAC1C,OAAA,EACE,aAAA,GACI,CAAA,CAAE,mCAAmC,CAAA,CAAE,OAAA;AAAA,UACrC,UAAA;AAAA,UACA,GAAG,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,aAAA,CAAc,KAAK,QAAQ,CAAA;AAAA,SAChE,GACA,EAAA;AAAA,QAEN,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,QACpC,WAAW,MAAM;AACf,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,KAAK,YAAA,CAAa,aAAA,CAAc,IAAA,CAAK,EAAE,CAAA;AAAA,UACzC;AACA,UAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,QACvB,CAAA;AAAA,QACA,QAAA,EAAU,MAAM,gBAAA,CAAiB,IAAI;AAAA;AAAA;AACvC,GAAA,EACF,CAAA;AAEJ;;;AE/gBA,mBAAA,EAAA;AAeO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAAqB;AACnB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,uBACEU,eAAAA;AAAA,IAAC8E,mBAAAA,CAAO,GAAA;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,GAAA,EAAI;AAAA,MAC3B,SAAA,EAAW,CAAA,uBAAA,EAA0B,OAAA,GAAU,aAAA,GAAgB,WAAW,CAAA,kGAAA,CAAA;AAAA,MAC1E,IAAA,EAAK,OAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAAxF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0GAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,UAACoG,aAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,wCAAA;AAAA,YACV,MAAA,EAAO;AAAA;AAAA,SACT,EACF,CAAA;AAAA,wBACA1F,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iEAAA,EACV,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,0BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mFACV,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,0BACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAA;AAAA,YAAA,OAAA,oBACCA,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,uNAAA;AAAA,gBACV,IAAA,EAAK,QAAA;AAAA,gBAEL,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAAC4D,oBAAAA,EAAA,EAAe,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,kBACvC,EAAE,0BAA0B;AAAA;AAAA;AAAA,aAC/B;AAAA,YAED,gCACClD,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,YAAA;AAAA,gBACT,SAAA,EAAU,uQAAA;AAAA,gBACV,IAAA,EAAK,QAAA;AAAA,gBAEL,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAACoJ,4BAAA,EAAA,EAAuB,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,kBAC/C,EAAE,+BAA+B;AAAA;AAAA;AAAA;AACpC,WAAA,EAEJ;AAAA,SAAA,EACF,CAAA;AAAA,QACC,6BACCpJ,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,SAAA;AAAA,YACT,SAAA,EAAU,sOAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAY,EAAE,iCAAiC,CAAA;AAAA,YAE/C,QAAA,kBAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,WAAU,aAAA,EAAc;AAAA;AAAA;AAC7B;AAAA;AAAA,GAEJ;AAEJ;ATZA,IAAM,6BAAA,GAAgC,GAAA;AACtC,IAAM,yBAAA,GAA4B,GAAA;AAClC,IAAM,yBAAA,GAA4B,GAAA;AAElC,SAAS,eAAA,CAAgB;AAAA,EACvB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,UAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA,GAAqB,KAAA;AAAA,EACrB,6BAAA,GAAgC,KAAA;AAAA,EAChC,wBAAA,GAA2B;AAC7B,CAAA,EAAwC;AACtC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,MAEA,cAAA,EAAe;AACjB,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,MACE,gBAAA,EAAiB;AACrB,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,UAAA,GAAa,SAAS,MAAA,KAAW,UAAA;AACvC,EAAA,MAAM,iBAAiB,OAAA,EAAS,MAAA,GAAS,CAAC,OAAA,CAAQ,OAAO,QAAA,GAAW,KAAA;AACpE,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,QAAA,IAAY,UAAU,KAAK,UAAA,IAAc,cAAA;AAC3E,EAAA,MAAM,gBAAA,GAAmB,oBAAA,CAAqB,eAAA,EAAiB,MAAM,CAAA;AACrE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIhD,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,aAAA,GAAgBH,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAAC,MAAA;AAAA,IAAO;AAC1B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,gBAAA,CAAiB,OAAA,CAAQ,EAAE,CAAA;AAC5C,MAAA,iBAAA,EAAkB;AAClB,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,yBAAA,EAA2B;AAAA,QAC9D,QAAQ,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,QAAQ,EAAA;AAAG,OACrD,CAAC,CAAA;AACF,MAAA,iBAAA,GAAoB,QAAQ,EAAE,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,mBAAmB,iBAAA,EAAmB,OAAA,EAAS,EAAE,CAAC,CAAA;AAElE,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAIG,cAAAA;AAAA,IAC1D;AAAA,GACF;AACA,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAA+B,IAAI,CAAA;AAC7E,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,eAAS,6BAA6B,CAAA;AAC5F,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9E,EAAA,MAAM,kBAAA,GAAqBC,aAAuB,IAAI,CAAA;AAEtD,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,6BAAA;AAChB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,wBAAwB,CAAA;AACnE,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,SAAA,GAAY,MAAA,KAAW,MAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,yBAAA,CAA0B,SAAS,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,6BAAA,EAA+B,wBAAA,EAA0B,kBAAkB,CAAC,CAAA;AAEhF,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,kBAAA,EAAoB;AAAC,MAAA;AAAA,IAAO;AACjC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,MAAA;AAAA,IAAO;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,CAAA,EAAG,wBAAwB,CAAA,MAAA,CAAQ,CAAA;AAC3E,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AACjC,QAAA,IAAI,OAAO,QAAA,CAAS,CAAC,KAAK,CAAA,IAAK,yBAAA,IAA6B,KAAK,yBAAA,EAA2B;AAC1F,UAAA,sBAAA,CAAuB,CAAC,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,CAAC,wBAAA,EAA0B,kBAAkB,CAAC,CAAA;AAGjD,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS,EAAA,IAAM,CAAC,WAAW,kBAAA,EAAoB;AAClD,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,mBAAmB,OAAA,CAAQ,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,KAAY;AAC1D,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,gBAAA,CAAiB,QAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,MACvB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,GAAG,CAAC,OAAA,EAAS,EAAA,EAAI,UAAA,CAAW,kBAAkB,CAAC,CAAA;AAE/C,EAAA,MAAM,0BAAA,GAA6BN,kBAAY,MAAM;AACnD,IAAA,2BAAA,CAA4B,IAAI,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,4BAAA,GAA+BA,iBAAAA;AAAA,IACnC,CAAC,CAAA,KAA2B;AAC1B,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,QAAA,GAAW,EAAA,GAAK,EAAA;AAC/B,MAAA,IAAI,SAAA,GAA2B,IAAA;AAE/B,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAChD,QAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,mBAAA,GAAsB,IAAI,CAAA;AAAA,MAC5E,WAAW,CAAA,CAAE,GAAA,KAAQ,YAAA,IAAgB,CAAA,CAAE,QAAQ,WAAA,EAAa;AAC1D,QAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,mBAAA,GAAsB,IAAI,CAAA;AAAA,MAC5E,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ;AAC3B,QAAA,SAAA,GAAY,yBAAA;AAAA,MACd,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,QAAA,SAAA,GAAY,yBAAA;AAAA,MACd;AAEA,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,sBAAA,CAAuB,SAAS,CAAA;AAChC,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,CAAA,EAAG,wBAAwB,CAAA,MAAA,CAAA,EAAU,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,QACpF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,qBAAqB,wBAAwB;AAAA,GAChD;AAEA,EAAA,MAAM,iBAAA,GAAoBI,aAAO,mBAAmB,CAAA;AACpD,EAAA,iBAAA,CAAkB,OAAA,GAAU,mBAAA;AAE5B,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,wBAAA,EAA0B;AAAC,MAAA;AAAA,IAAO;AAEvC,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAkB;AAC9B,MAAA,MAAM,KAAK,kBAAA,CAAmB,OAAA;AAC9B,MAAA,IAAI,CAAC,EAAA,EAAI;AAAC,QAAA;AAAA,MAAO;AACjB,MAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,OAAA;AACzB,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,yBAAA,EAA2B,KAAK,GAAA,CAAI,yBAAA,EAA2B,CAAC,CAAC,CAAA;AAC1F,MAAA,sBAAA,CAAuB,OAAO,CAAA;AAAA,IAChC,CAAA;AAEA,IAAA,MAAM,KAAK,MAAM;AACf,MAAA,2BAAA,CAA4B,KAAK,CAAA;AACjC,MAAA,IAAI;AACF,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,MAAA,CAAO,YAAA,CAAa,OAAA;AAAA,YAClB,GAAG,wBAAwB,CAAA,MAAA,CAAA;AAAA,YAC3B,MAAA,CAAO,kBAAkB,OAAO;AAAA,WAClC;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,iBAAiB,WAAA,EAAa,IAAA,EAAM,EAAE,OAAA,EAAS,MAAM,CAAA;AAC9D,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,EAAE,CAAA;AACvC,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,YAAA;AAC7B,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,MAAA;AACjC,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAC9C,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,EAAE,CAAA;AAC1C,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,EAAA;AAC7B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,EAAA;AAAA,IACnC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,wBAAA,EAA0B,wBAAwB,CAAC,CAAA;AAEvD,EAAA,IAAI,QAAA,IAAY,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAAC,OAAA,EAAS;AAC9C,IAAA,uBACET,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,CAAA,CAAE,yBAAyB,GAAE,CAAA,EAClF,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,CAAA;AACjD,EAAA,MAAM,kBACJ,OAAA,EAAS,EAAA,KACR,gBAAA,IAAoB,gBAAA,KAAqB,QACtC,gBAAA,GACA,MAAA,CAAA;AAEN,EAAA,MAAM,sBAAA,GAAyB,OAAO,UAAA,CAAW,qBAAA,KAA0B,UAAA;AAC3E,EAAA,MAAM,qBAAA,GAAwB,OAAA,CAAQ,kBAAA,IAAsB,sBAAA,IAA0B,eAAe,CAAA;AACrG,EAAA,MAAM,0BAAA,GAA6B,OAAA;AAAA,IACjC,qBAAA,IAAyB,sBAAA,IAA0B,CAAC,WAAA,IAAe;AAAA,GACrE;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,MAAA,KAAmB;AAC7C,IAAA,UAAA,CAAW,MAAM,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,6BAA6B,MAAM;AACvC,IAAA,MAAM,YAAY,CAAC,sBAAA;AACnB,IAAA,yBAAA,CAA0B,SAAS,CAAA;AAEnC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,wBAAA,EAA0B,SAAA,GAAY,SAAS,OAAO,CAAA;AAClF,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,iCAAA,EAAmC,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MACzG;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,OAAA;AAAA,IACzB,OAAA,EAAS,MAAA,EAAQ,gBAAA,IACd,UAAA,CAAW,SAAA,IACX,UAAA,CAAW,kBAAA,IACX,UAAA,CAAW,gBAAA,IACX,UAAA,CAAW,uBAAA,IACX,UAAA,CAAW;AAAA,GAChB;AAEA,EAAA,MAAM,WAAA,GAAc,qCAClBU,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,mBAAA,CAAoB,IAAI,CAAA;AAAA,MACvC,SAAA,EAAU,mUAAA;AAAA,MACV,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,MAClC,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,MAE7B,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAACqJ,kBAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,QACjC,EAAE,qBAAqB;AAAA;AAAA;AAAA,GAC1B,GACE,IAAA;AAEJ,EAAA,MAAM,aAAA,mBACJ3I,eAAAA,CAAAG,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,WAAA;AAAA,IACA,yCACCH,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,0BAAA;AAAA,QACT,SAAA,EAAW;AAAA,UACT,0HAAA;AAAA,UACA,mFAAA;AAAA,UACA,yBACI,+HAAA,GACA;AAAA,SACN,CAAE,KAAK,GAAG,CAAA;AAAA,QACV,cAAY,sBAAA,GAAyB,CAAA,CAAE,6BAA6B,CAAA,GAAI,EAAE,6BAA6B,CAAA;AAAA,QACvG,eAAA,EAAe,sBAAA;AAAA,QACf,OAAO,sBAAA,GAAyB,CAAA,CAAE,6BAA6B,CAAA,GAAI,EAAE,6BAA6B,CAAA;AAAA,QAElG,QAAA,EAAA;AAAA,0BAAAV,eAACsJ,aAAA,EAAA,EAAQ,SAAA,EAAU,WAAU,MAAA,EAAQ,sBAAA,GAAyB,YAAY,SAAA,EAAW,CAAA;AAAA,UACpF,EAAE,wBAAwB;AAAA;AAAA;AAAA,KAC7B;AAAA,IAED;AAAA,GAAA,EACH,CAAA;AAGF,EAAA,uBACE5I,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,oFAAoF,SAAS,CAAA,CAAA;AAAA,MAEvG,QAAA,EAAA;AAAA,QAAA,UAAA,oBACCV,cAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,MAAA;AAAA,YACA,QAAA,EAAU,iBAAA;AAAA,YACV,QAAA;AAAA,YACA,WAAA,EAAa,aAAA;AAAA,YACb,SAAS,aAAA,KAAkB,OAAA,EAAS,QAAQ,CAAC,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA,CAAA;AAAA,YAC9D,cAAA,EAAgB,kBAAA,GAAqB,MAAM,mBAAA,CAAoB,IAAI,CAAA,GAAI;AAAA;AAAA,SACzE;AAAA,QAED,yBACCA,cAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,iBAAiB,SAAA,GAAY,OAAA;AAAA,YACtC,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,YAC/B,OAAA,EAAS,KAAA;AAAA,YACT,SAAA,EAAW,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,YAC9B,OAAA,EAAS,iBAAiB,iBAAA,GAAoB;AAAA;AAAA,SAChD;AAAA,wBAGFU,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,kBAAA;AAAA,YAOL,SAAA,EAAU,4CAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCACZ,QAAA,EAAA,WAAA,mBACCA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCACb,QAAA,kBAAAA,cAAAA,CAAC,SAAI,SAAA,EAAU,mDAAA,EACb,0BAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,WAAA,oBACCV,cAAAA,CAAC,sBAAA,EAAA,EAAe,gBAAgB,kBAAA,EAAoB,QAAA,EAAU,WAAW,gBAAA,EAAkB,CAAA;AAAA,gBAE5F,+BACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACb,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO,WAAA;AAAA,oBACP,OAAA,EAAO,IAAA;AAAA,oBACP,OAAA,EAAS,oBAAA,GAAuB,MAAM,KAAK,kBAAiB,GAAI,MAAA;AAAA,oBAChE,SAAA,EAAW;AAAA;AAAA,iBACb,EACF,CAAA;AAAA,gBAED,CAAC,iBAAA,IAAqB,eAAA;AAAA,gBACtB,CAAC,qCACAA,cAAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACC,OAAA;AAAA,oBACA,OAAA;AAAA,oBACA,WAAA;AAAA,oBACA,QAAA;AAAA,oBACA,YAAA,EAAc,UAAA;AAAA,oBACd,mBAAA,EAAqB,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,oBAC7C,SAAA;AAAA,oBACA,iBAAA,EAAmB,iBAAA;AAAA,oBACnB,WAAA;AAAA,oBACA,eAAA,EAAiB,UAAA;AAAA,oBACjB,QAAA,EAAU,YAAA;AAAA,oBACV,YAAA;AAAA,oBACA,SAAA,EAAW,aAAA;AAAA,oBACX,iBAAA,EAAmB,eAAA;AAAA,oBACnB,iBAAA,EAAmB,eAAA;AAAA,oBACnB,iBAAA,EAAmB,MAAA;AAAA,oBACnB,kBAAA,EAAmB,WAAA;AAAA,oBACnB,aAAA,EAAc,SAAA;AAAA,oBACd,QAAA,EAAU,gBAAA;AAAA,oBACV,sBAAA;AAAA,oBACA,eAAA;AAAA,oBACA,uBAAA,EAAyB;AAAA;AAAA,iBAC3B;AAAA,gCAEFA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,gEAAA,EACV,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAChC;AAAA,eAAA,EACF,GACF,CAAA,EACF,CAAA,mBAEAU,eAAAA,CAAAG,qBAAA,EACG,QAAA,EAAA;AAAA,gBAAA,UAAA,oBACCb,cAAAA;AAAA,kBAAC,qBAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAI,IAAA;AAAA,oBACJ,SAAA,EAAW,aAAA;AAAA,oBACX;AAAA;AAAA,iBACF;AAAA,gCAEFA,cAAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBACC,cAAA;AAAA,oBACA,mBAAA;AAAA,oBACA,aAAA;AAAA,oBACA,QAAA,EAAU;AAAA;AAAA,iBACZ;AAAA,gCACAA,cAAAA,CAACqH,4BAAAA,EAAA,EACE,QAAA,EAAA,YAAA,oBACCrH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,wBAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO,EAAE,8BAA8B,CAAA;AAAA,oBACvC,QAAA,EAAU,EAAE,iCAAiC;AAAA;AAAA,mBAEjD,CAAA,EAEJ,CAAA;AAAA,gBACC,+BACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACb,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO,WAAA;AAAA,oBACP,OAAA,EAAO,IAAA;AAAA,oBACP,OAAA,EAAS,oBAAA,GAAuB,MAAM,KAAK,kBAAiB,GAAI,MAAA;AAAA,oBAChE,SAAA,EAAW;AAAA;AAAA,iBACb,EACF,CAAA;AAAA,gBAED,CAAC,iBAAA,IAAqB,eAAA;AAAA,gBACtB,CAAC,qCACAA,cAAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACC,OAAA;AAAA,oBACA,OAAA;AAAA,oBACA,WAAA;AAAA,oBACA,QAAA;AAAA,oBACA,YAAA,EAAc,UAAA;AAAA,oBACd,mBAAA,EAAqB,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,oBAC7C,SAAA;AAAA,oBACA,iBAAA,EAAmB,iBAAA;AAAA,oBACnB,WAAA;AAAA,oBACA,eAAA,EAAiB,UAAA;AAAA,oBACjB,QAAA,EAAU,YAAA;AAAA,oBACV,YAAA;AAAA,oBACA,SAAA,EAAW,aAAA;AAAA,oBACX,iBAAA,EAAmB,eAAA;AAAA,oBACnB,iBAAA,EAAmB,eAAA;AAAA,oBACnB,iBAAA,EAAmB,MAAA;AAAA,oBACnB,QAAA,EAAU,gBAAA;AAAA,oBACV,sBAAA;AAAA,oBACA,eAAA;AAAA,oBACA,uBAAA,EAAyB;AAAA;AAAA;AAC3B,eAAA,EAEJ,CAAA,EAEJ,CAAA;AAAA,8BAGAA,cAAAA;AAAA,gBAACwF,mBAAAA,CAAO,GAAA;AAAA,gBAAP;AAAA,kBACC,SAAA,EAAU,oDAAA;AAAA,kBACV,OAAA,EAAS;AAAA,oBACP,KAAA,EAAO,0BAAA,IAA8B,eAAA,GAAkB,mBAAA,GAAsB;AAAA,mBAC/E;AAAA,kBACA,UAAA,EACE,wBAAA,GACI,EAAE,QAAA,EAAU,CAAA,EAAE,GACd,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,EAAA,EAAG;AAAA,kBAGnD,QAAA,EAAA,0BAAA,IAA8B,mCAC7B9E,eAAAA;AAAA,oBAAC8E,mBAAAA,CAAO,GAAA;AAAA,oBAAP;AAAA,sBACC,SAAA,EAAU,cAAA;AAAA,sBACV,KAAA,EAAO,EAAE,KAAA,EAAO,mBAAA,EAAoB;AAAA,sBACpC,OAAA,EAAS,EAAE,CAAA,EAAG,MAAA,EAAO;AAAA,sBACrB,OAAA,EAAS,EAAE,CAAA,EAAG,CAAA,EAAE;AAAA,sBAChB,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA,sBAE1D,QAAA,EAAA;AAAA,wCAAAxF,cAAAA;AAAA,0BAAC,KAAA;AAAA,0BAAA;AAAA,4BACC,IAAA,EAAK,WAAA;AAAA,4BACL,QAAA,EAAU,CAAA;AAAA,4BACV,YAAA,EAAY,EAAE,yBAAyB,CAAA;AAAA,4BACvC,kBAAA,EAAiB,UAAA;AAAA,4BACjB,eAAA,EAAe,mBAAA;AAAA,4BACf,eAAA,EAAe,yBAAA;AAAA,4BACf,eAAA,EAAe,yBAAA;AAAA,4BACf,WAAA,EAAa,0BAAA;AAAA,4BACb,SAAA,EAAW,4BAAA;AAAA,4BACX,SAAA,EAAU,gbAAA;AAAA,4BAEV,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4KAAA,EAA6K;AAAA;AAAA,yBAC/L;AAAA,wCACAA,cAAAA;AAAA,0BAAC,qBAAA;AAAA,0BAAA;AAAA,4BACC,UAAA;AAAA,4BACA,SAAA,EAAW,eAAA;AAAA,4BACX,WAAA;AAAA,4BACA,WAAW,CAAC,iBAAA;AAAA,4BACZ,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA;AACF;AAAA,eAEJ;AAAA,8BAEAA,cAAAA,CAACqH,4BAAAA,EAAA,EACE,QAAA,EAAA,0BAAA,IAA8B,mCAC7B3G,eAAAA;AAAA,gBAAC8E,mBAAAA,CAAO,GAAA;AAAA,gBAAP;AAAA,kBAEC,SAAA,EAAU,mCAAA;AAAA,kBACV,OAAA,EAAS,EAAE,CAAA,EAAG,MAAA,EAAO;AAAA,kBACrB,OAAA,EAAS,EAAE,CAAA,EAAG,CAAA,EAAE;AAAA,kBAChB,IAAA,EAAM,EAAE,CAAA,EAAG,MAAA,EAAO;AAAA,kBAClB,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA,kBAC1D,IAAA,EAAK,QAAA;AAAA,kBACL,YAAA,EAAW,MAAA;AAAA,kBAEX,QAAA,EAAA;AAAA,oCAAAxF,cAAAA;AAAA,sBAACwF,mBAAAA,CAAO,MAAA;AAAA,sBAAP;AAAA,wBACC,IAAA,EAAK,QAAA;AAAA,wBACL,SAAA,EAAU,mCAAA;AAAA,wBACV,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,wBACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,wBACtB,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,wBACnB,OAAA,EAAS,0BAAA;AAAA,wBACT,YAAA,EAAY,EAAE,qBAAqB;AAAA;AAAA,qBACrC;AAAA,oCACAxF,cAAAA;AAAA,sBAAC,qBAAA;AAAA,sBAAA;AAAA,wBACC,UAAA;AAAA,wBACA,SAAA,EAAW,eAAA;AAAA,wBACX,WAAA;AAAA,wBACA,WAAW,CAAC,iBAAA;AAAA,wBACZ,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,iBAAA;AAAA,gBAxBI;AAAA,eAyBN,EAEJ;AAAA;AAAA;AAAA,SACF;AAAA,QACC,sCACCA,cAAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,gBAAA;AAAA,YACR,WAAW,OAAA,EAAS,EAAA;AAAA,YACpB,UAAA;AAAA,YACA,OAAA,EAAS,MAAM,mBAAA,CAAoB,KAAK;AAAA;AAAA;AAC1C;AAAA;AAAA,GAEJ;AAEJ;AAEO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,aAAa,gBAAA,EAAkB,GAAG,WAAU,GAAI,KAAA;AAE/E,EAAA,uBACEA,cAAAA;AAAA,IAAC,mBAAA;AAAA,IAAA;AAAA,MACC,UAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MAEA,QAAA,kBAAAA,cAAAA,CAAC,eAAA,EAAA,EAAgB,UAAA,EAAyB,GAAG,SAAA,EAAW;AAAA;AAAA,GAC1D;AAEJ;AUnnBA,gBAAA,EAAA;AACA,mBAAA,EAAA;AAQO,SAAS,aAAA,GAAgB;AAC9B,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,cAAA,EAAe;AAC3C,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,MAAM,MAAA,GAAuBQ,aAAAA;AAAA,IAC3B,MAAM,OAAA,CAAQ,UAAA,EAAY,GAAA,EAAK,UAAU,EAAC;AAAA,IAC1C,CAAC,OAAA,CAAQ,UAAA,EAAY,GAAA,EAAK,MAAM;AAAA,GAClC;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA;AAC9D,EAAA,MAAM,YAAA,GAAe,SAAS,YAAA,EAAc,EAAA;AAG5C,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,YAAA,EAAc;AAC1B,MAAA,QAAA,CAAS,aAAa,EAAE,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,YAAA,EAAc,QAAQ,CAAC,CAAA;AAGlC,EAAA,MAAM,WAAA,GAAcN,kBAAY,MAAM;AACpC,IAAA,MAAM,eAAe,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,YAAY,CAAA;AAClE,IAAA,MAAM,SAAA,GAAA,CAAa,YAAA,GAAe,CAAA,IAAK,MAAA,CAAO,MAAA;AAC9C,IAAA,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA,CAAE,EAAE,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,YAAA,EAAc,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAEnC,EAAAM,gBAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAqB;AACpC,MAAA,MAAM,iBAAA,GAAoB,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA;AACzC,MAAA,MAAM,gBAAgB,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CAAE,GAAA,CAAI,aAAY,KAAM,GAAA;AAEnE,MAAA,IAAI,qBAAqB,CAAA,CAAE,QAAA,IAAY,CAAC,CAAA,CAAE,UAAU,aAAA,EAAe;AACjE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,WAAA,EAAY;AAAA,MACd;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAC5C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,OAAO,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEpC,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,SAAI,SAAA,EAAU,2DAAA,EACZ,iBAAO,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACpB,MAAA,MAAM,QAAA,GAAW,EAAE,EAAA,KAAO,YAAA;AAC1B,MAAA,MAAM,SAAS,CAAA,KAAM,CAAA;AACrB,MAAA,uBACEU,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA;AAAA,UAC5B,SAAA,EAAW;AAAA;AAAA,gBAAA,EAGP,QAAA,GACI,MAAA,GACE,wEAAA,GACA,sEAAA,GACF,+EACN;AAAA,cAAA,CAAA;AAAA,UAGD,QAAA,EAAA;AAAA,YAAA,MAAA,mBAASV,cAAAA,CAACyG,eAAAA,EAAA,EAAU,IAAA,EAAM,IAAI,MAAA,EAAO,MAAA,EAAO,CAAA,mBAAKzG,eAACuH,WAAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,4BACjFvH,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,CAAA,CAAE,KAAK,CAAA,EAAE;AAAA;AAAA,SAAA;AAAA,QAfb,CAAA,CAAE;AAAA,OAgBT;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0EAAA,EACb,QAAA,EAAA;AAAA,MAAA,SAAA,CAAU,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,MAAQ,QAAA;AAAA,MAAS;AAAA,KAAA,EACpE;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACnEA,qBAAA,EAAA;AACA,cAAA,EAAA;ACCA,IAAM6I,YAAAA,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,GAAQA,aAAY,IAAI,CAAA;AAC9B,EAAA,MAAMC,wBAAuBnB,6BAAAA,EAAiB;AAC9C,EAAA,MAAM,QAAA,GAAWmB,wBAAuB,CAAA,GAAI,GAAA;AAE5C,EAAA,uBACExJ,cAAAA;AAAA,IAACwF,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,kBAAA9E,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAEZ,QAAA,EAAA;AAAA,QAAA,IAAA,oBACCV,cAAAA;AAAA,UAACwF,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,YAAY,EAAE,QAAA,EAAU,KAAA,EAAOgE,qBAAAA,GAAuB,IAAI,GAAA,EAAI;AAAA,YAE7D,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAIFxJ,cAAAA;AAAA,UAACwF,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,YAAY,EAAE,QAAA,EAAU,KAAA,EAAOgE,qBAAAA,GAAuB,IAAI,GAAA,EAAI;AAAA,YAE7D,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAGC,+BACCxJ,cAAAA;AAAA,UAACwF,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,YAAY,EAAE,QAAA,EAAU,KAAA,EAAOgE,qBAAAA,GAAuB,IAAI,GAAA,EAAI;AAAA,YAE7D,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAID,0BACCxJ,cAAAA;AAAA,UAACwF,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,YAAY,EAAE,QAAA,EAAU,KAAA,EAAOgE,qBAAAA,GAAuB,IAAI,GAAA,EAAI;AAAA,YAE7D,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;AAEA,IAAM,kBAAA,GAAqBxI,WAAK,UAAU;AAC1C,kBAAA,CAAmB,WAAA,GAAc,YAAA;;;ACxGjC,mBAAA,EAAA;AA4BA,IAAMuI,YAAAA,GAAc;AAAA,EAClB,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAexB,gBAAAA;AAAA,EACnB,CACE;AAAA,IACE,KAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,GAAY,GAAA;AAAA,IACZ,SAAA,GAAY,KAAA;AAAA,IACZ,WAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,cAAA,GAAiB,EAAA;AAAA,IACjB,IAAA,GAAO;AAAA,KAET,GAAA,KACG;AACH,IAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,IAAA,MAAM,mBAAA,GAAsB,WAAA,IAAe,CAAA,CAAE,wBAAwB,CAAA;AACrE,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIzH,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,QAAA,GAAWC,aAAyB,IAAI,CAAA;AAG9C,IAAAyH,yBAAAA,CAAoB,KAAK,OAAO;AAAA,MAC9B,cAAc,MAAM;AAClB,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB,CAAA;AAAA,MACA,eAAe,MAAM;AACnB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,KACF,CAAE,CAAA;AAGF,IAAAvH,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,CAAA,CAAE,eAAA,EAAgB;AAElB,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,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAA;AAEA,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY8I,aAAY,IAAI,CAAA;AAElC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,uBACEvJ,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,gCAAA;AAAA,UACV,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,UACpB,CAAA;AAAA,UACA,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAExC,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,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,cAClC,MAAA,EAAQ,UAAA;AAAA,cACR,SAAA;AAAA,cACA,WAAA,EAAa,mBAAA;AAAA,cACb,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,cAClC,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,cACxC,SAAA,EAAW,CAAA,iBAAA,EAAoB,SAAS,CAAA,+OAAA,EAAkP,cAAc,CAAA,CAAA;AAAA,cACxS,YAAA,EAAY,EAAE,+BAA+B;AAAA;AAAA;AAC/C;AAAA,OACF;AAAA,IAEJ;AAEA,IAAA,MAAM,eAAe,KAAA,IAAS,mBAAA;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,EAAO,EAAE,uCAAuC,CAAA;AAAA,QAChD,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,mBACCU,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iEAAA,EACd,QAAA,EAAA;AAAA,0BAAAV,eAACuG,iBAAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI,WAAU,cAAA,EAAe,CAAA;AAAA,0BAChDvG,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,IAAM,oBAAA,GAAuBgB,WAAK,YAAY;;;AC3L9C,mBAAA,EAAA;AAyBA,IAAMuI,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;AAAA,EACA,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;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,mBAAA,GAAsB,WAAA,IAAe,CAAA,CAAE,sBAAsB,CAAA;AACnE,EAAA,MAAM,iBAAA,GAAoB,SAAA,IAAa,CAAA,CAAE,sBAAsB,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAWhJ,aAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQgJ,aAAY,IAAI,CAAA;AAE9B,EAAA9I,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,uBACEC,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,mBAAmB,SAAS,CAAA,CAAA,EAAI,MAAK,QAAA,EAEnD,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iEAAA,EACd,QAAA,kBAAAA,cAAAA;AAAA,MAACuF,qBAAAA;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,oBAGAvF,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,EAAa,mBAAA;AAAA,QACb,QAAA;AAAA,QACA,SAAA,EAAW,CAAA,OAAA,EAAU,KAAA,CAAM,SAAS,CAAA,2YAAA,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,4DAAA,EAA+D,KAAA,CAAM,QAAQ,CAAA,8JAAA,CAAA;AAAA,QACxF,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,QACnC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,QAE9B,QAAA,kBAAAA,eAACsD,OAAAA,EAAA,EAAE,MAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,MAAA,EAAO,MAAA,EAAO;AAAA;AAAA;AACzC,GAAA,EAEJ,CAAA;AAEJ;AAEA,IAAM,mBAAA,GAAsBtC,WAAK,WAAW;AAC5C,mBAAA,CAAoB,WAAA,GAAc,aAAA;AAGlC,IAAO,mBAAA,GAAQ,mBAAA;AC5Gf,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,uBACEhB,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,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,kCAAA,EAAqC,SAAS,CAAA,CAAA,EAC5D,QAAA,EAAA;AAAA,oBAAAV,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,IAAM,gBAAA,GAAmBgB,WAAK,QAAQ;AACtC,gBAAA,CAAiB,WAAA,GAAc,UAAA;;;AJ1H/B,cAAA,EAAA;AKlCA,SAAS,aAAA,CAAc;AAAA,EACrB,IAAA,GAAO,IAAA;AAAA,EACP;AACF,CAAA,EAGG;AACD,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,EAAA,EAAI,EAAA;AAAA,IACJ,EAAA,EAAI,EAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,MAAMuI,YAAAA,GAAc;AAAA,IAClB,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,uBACE7I,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAA4C,IAAA,EAAK,QAAA,EAAS,aAAU,QAAA,EACjF,QAAA,EAAA;AAAA,oBAAAV,cAAAA;AAAA,MAACuG,iBAAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,QAAQ,IAAI,CAAA;AAAA,QAClB,SAAA,EAAW,CAAA,EAAGgD,YAAAA,CAAY,IAAI,CAAC,CAAA,qEAAA;AAAA;AAAA,KACjC;AAAA,IACC,2BAAWvJ,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDAAiD,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACpF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,IAAA,GAAO,IAAA;AAAA,EACP;AACF,CAAA,EAGG;AACD,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,EAAA,EAAI,aAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,MAAMyJ,WAAAA,GAAa;AAAA,IACjB,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,OAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,uBACE/I,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAA4C,IAAA,EAAK,QAAA,EAAS,aAAU,QAAA,EACjF,QAAA,EAAA;AAAA,oBAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,KAAA,EAAQyJ,WAAAA,CAAW,IAAI,CAAC,CAAA,CAAA,EACrC,QAAA,EAAA,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,0BACdzJ,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,CAAA,EAAG,cAAA,CAAe,IAAI,CAAC,CAAA,kFAAA,CAAA;AAAA,QAClC,OAAO,EAAE,cAAA,EAAgB,CAAA,EAAG,KAAA,GAAQ,IAAI,CAAA,CAAA,CAAA;AAAI,OAAA;AAAA,MAFvC;AAAA,KAIR,CAAA,EACH,CAAA;AAAA,IACC,2BAAWA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDAAiD,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACpF,CAAA;AAEJ;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA,GAAO,IAAA;AAAA,EACP;AACF,CAAA,EAGG;AACD,EAAA,MAAMuJ,YAAAA,GAAc;AAAA,IAClB,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,uBACE7I,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAA4C,IAAA,EAAK,QAAA,EAAS,aAAU,QAAA,EACjF,QAAA,EAAA;AAAA,oBAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAGuJ,YAAAA,CAAY,IAAI,CAAC,CAAA,iFAAA,CAAA,EAAqF,CAAA;AAAA,IACxH,2BAAWvJ,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDAAiD,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACpF,CAAA;AAEJ;AAEA,SAAS,eAAe,EAAE,OAAA,GAAU,WAAW,IAAA,GAAO,IAAA,EAAM,SAAQ,EAAwB;AAC1F,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,MAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAY,OAAA,EAAkB,CAAA;AAAA,IACnD,KAAK,OAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAY,OAAA,EAAkB,CAAA;AAAA,IACpD,KAAK,SAAA;AAAA,IACL;AACE,MAAA,uBAAOA,cAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAY,OAAA,EAAkB,CAAA;AAAA;AAE1D;AAEA,IAAM,sBAAA,GAAyBgB,WAAK,cAAc;AAClD,sBAAA,CAAuB,WAAA,GAAc,gBAAA;AAGrC,IAAO,sBAAA,GAAQ,sBAAA;;;ALlEf,sBAAA,EAAA;AACA,oBAAA,EAAA;;;AM3CA,mBAAA,EAAA;AAcA,IAAM,UAAA,GAGF;AAAA,EACF,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,wCAAA;AAAA,IACR,EAAA,EAAI,uFAAA;AAAA,IACJ,IAAA,EAAM,uCAAA;AAAA,IACN,QAAA,EAAU,oCAAA;AAAA,IACV,MAAA,EAAQsF;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,gCAAA;AAAA,IACR,EAAA,EAAI,uEAAA;AAAA,IACJ,IAAA,EAAM,+BAAA;AAAA,IACN,QAAA,EAAU,4BAAA;AAAA,IACV,MAAA,EAAQD;AAAA,GACV;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,kCAAA;AAAA,IACR,EAAA,EAAI,2EAAA;AAAA,IACJ,IAAA,EAAM,iCAAA;AAAA,IACN,QAAA,EAAU,8BAAA;AAAA,IACV,MAAA,EAAQiC;AAAA,GACV;AAAA,EACA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,oCAAA;AAAA,IACR,EAAA,EAAI,+EAAA;AAAA,IACJ,IAAA,EAAM,mCAAA;AAAA,IACN,QAAA,EAAU,gCAAA;AAAA,IACV,MAAA,EAAQlC;AAAA;AAEZ,CAAA;AAEA,IAAM,kBAAA,GAAqB,kCAAA;AAC3B,IAAI,gBAAA,GAA0C,IAAA;AAC9C,SAAS,mBAAA,GAA6C;AACpD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAChD,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,gBAAA,GAAmB,MAAA,CAAO,WAAW,kBAAkB,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,gBAAA;AACT;AACA,SAAS,uBAAuB,QAAA,EAAkC;AAChE,EAAA,MAAM,MAAM,mBAAA,EAAoB;AAChC,EAAA,IAAI,CAAC,GAAA,EAAK;AAAC,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAAE;AAC3B,EAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACvC,EAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AACzD;AACA,SAAS,wBAAA,GAAoC;AAC3C,EAAA,MAAM,MAAM,mBAAA,EAAoB;AAChC,EAAA,OAAO,GAAA,GAAM,IAAI,OAAA,GAAU,KAAA;AAC7B;AACA,SAAS,8BAAA,GAA0C;AACjD,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,KAAA,CAAM;AAAA,EACpB,EAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,GAAW,GAAA;AAAA,EACX,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAe;AACb,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,oBAAA,GAAuB,YAAA,IAAgB,CAAA,CAAE,iCAAiC,CAAA;AAChF,EAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,EAAA,MAAM,OAAO,MAAA,CAAO,MAAA;AACpB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI9F,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,YAAA,GAAeC,aAAO,QAAQ,CAAA;AACpC,EAAA,MAAM,QAAA,GAAWA,YAAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAElC,EAAA,MAAMiJ,qBAAAA,GAAuBlI,0BAAAA;AAAA,IAC3B,sBAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAAb,gBAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,MAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AACvD,IAAA,OAAO,MAAM,qBAAqB,KAAK,CAAA;AAAA,EACzC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AAAC,MAAA;AAAA,IAAO;AAEpB,IAAA,QAAA,CAAS,OAAA,GAAU,KAAK,GAAA,EAAI;AAC5B,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,OAAA,CAAQ,KAAK,CAAA;AAEb,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,EAAE,CAAA,EAAG,GAAG,CAAA;AAAA,IACrC,CAAA,EAAG,aAAa,OAAO,CAAA;AAEvB,IAAA,OAAO,MAAM;AAEX,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,CAAS,OAAA;AACtC,MAAA,YAAA,CAAa,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,CAAa,UAAU,OAAO,CAAA;AACjE,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,EAAA,EAAI,MAAA,EAAQ,SAAS,CAAC,CAAA;AAE1B,EAAA,MAAM,aAAA,GAAgBN,kBAAY,MAAM;AACtC,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,UAAA,CAAW,MAAM,SAAA,CAAU,EAAE,CAAA,EAAG,GAAG,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,EAAA,EAAI,SAAS,CAAC,CAAA;AAElB,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,OAAA,GAAU,WAAA,GAAc,QAAA;AAClD,EAAA,MAAM,IAAA,GAAO,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,YAAY,OAAA,GAAU,QAAA;AAEhE,EAAA,uBACEH,cAAAA;AAAA,IAAC0J,kBAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,KAAA,EAAM,kCAAA;AAAA,MACN,SAAA,EAAU,mCAAA;AAAA,MACV,OAAA,EAAQ,qCAAA;AAAA,MACR,KAAA,EAAM,iCAAA;AAAA,MACN,SAAA,EAAU,qCAAA;AAAA,MACV,OAAA,EAAQ,mCAAA;AAAA,MAER,QAAA,kBAAAhJ,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAA,uKAAA,EAA0K,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,UAC9L,IAAA;AAAA,UACA,WAAA,EAAW,QAAA;AAAA,UACX,aAAA,EAAY,MAAA;AAAA,UACZ,YAAA,EAAc,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,UAClC,YAAA,EAAc,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,UAGnC,QAAA,EAAA;AAAA,4BAAAV,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,oEAAA,EAAuE,MAAA,CAAO,IAAI,CAAA,CAAA,EAChG,QAAA,kBAAAA,cAAAA,CAAC,IAAA,EAAA,EAAK,MAAM,EAAA,EAAI,SAAA,EAAW,OAAO,MAAA,EAAQ,MAAA,EAAO,QAAO,CAAA,EAC1D,CAAA;AAAA,4BAGAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mFACV,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,YAGC,0BACCA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAS,MAAM;AACb,kBAAA,MAAA,CAAO,OAAA,EAAQ;AACf,kBAAA,aAAA,EAAc;AAAA,gBAChB,CAAA;AAAA,gBACA,SAAA,EAAW,CAAA,+LAAA,EAAkM,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,gBAEzN,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,aACV;AAAA,4BAIFA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,aAAA;AAAA,gBACT,SAAA,EAAU,iNAAA;AAAA,gBACV,YAAA,EAAY,oBAAA;AAAA,gBAEZ,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,aAC7B;AAAA,4BAGAtD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEACb,QAAA,kBAAAA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,OAAA,EAAU,MAAA,CAAO,QAAQ,CAAA,uCAAA,CAAA;AAAA,gBACpC,KAAA,EACEwJ,qBAAAA,GACI,EAAC,GACD;AAAA,kBACE,SAAA,EAAW,yBAAyB,QAAQ,CAAA,kBAAA,CAAA;AAAA,kBAC5C,kBAAA,EAAoB,SAAS,QAAA,GAAW;AAAA;AAC1C;AAAA,aAER,EACF;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;;ACtMA,mBAAA,EAAA;AASO,SAAS,cAAA,CAAe,EAAE,MAAA,EAAQ,SAAA,EAAW,cAAa,EAAwB;AACvF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEtC,EAAA,uBACExJ,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,EAAE,6BAA6B,CAAA;AAAA,MAC3C,SAAA,EAAU,0FAAA;AAAA,MAET,iBAAO,GAAA,CAAI,CAAC,0BACXA,cAAAA,CAAC,SAAmB,SAAA,EAAU,qBAAA,EAC5B,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAO,GAAG,KAAA,EAAO,SAAA,EAAsB,cAA4B,CAAA,EAAA,EAD5D,KAAA,CAAM,EAEhB,CACD;AAAA;AAAA,GACH;AAEJ;ACeO,SAAS,eAAA,CAAgB;AAAA,EAC9B,WAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,aAAA,EAAA2J,cAAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX;AACF,CAAA,EAAyB;AAEvB,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,uBAAO3J,cAAAA,CAAAa,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAAA,EACrB;AAGA,EAAA,MAAM,YACJ,IAAA,KAAS,KAAA,GACL,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,KAAM8I,cAAAA,CAAc,CAAC,CAAC,IACzC,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAMA,cAAAA,CAAc,CAAC,CAAC,CAAA;AAE9C,EAAA,OAAO,SAAA,mBAAY3J,cAAAA,CAAAa,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA,mBAAMb,cAAAA,CAAAa,mBAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AACnD;;;AC5DA,mBAAA,EAAA;AAgCA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,kBAAA,GAAqB,UAAA,IAAc,CAAA,CAAE,wBAAwB,CAAA;AACnE,EAAA,MAAM,kBAAA,GAAqB,UAAA,IAAc,CAAA,CAAE,iCAAiC,CAAA;AAC5E,EAAA,uBACEH,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EAEb,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yFAAA,EAA0F,eAAY,MAAA,EACnH,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EAAkD,OAAA,EAAQ,aAAA,EAAc,MAAK,cAAA,EAC1F,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,YAAO,EAAA,EAAG,KAAA,EAAM,IAAG,KAAA,EAAM,CAAA,EAAE,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAM,CAAA;AAAA,sBAC/CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAA,EAAM,IAAG,KAAA,EAAM,CAAA,EAAE,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAM,CAAA;AAAA,sBAC/CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAA,EAAM,IAAG,KAAA,EAAM,CAAA,EAAE,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAM;AAAA,KAAA,EACjD,CAAA,EACF,CAAA;AAAA,oBAEAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EAEb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EAAgF,CAAA;AAAA,wBAC/FA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iJACb,QAAA,kBAAAA,cAAAA,CAAC4I,mBAAAA,EAAA,EAAc,MAAM,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC,MAAA,EAAO,QAAO,CAAA,EACpF;AAAA,OAAA,EACF,CAAA;AAAA,sBAEA5I,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8DAA8D,QAAA,EAAA,kBAAA,EAAmB,CAAA;AAAA,sBAC/FA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0EACV,QAAA,EAAA,KAAA,EAAO,OAAA,IAAW,CAAA,CAAE,8BAA8B,CAAA,EACrD,CAAA;AAAA,MAEC,2BACCU,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,OAAA;AAAA,UACT,SAAA,EAAU,yJAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAV,eAAC4D,oBAAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,YACvC;AAAA;AAAA;AAAA;AACH,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAKA,SAAS,2BAAA,CAA4B;AAAA,EACnC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,uBACE5D,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,sBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EAA6D,CAAA;AAAA,sBAC5EA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uGACb,QAAA,kBAAAA,cAAAA,CAAC4I,mBAAAA,EAAA,EAAc,MAAM,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,MAAA,EAAO,QAAO,CAAA,EAClE;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA5I,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4CAAA,EAA8C,uBAAa,sBAAA,EAAuB,CAAA;AAAA,oBAChGA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDACV,QAAA,EAAA,KAAA,EAAO,OAAA,IAAW,gBAAgB,kCAAA,EACrC,CAAA;AAAA,IAEC,2BACCU,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,OAAA;AAAA,QACT,SAAA,EAAU,yJAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAV,eAAC4D,oBAAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,UACvC,SAAA,IAAa;AAAA;AAAA;AAAA;AAChB,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;AAEA,IAAM,aAAA,GAAN,cAA4BgG,eAAA,CAAkD;AAAA,EAC5E,YAAY,KAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,cAAA,EAAgB,KAAA,EAAM;AAAA,EACvC;AAAA,EAEA,OAAO,wBAAA,GAA+C;AACpD,IAAA,OAAO,EAAE,gBAAgB,IAAA,EAAK;AAAA,EAChC;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAAA,EAAsB;AACpD,IAAA,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,KAAA,EAAO,SAAS,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAA,GAAS;AACP,IAAA,IAAI,IAAA,CAAK,MAAM,cAAA,EAAgB;AAC7B,MAAA,uBACE5J,cAAAA;AAAA,QAAC,2BAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,KAAK,KAAA,CAAM,YAAA;AAAA,UAClB,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,UACpB,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,aAAA,EAAe,KAAA;AAAA,UACrC,YAAA,EAAc,IAAA,CAAK,KAAA,CAAM,aAAA,EAAe,QAAA;AAAA,UACxC,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,aAAA,EAAe;AAAA;AAAA,OACvC;AAAA,IAEJ;AACA,IAAA,OAAO,IAAA,CAAK,MAAM,cAAA,EAAe;AAAA,EACnC;AACF,CAAA;AAEA,IAAM,aAAA,GAAN,cAA4B4J,eAAA,CAAkD;AAAA,EAC5E,YAAY,KAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA;AAab,IAAA,IAAA,CAAA,WAAA,GAAc,MAAM;AAClB,MAAA,IAAA,CAAK,SAAS,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,IAAA,CAAA,mBAAA,GAAsB,CAAC,OAAc,SAAA,KAAyB;AAC5D,MAAA,OAAA,CAAQ,MAAM,wCAAA,EAA0C;AAAA,QACtD,YAAA,EAAc,KAAK,KAAA,CAAM,KAAA;AAAA,QACzB,aAAA,EAAe,KAAA;AAAA,QACf;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAA,EAAO,SAAS,CAAA;AAAA,IACvC,CAAA;AAvBE,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,EAC9C;AAAA,EAEA,OAAO,yBAAyB,KAAA,EAAkC;AAChE,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,EACjC;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAAA,EAAsB;AACpD,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAA,EAAyC,KAAA,EAAO,SAAS,CAAA;AACvE,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAA,EAAO,SAAS,CAAA;AAAA,EACvC;AAAA,EAeA,MAAA,GAAS;AACP,IAAA,IAAI,IAAA,CAAK,MAAM,QAAA,EAAU;AACvB,MAAA,uBACE5J,cAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UAEC,YAAA,EAAc,KAAK,KAAA,CAAM,KAAA;AAAA,UACzB,SAAS,IAAA,CAAK,WAAA;AAAA,UACd,iBAAiB,IAAA,CAAK,mBAAA;AAAA,UACtB,aAAA,EAAe,KAAK,KAAA,CAAM,gBAAA;AAAA,UAC1B,gBAAgB,MAAM;AAEpB,YAAA,IAAI,IAAA,CAAK,MAAM,QAAA,EAAU;AACvB,cAAA,IAAI,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,KAAa,UAAA,EAAY;AAC7C,gBAAA,OAAO,KAAK,KAAA,CAAM,QAAA,CAAS,KAAK,KAAA,CAAM,KAAA,EAAO,KAAK,WAAW,CAAA;AAAA,cAC/D;AACA,cAAA,OAAO,KAAK,KAAA,CAAM,QAAA;AAAA,YACpB;AAGA,YAAA,uBAAOA,eAAC,mBAAA,EAAA,EAAoB,KAAA,EAAO,KAAK,KAAA,CAAM,KAAA,EAAO,OAAA,EAAS,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,UAClF;AAAA,SAAA;AAAA,QAhBK,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,IAAA,IAAQ,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW,EAAE,CAAA;AAAA,OAiB9E;AAAA,IAEJ;AAEA,IAAA,OAAO,KAAK,KAAA,CAAM,QAAA;AAAA,EACpB;AACF;AC5Ne,SAAR,eAAA,CAAiC,EAAE,KAAA,GAAQ,CAAA,EAAE,EAAyB;AAC3E,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,0BACrCA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAU,oCAAA;AAAA,MAEV,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAEb,QAAA,EAAA;AAAA,wBAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EAA+C,CAAA;AAAA,wBAE9DA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAiD,CAAA,EAClE;AAAA,OAAA,EACF;AAAA,KAAA;AAAA,IAVK;AAAA,GAYR,CAAA,EACH,CAAA;AAEJ;ACCO,SAAS,aAAa,OAAA,EAA4C;AACvE,EAAA,MAAM;AAAA,IACJ,KAAA,GAAQ,GAAA;AAAA,IACR,WAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA,GAAgB,EAAA;AAAA,IAChB,cAAA,GAAiB;AAAA,GACnB,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIM,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,QAAA,GAAWC,aAA6C,IAAI,CAAA;AAClE,EAAA,MAAM,WAAA,GAAcA,aAAwC,IAAI,CAAA;AAChE,EAAA,MAAM,QAAA,GAAWA,aAAmD,IAAI,CAAA;AAExE,EAAA,MAAM,UAAA,GAAaJ,kBAAY,MAAM;AACnC,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAC7B,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA;AAAA,IACvB,CAAC,CAAA,KAA2C;AAI1C,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,OAAA,GAAU,CAAA;AAGnB,MAAA,MAAM,OAAA,GAAU,aAAa,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA;AAC1D,MAAA,MAAM,OAAA,GAAU,aAAa,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA;AAC1D,MAAA,WAAA,CAAY,OAAA,GAAU,EAAE,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAQ;AAE/C,MAAA,YAAA,IAAe;AAEf,MAAA,UAAA,EAAW;AACX,MAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM;AAClC,QAAA,IAAI,cAAA,IAAkB,UAAU,OAAA,EAAS;AACvC,UAAA,SAAA,CAAU,QAAQ,EAAE,CAAA;AAAA,QACtB;AACA,QAAA,WAAA,CAAY,SAAS,OAAQ,CAAA;AAAA,MAC/B,GAAG,KAAK,CAAA;AAAA,IACV,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,WAAA,EAAa,YAAA,EAAc,gBAAgB,UAAU;AAAA,GAC/D;AAEA,EAAA,MAAM,cAAA,GAAiBA,kBAAY,MAAM;AACvC,IAAA,UAAA,EAAW;AACX,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,EACrB,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,MAAM;AAC1C,IAAA,UAAA,EAAW;AACX,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,IAAA,aAAA,IAAgB;AAAA,EAClB,CAAA,EAAG,CAAC,UAAA,EAAY,aAAa,CAAC,CAAA;AAE9B,EAAA,MAAM,UAAA,GAAaA,iBAAAA;AAAA,IACjB,CAAC,CAAA,KAA2C;AAC1C,MAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,CAAC,SAAA,EAAW;AAAC,QAAA;AAAA,MAAO;AAEhD,MAAA,MAAM,OAAA,GAAU,aAAa,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA;AAC1D,MAAA,MAAM,OAAA,GAAU,aAAa,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA;AAE1D,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,WAAA,CAAY,QAAQ,CAAC,CAAA;AACvD,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,WAAA,CAAY,QAAQ,CAAC,CAAA;AAEvD,MAAA,IAAI,MAAA,GAAS,aAAA,IAAiB,MAAA,GAAS,aAAA,EAAe;AACpD,QAAA,iBAAA,EAAkB;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,aAAA,EAAe,iBAAiB;AAAA,GAC9C;AAGA,EAAAM,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,WAAA,EAAa,UAAA;AAAA,MACb,WAAA,EAAa,gBAAA;AAAA,MACb,SAAA,EAAW,cAAA;AAAA,MACX,YAAA,EAAc;AAAA,KAChB;AAAA,IACA;AAAA,GACF;AACF;;;ACxHA,mBAAA,EAAA;AAkBO,IAAM,mBAA8C,CAAC;AAAA,EAC1D,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIH,eAAS,EAAE,CAAA;AACnD,EAAA,MAAM,OAAA,GAAUC,aAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAWA,YAAAA,CAAqC,EAAE,CAAA;AAExD,EAAA,MAAM,cAAA,GAAiBC,aAAAA;AAAA,IACrB,MAAM,KAAA,CAAM,MAAA,CAAiB,CAAC,GAAA,EAAK,MAAM,CAAA,KAAM;AAC7C,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAAC,QAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MAAE;AACjC,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAAA,IACL,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,SAAA,GAAYL,iBAAAA,CAAY,CAAC,KAAA,KAAkB;AAC/C,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,EAAG,KAAA,EAAM;AAAA,EACjC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,sBAAsB,MAAM;AACxC,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,SAAA,CAAU,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,MAC7B;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,qBAAqB,KAAK,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,MAAA,EAAQ,cAAA,EAAgB,SAAS,CAAC,CAAA;AAGtC,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,MAAA;AAAA,IAAO;AAErB,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,OAAA,CAAQ,YAAY,CAAA;AAE7D,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,QAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,OAAA,EAAQ;AACR,UAAA;AAAA,QACF,KAAK,WAAA,EAAa;AAChB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAM,UAAU,iBAAA,GAAoB,cAAA,CAAe,MAAA,GAAS,CAAA,GACxD,oBAAoB,CAAA,GACpB,CAAA;AACJ,UAAA,SAAA,CAAU,cAAA,CAAe,OAAO,CAAC,CAAA;AACjC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,SAAA,EAAW;AACd,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAM,UAAU,iBAAA,GAAoB,CAAA,GAChC,iBAAA,GAAoB,CAAA,GACpB,eAAe,MAAA,GAAS,CAAA;AAC5B,UAAA,SAAA,CAAU,cAAA,CAAe,OAAO,CAAC,CAAA;AACjC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAAC,YAAA,SAAA,CAAU,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,UAAE;AAC7D,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAAC,YAAA,SAAA,CAAU,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,UAAE;AACrF,UAAA;AAAA;AACJ,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,GAAG,CAAC,MAAA,EAAQ,SAAS,YAAA,EAAc,cAAA,EAAgB,SAAS,CAAC,CAAA;AAE7D,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAEzC,EAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAC9B,EAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,EAAA;AAChD,EAAA,MAAM,UAAA,GAAa,iBAAiB,UAAA,CAAW,MAAA;AAC/C,EAAA,MAAM,eAAA,GAAkB,UAAA,GAAa,mBAAA,IAAuB,UAAA,CAAW,GAAA,GAAM,UAAA;AAE7E,EAAA,MAAM,KAAA,GAAuB;AAAA,IAC3B,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM,CAAA,EAAG,UAAA,CAAW,IAAI,CAAA,EAAA,CAAA;AAAA,IACxB,KAAA,EAAO,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,EAAA,CAAA;AAAA,IAC1B,MAAA,EAAQ,IAAA;AAAA,IACR,GAAI,eAAA,GACA,EAAE,MAAA,EAAQ,GAAG,cAAA,GAAiB,UAAA,CAAW,GAAG,CAAA,EAAA,CAAA,KAC5C,EAAE,GAAA,EAAK,CAAA,EAAG,UAAA,CAAW,MAAM,CAAA,EAAA,CAAA;AAAK,GACtC;AAEA,EAAA,OAAOoE,qBAAAA;AAAA,oBACL7E,eAACqH,4BAAAA,EAAA,EACE,oCACC3G,eAAAA,CAAAG,qBAAA,EACE,QAAA,EAAA;AAAA,sBAAAb,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,wBAAA;AAAA,UACV,OAAA,EAAS;AAAA;AAAA,OACX;AAAA,sBAEAA,cAAAA;AAAA,QAACwF,mBAAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,IAAA,EAAK,MAAA;AAAA,UACL,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,UAClC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,UACnC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,UAChC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,UAChC,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,UAC7B,KAAA;AAAA,UACA,SAAA,EAAU,0HAAA;AAAA,UAEV,QAAA,kBAAAxF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACZ,gBAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChBU,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,GAAA,EAAK,CAAC,EAAA,KAAO;AAAE,gBAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA;AAAA,cAAI,CAAA;AAAA,cAC7C,IAAA,EAAK,UAAA;AAAA,cACL,QAAA,EAAU,YAAA,KAAiB,KAAA,GAAQ,CAAA,GAAI,EAAA;AAAA,cACvC,SAAS,MAAM;AACb,gBAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,kBAAA,IAAA,CAAK,OAAA,EAAQ;AACb,kBAAA,OAAA,EAAQ;AAAA,gBACV;AAAA,cACF,CAAA;AAAA,cACA,UAAU,IAAA,CAAK,QAAA;AAAA,cACf,SAAA,EAAW;AAAA;AAAA;AAAA,oBAAA,EAGP,IAAA,CAAK,QAAA,GACH,+BAAA,GACA,oGAAoG;AAAA,oBAAA,EACtG,IAAA,CAAK,OAAA,KAAY,QAAA,GACf,gCAAA,GACA,kCAAkC;AAAA,kBAAA,CAAA;AAAA,cAGvC,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,wBACJV,cAAAA,CAAC,UAAK,SAAA,EAAU,wDAAA,EACb,eAAK,IAAA,EACR,CAAA;AAAA,gCAEFA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAU,eAAK,KAAA,EAAM;AAAA;AAAA,aAAA;AAAA,YA3BhC,IAAA,CAAK;AAAA,WA6Bb,CAAA,EACH;AAAA;AAAA;AACF,KAAA,EACF,CAAA,EAEJ,CAAA;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;;;ACtKA,mBAAA,EAAA;AAkBA,IAAM,WAAA,GAAcgB,UAAAA;AAAA,EAClB,CAAC;AAAA,IACC,OAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,QAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA,GAAe,SAAA;AAAA,IACf,SAAA,GAAY;AAAA,GACd,KAAM;AACJ,IAAA,MAAM,gBAAA,GAAmBT,aAAwB,IAAI,CAAA;AACrD,IAAA,MAAM,OAAA,GAAUA,aAAuB,IAAI,CAAA;AAC3C,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,eAAS,KAAK,CAAA;AAC9C,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAyB,IAAI,CAAA;AACjE,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,IAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAG7B,IAAA,MAAM,aAAA,GAAgBC,aAAO,KAAK,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQsJ,4BAAe,CAAC,CAAA;AAC9B,IAAA,MAAM,cAAA,GAAiBC,yBAAA,CAAa,KAAA,EAAO,CAAC,GAAA,EAAK,GAAA,EAAK,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,GAAA,EAAK,CAAC,CAAC,CAAA;AACrE,IAAA,MAAM,YAAA,GAAeA,yBAAA,CAAa,KAAA,EAAO,CAAC,GAAA,EAAK,GAAA,EAAK,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AACrE,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,SAAA;AAEzB,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,EAA2C,IAAA,KAAkB;AAClF,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,GAAA,IAAO,SAAA,EAAW;AACpC,QAAA,SAAA,EAAU;AAAA,MACZ;AAGA,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH,CAAA;AAGA,IAAArJ,gBAAU,MAAM;AACd,MAAA,UAAA,CAAW,gBAAgB,QAAQ,CAAA;AAAA,IACrC,CAAA,EAAG,EAAE,CAAA;AAIL,IAAA,MAAM,iBAAA,GAAoB,CAAC,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK;AAG/C,IAAA,MAAM,YAAA,GAAe,oBAAoB,CAAA,CAAE,0BAA0B,IAAK,OAAA,CAAQ,KAAA,IAAS,EAAE,wBAAwB,CAAA;AACrH,IAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA;AAC5D,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,EAAQ,IAAA,IAAQ,OAAA;AAC3C,IAAA,MAAM,SAAA,GACJ,UAAA,KAAe,QAAA,GACX,CAAA,CAAE,yBAAyB,CAAA,GAC3B,UAAA,KAAe,QAAA,GACb,CAAA,CAAE,yBAAyB,CAAA,GAC3B,UAAA,KAAe,UAAA,GACb,CAAA,CAAE,2BAA2B,CAAA,GAC7B,EAAA;AACV,IAAA,MAAM,eAAA,GACJ,OAAA,CAAQ,OAAA,GACJ,CAAA,CAAE,0BAA0B,CAAA,GAC5B,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,QAAA,GACxC,CAAA,CAAE,8BAA8B,CAAA,GAChC,EAAA;AACR,IAAA,MAAM,eAAA,GAAkB,QAAQ,OAAA,CAAQ,OAAA,IAAY,QAAQ,WAAA,IAAe,OAAA,CAAQ,cAAc,CAAE,CAAA;AACnG,IAAA,MAAM,YAAY,CAAC,YAAA,EAAc,iBAAiB,SAAS,CAAA,CAAE,OAAO,OAAO,CAAA;AAG3E,IAAA,MAAM,EAAE,QAAA,EAAU,iBAAA,EAAkB,GAAI,YAAA,CAAa;AAAA,MACnD,KAAA,EAAO,GAAA;AAAA,MACP,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,QAAA,MAAM,SAAS,CAAA,CAAE,aAAA;AACjB,QAAA,aAAA,CAAc,MAAA,CAAO,uBAAuB,CAAA;AAC5C,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MAClB,CAAA;AAAA,MACA,cAAA,EAAgB;AAAA,KACjB,CAAA;AAGD,IAAAA,gBAAU,MAAM;AACd,MAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,MAAA,IAAI,CAAC,OAAA,EAAS;AAAC,QAAA;AAAA,MAAO;AAEtB,MAAA,MAAM,SAAS,iBAAA,CAAkB,IAAA,CAAK,SAAA,CAAU,SAAS,KAAK,YAAA,IAAgB,QAAA;AAC9E,MAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,QAAA;AAAA,MAAO;AAErB,MAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAAa;AACtC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,SAAS,CAAA,CAAE,aAAA;AACjB,QAAA,aAAA,CAAc,MAAA,CAAO,uBAAuB,CAAA;AAC5C,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MAClB,CAAA;AAEA,MAAA,OAAA,CAAQ,gBAAA,CAAiB,eAAe,iBAAiB,CAAA;AACzD,MAAA,OAAO,MAAM,OAAA,CAAQ,mBAAA,CAAoB,aAAA,EAAe,iBAAiB,CAAA;AAAA,IAC3E,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,MAAM,gBAAA,GAAsCD,aAAAA;AAAA,MAC1C,MACE,SAAS,UAAA,GACL;AAAA,QACA,GAAI,YAAY,CAAC;AAAA,UACf,EAAA,EAAI,SAAA;AAAA,UACJ,KAAA,EAAO,EAAE,+BAA+B,CAAA;AAAA,UACxC,IAAA,kBAAMR,cAAAA,CAAC+J,kBAAA,EAAA,EAAa,MAAM,EAAA,EAAI,CAAA;AAAA,UAC9B,OAAA,EAAS,MAAM,SAAA;AAAU,SAC1B,IAAI,EAAC;AAAA,QACN,GAAI,WAAW,CAAC;AAAA,UACd,EAAA,EAAI,QAAA;AAAA,UACJ,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,UACpC,sBAAM/J,cAAAA,CAACiE,kBAAAA,EAAA,EAAa,MAAM,EAAA,EAAI,CAAA;AAAA,UAC9B,OAAA,EAAS,MAAM,gBAAA,CAAiB,OAAA,EAAS,YAAA;AAAa,SACvD,IAAI;AAAC,OACR,GACE;AAAA,QACA,GAAI,QAAQ,CAAC;AAAA,UACX,EAAA,EAAI,KAAA;AAAA,UACJ,OAAO,OAAA,CAAQ,MAAA,GAAS,EAAE,0BAA0B,CAAA,GAAI,EAAE,wBAAwB,CAAA;AAAA,UAClF,IAAA,EAAM,OAAA,CAAQ,MAAA,mBAASjE,eAACuB,WAAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,CAAA,mBAAKvB,cAAAA,CAACgK,cAAA,EAAA,EAAS,MAAM,EAAA,EAAI,CAAA;AAAA,UACjE,OAAA,EAAS,MAAM,KAAA;AAAM,SACtB,IAAI,EAAC;AAAA,QACN,GAAI,WAAW,CAAC;AAAA,UACd,EAAA,EAAI,QAAA;AAAA,UACJ,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,UACpC,sBAAMhK,cAAAA,CAACiE,kBAAAA,EAAA,EAAa,MAAM,EAAA,EAAI,CAAA;AAAA,UAC9B,OAAA,EAAS,MAAM,gBAAA,CAAiB,OAAA,EAAS,YAAA;AAAa,SACvD,IAAI,EAAC;AAAA,QACN,GAAI,oBAAoB,CAAC;AAAA,UACvB,EAAA,EAAI,YAAA;AAAA,UACJ,KAAA,EAAO,EAAE,gCAAgC,CAAA;AAAA,UACzC,sBAAMjE,cAAAA,CAACsH,qBAAAA,EAAA,EAAgB,MAAM,EAAA,EAAI,CAAA;AAAA,UACjC,OAAA,EAAS,MAAM,iBAAA;AAAkB,SAClC,IAAI,EAAC;AAAA,QACN,GAAI,YAAY,CAAC;AAAA,UACf,EAAA,EAAI,SAAA;AAAA,UACJ,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,UACrC,sBAAMtH,cAAAA,CAACuI,aAAAA,EAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,UACzB,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,UACzB,OAAA,EAAS;AAAA,SACV,IAAI,EAAC;AAAA,QACN,GAAI,WAAW,CAAC;AAAA,UACd,EAAA,EAAI,QAAA;AAAA,UACJ,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,UACpC,sBAAMvI,cAAAA,CAAC+I,WAAAA,EAAA,EAAM,MAAM,EAAA,EAAI,CAAA;AAAA,UACvB,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,UACxB,OAAA,EAAS;AAAA,SACV,IAAI;AAAC,OACR;AAAA,MACJ,CAAC,IAAA,EAAM,OAAA,CAAQ,MAAA,EAAQ,SAAA,EAAW,OAAO,QAAA,EAAU,iBAAA,EAAmB,SAAA,EAAW,QAAA,EAAU,CAAC;AAAA,KAC9F;AAEA,IAAA,MAAM,cAAA,GAAiB,iBAAiB,MAAA,GAAS,CAAA;AAEjD,IAAA,uBACErI,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAH,eAAAA;AAAA,QAAC8E,mBAAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UACC,QAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,UAAA,EAAW,OAAA;AAAA,UACX,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAU,qCAAA;AAAA,UAGT,QAAA,EAAA;AAAA,YAAA,cAAA,oBACCxF,cAAAA;AAAA,cAACwF,mBAAAA,CAAO,GAAA;AAAA,cAAP;AAAA,gBACC,SAAA,EAAU,4GAAA;AAAA,gBACV,KAAA,EAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,OAAO,YAAA,EAAa;AAAA,gBACtD,aAAA,EAAY,MAAA;AAAA,gBAEZ,0BAAAxF,cAAAA,CAACuI,aAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,WAAU,YAAA,EAAa;AAAA;AAAA,aAC5C;AAAA,4BAIFvI,cAAAA;AAAA,cAACwF,mBAAAA,CAAO,GAAA;AAAA,cAAP;AAAA,gBACC,IAAA,EAAM,iBAAiB,GAAA,GAAM,KAAA;AAAA,gBAC7B,iBAAA,EAAiB,IAAA;AAAA,gBACjB,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA,EAAE;AAAA,gBACxC,WAAA,EAAa,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,gBACrC,gBAAA,EAAgB,IAAA;AAAA,gBAChB,KAAA,EAAO,EAAE,CAAA,EAAG,cAAA,GAAiB,QAAQ,MAAA,EAAU;AAAA,gBAC/C,aAAa,MAAM;AAAE,kBAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,gBAAM,CAAA;AAAA,gBACnD,SAAA,EAAW,iBAAiB,aAAA,GAAgB,MAAA;AAAA,gBAC5C,SAAA,EAAU,UAAA;AAAA,gBAEZ,QAAA,kBAAAxF,cAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,QAAA,EAAU,CAAA;AAAA,oBACV,GAAA,EAAK,OAAA;AAAA,oBACL,SAAS,MAAM;AACb,sBAAA,IAAI,cAAc,OAAA,EAAS;AAAC,wBAAA;AAAA,sBAAO;AACnC,sBAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AAAA,oBACrB,CAAA;AAAA,oBACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,sBAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,sBAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,MAAA,EAAQ,QAAQ,2CAA2C,CAAA;AACpF,sBAAA,IAAI,cAAA,EAAgB;AAAC,wBAAA;AAAA,sBAAO;AAE5B,sBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,wBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,wBAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AAAA,sBACrB;AAAA,oBACF,CAAA;AAAA,oBACA,WAAW,CAAA,wLAAA,EACT,QAAA,GACI,sIAAA,GACA,oJACN,IAAI,SAAS,CAAA,CAAA;AAAA,oBACb,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,oBAClC,mBAAA,EAAiB,IAAA;AAAA,oBACjB,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,SAAA,EAAY,QAAQ,EAAE,CAAA,CAAA;AAAA,oBACjD,GAAG,iBAAA;AAAA,oBAEJ,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,sCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA;AAAA,wBAAA,eAAA,oBACCV,eAACiJ,gBAAAA,EAAA,EAAW,MAAM,EAAA,EAAI,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,2DAAA,EAA4D,CAAA;AAAA,wCAE/GvI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,0CAAAV,cAAAA;AAAA,4BAAC,oBAAA;AAAA,4BAAA;AAAA,8BACC,GAAA,EAAK,gBAAA;AAAA,8BACL,KAAA,EAAO,YAAA;AAAA,8BACP,MAAA,EAAQ,CAAC,QAAA,KAAa,QAAA,GAAW,QAAQ,CAAA;AAAA,8BACzC,SAAA,EAAW;AAAA;AAAA,2BACb;AAAA,0CACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,4BAAA,SAAA,CAAU,KAAK,UAAK,CAAA;AAAA,4BACpB,eAAA,IAAmB,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,GAAc,CAAA,oBAC/DV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uJAAA,EACb,QAAA,EAAA,OAAA,CAAQ,WAAA,EACX;AAAA,2BAAA,EAEJ;AAAA,yBAAA,EACF;AAAA,uBAAA,EACF,CAAA;AAAA,sBACC,CAAC,OAAA,IAAW,cAAA,oBACXU,eAAAA,CAAC6D,cAAA,EACC,QAAA,EAAA;AAAA,wCAAAvE,cAAAA;AAAA,0BAACwE,kBAAAA;AAAA,0BAAA;AAAA,4BACC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,8BAAA,CAAA,CAAE,cAAA,EAAe;AACjB,8BAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,4BACpB,CAAA;AAAA,4BACA,SAAA,EAAU,4MAAA;AAAA,4BACV,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,4BAC1C,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,iBAAA,EAAoB,QAAQ,EAAE,CAAA,CAAA;AAAA,4BAE1D,QAAA,kBAAAxE,eAACiK,eAAA,EAAA,EAAU,IAAA,EAAM,IAAI,SAAA,EAAU,SAAA,EAAU,QAAO,MAAA,EAAO;AAAA;AAAA,yBACzD;AAAA,wCACAvJ,eAAAA;AAAA,0BAACgE,iBAAAA;AAAA,0BAAA;AAAA,4BACC,MAAA,EAAO,cAAA;AAAA,4BACP,SAAA,EAAU,4IAAA;AAAA,4BAET,QAAA,EAAA;AAAA,8BAAA,IAAA,KAAS,UAAA,IAAc,KAAA,oBACtB1E,cAAAA,CAAC2E,gBAAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRjE,eAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oCAAA,KAAA,EAAM;AAAA,kCACR,CAAA;AAAA,kCACA,SAAA,EAAW,CAAA,0IAAA,EACT,KAAA,GACI,+EAAA,GACA,yCACN,CAAA,CAAA;AAAA,kCACA,cAAY,OAAA,CAAQ,MAAA,GAAS,EAAE,0BAA0B,CAAA,GAAI,EAAE,wBAAwB,CAAA;AAAA,kCACvF,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,aAAA,EAAgB,QAAQ,EAAE,CAAA,CAAA;AAAA,kCAErD,QAAA,EAAA;AAAA,oCAAA,OAAA,CAAQ,yBACPV,cAAAA,CAACuB,WAAAA,EAAA,EAAM,MAAM,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA,mBAErCvB,cAAAA,CAACgK,cAAA,EAAA,EAAS,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,oCAEzC,QAAQ,MAAA,GAAS,CAAA,CAAE,0BAA0B,CAAA,GAAI,EAAE,wBAAwB;AAAA;AAAA;AAAA,+BAC9E,EAEJ,CAAA;AAAA,8BAED,QAAA,oBACChK,cAAAA,CAAC2E,gBAAAA,EAAA,EACE,WAAC,EAAE,KAAA,EAAO,KAAA,EAAM,qBACfjE,eAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oCAAA,gBAAA,CAAiB,SAAS,YAAA,EAAa;AACvC,oCAAA,KAAA,EAAM;AAAA,kCACR,CAAA;AAAA,kCACA,SAAA,EAAW,CAAA,0IAAA,EACT,KAAA,GACI,+EAAA,GACA,yCACN,CAAA,CAAA;AAAA,kCACA,YAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,kCACzC,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,gBAAA,EAAmB,QAAQ,EAAE,CAAA,CAAA;AAAA,kCAEzD,QAAA,EAAA;AAAA,oDAAAV,eAACiE,kBAAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,oCAC3C,EAAE,2BAA2B;AAAA;AAAA;AAAA,+BAChC,EAEJ,CAAA;AAAA,8BAED,IAAA,KAAS,UAAA,IAAc,iBAAA,oBACtBjE,cAAAA,CAAC2E,gBAAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,KAAA,EAAO,KAAA,EAAM,qBACfjE,eAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oCAAA,iBAAA,EAAkB;AAClB,oCAAA,KAAA,EAAM;AAAA,kCACR,CAAA;AAAA,kCACA,SAAA,EAAW,CAAA,0IAAA,EACT,KAAA,GACI,+EAAA,GACA,yCACN,CAAA,CAAA;AAAA,kCACA,YAAA,EAAY,EAAE,gCAAgC,CAAA;AAAA,kCAC9C,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,oBAAA,EAAuB,QAAQ,EAAE,CAAA,CAAA;AAAA,kCAE7D,QAAA,EAAA;AAAA,oDAAAV,eAACsH,qBAAAA,EAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,oCAC9C,EAAE,gCAAgC;AAAA;AAAA;AAAA,+BACrC,EAEJ,CAAA;AAAA,8BAED,IAAA,KAAS,UAAA,IAAc,SAAA,oBACtBtH,cAAAA,CAAC2E,gBAAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRjE,eAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oCAAA,SAAA,EAAU;AAAA,kCACZ,CAAA;AAAA,kCACA,SAAA,EAAW,CAAA,yGAAA,EACT,KAAA,GACI,qHAAA,GACA,oFACN,CAAA,CAAA;AAAA,kCACA,YAAA,EAAY,EAAE,+BAA+B,CAAA;AAAA,kCAC7C,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,iBAAA,EAAoB,QAAQ,EAAE,CAAA,CAAA;AAAA,kCAE1D,QAAA,EAAA;AAAA,oDAAAV,cAAAA,CAAC+J,kBAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,oCAC3C,EAAE,+BAA+B;AAAA;AAAA;AAAA,+BACpC,EAEJ,CAAA;AAAA,8BAED,IAAA,KAAS,UAAA,IAAc,SAAA,oBACtB/J,cAAAA,CAAC2E,gBAAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRjE,eAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oCAAA,SAAA,EAAU;AAAA,kCACZ,CAAA;AAAA,kCACA,SAAA,EAAW,CAAA,yGAAA,EACT,KAAA,GACI,qHAAA,GACA,oFACN,CAAA,CAAA;AAAA,kCACA,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,kCAC1C,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,iBAAA,EAAoB,QAAQ,EAAE,CAAA,CAAA;AAAA,kCAE1D,QAAA,EAAA;AAAA,oDAAAV,eAACuI,aAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,oCACtC,EAAE,4BAA4B;AAAA;AAAA;AAAA,+BACjC,EAEJ,CAAA;AAAA,8BAED,QAAA,oBACCvI,cAAAA,CAAC2E,gBAAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRjE,eAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oCAAA,QAAA,EAAS;AAAA,kCACX,CAAA;AAAA,kCACA,SAAA,EAAW,CAAA,yGAAA,EACT,KAAA,GACI,yGAAA,GACA,4EACN,CAAA,CAAA;AAAA,kCACA,YAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,kCACzC,aAAA,EAAa,CAAA,EAAG,YAAY,CAAA,gBAAA,EAAmB,QAAQ,EAAE,CAAA,CAAA;AAAA,kCAEzD,QAAA,EAAA;AAAA,oDAAAV,eAAC+I,WAAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,oCACpC,EAAE,2BAA2B;AAAA;AAAA;AAAA,+BAChC,EAEJ;AAAA;AAAA;AAAA;AAEJ,uBAAA,EACF;AAAA,qBAAA,EAEJ;AAAA;AAAA;AACF;AAAA;AACA;AAAA;AAAA,OACF;AAAA,sBACA/I,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,gBAAA;AAAA,UACP,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,CAAA;AAAA,UAChC,UAAA,EAAY;AAAA;AAAA;AACd,KAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AAE1B,IAAO,mBAAA,GAAQ;AC5bA,SAAR,eAAA,CAAiC,EAAE,SAAA,EAAW,KAAA,EAAM,EAAyB;AAClF,EAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iIACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAkD,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,oBAC5EA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kGACb,QAAA,EAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACVA,mBAAA,EAAA;AAUA,SAAS,WAAW,EAAE,KAAA,EAAO,YAAA,EAAc,YAAA,EAAc,SAAQ,EAAoB;AACnF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,0BAAAA,cAAAA,CAACuE,YAAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,IAAA,EAAK,qBACP7D,eAAAA,CAAAG,qBAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,eAAAA;AAAA,MAAC8D,kBAAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA;AAAA,QAUX,YAAA,EAAY,EAAE,0BAA0B,CAAA;AAAA,QAEvC,QAAA,EAAA;AAAA,UAAA,YAAA,mBACC9D,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA;AAAA,cAAC,kBAAA;AAAA,cAAA;AAAA,gBACC,WAAW,YAAA,CAAa,SAAA;AAAA,gBACxB,UAAU,YAAA,CAAa,QAAA;AAAA,gBACvB,UAAU,YAAA,CAAa,QAAA;AAAA,gBACvB,IAAA,EAAK;AAAA;AAAA,aACP;AAAA,4BACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,cAAA,YAAA,CAAa,SAAA;AAAA,cAAU,GAAA;AAAA,cAAE,YAAA,CAAa;AAAA,aAAA,EACzC;AAAA,WAAA,EACF,CAAA,mBAEAV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA,OAAA,GAAU,CAAA,CAAE,8BAA8B,CAAA,GAAI,CAAA,CAAE,0BAA0B,CAAA,EAC7E,CAAA;AAAA,0BAGFU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA;AAAA,YAAA,YAAA,oBACCV,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,YAAA,CAAa,IAAI,CAAA;AAAA,gBACnB,CAAA;AAAA,gBACA,SAAA,EAAU,uFAAA;AAAA,gBACV,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,gBAEnC,0BAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,WAAU,8CAAA,EAA+C;AAAA;AAAA,aACxE;AAAA,4BAEFtD,cAAAA;AAAA,cAACsE,eAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,EAAA;AAAA,gBACN,SAAA,EAAW,CAAA,8DAAA,EACT,IAAA,GAAO,YAAA,GAAe,EACxB,CAAA;AAAA;AAAA;AACF,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,oBAEA5D,eAAAA;AAAA,MAACgE,iBAAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAU,uUAAA;AAAA,QAYV,QAAA,EAAA;AAAA,0BAAA1E,eAAC2E,gBAAAA,EAAA,EACE,WAAC,EAAE,KAAA,uBACF3E,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,cAChC,SAAA,EAAW;AAAA;AAAA;AAAA,sBAAA,EAIP,KAAA,GACI,iCACA,yCACN;AAAA,sBAAA,EAEE,CAAC,YAAA,GACG,oDAAA,GACA,kCACN;AAAA,oBAAA,CAAA;AAAA,cAGD,YAAE,0BAA0B;AAAA;AAAA,WAC/B,EAEJ,CAAA;AAAA,UAGC,MAAM,MAAA,GAAS,CAAA,oBACdA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oDAAA,EAAqD,CAAA;AAAA,UAIrE,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,cAAAA,CAAC2E,gBAAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRjE,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,cAChC,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA,wBAAA,EAKP,KAAA,GACI,iCACA,yCACN;AAAA,wBAAA,EAEE,YAAA,EAAc,EAAA,KAAO,IAAA,CAAK,EAAA,GACtB,uDACA,kCACN;AAAA,sBAAA,CAAA;AAAA,cAGF,QAAA,EAAA;AAAA,gCAAAV,cAAAA;AAAA,kBAAC,kBAAA;AAAA,kBAAA;AAAA,oBACC,WAAW,IAAA,CAAK,SAAA;AAAA,oBAChB,UAAU,IAAA,CAAK,QAAA;AAAA,oBACf,UAAU,IAAA,CAAK,QAAA;AAAA,oBACf,IAAA,EAAK;AAAA;AAAA,iBACP;AAAA,gCACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAK,SAAA;AAAA,kBAAU,GAAA;AAAA,kBAAE,IAAA,CAAK;AAAA,iBAAA,EACzB;AAAA;AAAA;AAAA,WACF,EAAA,EA7BW,IAAA,CAAK,EA+BpB,CACD,CAAA;AAAA,UAGA,MAAM,MAAA,KAAW,CAAA,oBAChBV,cAAAA,CAAC,SAAI,SAAA,EAAU,uBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,OAAE,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,CAAA,CAAE,8BAA8B,GAAE,CAAA,EAC7F;AAAA;AAAA;AAAA;AAEJ,GAAA,EACF,GAEJ,CAAA,EACF,CAAA;AAEJ;AAEA,IAAM,kBAAA,GAAqBgB,WAAK,UAAU;AAC1C,kBAAA,CAAmB,WAAA,GAAc,YAAA;;;ACnKjC,mBAAA,EAAA;AASe,SAAR,YAAA,CAA8B,EAAE,UAAA,EAAY,eAAA,EAAiB,iBAAgB,EAAsB;AACxG,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAG7B,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIV,eAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAA6B,IAAI,CAAA;AACzE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,CAAC,CAAA;AACtC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,cAAAA,CAAoB,EAAE,CAAA;AAChD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,cAAAA,CAAwB,EAAE,CAAA;AACpD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQ,EAAA;AAGd,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAW,SAAA,EAAW;AAAC,MAAA;AAAA,IAAO;AAEnC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,IAAA,UAAA,CAAW,SAAA,EAAU,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACtC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,QAAA,CAAS,MAAM,CAAA;AACf,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAW,eAAA,EAAiB;AAAC,MAAA;AAAA,IAAO;AAEzC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,UAAA,CAAW,eAAA,CAAgB;AAAA,MACzB,KAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,MAAA,EAAQ,cAAc,EAAA,IAAM;AAAA,KAC7B,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAClB,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,IAAI,WAAW,CAAA,EAAG;AAChB,UAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,QAC1B,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,QAClD;AACA,QAAA,aAAA,CAAc,OAAO,KAAK,CAAA;AAC1B,QAAA,UAAA,CAAW,OAAO,OAAO,CAAA;AACzB,QAAA,WAAA,CAAY,KAAK,CAAA;AAAA,MACnB;AAAA,IACF,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,QAAA,CAAS,CAAA,CAAE,8BAA8B,CAAC,CAAA;AAC1C,QAAA,WAAA,CAAY,KAAK,CAAA;AAAA,MACnB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,GAAG,CAAC,UAAA,EAAY,QAAQ,eAAA,EAAiB,YAAA,EAAc,CAAC,CAAC,CAAA;AAGzD,EAAAA,gBAAU,MAAM;AACd,IAAA,SAAA,CAAU,CAAC,CAAA;AACX,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA,EAAG,CAAC,eAAA,EAAiB,YAAY,CAAC,CAAA;AAGlC,EAAA,MAAM,cAAA,GAAiBN,kBAAY,MAAM;AACvC,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS,IAAA,GAAO,KAAK,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,MAAM,eAAA,GAAkBI,aAA8B,IAAI,CAAA;AAE1D,EAAA,MAAM,WAAA,GAAcJ,iBAAAA,CAAY,CAAC,IAAA,KAAgC;AAC/D,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAM,gBAAU,MAAM;AACd,IAAA,MAAM,OAAO,eAAA,CAAgB,OAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,IAAQ,QAAA,IAAY,CAAC,OAAA,EAAS;AAAC,MAAA;AAAA,IAAO;AAE3C,IAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,CAAqB,CAAC,OAAA,KAAY;AACrD,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,cAAA,EAAgB;AAC7B,QAAA,cAAA,EAAe;AAAA,MACjB;AAAA,IACF,CAAA,EAAG,EAAE,SAAA,EAAW,GAAA,EAAK,CAAA;AAErB,IAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAErB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,cAAc,CAAC,CAAA;AAGtC,EAAA,MAAM,YAAA,GAAeD,cAAQ,MAAM;AACjC,IAAA,IAAI,WAAW,SAAA,EAAW;AAAC,MAAA,OAAO,KAAA;AAAA,IAAM;AACxC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAyB;AAC7C,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IAAI,IAAA,CAAK,SAAS,CAAC,OAAA,CAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,EAAG;AAC7C,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,KAAK,KAAK,CAAA;AAAA,MACvC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,EACpC,GAAG,CAAC,KAAA,EAAO,KAAA,EAAO,UAAA,CAAW,SAAS,CAAC,CAAA;AAGvC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,IAAIF,cAAAA,iBAAsB,IAAI,KAAK,CAAA;AAE3E,EAAA,MAAM,WAAA,GAAcH,iBAAAA,CAAY,CAAC,OAAA,KAAoB;AACnD,IAAA,iBAAA,CAAkB,CAAC,IAAA,KAAS;AAC1B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACrB,QAAA,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,MAClB;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,mBAAmB,YAAA,EAAc;AAAE,MAAA;AAAA,IAAQ;AAChD,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,eAAe,CAAA;AACrD,IAAA,IAAI,IAAA,EAAM,OAAO,EAAA,EAAI;AACnB,MAAA,iBAAA,CAAkB,CAAA,IAAA,KAAQ;AACxB,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAO,EAAE,CAAA,EAAG;AAAE,UAAA,OAAO,IAAA;AAAA,QAAM;AAC7C,QAAA,uBAAO,IAAI,IAAI,CAAC,GAAG,MAAM,IAAA,CAAK,KAAA,CAAO,EAAE,CAAC,CAAA;AAAA,MAC1C,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,KAAA,EAAO,YAAY,CAAC,CAAA;AAGzC,EAAA,MAAM,YAAA,GAAeD,cAAQ,MAAM;AACjC,IAAA,IAAI,YAAA,EAAc;AAAC,MAAA,OAAO,IAAA;AAAA,IAAK;AAE/B,IAAA,MAAM,QAAA,uBAAe,GAAA,EAA+E;AAEpG,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS;AAAA,QAC1B,EAAA,EAAI,aAAA;AAAA,QACJ,SAAA,EAAW,EAAE,wBAAwB,CAAA;AAAA,QACrC,QAAA,EAAU,EAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ;AACA,MAAA,MAAM,UAAU,KAAA,CAAM,EAAA;AAEtB,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,IAAI,OAAA,EAAS;AAAA,UACpB,KAAA;AAAA,UACA,OAAO,EAAC;AAAA,UACR,iBAAiB,IAAA,CAAK;AAAA,SACvB,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAClC,MAAA,KAAA,CAAM,KAAA,CAAM,KAAK,IAAI,CAAA;AAGrB,MAAA,IAAI,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,eAAA,EAAiB;AAC1C,QAAA,KAAA,CAAM,kBAAkB,IAAA,CAAK,SAAA;AAAA,MAC/B;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MACnC,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,eAAA,CAAgB,aAAA,CAAc,EAAE,eAAe;AAAA,KAC7D;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,YAAA,EAAc,CAAC,CAAC,CAAA;AAE3B,EAAA,uBACEE,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,sCAAA;AAAA,MACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MAClC,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MAGxC,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EAEb,QAAA,EAAA;AAAA,0BAAAV,cAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,YAAA;AAAA,cACP,YAAA;AAAA,cACA,YAAA,EAAc,eAAA;AAAA,cACd,OAAA,EAAS,YAAA,IAAiB,QAAA,IAAY,KAAA,CAAM,MAAA,KAAW;AAAA;AAAA,WACzD;AAAA,0BAGAU,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oDAAA,EACf,QAAA,EAAA;AAAA,4BAAAV,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,UAAA;AAAA,gBACL,OAAA,EAAS,eAAA;AAAA,gBACT,UAAU,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,gBACpD,SAAA,EAAU;AAAA;AAAA,aAMZ;AAAA,4BACAU,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oEAAA,EACd,QAAA,EAAA;AAAA,8BAAAV,eAACuI,aAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,cACtC,EAAE,iCAAiC;AAAA,aAAA,EACtC;AAAA,WAAA,EACF,CAAA;AAAA,UAGC,UAAA,GAAa,qBACZvI,cAAAA,CAAC,OAAE,SAAA,EAAU,0CAAA,EACV,QAAA,EAAA,UAAA,KAAe,CAAA,GACZ,CAAA,CAAE,2BAAA,EAA6B,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA,GACpD,CAAA,CAAE,8BAA8B,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA,EAC3D;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAGAU,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAkD,YAAA,EAAY,CAAA,CAAE,mCAAmC,CAAA,EAC/G,QAAA,EAAA;AAAA,UAAA,QAAA,IAAY,MAAM,MAAA,KAAW,CAAA,mBAC5BV,cAAAA,CAAC,mBAAgB,KAAA,EAAO,CAAA,EAAG,CAAA,mBAE3BA,eAAAa,mBAAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,MAAA,GAAS,oBACdH,eAAAA;AAAA,YAAC8E,mBAAAA,CAAO,GAAA;AAAA,YAAP;AAAA,cACC,SAAA,EAAU,gBAAA;AAAA,cACV,QAAA,EAAU,wBAAA;AAAA,cACV,OAAA,EAAQ,QAAA;AAAA,cACR,OAAA,EAAQ,SAAA;AAAA,cACR,IAAA,EAAK,MAAA;AAAA,cACL,YAAA,EAAY,EAAE,0CAA0C,CAAA;AAAA,cAEvD,QAAA,EAAA;AAAA,gBAAA,YAAA;AAAA;AAAA,kBAEC,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,KAAU;AAC1B,oBAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,EAAA;AAC5B,oBAAA,MAAM,SAAA,GAAY,CAAC,KAAA,CAAM,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACxF,oBAAA,MAAM,WAAA,GAAc,CAAC,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAE/C,oBAAA,uBACE9E,eAAAA,CAAC,KAAA,EAAA,EAAkB,SAAA,EAAU,MAAA,EAE3B,QAAA,EAAA;AAAA,sCAAAA,eAAAA;AAAA,wBAAC,KAAA;AAAA,wBAAA;AAAA,0BACC,IAAA,EAAK,QAAA;AAAA,0BACL,QAAA,EAAU,CAAA;AAAA,0BACV,OAAA,EAAS,MAAM,WAAA,CAAY,OAAO,CAAA;AAAA,0BAClC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,4BAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,8BAAA,CAAA,CAAE,cAAA,EAAe;AACjB,8BAAA,WAAA,CAAY,OAAO,CAAA;AAAA,4BACrB;AAAA,0BACF,CAAA;AAAA,0BACA,SAAA,EAAU,mIAAA;AAAA,0BACV,iBAAe,CAAC,WAAA;AAAA,0BAEhB,QAAA,EAAA;AAAA,4CAAAV,cAAAA;AAAA,8BAACgE,gBAAAA;AAAA,8BAAA;AAAA,gCACC,IAAA,EAAM,EAAA;AAAA,gCACN,MAAA,EAAO,MAAA;AAAA,gCACP,SAAA,EAAW,CAAA,4EAAA,EAA+E,WAAA,GAAc,EAAA,GAAK,WAAW,CAAA;AAAA;AAAA,6BAC1H;AAAA,4CACAhE,cAAAA;AAAA,8BAAC,kBAAA;AAAA,8BAAA;AAAA,gCACC,SAAA,EAAW,MAAM,KAAA,CAAM,SAAA;AAAA,gCACvB,QAAA,EAAU,MAAM,KAAA,CAAM,QAAA;AAAA,gCACtB,QAAA,EAAU,MAAM,KAAA,CAAM,QAAA;AAAA,gCACtB,IAAA,EAAK;AAAA;AAAA,6BACP;AAAA,4CACAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gFACb,QAAA,EAAA,SAAA,IAAa,CAAA,CAAE,wBAAwB,CAAA,EAC1C,CAAA;AAAA,4CACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8GAAA,EACb,QAAA,EAAA,KAAA,CAAM,MAAM,MAAA,EACf;AAAA;AAAA;AAAA,uBACF;AAAA,sCAGAA,eAACqH,4BAAAA,EAAA,EAAgB,SAAS,KAAA,EACvB,QAAA,EAAA,CAAC,+BACArH,cAAAA;AAAA,wBAACwF,mBAAAA,CAAO,GAAA;AAAA,wBAAP;AAAA,0BAEC,OAAA,EAAS,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,0BACjC,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAA,EAAE;AAAA,0BACtC,IAAA,EAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,0BAC9B,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,CAAC,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA,EAAE;AAAA,0BACpD,SAAA,EAAU,iBAAA;AAAA,0BAEV,QAAA,kBAAAxF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACZ,gBAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBAChBA,cAAAA;AAAA,4BAACwF,mBAAAA,CAAO,GAAA;AAAA,4BAAP;AAAA,8BAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,8BAC9B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,8BAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,8BAE3B,QAAA,kBAAAxF,cAAAA;AAAA,gCAAC,KAAA;AAAA,gCAAA;AAAA,kCACC,IAAA,EAAK,MAAA;AAAA,kCACL,QAAA,EAAU,CAAA;AAAA,kCACV,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAA,CAAK,EAAE,CAAA;AAAA,kCACtC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,oCAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,sCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sCAAA,eAAA,CAAgB,KAAK,EAAE,CAAA;AAAA,oCACzB;AAAA,kCACF,CAAA;AAAA,kCACA,SAAA,EAAW;AAAA;AAAA,wCAAA,EAGP,IAAA,CAAK,EAAA,KAAO,eAAA,GACR,sIAAA,GACA,yGACN;AAAA,sCAAA,CAAA;AAAA,kCAEF,cAAA,EAAc,IAAA,CAAK,EAAA,KAAO,eAAA,GAAkB,MAAA,GAAS,MAAA;AAAA,kCAErD,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,oDAAAV,cAAAA,CAAC,OAAE,SAAA,EAAU,iCAAA,EACV,eAAK,KAAA,IAAS,CAAA,CAAE,wBAAwB,CAAA,EAC3C,CAAA;AAAA,oDACAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,sCAAA,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,GAAc,CAAA,oBACtDV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA,IAAA,CAAK,WAAA,EACR,CAAA;AAAA,sCAED,KAAK,MAAA,KAAW,UAAA,oBACfU,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+HAAA,EACd,QAAA,EAAA;AAAA,wDAAAV,eAACuI,aAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,wCACtC,EAAE,sBAAsB;AAAA,uCAAA,EAC3B;AAAA,qCAAA,EAEJ;AAAA,mCAAA,EACF;AAAA;AAAA;AACF,6BAAA;AAAA,4BA3CK,IAAA,CAAK;AAAA,2BA6Cb,CAAA,EACH;AAAA,yBAAA;AAAA,wBAxDK,SAAS,OAAO,CAAA;AAAA,uBAyDvB,EAEJ;AAAA,qBAAA,EAAA,EAjGQ,OAkGV,CAAA;AAAA,kBAEJ,CAAC;AAAA;AAAA;AAAA,kBAGD,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAClB,oBAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS;AAAA,sBAE1B,SAAA,EAAW,EAAA;AAAA,sBACX,QAAA,EAAU,EAAA;AAAA,sBACV,QAAA,EAAU;AAAA,qBACZ;AACA,oBAAA,MAAM,SAAA,GAAY,CAAC,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC5E,oBAAA,uBACEvI,cAAAA;AAAA,sBAACwF,mBAAAA,CAAO,GAAA;AAAA,sBAAP;AAAA,wBAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,wBAC9B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,wBAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,GAAA,EAAI;AAAA,wBAE3B,QAAA,kBAAAxF,cAAAA;AAAA,0BAAC,KAAA;AAAA,0BAAA;AAAA,4BACC,IAAA,EAAK,MAAA;AAAA,4BACL,QAAA,EAAU,CAAA;AAAA,4BACV,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAA,CAAK,EAAE,CAAA;AAAA,4BACtC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,8BAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,gCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gCAAA,eAAA,CAAgB,KAAK,EAAE,CAAA;AAAA,8BACzB;AAAA,4BACF,CAAA;AAAA,4BACA,SAAA,EAAW;AAAA;AAAA,4BAAA,EAGP,IAAA,CAAK,EAAA,KAAO,eAAA,GACR,sIAAA,GACA,yGACN;AAAA,0BAAA,CAAA;AAAA,4BAEF,cAAA,EAAc,IAAA,CAAK,EAAA,KAAO,eAAA,GAAkB,MAAA,GAAS,MAAA;AAAA,4BAErD,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAEb,QAAA,EAAA;AAAA,8CAAAV,cAAAA;AAAA,gCAAC,kBAAA;AAAA,gCAAA;AAAA,kCACC,WAAW,KAAA,CAAM,SAAA;AAAA,kCACjB,UAAU,KAAA,CAAM,QAAA;AAAA,kCAChB,UAAU,KAAA,CAAM,QAAA;AAAA,kCAChB,IAAA,EAAK;AAAA;AAAA,+BACP;AAAA,8CAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gDAAAV,cAAAA,CAAC,OAAE,SAAA,EAAU,8BAAA,EACV,eAAK,KAAA,IAAS,CAAA,CAAE,wBAAwB,CAAA,EAC3C,CAAA;AAAA,gCACC,6BACCA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDACV,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,gCAED,KAAK,MAAA,KAAW,UAAA,oBACfU,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oIAAA,EACd,QAAA,EAAA;AAAA,kDAAAV,eAACuI,aAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,kCACtC,EAAE,sBAAsB;AAAA,iCAAA,EAC3B;AAAA,+BAAA,EAEJ;AAAA,6BAAA,EACF;AAAA;AAAA;AACF,uBAAA;AAAA,sBApDK,IAAA,CAAK;AAAA,qBAqDZ;AAAA,kBAEJ,CAAC;AAAA,iBAAA;AAAA,gBAIF,OAAA,oBACCvI,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAK,WAAA,EAAa,SAAA,EAAU,kBAAA,EAC9B,QAAA,EAAA,QAAA,mBACCA,cAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,CAAA,EAAG,oBAE3BA,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,cAAA;AAAA,oBACT,SAAA,EAAU,gEAAA;AAAA,oBAET,YAAE,0BAA0B;AAAA;AAAA,iBAC/B,EAEJ;AAAA;AAAA;AAAA,8BAIJA,cAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,EAAE,8BAA8B,CAAA;AAAA,cACvC,aACE,YAAA,GACI,CAAA,CAAE,mCAAmC,EAAE,SAAA,EAAW,aAAa,SAAA,EAAW,QAAA,EAAU,YAAA,CAAa,QAAA,EAAU,CAAA,GAC3G,eAAA,GACA,EAAE,8BAA8B,CAAA,GAChC,EAAE,oCAAoC;AAAA;AAAA,WAE9C,EAEJ,CAAA;AAAA,UAGD,KAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iGAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EACV,QAAA,EAAA,KAAA,EACH,CAAA,EACF;AAAA,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;;;AC/cA,mBAAA,EAAA;ACWA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,UAAU,CAAC,CAAA;AAC/C;AAEA,IAAM,gBAAA,GAAmB,IAAA;AACzB,IAAM,iBAAA,GAAoB,CAAA;AAmBnB,SAAS,QAAA,GAA2B;AACzC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIM,cAAAA,CAAsB,EAAE,CAAA;AACpD,EAAA,MAAM,iBAAA,GAAoBC,YAAAA,iBAA4B,IAAI,GAAA,EAAK,CAAA;AAE/D,EAAA,MAAM,SAAA,GAAYJ,iBAAAA;AAAA,IAChB,CAAC,IAAA,EAAiB,OAAA,EAAiB,QAAA,EAAmB,MAAA,KAAyB;AAC7E,MAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,IAAA,EAAK,CAAE,WAAA,EAAY;AACrD,MAAA,MAAMC,IAAAA,GAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,iBAAiB,CAAA,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,OAAA,CAAQ,GAAA,CAAIA,IAAG,CAAA;AACrD,MAAA,IAAI,WAAA,IAAe,GAAA,GAAM,WAAA,GAAc,gBAAA,EAAkB;AACvD,QAAA;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,EAAE,KAAK,iBAAA,CAAkB,OAAA,CAAQ,SAAQ,EAAG;AAC9D,QAAA,IAAI,GAAA,GAAM,EAAA,GAAK,gBAAA,GAAmB,CAAA,EAAG;AACnC,UAAA,iBAAA,CAAkB,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,QACzC;AAAA,MACF;AACA,MAAA,iBAAA,CAAkB,OAAA,CAAQ,GAAA,CAAIA,IAAAA,EAAK,GAAG,CAAA;AAEtC,MAAA,MAAM,KAAK,UAAA,EAAW;AACtB,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,QAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAA,EAAM,EAAE,IAAI,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,CAAA;AAC9D,QAAA,IAAI,IAAA,CAAK,UAAU,iBAAA,EAAmB;AAAC,UAAA,OAAO,IAAA;AAAA,QAAK;AACnD,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,iBAAiB,CAAA;AAAA,MACnD,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,OAAA,GAAUD,iBAAAA,CAAY,CAAC,EAAA,KAAe;AAC1C,IAAA,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACrD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACnC,IAAA,SAAA,CAAU,EAAE,CAAA;AACZ,IAAA,iBAAA,CAAkB,QAAQ,KAAA,EAAM;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,iBAAAA;AAAA,IACd,CAAC,KAAa,QAAA,EAAmB,MAAA,KAAyB,UAAU,SAAA,EAAW,GAAA,EAAK,UAAU,MAAM,CAAA;AAAA,IACpG,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,KAAA,GAAQA,iBAAAA;AAAA,IACZ,CAAC,KAAa,QAAA,EAAmB,MAAA,KAAyB,UAAU,OAAA,EAAS,GAAA,EAAK,UAAU,MAAM,CAAA;AAAA,IAClG,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,IAAA,GAAOA,iBAAAA;AAAA,IACX,CAAC,KAAa,QAAA,EAAmB,MAAA,KAAyB,UAAU,MAAA,EAAQ,GAAA,EAAK,UAAU,MAAM,CAAA;AAAA,IACjG,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,OAAA,GAAUA,iBAAAA;AAAA,IACd,CAAC,KAAa,QAAA,EAAmB,MAAA,KAAyB,UAAU,SAAA,EAAW,GAAA,EAAK,UAAU,MAAM,CAAA;AAAA,IACpG,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;ACtHO,SAAS,mBAAA,CAAoB,UAAqB,CAAA,EAA6C;AAEpG,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAW,EAAC;AAE3D,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,KAAA,GAAQ+J,mBAAW,GAAG,CAAA;AAG5B,EAAA,MAAM,SAAA,GAAY,CAAA,KAAM,CAAC9J,IAAAA,KAAgBA,IAAAA,CAAAA;AAGzC,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,OAAA,EAAS,UAAU,wBAAwB,CAAA;AAAA,IAC3C,WAAA,EAAa,UAAU,4BAA4B,CAAA;AAAA,IACnD,aAAA,EAAe,UAAU,4BAA4B,CAAA;AAAA,IACrD,cAAA,EAAgB,UAAU,6BAA6B,CAAA;AAAA,IACvD,OAAA,EAAS,UAAU,wBAAwB;AAAA,GAC7C;AAGA,EAAA,MAAM,QAAA,uBAAe,GAAA,CAAuB;AAAA,IAC1C,CAAC,OAAA,EAAS,EAAE,CAAA;AAAA,IACZ,CAAC,WAAA,EAAa,EAAE,CAAA;AAAA,IAChB,CAAC,aAAA,EAAe,EAAE,CAAA;AAAA,IAClB,CAAC,cAAA,EAAgB,EAAE,CAAA;AAAA,IACnB,CAAC,OAAA,EAAS,EAAE;AAAA,GACb,CAAA;AAGD,EAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,OAAA,KAAY;AAChC,IAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAWwC,wBAAAA,CAAiB,KAAA,EAAOsH,kBAAA,CAAW,WAAW,CAAC,CAAA;AAEhE,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,aAAa,CAAA,EAAG;AACzB,MAAA,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,YAAY,CAAA,EAAG;AACxB,MAAA,QAAA,CAAS,GAAA,CAAI,aAAa,CAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,YAAY,EAAA,EAAI;AACzB,MAAA,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAAA,IACrC;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,QAAA,CAAS,OAAA,CAAQ,CAACC,SAAAA,KAAa;AAC7B,IAAAA,SAAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,OAAO,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IACzE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,QAAA,CAAS,OAAA,CAAQ,CAACA,SAAAA,EAAU,YAAA,KAAiB;AAC3C,IAAA,IAAIA,SAAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,CAAW,YAAY,CAAA,IAAK,YAAA,EAAc,QAAA,EAAAA,SAAAA,EAAU,CAAA;AAAA,IAC1E;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AFlCA,IAAM,6BAAA,GAAgC,GAAA;AAEtC,SAAS,UAAA,CAAW,EAAE,KAAA,EAAM,EAA+B;AACzD,EAAA,MAAM,QAAQ,KAAA,CAAM,kBAAA;AACpB,EAAA,uBACEzJ,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,+CAAA,EACT,KAAA,GACI,yEAAA,GACA,iEACN,CAAA,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAV,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,oBAAA,EACT,KAAA,GACI,oCAAA,GACA,gCACN,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,SACT;AAAA,QACC,KAAA,CAAM,+BACLA,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,aAAA,EACT,KAAA,GACI,oCAAA,GACA,gCACN,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA;AACT;AAAA;AAAA,GAEJ;AAEJ;AAEA,IAAM,oBAAA,GAAuB,0BAAA;AAC7B,IAAM,kCAAA,GAAqC,GAAA;AAC3C,IAAM,2BAAA,GAA8B,EAAA;AACpC,IAAM,+BAAA,GAAkC,CAAA;AACxC,IAAM,kCAAA,GAAqC,GAAA;AAC3C,IAAM,wBAAA,GAA2B,CAAA;AAEjC,SAAS,kBAAA,GAAqB;AAC5B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIM,eAAS,MAAM;AACnD,IAAA,IAAI;AACF,MAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,oBAAoB,CAAA,KAAM,MAAA;AAAA,IACxD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,cAAA,GAAiBC,aAAO,WAAW,CAAA;AACzC,EAAAE,gBAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,MAAA,GAASN,kBAAY,MAAM;AAC/B,IAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AACvB,MAAA,MAAM,OAAO,CAAC,IAAA;AACd,MAAA,IAAI;AAAE,QAAA,YAAA,CAAa,OAAA,CAAQ,oBAAA,EAAsB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAa;AACrF,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,IAAI;AAAE,MAAA,YAAA,CAAa,OAAA,CAAQ,sBAAsB,OAAO,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAa;AAAA,EAClF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,kBAAY,MAAM;AACjC,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AAAE,MAAA,YAAA,CAAa,OAAA,CAAQ,sBAAsB,MAAM,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAa;AAAA,EACjF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,WAAA,EAAa,cAAA,EAAgB,MAAA,EAAQ,QAAQ,QAAA,EAAS;AACjE;AAuBe,SAARmJ,QAAAA,CAAyB;AAAA,EAC9B,UAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,SAAA,EAAW,mBAAA;AAAA,EACX;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,qBAAqBjB,6BAAAA,EAAiB;AAC5C,EAAA,MAAM,cAAA,GAAiB9H,aAAoB,IAAI,CAAA;AAC/C,EAAA,MAAM,kBAAA,GAAqBA,aAAuB,IAAI,CAAA;AACtD,EAAA,MAAM,2BAAA,GAA8BA,YAAAA,CAA+B,EAAE,CAAA;AAGrE,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAQ,MAAA,EAAQ,QAAA,KAAa,kBAAA,EAAmB;AACrE,EAAA,MAAM,cAAc,CAAC,OAAA;AAGrB,EAAA,MAAM,kBAAA,GAAqBJ,iBAAAA;AAAA,IACzB,CAAC,CAAA,KAAqC;AACpC,MAAA,IAAI,CAAC,WAAA,EAAa;AAAC,QAAA;AAAA,MAAO;AAC1B,MAAA,MAAM,WAAA,GAAc,wIAAA;AACpB,MAAA,IAAK,CAAA,CAAE,MAAA,CAAuB,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAC,QAAA;AAAA,MAAO;AAC5D,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IACA,CAAC,aAAa,MAAM;AAAA,GACtB;AAGA,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAAC,MAAA;AAAA,IAAO;AAE1B,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA;AAE7B,MAAA,IAAI,KAAA,IAAS,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK;AAC1B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,EAAO;AAAA,MACT;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AAGxB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAAC,MAAA;AAAA,IAAO;AAE1B,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,MAAM,SAAU,CAAA,CAAyC,MAAA;AACzD,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,QAAA,EAAS;AAAA,MACX;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,mCAAmC,OAAO,CAAA;AAClE,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,iCAAA,EAAmC,OAAO,CAAA;AAAA,EACpF,CAAA,EAAG,CAAC,WAAA,EAAa,QAAQ,CAAC,CAAA;AAE1B,EAAA,MAAM,gBAAgB,WAAA,IAAe,WAAA;AAGrC,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAAIH,eAAS,KAAK,CAAA;AAC9E,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,2BAAA,CAA4B,KAAK,CAAA;AACjC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,2BAAA,CAA4B,IAAI,GAAG,GAAG,CAAA;AACrE,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIH,eAAoB,UAAU,CAAA;AAChF,EAAA,MAAM,YAAY,mBAAA,IAAuB,iBAAA;AACzC,EAAA,MAAM,eAAA,GAAkBH,iBAAAA,CAAY,CAAC,GAAA,KAAmB;AACtD,IAAA,IAAI,wBAAwB,MAAA,EAAW;AACrC,MAAA,oBAAA,CAAqB,GAAG,CAAA;AAAA,IAC1B;AACA,IAAA,WAAA,GAAc,GAAG,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,mBAAA,EAAqB,WAAW,CAAC,CAAA;AAGrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIG,eAAS,EAAE,CAAA;AAGjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAiC,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAiC,IAAI,CAAA;AAC3E,EAAA,MAAM,YAAA,GAAe,WAAW,kBAAA,KAAuB,IAAA;AAGvD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,eAAS,CAAC,CAAA;AAG9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAG5E,EAAA,MAAM,aAAA,GAAgBH,kBAAY,YAAY;AAC5C,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,MAAM,SAAS,MAAM,UAAA,CAAW,aAAa,EAAE,KAAA,EAAO,IAAI,CAAA;AAC1D,MAAA,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,GAAG,CAAA;AAC7C,MAAA,YAAA,CAAa,cAAA,CAAe,GAAA,EAAK,CAAA,CAAE,qCAAqC,CAAC,CAAC,CAAA;AAAA,IAC5E,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,CAAC,CAAC,CAAA;AAElB,EAAAM,gBAAU,MAAM;AACd,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,aAAA,EAAe,UAAU,CAAC,CAAA;AAE9B,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAiB;AAC9C,MAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAE1B,MAAA,MAAM,SAAU,KAAA,CAA2C,MAAA;AAC3D,MAAA,MAAM,SAAS,MAAA,EAAQ,MAAA;AACvB,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,KAAW,qBAAqB,MAAA,KAAW,cAAA,IAAkB,WAAW,4BAAA,EAA8B;AACnH,QAAA,qBAAA,CAAsB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,MACpC;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,2BAA2B,qBAAqB,CAAA;AACxE,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,2BAA2B,qBAAqB,CAAA;AAAA,IAC7E,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,gBAAU,MAAM;AACd,IAAA,2BAAA,CAA4B,UAAU,EAAC;AAAA,EACzC,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,EAAiB;AAAC,MAAA;AAAA,IAAO;AAC9B,IAAA,IAAI,OAAA,EAAS;AAAC,MAAA;AAAA,IAAO;AAErB,IAAA,MAAM,mBAAmB,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,OAAO,eAAe,CAAA;AAClF,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO,2BAAA,CAA4B,QAAQ,eAAe,CAAA;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,2BAAA,CAA4B,OAAA,CAAQ,eAAe,CAAA,IAAK,CAAA;AACzE,IAAA,IAAI,YAAY,+BAAA,EAAiC;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,2BAAA,CAA4B,OAAA,CAAQ,eAAe,CAAA,GAAI,QAAA,GAAW,CAAA;AAElE,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,MAAM;AACxC,MAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,qBAAA,CAAsB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,IACpC,GAAG,kCAAkC,CAAA;AAErC,IAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,eAAA,EAAiB,OAAA,EAAS,QAAQ,CAAC,CAAA;AAKvC,EAAA,MAAM,oBAAA,GAAuBD,cAAQ,MAAM;AACzC,IAAA,MAAM,YAAA,GAAe,EAAE,qBAAqB,CAAA;AAC5C,IAAA,OACE,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IACtB,SAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,UAAU,YAAA,CAAa,CAAA;AAAA,EAEpE,CAAA,EAAG,CAAC,QAAA,EAAU,CAAC,CAAC,CAAA;AAEhB,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,oBAAA,IAAwB,kBAAA,KAAuB,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AAE/D,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,MAAM,UAAA,GAAa,YAAY,YAAY;AACzC,MAAA,SAAA,EAAA;AACA,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,UAAA,CAAW,aAAa,EAAE,KAAA,EAAO,IAAI,CAAA;AAC1D,QAAA,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAI,aAAa,2BAAA,EAA6B;AAC5C,QAAA,aAAA,CAAc,UAAU,CAAA;AAAA,MAC1B;AAAA,IACF,GAAG,kCAAkC,CAAA;AAErC,IAAA,OAAO,MAAM,cAAc,UAAU,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,oBAAA,EAAsB,UAAA,EAAY,kBAAkB,CAAC,CAAA;AAEzD,EAAA,MAAM,oBAAA,GAAuB,CAAC,SAAA,KAAsB;AAClD,IAAA,mBAAA,CAAoB,SAAS,CAAA;AAC7B,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoBN,iBAAAA,CAAY,OAAO,SAAA,KAAsB;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,iBAAiB,SAAS,CAAA;AAC3C,MAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,yBAAA,EAA2B;AAAA,QAC9D,MAAA,EAAQ,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAA;AAAU,OAC3C,CAAC,CAAA;AAAA,IACJ,SAAS,OAAA,EAAS;AAChB,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,OAAO,CAAA;AACnD,MAAA,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,oCAAoC,CAAC,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,CAAA,EAAG,KAAK,CAAC,CAAA;AAEzB,EAAA,MAAM,iBAAiB,YAAY;AACjC,IAAA,IAAI,CAAC,gBAAA,EAAkB;AAAC,MAAA;AAAA,IAAO;AAE/B,IAAA,MAAM,oBAAoB,eAAA,KAAoB,gBAAA;AAC9C,IAAA,MAAM,UAAA,GAAa,gBAAA;AAEnB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,eAAe,UAAU,CAAA;AAC1C,MAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,yBAAA,EAA2B;AAAA,QAC9D,MAAA,EAAQ,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,UAAA;AAAW,OACrD,CAAC,CAAA;AAEF,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,MACpB;AAEA,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,6BAA6B,CAAA,EAAG,GAAA,EAAM;AAAA,QACpD,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,QAC7B,OAAA,EAAS,MAAM,iBAAA,CAAkB,UAAU;AAAA,OAC5C,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,GAAG,CAAA;AAC/C,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,CAAA,CAAE,oCAAoC,CAAC,CAAA;AAC3E,MAAA,cAAA,CAAe,OAAO,CAAA;AACtB,MAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC3B,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,OAClC,SAAA,EACA,eAAA,KACG;AACH,IAAA,IAAI;AACF,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAM,UAAA,CAAW,aAAa,SAAS,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,MAAM,UAAA,CAAW,WAAW,SAAS,CAAA;AAAA,MACvC;AACA,MAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,IAC5B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,GAAG,CAAA;AAC1C,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,CAAA,CAAE,kCAAkC,CAAC,CAAA;AACzE,MAAA,cAAA,CAAe,OAAO,CAAA;AACtB,MAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,CAAA,EAAG,KAAK,CAAC,CAAA;AAEzB,EAAA,MAAM,mBAAA,GAAsBA,iBAAAA,CAAY,OAAO,SAAA,EAAmB,QAAA,KAAqB;AACrF,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,aAAA,CAAc,SAAA,EAAW,QAAQ,CAAA;AAClD,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,wCAAwC,CAAC,CAAA;AACzD,MAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,IAC5B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,GAAG,CAAA;AACpD,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,CAAA,CAAE,mCAAmC,CAAC,CAAA;AAC1E,MAAA,cAAA,CAAe,OAAO,CAAA;AACtB,MAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,CAAA,EAAG,KAAK,CAAC,CAAA;AAEzB,EAAA,MAAM,qBAAA,GAAwBA,iBAAAA,CAAY,OAAO,SAAA,KAAsB;AACrE,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,uBAAuB,SAAS,CAAA;AACjD,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,iCAAiC,CAAC,CAAA;AAClD,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,yBAAA,EAA2B;AAAA,QAC9D,MAAA,EAAQ,EAAE,MAAA,EAAQ,4BAAA,EAA8B,SAAA;AAAU,OAC3D,CAAC,CAAA;AAAA,IACJ,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,GAAG,CAAA;AAChD,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,CAAA,CAAE,wCAAwC,CAAC,CAAA;AAC/E,MAAA,cAAA,CAAe,OAAO,CAAA;AACtB,MAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,CAAA,EAAG,KAAK,CAAC,CAAA;AAGzB,EAAA,MAAM,mBAAA,GAAsBA,iBAAAA;AAAA,IAC1B,CAAC,SAAA,KAAsB,eAAA,CAAgB,SAAS,CAAA;AAAA,IAChD,CAAC,eAAe;AAAA,GAClB;AACA,EAAA,MAAM,oBAAA,GAAuBA,iBAAAA;AAAA,IAC3B,CAAC,SAAA,KAAsB,oBAAA,CAAqB,SAAS,CAAA;AAAA,IACrD;AAAC,GACH;AACA,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA;AAAA,IACvB,CAAC,SAAA,EAAmB,MAAA,KAAoB,eAAA,CAAgB,WAAW,MAAM,CAAA;AAAA,IACzE,CAAC,eAAe;AAAA,GAClB;AACA,EAAA,MAAM,mBAAA,GAAsBA,iBAAAA;AAAA,IAC1B,CAAC,SAAA,EAAmB,QAAA,KAAqB,mBAAA,CAAoB,WAAW,QAAQ,CAAA;AAAA,IAChF,CAAC,mBAAmB;AAAA,GACtB;AACA,EAAA,MAAM,4BAAA,GAA+BA,iBAAAA;AAAA,IACnC,CAAC,SAAA,KAAsB,qBAAA,CAAsB,SAAS,CAAA;AAAA,IACtD,CAAC,qBAAqB;AAAA,GACxB;AAGA,EAAA,MAAM,gBAAA,GAAmBK,cAAQ,MAAM;AACrC,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG;AAAC,MAAA,OAAO,QAAA;AAAA,IAAS;AAC1C,IAAA,MAAM,CAAA,GAAI,YAAY,WAAA,EAAY;AAClC,IAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,QAAA,EAAU,WAAW,CAAC,CAAA;AAG1B,EAAA,MAAM,cAAA,GAAiBA,aAAAA;AAAA,IACrB,MAAM,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,IAC7C,CAAC,gBAAgB;AAAA,GACnB;AACA,EAAA,MAAM,gBAAA,GAAmBA,aAAAA;AAAA,IACvB,MAAM,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AAAA,IAC9C,CAAC,gBAAgB;AAAA,GACnB;AAGA,EAAA,MAAM,aAAA,GAAgBA,cAAQ,MAAM;AAClC,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,gBAAA,EAAkB,CAAC,CAAA;AACtD,IAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,IACvB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACrB,GAAG,KAAA;AAAA,MACH,QAAA,EAAU,MAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,GAAI,KAAA,CAAM,WAAW;AAAC,KAC9D,CAAE,IACF,EAAC;AAAA,EACP,CAAA,EAAG,CAAC,gBAAA,EAAkB,CAAC,CAAC,CAAA;AAGxB,EAAA,MAAM,uBAAA,GAA0BA,aAAAA;AAAA,IAC9B,MAAM,aAAA,CAAc,OAAA,CAAQ,CAAC,KAAA,KAAU,MAAM,QAAQ,CAAA;AAAA,IACrD,CAAC,aAAa;AAAA,GAChB;AAGA,EAAA,MAAM,mBAAA,GAAsBA,cAAQ,MAAM;AACxC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,KAAK,CAAC,GAAG,cAAA,EAAgB,GAAG,uBAAuB,CAAA,EAAG;AAC/D,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AAC9B,MAAA,IAAA,CAAK,GAAA,CAAI,EAAE,EAAE,CAAA;AACb,MAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACb,MAAA,IAAI,MAAA,CAAO,UAAU,wBAAA,EAA0B;AAAC,QAAA;AAAA,MAAM;AAAA,IACxD;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,cAAA,EAAgB,uBAAuB,CAAC,CAAA;AAE5C,EAAA,MAAM,oBAAoB,gBAAA,CAAiB,MAAA;AAC3C,EAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,iBAAA,GAAoB,oBAAoB,MAAM,CAAA;AAGhF,EAAA,MAAM,wBAAA,GAA2BL,iBAAAA;AAAA,IAC/B,CAAC,CAAA,KAAwC;AACvC,MAAA,MAAM,MAAM,cAAA,CAAe,OAAA;AAC3B,MAAA,IAAI,CAAC,GAAA,EAAK;AAAC,QAAA;AAAA,MAAO;AAElB,MAAA,MAAM,iBAAiB,KAAA,CAAM,IAAA;AAAA,QAC3B,GAAA,CAAI,iBAA8B,2BAA2B;AAAA,OAC/D;AACA,MAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAAC,QAAA;AAAA,MAAO;AAEzC,MAAA,MAAM,eAAe,cAAA,CAAe,OAAA;AAAA,QAClC,QAAA,CAAS;AAAA,OACX;AAEA,MAAA,IAAI,SAAA,GAA2B,IAAA;AAE/B,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,WAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,SAAA,GACE,YAAA,GAAe,IAAI,CAAA,GAAI,IAAA,CAAK,IAAI,YAAA,GAAe,CAAA,EAAG,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA;AAC7E,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,SAAA,GACE,YAAA,GAAe,IACX,cAAA,CAAe,MAAA,GAAS,IACxB,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,CAAA,EAAG,CAAC,CAAA;AAClC,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,SAAA,GAAY,CAAA;AACZ,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,SAAA,GAAY,eAAe,MAAA,GAAS,CAAA;AACpC,UAAA;AAAA;AAGJ,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,cAAA,CAAe,SAAS,EAAE,KAAA,EAAM;AAAA,MAClC;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,uBACEO,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,eAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,cAAc,kBAAA,GAAqB,MAAA;AAAA,QAC5C,SAAA,EAAW,CAAA,oHAAA,EAAuH,wBAAA,GAA2B,kBAAA,GAAqB,iBAAiB,CAAA,6CAAA,EACjM,aAAA,GACI,sBAAA,GACA,WAAA,GACE,sBAAA,GACA,MACR,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,QACb,KAAA,EAAO,EAAE,UAAA,EAAY,OAAA,EAAQ;AAAA,QAC7B,IAAA,EAAK,YAAA;AAAA,QACL,YAAA,EAAY,EAAE,6BAA6B,CAAA;AAAA,QAG1C,QAAA,EAAA;AAAA,UAAA,WAAA,oBACCA,eAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,gGAAA,EACT,aAAA,GACI,oCAAA,GACA,4CACN,CAAA,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,kCAAAV,cAAAA;AAAA,oBAACwF,mBAAAA,CAAO,MAAA;AAAA,oBAAP;AAAA,sBACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,wBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,wBAAA,SAAA,EAAU;AAAA,sBACZ,CAAA;AAAA,sBACA,QAAA,EAAU,YAAY,OAAA,IAAW,YAAA;AAAA,sBACjC,SAAA,EAAU,8QAAA;AAAA,sBACV,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,sBAC9B,YAAA,EAAY,EAAE,8BAA8B,CAAA;AAAA,sBAC5C,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,sBAEvB,QAAA,EAAA,QAAA,mBACCxF,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iFAAA,EAAkF,CAAA,mBAEjGA,cAAAA,CAACgJ,UAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,mBAElC;AAAA,kCACAhJ,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mQAAA,EACb,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;AAAA,iBAAA,EACF,CAAA;AAAA,gCAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,kCAAAV,cAAAA;AAAA,oBAACwF,mBAAAA,CAAO,MAAA;AAAA,oBAAP;AAAA,sBACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,wBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,wBAAA,MAAA,EAAO;AACP,wBAAA,UAAA,CAAW,MAAM;AACf,0BAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,OAAA,EAAS,aAAA,CAAc,OAAO,CAAA;AAC/D,0BAAA,KAAA,EAAO,KAAA,EAAM;AAAA,wBACf,GAAG,6BAA6B,CAAA;AAAA,sBAClC,CAAA;AAAA,sBACA,SAAA,EAAU,iRAAA;AAAA,sBACV,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,sBAC1C,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,sBAExB,QAAA,kBAAAxF,cAAAA,CAACuF,qBAAAA,EAAA,EAAgB,MAAM,EAAA,EAAI;AAAA;AAAA,mBAC7B;AAAA,kCACAvF,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wSAAA,EACb,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EACjC;AAAA,iBAAA,EACF,CAAA;AAAA,gBAGC,mBAAA,CAAoB,MAAA,GAAS,CAAA,oBAC5BU,eAAAA;AAAA,kBAAC8E,mBAAAA,CAAO,GAAA;AAAA,kBAAP;AAAA,oBACC,SAAA,EAAU,yCAAA;AAAA,oBACV,QAAA,EAAU,qBAAqB,MAAA,GAAY,wBAAA;AAAA,oBAC3C,OAAA,EAAQ,QAAA;AAAA,oBACR,OAAA,EAAS,gBAAgB,SAAA,GAAY,QAAA;AAAA,oBAEpC,QAAA,EAAA;AAAA,sBAAA,mBAAA,CAAoB,GAAA,CAAI,CAAC,OAAA,KAAY;AACpC,wBAAA,MAAM,QAAA,GAAW,QAAQ,EAAA,KAAO,eAAA;AAChC,wBAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,EAAO,MAAK,GAAI,CAAC,GAAG,WAAA,EAAY;AACxD,wBAAA,uBACE9E,eAAAA;AAAA,0BAAC8E,mBAAAA,CAAO,GAAA;AAAA,0BAAP;AAAA,4BAEC,SAAA,EAAU,0BAAA;AAAA,4BACV,QAAA,EACE,qBACI,MAAA,GACA;AAAA,8BACE,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,8BACjC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA;AAAE,6BAClC;AAAA,4BAGN,QAAA,EAAA;AAAA,8CAAAxF,cAAAA;AAAA,gCAACwF,mBAAAA,CAAO,MAAA;AAAA,gCAAP;AAAA,kCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oCAAA,eAAA,CAAgB,QAAQ,EAAE,CAAA;AAAA,kCAC5B,CAAA;AAAA,kCACA,SAAA,EAAW,CAAA,6LAAA,EACT,QAAA,GACI,4HAAA,GACA,wGACN,CAAA,CAAA;AAAA,kCACA,YAAA,EAAY,OAAA,CAAQ,KAAA,IAAS,CAAA,CAAE,qBAAqB,CAAA;AAAA,kCACpD,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,kCAEvB,QAAA,EAAA,OAAA,GACC,0BAEAxF,cAAAA,CAACoK,oBAAW,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,+BAExC;AAAA,8CACApK,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+SACZ,QAAA,EAAA,OAAA,CAAQ,KAAA,IAAS,CAAA,CAAE,qBAAqB,CAAA,EAC3C;AAAA;AAAA,2BAAA;AAAA,0BAhCK,OAAA,CAAQ;AAAA,yBAiCf;AAAA,sBAEJ,CAAC,CAAA;AAAA,sBACA,aAAA,GAAgB,qBACfU,eAAAA;AAAA,wBAAC8E,mBAAAA,CAAO,GAAA;AAAA,wBAAP;AAAA,0BACC,SAAA,EAAU,yBAAA;AAAA,0BACV,QAAA,EACE,qBACI,MAAA,GACA;AAAA,4BACE,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,4BACjC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA;AAAE,2BAClC;AAAA,0BAGN,QAAA,EAAA;AAAA,4CAAA9E,eAAAA;AAAA,8BAAC8E,mBAAAA,CAAO,MAAA;AAAA,8BAAP;AAAA,gCACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kCAAA,MAAA,EAAO;AAAA,gCACT,CAAA;AAAA,gCACA,SAAA,EAAU,6SAAA;AAAA,gCACV,cAAY,CAAA,CAAE,0BAAA,EAA4B,EAAE,KAAA,EAAO,eAAe,CAAA;AAAA,gCAClE,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,gCACzB,QAAA,EAAA;AAAA,kCAAA,GAAA;AAAA,kCACG;AAAA;AAAA;AAAA,6BACJ;AAAA,4CACAxF,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4SAAA,EACb,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAClC;AAAA;AAAA;AAAA;AACF;AAAA;AAAA;AAEJ;AAAA;AAAA,WAEJ;AAAA,0BAIFU,eAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,WAAW,CAAA,8DAAA,EACT,aAAA,GACI,4CAAA,GACA,WAAA,GACE,2CACA,EACR,CAAA,CAAA;AAAA,cAGE,QAAA,EAAA;AAAA,gBAAA,CAAA,UAAA,IAAc,OAAA,qBACdA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qFAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,UAAA;AAAA,kBACA,2BACCV,cAAAA;AAAA,oBAACwF,mBAAAA,CAAO,MAAA;AAAA,oBAAP;AAAA,sBACC,OAAA,EAAS,OAAA;AAAA,sBACT,SAAA,EAAU,2HAAA;AAAA,sBACV,KAAA,EAAO,EAAE,6BAA6B,CAAA;AAAA,sBACtC,YAAA,EAAY,EAAE,6BAA6B,CAAA;AAAA,sBAC3C,UAAA,EAAW,OAAA;AAAA,sBACX,QAAA,EAAS,KAAA;AAAA,sBACT,QAAA,EAAU,cAAA;AAAA,sBAEV,0BAAAxF,cAAAA,CAACsD,OAAAA,EAAA,EAAE,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU;AAAA;AAAA;AACnC,iBAAA,EAEJ,CAAA;AAAA,gBAID,SAAA,KAAc,WAAA,IAAe,eAAA,mBAC5BtD,cAAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACC,UAAA;AAAA,oBACA,eAAA;AAAA,oBACA;AAAA;AAAA,iBACF,mBAEAU,eAAAA,CAAAG,mBAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,kCAAAb,eAAC,KAAA,EAAA,EAAI,GAAA,EAAK,kBAAA,EAAoB,SAAA,EAAU,aACtC,QAAA,kBAAAA,cAAAA;AAAA,oBAAC,mBAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO,WAAA;AAAA,sBACP,QAAA,EAAU,cAAA;AAAA,sBACV,WAAA,EAAa,EAAE,4BAA4B;AAAA;AAAA,mBAC7C,EACF,CAAA;AAAA,kCAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OACb,QAAA,kBAAAA,cAAAA;AAAA,oBAACwF,mBAAAA,CAAO,MAAA;AAAA,oBAAP;AAAA,sBACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,wBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,wBAAA,SAAA,EAAU;AAAA,sBACZ,CAAA;AAAA,sBACA,QAAA,EAAU,YAAY,OAAA,IAAW,YAAA;AAAA,sBACjC,SAAA,EAAU,kaAAA;AAAA,sBACV,OAAO,YAAA,GAAe,CAAA,CAAE,kCAAkC,CAAA,GAAI,EAAE,qBAAqB,CAAA;AAAA,sBACrF,YAAA,EAAY,EAAE,8BAA8B,CAAA;AAAA,sBAC5C,YAAY,kBAAA,GAAqB,EAAC,GAAI,EAAE,GAAG,EAAA,EAAG;AAAA,sBAC9C,UAAU,kBAAA,GAAqB,EAAC,GAAI,EAAE,OAAO,IAAA,EAAK;AAAA,sBAEjD,QAAA,EAAA,QAAA,mBACC9E,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wCAAAb,cAAAA,CAAC,sBAAA,EAAA,EAAe,OAAA,EAAQ,SAAA,EAAU,MAAK,IAAA,EAAK,CAAA;AAAA,wCAC5CA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAAE;AAAA,uBAAA,EACrC,CAAA,mBAEAU,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wCAAAb,eAACgJ,UAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO,CAAA;AAAA,wCAC9BhJ,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE;AAAA,uBAAA,EAClC;AAAA;AAAA,mBAEJ,EACF,CAAA;AAAA,kCAGAU,eAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,GAAA,EAAK,cAAA;AAAA,sBACL,SAAA,EAAU,iDAAA;AAAA,sBACV,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,sBAC1C,SAAA,EAAW,wBAAA;AAAA,sBAEV,QAAA,EAAA;AAAA,wBAAA,OAAA,IAAW,QAAA,CAAS,MAAA,KAAW,CAAA,mBAC9BV,cAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,CAAA,EAAG,CAAA,mBAE3BU,eAAAA,CAAAG,mBAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,0BAAA,cAAA,CAAe,SAAS,CAAA,oBACvBH,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EACb,QAAA,EAAA;AAAA,4CAAAV,cAAAA;AAAA,8BAAC,eAAA;AAAA,8BAAA;AAAA,gCACC,SAAA,EAAW,EAAE,sBAAsB,CAAA;AAAA,gCACnC,OAAO,cAAA,CAAe;AAAA;AAAA,6BACxB;AAAA,4CACAA,cAAAA;AAAA,8BAACwF,mBAAAA,CAAO,GAAA;AAAA,8BAAP;AAAA,gCACC,SAAA,EAAU,gBAAA;AAAA,gCACV,QAAA,EAAU,wBAAA;AAAA,gCACV,OAAA,EAAQ,QAAA;AAAA,gCACR,OAAA,EAAQ,SAAA;AAAA,gCACR,IAAA,EAAK,MAAA;AAAA,gCACL,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,gCAEzC,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,OAAA,KAAY;AAC/B,kCAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,EAAQ,QAAA,IAAY,IAAA;AAC7C,kCAAA,uBACExF,cAAAA;AAAA,oCAAC,mBAAA;AAAA,oCAAA;AAAA,sCAEC,OAAA;AAAA,sCACA,QAAA,EAAU,QAAQ,EAAA,KAAO,eAAA;AAAA,sCACzB,QAAA,EAAU,MAAM,mBAAA,CAAoB,OAAA,CAAQ,EAAE,CAAA;AAAA,sCAC9C,WAAW,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,EAAE,CAAA,GAAI,MAAA;AAAA,sCAC/D,KAAA,EAAO,WAAW,MAAM,gBAAA,CAAiB,QAAQ,EAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAAA,sCACvE,QAAA,EAAU,WAAW,CAAC,QAAA,KAAa,oBAAoB,OAAA,CAAQ,EAAA,EAAI,QAAQ,CAAA,GAAI,MAAA;AAAA,sCAC/E,mBAAmB,QAAA,GAAW,MAAM,4BAAA,CAA6B,OAAA,CAAQ,EAAE,CAAA,GAAI;AAAA,qCAAA;AAAA,oCAP1E,OAAA,CAAQ;AAAA,mCAQf;AAAA,gCAEJ,CAAC;AAAA;AAAA,6BACH;AAAA,4CACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EAAqD;AAAA,2BAAA,EACtE,CAAA;AAAA,0BAID,aAAA,CAAc,IAAI,CAAC,KAAA,qBAClBU,eAAAA,CAAC,KAAA,EAAA,EAAqB,WAAU,MAAA,EAC9B,QAAA,EAAA;AAAA,4CAAAV,cAAAA;AAAA,8BAAC,eAAA;AAAA,8BAAA;AAAA,gCACC,WAAW,KAAA,CAAM,IAAA;AAAA,gCACjB,KAAA,EAAO,MAAM,QAAA,CAAS;AAAA;AAAA,6BACxB;AAAA,4CACAA,cAAAA;AAAA,8BAACwF,mBAAAA,CAAO,GAAA;AAAA,8BAAP;AAAA,gCACC,SAAA,EAAU,gBAAA;AAAA,gCACV,QAAA,EAAU,wBAAA;AAAA,gCACV,OAAA,EAAQ,QAAA;AAAA,gCACR,OAAA,EAAQ,SAAA;AAAA,gCACR,IAAA,EAAK,MAAA;AAAA,gCACL,YAAA,EAAY,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,MAAA,CAAA;AAAA,gCAExB,QAAA,EAAA,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AAC/B,kCAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,EAAQ,QAAA,IAAY,IAAA;AAC7C,kCAAA,uBACExF,cAAAA;AAAA,oCAAC,mBAAA;AAAA,oCAAA;AAAA,sCAEC,OAAA;AAAA,sCACA,QAAA,EAAU,QAAQ,EAAA,KAAO,eAAA;AAAA,sCACzB,QAAA,EAAU,MAAM,mBAAA,CAAoB,OAAA,CAAQ,EAAE,CAAA;AAAA,sCAC9C,WAAW,QAAA,GAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,EAAE,CAAA,GAAI,MAAA;AAAA,sCAC/D,KAAA,EAAO,WAAW,MAAM,gBAAA,CAAiB,QAAQ,EAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAAA,sCACvE,QAAA,EAAU,WAAW,CAAC,QAAA,KAAa,oBAAoB,OAAA,CAAQ,EAAA,EAAI,QAAQ,CAAA,GAAI,MAAA;AAAA,sCAC/E,mBAAmB,QAAA,GAAW,MAAM,4BAAA,CAA6B,OAAA,CAAQ,EAAE,CAAA,GAAI;AAAA,qCAAA;AAAA,oCAP1E,OAAA,CAAQ;AAAA,mCAQf;AAAA,gCAEJ,CAAC;AAAA;AAAA;AACH,2BAAA,EAAA,EA5BQ,KAAA,CAAM,IA6BhB,CACD,CAAA;AAAA,0BAGA,gBAAA,CAAiB,MAAA,KAAW,CAAA,IAAK,CAAC,2BACjCA,cAAAA;AAAA,4BAAC,kBAAA;AAAA,4BAAA;AAAA,8BACC,KAAA,EACE,WAAA,GACI,CAAA,CAAE,6BAAA,EAA+B,EAAE,OAAO,WAAA,EAAa,CAAA,GACvD,CAAA,CAAE,2BAA2B,CAAA;AAAA,8BAEnC,WAAA,EACE,WAAA,GACI,MAAA,GACA,CAAA,CAAE,sCAAsC,CAAA;AAAA,8BAE9C,MAAA,EACE,8BACEA,cAAAA;AAAA,gCAAC,QAAA;AAAA,gCAAA;AAAA,kCACC,OAAA,EAAS,MAAM,cAAA,CAAe,EAAE,CAAA;AAAA,kCAChC,SAAA,EAAU,+EAAA;AAAA,kCAET,YAAE,qBAAqB;AAAA;AAAA,+BAC1B,GACE;AAAA;AAAA;AAER,yBAAA,EAEJ,CAAA;AAAA,wBAGD,SAAA,oBAAaA,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAO,SAAA,EAAW,CAAA;AAAA,wBAC3C,eAAe,CAAC,SAAA,oBAAaA,cAAAA,CAAC,UAAA,EAAA,EAAW,OAAO,WAAA,EAAa;AAAA;AAAA;AAAA,mBAChE;AAAA,kBAGC;AAAA,iBAAA,EACH,CAAA;AAAA,gBAID,WAAA,oBACCU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sGAAA,EAEX,QAAA,EAAA;AAAA,kBAAA,cAAA,IAAkB,eAAA,mBAClBA,eAAAA,CAAC6D,YAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oCAAAvE,cAAAA;AAAA,sBAACwE,kBAAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,0BAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,wBACpB,CAAA;AAAA,wBACA,UAAU,OAAA,IAAW,YAAA;AAAA,wBACrB,SAAA,EAAU,2UAAA;AAAA,wBACV,YAAA,EAAY,EAAE,yBAAyB,CAAA;AAAA,wBACvC,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,wBAElC,QAAA,kBAAAxE,cAAAA,CAACqK,UAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,qBAClB;AAAA,oCACA3J,eAAAA;AAAA,sBAACgE,iBAAAA;AAAA,sBAAA;AAAA,wBACC,MAAA,EAAO,WAAA;AAAA,wBACP,SAAA,EAAU,+JAAA;AAAA,wBAET,QAAA,EAAA;AAAA,0BAAA,cAAA,oBACC1E,eAAC2E,gBAAAA,EAAA,EACE,WAAC,EAAE,KAAA,EAAO,KAAA,EAAM,qBACfjE,eAAAA;AAAA,4BAAC,QAAA;AAAA,4BAAA;AAAA,8BACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gCAAA,cAAA,EAAe;AACf,gCAAA,KAAA,EAAM;AAAA,8BACR,CAAA;AAAA,8BACA,SAAA,EAAW,CAAA,wIAAA,EACT,KAAA,GAAQ,iCAAA,GAAoC,EAC9C,CAAA,CAAA;AAAA,8BACA,YAAA,EAAY,EAAE,8BAA8B,CAAA;AAAA,8BAE5C,QAAA,EAAA;AAAA,gDAAAV,eAACuI,aAAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,WAAU,kCAAA,EAAmC,CAAA;AAAA,gCAC/D,EAAE,8BAA8B;AAAA;AAAA;AAAA,2BACnC,EAEJ,CAAA;AAAA,0BAED,eAAA,IAAmB,SAAA,KAAc,WAAA,oBAChCvI,cAAAA,CAAC2E,gBAAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,KAAA,EAAO,KAAA,EAAM,qBACfjE,eAAAA;AAAA,4BAAC,QAAA;AAAA,4BAAA;AAAA,8BACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gCAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,gCAAA,KAAA,EAAM;AAAA,8BACR,CAAA;AAAA,8BACA,SAAA,EAAW,CAAA,wIAAA,EACT,KAAA,GAAQ,iCAAA,GAAoC,EAC9C,CAAA,CAAA;AAAA,8BACA,YAAA,EAAY,EAAE,yBAAyB,CAAA;AAAA,8BAEvC,QAAA,EAAA;AAAA,gDAAAV,cAAAA,CAACsK,WAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI,WAAU,kCAAA,EAAmC,CAAA;AAAA,gCAC7D,EAAE,yBAAyB;AAAA;AAAA;AAAA,2BAC9B,EAEJ,CAAA;AAAA,0BAED,eAAA,IAAmB,SAAA,KAAc,WAAA,oBAChCtK,cAAAA,CAAC2E,gBAAAA,EAAA,EACE,QAAA,EAAA,CAAC,EAAE,KAAA,EAAO,KAAA,EAAM,qBACfjE,eAAAA;AAAA,4BAAC,QAAA;AAAA,4BAAA;AAAA,8BACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gCAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gCAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gCAAA,eAAA,CAAgB,UAAU,CAAA;AAC1B,gCAAA,KAAA,EAAM;AAAA,8BACR,CAAA;AAAA,8BACA,SAAA,EAAW,CAAA,wIAAA,EACT,KAAA,GAAQ,iCAAA,GAAoC,EAC9C,CAAA,CAAA;AAAA,8BACA,YAAA,EAAY,EAAE,wBAAwB,CAAA;AAAA,8BAEtC,QAAA,EAAA;AAAA,gDAAAV,cAAAA,CAACuK,UAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,WAAU,kCAAA,EAAmC,CAAA;AAAA,gCAC5D,EAAE,wBAAwB;AAAA;AAAA;AAAA,2BAC7B,EAEJ;AAAA;AAAA;AAAA;AAEJ,mBAAA,EACF,CAAA,mBAEAvK,cAAAA,CAAC,KAAA,EAAA,EAAI,CAAA;AAAA,kCAIPU,eAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,wBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,wBAAA,MAAA,EAAO;AAAA,sBACT,CAAA;AAAA,sBACA,SAAA,EAAU,wRAAA;AAAA,sBACV,KAAA,EAAO,EAAE,gCAAgC,CAAA;AAAA,sBACzC,YAAA,EAAY,EAAE,gCAAgC,CAAA;AAAA,sBAE9C,QAAA,EAAA;AAAA,wCAAAV,cAAAA,CAACwK,mBAAA,EAAA,EAAc,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,wCACzBxK,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE;AAAA;AAAA;AAAA;AACtE,iBAAA,EACF;AAAA;AAAA;AAAA,WAEJ;AAAA,UAGC,WAAA,IAAe,aAAA,oBACdA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4GAAA,EACb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,MAAA,EAAO;AAAA,gBACT,CAAA;AAAA,gBACA,SAAA,EAAU,iSAAA;AAAA,gBACV,KAAA,EAAO,EAAE,8BAA8B,CAAA;AAAA,gBACvC,YAAA,EAAY,EAAE,8BAA8B,CAAA;AAAA,gBAE5C,QAAA,kBAAAA,cAAAA,CAACyK,oBAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,aAC5B;AAAA,4BACAzK,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mQAAA,EACb,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAC5B;AAAA,WAAA,EACF,CAAA,EACF;AAAA;AAAA;AAAA,KAEJ;AAAA,oBAGAA,cAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,WAAA;AAAA,QACR,KAAA,EAAO,EAAE,mCAAmC,CAAA;AAAA,QAC5C,OAAA,EAAS,EAAE,mCAAmC,CAAA;AAAA,QAC9C,WAAA,EAAa,EAAE,8BAA8B,CAAA;AAAA,QAC7C,UAAA,EAAY,EAAE,sBAAsB,CAAA;AAAA,QACpC,QAAA,EAAU,IAAA;AAAA,QACV,SAAA,EAAW,cAAA;AAAA,QACX,UAAU,MAAM;AACd,UAAA,cAAA,CAAe,KAAK,CAAA;AACpB,UAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,QAC1B;AAAA;AAAA,KACF;AAAA,oBAGAA,eAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,MAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,OAAA,EAAS;AAAA,GAAA,EAClE,CAAA;AAEJ;AG3gCA,mBAAA,EAAA;AAee,SAAR,gBAAA,CAAkC;AAAA,EACvC,UAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,aAAa,QAAA,EAAS;AAC5B,EAAA,MAAM,QAAQ,cAAA,IAAkB,UAAA;AAChC,EAAA,MAAM,6BAA6B,CAAC,cAAA;AAGpC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIM,eAAS,EAAE,CAAA;AAGjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAG3C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,CAAC,CAAA;AAG9C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAG5E,EAAA,MAAM,aAAA,GAAgBH,kBAAY,YAAY;AAC5C,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,YAAA,CAAa;AAAA,QAC3C,KAAA,EAAO,GAAA;AAAA,QACP,eAAA,EAAiB;AAAA,OAClB,CAAA;AACD,MAAA,WAAA,CAAY,MAAA,CAAO,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,UAAU,CAAC,CAAA;AAAA,IACpE,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,GAAG,CAAA;AAAA,IACxD,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAAM,gBAAU,MAAM;AACd,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,aAAA,EAAe,UAAU,CAAC,CAAA;AAE9B,EAAA,MAAM,oBAAA,GAAuB,CAAC,SAAA,KAAsB;AAClD,IAAA,mBAAA,CAAoB,SAAS,CAAA;AAC7B,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,iBAAiB,YAAY;AACjC,IAAA,IAAI,CAAC,gBAAA,EAAkB;AAAC,MAAA;AAAA,IAAO;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,iBAAA,GAAoB,gBAAA;AAC1B,MAAA,MAAM,UAAA,CAAW,iBAAiB,iBAAiB,CAAA;AACnD,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,yBAAA,EAA2B;AAAA,QAC9D,MAAA,EAAQ,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,iBAAA;AAAkB,OAC5D,CAAC,CAAA;AACF,MAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,0CAA0C,CAAC,CAAA;AAAA,IAC7D,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,GAAG,CAAA;AAC/C,MAAA,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,qCAAqC,CAAC,CAAA;AAAA,IACtD,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,OAAO,SAAA,EAAmB,QAAA,KAAqB;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW,aAAA,CAAc,SAAA,EAAW,QAAQ,CAAA;AAClD,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,wCAAwC,CAAC,CAAA;AACzD,MAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,IAC5B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,GAAG,CAAA;AACpD,MAAA,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,mCAAmC,CAAC,CAAA;AAAA,IACpD;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmBD,cAAQ,MAAM;AACrC,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG;AAAC,MAAA,OAAO,QAAA;AAAA,IAAS;AAC1C,IAAA,MAAM,CAAA,GAAI,YAAY,WAAA,EAAY;AAClC,IAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,QAAA,EAAU,WAAW,CAAC,CAAA;AAG1B,EAAA,MAAM,aAAA,GAAgBA,cAAQ,MAAM;AAClC,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,gBAAA,EAAkB,CAAC,CAAA;AACtD,IAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,IACvB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACrB,GAAG,KAAA;AAAA,MACH,QAAA,EAAU,MAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,GAAI,KAAA,CAAM,WAAW;AAAC,KAC9D,CAAE,IACF,EAAC;AAAA,EACP,CAAA,EAAG,CAAC,gBAAA,EAAkB,CAAC,CAAC,CAAA;AAExB,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,KAAW,CAAA;AACpC,EAAA,MAAM,kBAAA,GAAqB,gBAAA,CAAiB,MAAA,KAAW,CAAA,IAAK,CAAC,CAAC,WAAA;AAE9D,EAAA,uBACEE,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,oDAAoD,SAAS,CAAA,CAAA;AAAA,MAGxE,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mFAAA,EACb,QAAA,EAAA;AAAA,0BAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,kBAAAU,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAA;AAAA,cACT,SAAA,EAAU,iJAAA;AAAA,cACV,YAAA,EAAY,EAAE,6BAA6B,CAAA;AAAA,cAE3C,QAAA,EAAA;AAAA,gCAAAV,eAACgG,eAAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,gBACxC,EAAE,oBAAoB;AAAA;AAAA;AAAA,WACzB,EACF,CAAA;AAAA,0BAEAtF,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,4BAAAV,cAAAA;AAAA,cAACuI,aAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,EAAA;AAAA,gBACN,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAvI,cAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,kDAAA,EACX,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAC5B;AAAA,WAAA,EACF,CAAA;AAAA,0BAGAA,cAAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,WAAA;AAAA,cACP,QAAA,EAAU,cAAA;AAAA,cACV,WAAA,EAAa,EAAE,qCAAqC;AAAA;AAAA;AACtD,SAAA,EACF,CAAA;AAAA,wBAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,qBAAW,QAAA,CAAS,MAAA,KAAW,CAAA,mBAC9BA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,sBAAA,EAAA,EAAe,CAAA,EAClB,CAAA,GACE,OAAA,mBACFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,sBACEA,cAAAA;AAAA,cAACuI,aAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,EAAA;AAAA,gBACN,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,YAEF,KAAA,EAAO,EAAE,iCAAiC,CAAA;AAAA,YAC1C,WAAA,EAAa,EAAE,4CAA4C;AAAA;AAAA,SAC7D,EACF,IACE,kBAAA,mBACFvI,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,sBACEA,cAAAA;AAAA,cAACuI,aAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,EAAA;AAAA,gBACN,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,YAEF,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,YACpC,WAAA,EAAa,EAAE,sCAAA,EAAwC;AAAA,cACrD,KAAA,EAAO;AAAA,aACR;AAAA;AAAA,SACH,EACF,oBAEAvI,cAAAA;AAAA,UAACwF,mBAAAA,CAAO,GAAA;AAAA,UAAP;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACV,QAAA,EAAU,wBAAA;AAAA,YACV,OAAA,EAAQ,QAAA;AAAA,YACR,OAAA,EAAQ,SAAA;AAAA,YAEP,wBAAc,GAAA,CAAI,CAAC,KAAA,qBAClB9E,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAV,cAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACC,WAAW,KAAA,CAAM,IAAA;AAAA,kBACjB,KAAA,EAAO,MAAM,QAAA,CAAS;AAAA;AAAA,eACxB;AAAA,8BACAA,eAACwF,mBAAAA,CAAO,EAAA,EAAP,EAAU,SAAA,EAAU,qBAAA,EAAsB,MAAK,MAAA,EAC7C,QAAA,EAAA,KAAA,CAAM,SAAS,GAAA,CAAI,CAAC,4BACnBxF,cAAAA,CAACwF,oBAAO,EAAA,EAAP,EAA2B,SAAA,EAAU,YAAA,EACpC,QAAA,kBAAAxF,cAAAA;AAAA,gBAAC,mBAAA;AAAA,gBAAA;AAAA,kBACC,OAAA;AAAA,kBACA,QAAA,EAAU,QAAQ,EAAA,KAAO,eAAA;AAAA,kBACzB,IAAA,EAAK,UAAA;AAAA,kBACL,YAAA,EAAa,UAAA;AAAA,kBACb,QAAA,EAAU,MAAM,eAAA,CAAgB,OAAA,CAAQ,EAAE,CAAA;AAAA,kBAC1C,SAAA,EAAW,MAAM,oBAAA,CAAqB,OAAA,CAAQ,EAAE,CAAA;AAAA,kBAChD,UAAU,CAAC,QAAA,KACT,mBAAA,CAAoB,OAAA,CAAQ,IAAI,QAAQ;AAAA;AAAA,eAE5C,EAAA,EAXc,OAAA,CAAQ,EAYxB,CACD,CAAA,EACH;AAAA,aAAA,EAAA,EArBQ,KAAA,CAAM,IAsBhB,CACD;AAAA;AAAA,SACH,EAEJ,CAAA;AAAA,wBAGAA,cAAAA;AAAA,UAAC,oBAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,WAAA;AAAA,YACR,KAAA,EAAO,EAAE,6BAA6B,CAAA;AAAA,YACtC,OAAA,EAAS,EAAE,oCAAoC,CAAA;AAAA,YAC/C,WAAA,EAAa,EAAE,+BAA+B,CAAA;AAAA,YAC9C,UAAA,EAAY,EAAE,sBAAsB,CAAA;AAAA,YACpC,QAAA,EAAU,KAAA;AAAA,YACV,SAAA,EAAW,cAAA;AAAA,YACX,UAAU,MAAM;AACd,cAAA,cAAA,CAAe,KAAK,CAAA;AACpB,cAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,YAC1B;AAAA;AAAA,SACF;AAAA,QAGC,0BAAA,oBACCA,cAAAA,CAAC,cAAA,EAAA,EAAe,QAAQ,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,KAAA,CAAM,OAAA,EAAS;AAAA;AAAA;AAAA,GAEpE;AAEJ;;;AC/PA,mBAAA,EAAA;AAEe,SAAR,QAAA,GAA4B;AACjC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,uBACEA,cAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,eAAA;AAAA,MACL,SAAA,EAAU,mQAAA;AAAA,MAET,YAAE,uBAAuB;AAAA;AAAA,GAC5B;AAEJ;ACZA,IAAM,YAAA,GAAe,oBAAA;AAErB,SAAS,WAAA,GAAuB;AAC9B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACjD,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA,CAAE,OAAA;AACzC;AAUO,SAAS,eAAA,GAAyC;AACvD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIM,eAAS,WAAW,CAAA;AACpD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEtD,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAAC,MAAA;AAAA,IAAO;AAE3C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAE1C,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAA2B;AAC1C,MAAA,WAAA,CAAY,EAAE,OAAO,CAAA;AACrB,MAAA,IAAI,CAAC,EAAE,OAAA,EAAS;AAAC,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MAAE;AAAA,IAC1C,CAAA;AAGA,IAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,MAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,IAAI,WAAA,EAAa;AAC1B,MAAA,GAAA,CAAI,YAAY,OAAO,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,IAAI,mBAAA,EAAqB;AAC3B,QAAA,GAAA,CAAI,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAAA,MAC3C,CAAA,MAAA,IAAW,IAAI,cAAA,EAAgB;AAC7B,QAAA,GAAA,CAAI,eAAe,OAAO,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAaN,iBAAAA,CAAY,MAAM,gBAAgB,IAAI,CAAA,EAAG,EAAE,CAAA;AAC9D,EAAA,MAAM,cAAcA,iBAAAA,CAAY,MAAM,gBAAgB,KAAK,CAAA,EAAG,EAAE,CAAA;AAChE,EAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,MAAM,eAAA,CAAgB,CAAC,MAAM,CAAC,CAAC,CAAA,EAAG,EAAE,CAAA;AAErE,EAAA,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,UAAA,EAAY,aAAa,YAAA,EAAa;AACzE;;;AC1CA,mBAAA,EAAA;AAmBO,SAAS,YAAA,CAAa;AAAA,EAC3B,aAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAE,QAAA,EAAU,YAAA,EAAc,UAAA,EAAY,WAAA,KAAgB,eAAA,EAAgB;AAC5E,EAAA,MAAM,SAAA,GAAYI,aAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,aAAA,GAAgBA,aAA0B,IAAI,CAAA;AAGpD,EAAA,YAAA,CAAa,SAAA,EAAW,QAAA,IAAY,YAAA,EAAc,aAAA,CAAc,OAAO,CAAA;AAGvE,EAAA,MAAM,SAAA,GAAYC,cAA0B,MAAM;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AAAC,MAAA,OAAO,EAAC;AAAA,IAAE;AAC3B,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,MAAM,QAAA,EAAU,SAAA,EAAW,WAAA,EAAa,UAAA,EAAY,CAAA;AAAA,EAChF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACd,EAAA,oBAAA,CAAqB,SAAS,CAAA;AAG9B,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,EAAc;AAAC,MAAA;AAAA,IAAO;AAExC,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,WAAA,EAAY;AAAA,MACd;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,WAAA,EAAa,QAAA,EAAU,YAAY,CAAC,CAAA;AAGxC,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,EAA2C,IAAA,KAAkB;AACxF,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,GAAA,EAAK;AACvB,MAAA,WAAA,EAAY;AAAA,IACd;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,QAAA,mBACdT,cAAAA,CAACqH,4BAAAA,EAAA,EAAgB,IAAA,EAAK,MAAA,EAAO,OAAA,EAAS,KAAA,EACpC,QAAA,kBAAArH,cAAAA;AAAA,IAACwF,mBAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MAEC,SAAA,EAAU,6BAAA;AAAA,MACV,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,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,IAAA,EAAM,MAAM,SAAA,EAAU;AAAA,MAE7C;AAAA,KAAA;AAAA,IAPI;AAAA,KAST,CAAA,mBAEAxF,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA+B,QAAA,EAAS,CAAA;AAGzD,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,2DAAA,EAA8D,SAAS,CAAA,CAAA,EACrF,QAAA,EAAA;AAAA,oBAAAV,eAAC,QAAA,EAAA,EAAS,CAAA;AAAA,oBAGVA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBACZ,QAAA,EAAA,aAAA,CAAc,EAAE,CAAA,EACnB,CAAA;AAAA,oBAGAA,eAACqH,4BAAAA,EAAA,EACE,sBAAY,YAAA,oBACX3G,eAAAA,CAAAG,mBAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,sBAAAb,cAAAA;AAAA,QAACwF,mBAAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UAEC,SAAA,EAAU,0DAAA;AAAA,UACV,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,UACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,UACtB,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,UACnB,OAAA,EAAS,WAAA;AAAA,UACT,aAAA,EAAY;AAAA,SAAA;AAAA,QANR;AAAA,OAON;AAAA,sBAEAxF,cAAAA;AAAA,QAACwF,mBAAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UAEC,SAAA,EAAU,uFAAA;AAAA,UACV,OAAA,EAAS,EAAE,CAAA,EAAG,OAAA,EAAQ;AAAA,UACtB,OAAA,EAAS,EAAE,CAAA,EAAG,CAAA,EAAE;AAAA,UAChB,IAAA,EAAM,EAAE,CAAA,EAAG,OAAA,EAAQ;AAAA,UACnB,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA,UAC1D,IAAA,EAAK,GAAA;AAAA,UACL,iBAAA,EAAiB,IAAA;AAAA,UACjB,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA,EAAE;AAAA,UACxC,WAAA,EAAa,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,CAAA,EAAE;AAAA,UACnC,SAAA,EAAW,mBAAA;AAAA,UACX,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAElC,QAAA,kBAAAxF,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAA,EAAW,SAAA,EAAU,kCAAA,EAC5B,QAAA,EAAA,aAAA,CAAc,EAAE,OAAA,EAAS,WAAA,EAAa,CAAA,EACzC;AAAA,SAAA;AAAA,QAfI;AAAA;AAgBN,KAAA,EACF,CAAA,EAEJ,CAAA;AAAA,oBAGAU,eAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,cAAA,EAAe,WAAU,+DAAA,EAE/B,QAAA,EAAA;AAAA,MAAA,QAAA,IAAY,CAAC,gCACZV,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,aAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,gXAAA;AAAA,UACV,YAAA,EAAY,EAAE,2BAA2B,CAAA;AAAA,UACzC,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,UAEpC,0BAAAA,cAAAA,CAACuK,UAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,QAAO,MAAA,EAAO;AAAA;AAAA,OAChC;AAAA,MAED;AAAA,KAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AC3JA,mBAAA,EAAA;AAgBA,SAAS,cAAA,CAAe;AAAA,EACtB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIjK,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,KAAA,MAAA;AAEvB,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,QAAQ,OAAO,CAAA;AAC5B,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,kCAAkC,CAAC,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AACN,MAAA,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,6BAA6B,CAAC,CAAA;AAAA,IAC9C,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAmB,YAAY;AACnC,IAAA,IAAI,CAAC,YAAA,EAAc;AAAC,MAAA;AAAA,IAAO;AAC3B,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,CAAa,QAAQ,EAAE,CAAA;AAAA,IAC/B,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAEb,QAAA,EAAA;AAAA,oBAAAV,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,UAAA;AAAA,QACT,QAAA,EAAU,OAAA;AAAA,QACV,OAAO,OAAA,GAAU,CAAA,CAAE,wBAAwB,CAAA,GAAI,EAAE,4BAA4B,CAAA;AAAA,QAC7E,SAAA,EAAU,8QAAA;AAAA,QACV,cAAY,OAAA,GAAU,CAAA,CAAE,wBAAwB,CAAA,GAAI,EAAE,4BAA4B,CAAA;AAAA,QAEjF,oCACCA,cAAAA,CAAC,sBAAA,EAAA,EAAe,OAAA,EAAQ,WAAU,IAAA,EAAK,IAAA,EAAK,CAAA,mBAE5CA,eAACwB,UAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU;AAAA;AAAA,KAExC;AAAA,IAGC,CAAC,MAAA,IAAU,YAAA,oBACVxB,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,gBAAA;AAAA,QACT,QAAA,EAAU,YAAA;AAAA,QACV,OAAO,YAAA,GAAe,CAAA,CAAE,6BAA6B,CAAA,GAAI,EAAE,2BAA2B,CAAA;AAAA,QACtF,SAAA,EAAU,8QAAA;AAAA,QACV,cAAY,YAAA,GAAe,CAAA,CAAE,6BAA6B,CAAA,GAAI,EAAE,2BAA2B,CAAA;AAAA,QAE1F,yCACCA,cAAAA,CAAC,sBAAA,EAAA,EAAe,OAAA,EAAQ,WAAU,IAAA,EAAK,IAAA,EAAK,CAAA,mBAE5CA,eAAC4D,oBAAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU;AAAA;AAAA,KAElD;AAAA,IAID,MAAA,IAAU,0BACT5D,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,MAAA,CAAO,OAAO,CAAA;AAAA,QAC7B,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,QACrC,SAAA,EAAU,0PAAA;AAAA,QACV,YAAA,EAAY,EAAE,4BAA4B,CAAA;AAAA,QAE1C,0BAAAA,cAAAA,CAACiE,kBAAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU;AAAA;AAAA;AAC9C,GAAA,EAEJ,CAAA;AAEJ;AAEejD,WAAK,cAAc;AC9FlC,mBAAA,EAAA;AAaA,IAAM,iBAAA,GAAoBA,WAA6B,CAAC,EAAE,YAAY,QAAA,EAAU,OAAA,EAAS,QAAA,GAAW,KAAA,EAAM,KAAM;AAC9G,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIV,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAElD,EAAA,MAAM,aAAa,UAAA,CAAW,OAAA,IAAW,cAAc,UAAA,CAAW,UAAA,EAAY,WAAW,QAAQ,CAAA;AACjG,EAAA,MAAM,WAAA,GAAc,OAAA,KAAY,MAAA,IAAa,CAAC,QAAA;AAC9C,EAAA,MAAM,gBAAA,GAAmB,QAAA,KAAa,MAAA,IAAa,CAAC,QAAA;AAEpD,EAAA,uBACEI,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAQP,WAAA,GAAc,0FAA0F,EAAE;AAAA,QAAA,EAC1G,CAAC,WAAA,GAAc,iBAAA,GAAoB,EAAE;AAAA,MAAA,CAAA;AAAA,MAEzC,OAAA,EAAS,cAAc,OAAA,GAAU,MAAA;AAAA,MACjC,IAAA,EAAM,cAAc,QAAA,GAAW,MAAA;AAAA,MAC/B,QAAA,EAAU,cAAc,CAAA,GAAI,MAAA;AAAA,MAC5B,SAAA,EACE,WAAA,GACI,CAAC,CAAA,KAAM;AACL,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,OAAA,IAAU;AAAA,QACZ;AAAA,MACF,CAAA,GACA,MAAA;AAAA,MAIN,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EAEZ,QAAA,EAAA;AAAA,UAAA,CAAC,iBAAiB,CAAC,UAAA,oBAClBV,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6DAAA,EAA8D,CAAA;AAAA,UAI9E,UAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gFAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,CAAA,CAAE,sCAAsC,GAAE,CAAA,EACxG,CAAA;AAAA,0BAIFA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,UAAA;AAAA,cACL,KAAK,UAAA,CAAW,QAAA;AAAA,cAChB,SAAA,EAAW;AAAA;AAAA;AAAA,YAAA,EAGP,aAAA,GAAgB,gBAAgB,WAAW;AAAA,YAAA,EAC3C,WAAA,GAAc,0BAA0B,EAAE;AAAA,UAAA,CAAA;AAAA,cAE9C,MAAA,EAAQ,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,cACnC,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI;AAAA;AAAA;AACnC,SAAA,EACF,CAAA;AAAA,QAGC,CAAC,aAAA,IAAiB,CAAC,UAAA,mBAClBA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EAAoE,CAAA,mBAEnFA,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+DAAA;AAAA,YACV,OAAO,UAAA,CAAW,QAAA;AAAA,YAEjB,QAAA,EAAA,UAAA,CAAW;AAAA;AAAA,SACd;AAAA,QAID,CAAC,aAAA,IAAiB,CAAC,6BAClBA,cAAAA,CAAC,SAAI,SAAA,EAAU,mEAAA,EAAoE,CAAA,mBAEnFA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDACV,QAAA,EAAA,cAAA,CAAe,UAAA,CAAW,SAAS,CAAA,EACtC,CAAA;AAAA,QAID,oCACCA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,QAAA,IAAW;AAAA,YACb,CAAA;AAAA,YACA,SAAA,EAAU,iOAAA;AAAA,YACV,YAAA,EAAY,CAAA,OAAA,EAAU,UAAA,CAAW,QAAQ,CAAA,CAAA;AAAA,YACzC,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,YAEnC,QAAA,kBAAAA,eAACsD,OAAAA,EAAA,EAAE,MAAM,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,MAAA,EAAO,MAAA,EAAO;AAAA;AAAA;AACrD;AAAA;AAAA,GAEJ;AAEJ,CAAC,CAAA;AAED,iBAAA,CAAkB,WAAA,GAAc,mBAAA;AAEhC,IAAO,yBAAA,GAAQ;AChHf,mBAAA,EAAA;AAkBA,IAAM,gBAAA,GAAmBtC,UAAAA;AAAA,EACvB,CAAC,EAAE,qBAAA,EAAuB,cAAA,GAAiB,EAAA,EAAI,YAAA,GAAe,EAAA,GAAK,IAAA,GAAO,IAAA,EAAM,QAAA,GAAW,KAAA,EAAM,KAAM;AACrG,IAAA,MAAM,YAAA,GAAeT,aAAyB,IAAI,CAAA;AAClD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAID,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAM7B,IAAA,MAAM,gBAAA,GAAmBH,iBAAAA;AAAA,MACvB,OAAO,CAAA,KAA2C;AAChD,QAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAG7C,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,YAAA,CAAa,QAAQ,KAAA,GAAQ,EAAA;AAAA,QAC/B;AAEA,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA;AAAA,QACF;AAEA,QAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,QAAA,IAAI;AAEF,UAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,YAAA,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,uBAAA,EAAyB,EAAE,GAAA,EAAK,gBAAgB,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvF,YAAA,YAAA,CAAa,KAAK,CAAA;AAClB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,cAA4B,EAAC;AACnC,UAAA,MAAM,SAA4B,EAAC;AAGnC,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,YAAA,IAAI;AACF,cAAA,sBAAA,CAAuB,MAAM,YAAY,CAAA;AAAA,YAC3C,SAAS,aAAA,EAAe;AACtB,cAAA,MAAA,CAAO,IAAA,CAAK,EAAE,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,aAAA,YAAyB,KAAA,GAAQ,aAAA,CAAc,OAAA,GAAU,MAAA,CAAO,aAAa,GAAG,CAAA;AAC1H,cAAA;AAAA,YACF;AAEA,YAAA,IAAI;AAEF,cAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,IAAI,CAAA;AAC7C,cAAA,MAAM,UAAA,GAAyB;AAAA,gBAC7B,SAAA,EAAW,OAAO,UAAA,EAAW;AAAA,gBAC7B,UAAU,IAAA,CAAK,IAAA;AAAA,gBACf,UAAU,IAAA,CAAK,IAAA;AAAA,gBACf,WAAW,IAAA,CAAK,IAAA;AAAA,gBAChB;AAAA,eACF;AACA,cAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9B,gBAAA,UAAA,CAAW,OAAA,GAAU,aAAA,CAAc,UAAA,EAAY,IAAA,CAAK,IAAI,CAAA;AAAA,cAC1D;AAEA,cAAA,WAAA,CAAY,KAAK,UAAU,CAAA;AAAA,YAC7B,SAAS,GAAA,EAAK;AACZ,cAAA,MAAA,CAAO,IAAA,CAAK;AAAA,gBACV,UAAU,IAAA,CAAK,IAAA;AAAA,gBACf,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,eACvD,CAAA;AAAA,YACH;AAAA,UACF;AAGA,UAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,YAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACtB,cAAA,KAAA,CAAM,MAAM,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA;AAAA,YAC7C,CAAC,CAAA;AAAA,UACH;AAGA,UAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,YAAA,qBAAA,CAAsB,WAAW,CAAA;AACjC,YAAA,MAAM,OAAA,GACJ,WAAA,CAAY,MAAA,KAAW,CAAA,GACnB,CAAA,CAAE,+BAA+B,EAAE,IAAA,EAAM,cAAA,CAAe,WAAA,CAAY,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,GACnF,CAAA,CAAE,6BAAA,EAA+B,EAAE,MAAM,CAAA,EAAG,WAAA,CAAY,MAAM,CAAA,MAAA,CAAA,EAAU,CAAA;AAC9E,YAAA,KAAA,CAAM,QAAQ,OAAO,CAAA;AAAA,UACvB,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC5B,YAAA,KAAA,CAAM,KAAA,CAAM,CAAA,CAAE,+BAA+B,CAAC,CAAA;AAAA,UAChD;AAAA,QACF,CAAA,SAAE;AACA,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,cAAA,EAAgB,YAAA,EAAc,qBAAA,EAAuB,OAAO,CAAC;AAAA,KAChE;AAKA,IAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACpC,MAAA,YAAA,CAAa,SAAS,KAAA,EAAM;AAAA,IAC9B,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,aAAa,QAAA,IAAY,SAAA;AAE/B,IAAA,uBACEO,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAEb,QAAA,EAAA;AAAA,sBAAAV,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,YAAA;AAAA,UACL,IAAA,EAAK,MAAA;AAAA,UACL,QAAA,EAAQ,IAAA;AAAA,UACR,MAAA,EAAQ,2BAAA;AAAA,UACR,QAAA,EAAU,gBAAA;AAAA,UACV,QAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAU,SAAA;AAAA,UACV,YAAA,EAAY,EAAE,+BAA+B;AAAA;AAAA,OAC/C;AAAA,sBAGAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,QAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAU,sjBAAA;AAAA,UAcV,YAAA,EAAY,EAAE,+BAA+B,CAAA;AAAA,UAC7C,WAAA,EAAW,SAAA;AAAA,UAEV,QAAA,EAAA,SAAA,mBACCA,cAAAA,CAACuG,iBAAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI,WAAU,sBAAA,EAAuB,MAAA,EAAO,QAAO,CAAA,mBAEtEvG,eAACiI,eAAAA,EAAA,EAAU,MAAM,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,MAAA,EAAO,MAAA,EAAO;AAAA;AAAA;AAE3D,KAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;AAE/B,IAAO,wBAAA,GAAQ;ACvKA,SAAR,qBAAA,CAAuC;AAAA,EAC5C,OAAA;AAAA,EACA,UAAA,GAAa,QAAA;AAAA,EACb;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI3H,eAAS,OAAO,CAAA;AAExD,EAAAG,gBAAU,MAAM;AACd,IAAA,eAAA,CAAgB,OAAO,CAAA;AAEvB,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,MACpB,GAAG,UAAU,CAAA;AACb,MAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,uBACET,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAW,UAAA;AAAA,MACX,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAU,SAAA;AAAA,MAET,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;;;ACzCA,mBAAA,EAAA;;;ACDA,mBAAA,EAAA;AAQe,SAAR,YAAA,CAA8B;AAAA,EACnC,QAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,UAAA,GAAa,gBAAgB,QAAA,CAAS,EAAE,KAAK,EAAE,OAAA,EAAS,EAAC,EAAE;AACjE,EAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,OAAA,IAAW,EAAC;AAC/C,EAAA,MAAM,aAAA,GAAgB,SAAS,IAAA,KAAS,iBAAA;AAGxC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIM,cAAAA,CAAS,UAAA,CAAW,cAAc,EAAE,CAAA;AAGtE,EAAAG,gBAAU,MAAM;AACd,IAAA,MAAM,IAAA,GAAO,gBAAgB,QAAA,CAAS,EAAE,KAAK,EAAc,CAAA;AAC3D,IAAA,YAAA,CAAa,IAAA,CAAK,cAAc,EAAE,CAAA;AAAA,EAEpC,CAAA,EAAG,CAAC,QAAA,CAAS,EAAE,CAAC,CAAA;AAEhB,EAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAAqB;AAC9C,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,IAAI,aAAA,EAAe;AAEjB,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,QAAA,CAAS,QAAQ,IAChD,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,QAAQ,CAAA,GAC5C,CAAC,GAAG,iBAAiB,QAAQ,CAAA;AACjC,MAAA,QAAA,CAAS,EAAE,OAAA,EAAS,UAAA,EAAY,UAAA,EAAY,QAAW,CAAA;AAAA,IACzD,CAAA,MAAO;AAEL,MAAA,QAAA,CAAS,EAAE,OAAA,EAAS,CAAC,QAAQ,CAAA,EAAG,UAAA,EAAY,QAAW,CAAA;AAAA,IACzD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,IAAA,KAAiB;AAC9C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS;AAAA,MACP,SAAS,EAAC;AAAA,MACV,YAAY,IAAA,IAAQ;AAAA,KACrB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAV,cAAAA,CAAC,SACC,QAAA,kBAAAA,cAAAA,CAAC,QAAG,SAAA,EAAU,0DAAA,EACX,QAAA,EAAA,QAAA,CAAS,IAAA,EACZ,CAAA,EACF,CAAA;AAAA,IAGC,aAAA,oBACCA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,iDAAA,EACV,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAClC,CAAA;AAAA,oBAIFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACX,QAAA,EAAA,CAAA,QAAA,CAAS,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,MAAA,KAAW;AACxC,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAErD,MAAA,uBACEA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,OAAA,EAAS,MAAM,iBAAA,CAAkB,MAAA,CAAO,EAAE,CAAA;AAAA,UAC1C,SAAA,EAAW;AAAA;AAAA,gBAAA,EAGP,UAAA,GACI,iDACA,iHACN;AAAA;AAAA,cAAA,CAAA;AAAA,UAGF,IAAA,EAAK,QAAA;AAAA,UACL,cAAA,EAAc,UAAA;AAAA,UAEd,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAEb,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACZ,0CACCA,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,UAAA;AAAA,gBACL,OAAA,EAAS,UAAA;AAAA,gBACT,QAAA,EAAQ,IAAA;AAAA,gBACR,SAAA,EAAU;AAAA;AAAA,gCAGZA,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,OAAA,EAAS,UAAA;AAAA,gBACT,QAAA,EAAQ,IAAA;AAAA,gBACR,SAAA,EAAU;AAAA;AAAA,aACZ,EAEJ,CAAA;AAAA,4BAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EACV,QAAA,EAAA,MAAA,CAAO,KAAA,EACV,CAAA,EACF;AAAA,WAAA,EACF;AAAA,SAAA;AAAA,QAxCK,MAAA,CAAO;AAAA,OAyCd;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBAGAU,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,aAAA,EAAc,WAAU,iEAAA,EACpC,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,8BAA8B,CAAA;AAAA,QAAE;AAAA,OAAA,EACrC,CAAA;AAAA,sBACAV,cAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,aAAA;AAAA,UACH,KAAA,EAAO,SAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,qBAAA,CAAsB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACrD,WAAA,EAAa,EAAE,6BAA6B,CAAA;AAAA,UAC5C,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,EAAU;AAAA;AAAA;AAKZ,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC7IA,mBAAA,EAAA;AAOe,SAAR,gBAAA,CAAkC;AAAA,EACvC,SAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAE7B,EAAA,uBACEU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAV,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EACX,QAAA,EAAA,CAAA,CAAE,iCAAiC,CAAA,EACtC,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uCAAA,EACV,QAAA,EAAA,CAAA,CAAE,uCAAuC,CAAA,EAC5C;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa;AAC3B,MAAA,MAAM,UAAA,GAAa,QAAQ,QAAA,CAAS,EAAE,KAAK,EAAE,OAAA,EAAS,EAAC,EAAE;AACzD,MAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,OAAA,IAAW,EAAC;AAC/C,MAAA,MAAM,aAAa,UAAA,CAAW,UAAA;AAC9B,MAAA,MAAM,kBAAkB,IAAI,GAAA,CAAA,CAAK,QAAA,CAAS,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,MAAA,KAAW,CAAC,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAEnG,MAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,MAAA,GAAS,CAAA,IAAK,CAAC,CAAC,UAAA;AAElD,MAAA,uBACEU,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,wFAAA;AAAA,UAGV,QAAA,EAAA;AAAA,4BAAAV,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gDAAA,EACX,mBAAS,IAAA,EACZ,CAAA;AAAA,YAGC,SAAA,mBACCU,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EAEZ,QAAA,EAAA;AAAA,cAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,qBACpBV,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAU,qMAAA;AAAA,kBAET,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA,IAAK;AAAA,iBAAA;AAAA,gBAH3B;AAAA,eAKR,CAAA;AAAA,cAGA,UAAA,oBACCU,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yLAAA,EACd,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA;AAAA,kBAAA,CAAA,CAAE,6BAA6B,CAAA;AAAA,kBAAE;AAAA,iBAAA,EAAC,CAAA;AAAA,gCACxEV,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAU,QAAA,EAAA,UAAA,EAAW;AAAA,eAAA,EACvC;AAAA,aAAA,EAEJ,CAAA,mBAEAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,iDAAA,EACV,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAC/B;AAAA;AAAA,SAAA;AAAA,QAhCG,QAAA,CAAS;AAAA,OAkChB;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC1EO,SAAS,mBAAmB,IAAA,EAA+C;AAChF,EAAA,IAAI,CAAC,IAAA,EAAM;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACzB,EAAA,OAAA,CAAQ,KAAK,OAAA,EAAS,MAAA,IAAU,KAAK,CAAA,IAAK,CAAC,CAAC,IAAA,CAAK,UAAA;AACnD;AAUO,SAAS,eAAA,CACd,SAAA,EACA,OAAA,EACA,CAAA,EACe;AACf,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,KAAM,mBAAmB,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AAC5E,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,CAAA,GAAI,CAAA,CAAE,mCAAmC,CAAA,GAAI,+CAAA;AAAA,EACtD;AAEA,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA;AACzB,IAAA,IAAI,IAAA,IAAA,CAAS,KAAK,OAAA,EAAS,MAAA,IAAU,OAAO,CAAA,IAAK,IAAA,CAAK,eAAe,EAAA,EAAI;AACvE,MAAA,OAAO,CAAA,GACH,CAAA,CAAE,iCAAA,EAAmC,EAAE,QAAA,EAAU,CAAA,CAAE,IAAA,EAAM,CAAA,GACzD,CAAA,uCAAA,EAA0C,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AHpBe,SAAR,YAAA,CAA8B;AAAA,EACnC,eAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIM,eAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAY,eAAA,CAAgB,SAAA;AAClC,EAAA,MAAM,kBAAA,GAAqB,gBAAgB,SAAA,CAAU,MAAA;AACrD,EAAA,MAAM,cAAc,WAAA,KAAgB,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,WAAA,KAAgB,SAAA,CAAU,MAAA,GAAS,CAAA;AAGtD,EAAA,MAAM,uBAAA,GACJ,kBAAA,IACC,SAAA,CAAU,WAAW,CAAA,EAAG,EAAA,IACvB,kBAAA,CAAmB,OAAA,CAAQ,SAAA,CAAU,WAAW,CAAA,CAAE,EAAE,CAAC,CAAA;AAEzD,EAAA,MAAM,YAAA,GAAe,CAAC,UAAA,KAAmC;AACvD,IAAA,MAAM,eAAA,GAAkB,UAAU,WAAW,CAAA;AAC7C,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,UAAA,CAAW,CAAC,IAAA,MAAU;AAAA,QACpB,GAAG,IAAA;AAAA,QACH,CAAC,eAAA,CAAgB,EAAE,GAAG;AAAA,OACxB,CAAE,CAAA;AAAA,IACJ;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,uBAAA,EAAyB;AAAC,MAAA;AAAA,IAAO;AACtC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,cAAA,CAAe,kBAAA,GAAqB,WAAA,GAAc,WAAA,GAAc,CAAC,CAAA;AAAA,IACnE,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,cAAc,CAAC,CAAA;AAAA,IAChC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,cAAA,CAAe,cAAc,CAAC,CAAA;AAAA,IAChC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,sBAAsB,YAAY;AACtC,IAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,SAAA,EAAW,OAAA,EAAS,CAAC,CAAA;AAC7D,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,QAAA,CAAS,eAAe,CAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,OAAO,CAAA;AAAA,IACxB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,eACJ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,EAAE,sBAAsB,CAAA;AAC/D,MAAA,QAAA,CAAS,YAAY,CAAA;AACrB,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,UAAU,MAAA,GAAS,CAAA;AACtC,EAAA,MAAM,eAAe,kBAAA,GACjB,CAAA,CAAE,4BAA4B,EAAE,OAAA,EAAS,YAAY,KAAA,EAAO,UAAA,EAAY,CAAA,GACxE,CAAA,CAAE,4BAA4B,EAAE,OAAA,EAAS,cAAc,CAAA,EAAG,KAAA,EAAO,YAAY,CAAA;AAEjF,EAAA,uBACEN,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kFAEb,QAAA,kBAAAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAV,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAChC,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,QAAA;AAAA,YACT,QAAA,EAAU,YAAA;AAAA,YACV,SAAA,EAAU,+FAAA;AAAA,YACV,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,YAEnC,QAAA,kBAAAA,cAAAA,CAACsD,OAAAA,EAAA,EAAE,WAAU,SAAA,EAAU;AAAA;AAAA;AACzB,OAAA,EACF,CAAA;AAAA,sBAGAtD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CACZ,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,sBAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,mDAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,CAAA,EAAA,CAAK,WAAA,GAAc,CAAA,IAAK,aAAc,GAAG,CAAA,CAAA;AAAA;AAClD;AAAA,OACF,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBACCV,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4FAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,KAAA,EAAM,CAAA,EAC/D,CAAA;AAAA,MAGD,qCACCA,cAAAA,CAAC,oBAAiB,SAAA,EAAsB,OAAA,EAAkB,oBAE1DA,cAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,UAAU,WAAW,CAAA;AAAA,UAC/B,eAAA,EAAiB,OAAA;AAAA,UACjB,QAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EAEJ,CAAA;AAAA,oBAGAU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EAEZ,QAAA,EAAA;AAAA,MAAA,CAAC,+BACAV,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA;AAAA,UACT,QAAA,EAAU,YAAA;AAAA,UACV,SAAA,EAAU,8LAAA;AAAA,UAET,YAAE,0BAA0B;AAAA;AAAA,OAC/B;AAAA,sBAGFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,MAEvB,kBAAA,mBACCU,eAAAA,CAAAG,mBAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,wBAAAb,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,QAAA;AAAA,YACT,QAAA,EAAU,YAAA;AAAA,YACV,SAAA,EAAU,4MAAA;AAAA,YAET,YAAE,uBAAuB;AAAA;AAAA,SAC5B;AAAA,wBAGAU,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,mBAAA;AAAA,YACT,QAAA,EAAU,YAAA;AAAA,YACV,SAAA,EAAU,8JAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,YAAA,oBAAgBV,cAAAA,CAAC,sBAAA,EAAA,EAAe,IAAA,EAAK,IAAA,EAAK,CAAA;AAAA,cAC1C,YAAA,GAAe,CAAA,CAAE,gCAAgC,CAAA,GAAI,EAAE,6BAA6B;AAAA;AAAA;AAAA;AACvF,OAAA,EACF,CAAA;AAAA;AAAA,wBAGAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,UAAA;AAAA,YACT,QAAA,EAAU,CAAC,uBAAA,IAA2B,YAAA;AAAA,YACtC,SAAA,EAAU,sIAAA;AAAA,YAET,YAAE,0BAA0B;AAAA;AAAA;AAC/B;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AIxLA,SAAS,UAAA,CAAW,WAAqB,UAAA,EAAgC;AACvE,EAAA,MAAM,aAAA,GAA0B,EAAE,GAAG,UAAA,EAAW;AAEhD,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,MAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AACxC,IAAA,MAAM,cAAA,GAAiB,WAAW,QAAQ,CAAA;AAE1C,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AAC1C,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,IAAI,iBAAiB,cAAA,EAAgB;AACnC,QAAA,aAAA,CAAc,QAAQ,CAAA,GAAI,CAAA,GAAI,IAAA,KAAoB;AAC/C,UAAC,cAAA,CAA6C,GAAG,IAAI,CAAA;AACrD,UAAC,aAAA,CAA4C,GAAG,IAAI,CAAA;AAAA,QACvD,CAAA;AAAA,MACF,WAAW,aAAA,EAAe;AACxB,QAAA,aAAA,CAAc,QAAQ,CAAA,GAAI,aAAA;AAAA,MAC5B;AAAA,IACF,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAE/B,MAAA,aAAA,CAAc,QAAQ,CAAA,GAAI,EAAE,GAAI,aAAA,EAA0B,GAAI,cAAA,EAA0B;AAAA,IAC1F,CAAA,MAAA,IAAW,aAAa,WAAA,EAAa;AAEnC,MAAA,aAAA,CAAc,QAAQ,CAAA,GAAI,CAAC,aAAA,EAAe,cAAc,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IACpF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,GAAG,SAAA,EAAW,GAAG,aAAA,EAAc;AAC1C;AAUO,IAAM,IAAA,GAAO+H,gBAAAA,CAAmC,CAAC,KAAA,EAAO,YAAA,KAAiB;AAC9E,EAAA,MAAM,EAAE,QAAA,EAAU,GAAG,SAAA,EAAU,GAAI,KAAA;AAEnC,EAAA,IAAI,CAACjG,oBAAAA,CAAe,QAAQ,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAe,QAAA,CAA8C,GAAA;AAEnE,EAAA,OAAO4I,mBAAa,QAAA,EAA0B;AAAA,IAC5C,GAAG,UAAA,CAAW,SAAA,EAAW,QAAA,CAAS,KAAiB,CAAA;AAAA,IACnD,GAAA,EAAK,YAAA,GACD,WAAA,CAAY,YAAA,EAAc,WAAiC,CAAA,GAC3D;AAAA,GACO,CAAA;AACf,CAAC;AAED,IAAA,CAAK,WAAA,GAAc,MAAA;AAKnB,SAAS,eAAkB,IAAA,EAA0D;AACnF,EAAA,OAAO,CAAC,IAAA,KAAS;AACf,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACpB,MAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,QAAA,GAAA,CAAI,IAAI,CAAA;AAAA,MACV,CAAA,MAAA,IAAW,OAAO,IAAA,EAAM;AACrB,QAAC,IAAyC,OAAA,GAAU,IAAA;AAAA,MACvD;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AAcO,SAAS,iBAAiB,QAAA,EAAqC;AACpE,EAAA,OAAO7I,cAAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAOC,oBAAc,CAAA;AACzD;ACjFA,IAAM,WAAA,GAAc5B,oBAA4C,MAAS,CAAA;AAEzE,SAAS,cAAA,GAAiB;AACxB,EAAA,MAAM,OAAA,GAAUD,iBAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,OAAA;AACT;AAWA,IAAM,QAAA,GAAW8H,gBAAAA,CAA0C,CAAC,KAAA,EAAO,GAAA,KAAQ;AACzE,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AACnD,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE/H,cAAAA,CAAC,WAAA,CAAY,UAAZ,EAAqB,KAAA,EAAO,EAAE,MAAA,EAAO,EACpC,QAAA,kBAAAA,cAAAA,CAAC,QAAK,GAAA,EAAU,cAAA,EAAc,QAAS,GAAG,QAAA,EACvC,UACH,CAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AAED,QAAA,CAAS,WAAA,GAAc,WAAA;AAQvB,IAAM,QAAA,GAAW+H,gBAAAA,CAA0C,CAAC,KAAA,EAAO,GAAA,KAAQ;AACzE,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE/H,eAAC,IAAA,EAAA,EAAK,GAAA,EAAU,kBAAe,MAAA,EAAQ,GAAG,UACvC,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,QAAA,CAAS,WAAA,GAAc,WAAA;AAQvB,IAAM,aAAA,GAAgB+H,gBAAAA,CAA+C,CAAC,KAAA,EAAO,GAAA,KAAQ;AACnF,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE/H,eAAC,IAAA,EAAA,EAAK,GAAA,EAAU,kBAAe,WAAA,EAAa,GAAG,UAC5C,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,aAAA,CAAc,WAAA,GAAc,gBAAA;AAa5B,IAAM,gBAAA,GAAmB,CAAC,IAAA,KACxB,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AAE3E,IAAM,aAAA,GAAgB+H,gBAAAA,CAAgD,CAAC,KAAA,EAAO,GAAA,KAAQ;AACpF,EAAA,MAAM,EAAE,SAAS,IAAA,EAAM,SAAA,GAAY,kBAAkB,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC/E,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,MAAA;AAE9B,EAAA,MAAM,OAAA,GAAU,OAAQ,OAAO,IAAA,KAAS,WAAW,IAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,GAAQ,IAAA;AAC5E,EAAA,MAAM,aAAA,GAAgB,OAAA,GAAU,SAAA,CAAU,OAAO,CAAA,GAAI,EAAA;AACrD,EAAA,MAAM,SAAA,GAAY,SAAS,WAAA,EAAY;AAEvC,EAAA,uBACE/H,eAAC,IAAA,EAAA,EAAK,GAAA,EAAU,UAAU,SAAA,EAAY,GAAG,QAAA,EACtC,QAAA,EAAA,QAAA,IAAY,aAAA,EACf,CAAA;AAEJ,CAAC,CAAA;AAED,aAAA,CAAc,WAAA,GAAc,gBAAA;AAQ5B,IAAM,WAAA,GAAc+H,gBAAAA,CAA6C,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC/E,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE/H,cAAAA,CAAC,IAAA,EAAA,EAAK,GAAA,EAAU,IAAA,EAAK,SAAQ,YAAA,EAAW,iBAAA,EAAmB,GAAG,QAAA,EAC3D,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,WAAA,CAAY,WAAA,GAAc,cAAA;AAMnB,IAAM,IAAA,GAAO;AAAA,EAClB,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,SAAA,EAAW,aAAA;AAAA,EACX,SAAA,EAAW,aAAA;AAAA,EACX,OAAA,EAAS;AACX;AChIA,IAAM,aAAA,GAAgBE,oBAA8C,MAAS,CAAA;AAE7E,SAAS,gBAAA,GAAmB;AAC1B,EAAA,MAAM,OAAA,GAAUD,iBAAW,aAAa,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,OAAA;AACT;AAQA,IAAM,UAAA,GAAa8H,gBAAAA,CAA6C,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC9E,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,MAAA;AAC9B,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIzH,eAA6B,MAAM,CAAA;AAEvF,EAAA,uBACEN,cAAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAO,EAAE,kBAAA,EAAoB,qBAAA,EAAsB,EACzE,0BAAAA,cAAAA,CAAC,IAAA,EAAA,EAAK,KAAW,GAAG,QAAA,EACjB,UACH,CAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AAED,UAAA,CAAW,WAAA,GAAc,aAAA;AAWzB,IAAM,WAAA,GAAc+H,gBAAAA,CAA+C,CAAC,KAAA,EAAO,GAAA,KAAQ;AACjF,EAAA,MAAM,EAAE,SAAS,GAAA,EAAK,GAAA,EAAK,uBAAuB,MAAA,EAAQ,OAAA,EAAS,GAAG,QAAA,EAAS,GAAI,KAAA;AACnF,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,gBAAA,EAAiB;AACnD,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAA8C;AAChE,IAAA,qBAAA,CAAsB,QAAQ,CAAA;AAC9B,IAAA,qBAAA,GAAwB,QAAQ,CAAA;AAChC,IAAA,MAAA,GAAS,CAAC,CAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAA8C;AACjE,IAAA,qBAAA,CAAsB,OAAO,CAAA;AAC7B,IAAA,qBAAA,GAAwB,OAAO,CAAA;AAC/B,IAAA,OAAA,GAAU,CAAC,CAAA;AAAA,EACb,CAAA;AAGA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,uBACE/H,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,GAAA;AAAA,QACA,KAAK,GAAA,IAAO,EAAA;AAAA,QACZ,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS,WAAA;AAAA,QACR,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AAEA,EAAA,OAAO,IAAA;AACT,CAAC,CAAA;AAED,WAAA,CAAY,WAAA,GAAc,cAAA;AAW1B,IAAM,cAAA,GAAiB+H,gBAAAA,CAAiD,CAAC,KAAA,EAAO,GAAA,KAAQ;AACtF,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,GAAU,GAAG,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AACxD,EAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,gBAAA,EAAiB;AAChD,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,MAAA;AAC9B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIzH,cAAAA,CAAS,YAAY,CAAC,CAAA;AAGxD,EAAA,IAAI,OAAA,GAAU,CAAA,IAAK,CAAC,SAAA,EAAW;AAC7B,IAAA,UAAA,CAAW,MAAM,YAAA,CAAa,IAAI,CAAA,EAAG,OAAO,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,uBAAuB,QAAA,EAAU;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEN,cAAAA,CAAC,IAAA,EAAA,EAAK,GAAA,EAAW,GAAG,UACjB,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,cAAA,CAAe,WAAA,GAAc,iBAAA;AAMtB,IAAM,MAAA,GAAS;AAAA,EACpB,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,QAAA,EAAU;AACZ;AC9HA,IAAM,aAAA,GAAgBE,oBAA8C,MAAS,CAAA;AAE7E,SAAS,gBAAA,GAAmB;AAC1B,EAAA,MAAM,OAAA,GAAUD,iBAAW,aAAa,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,OAAA;AACT;AAWA,IAAM,UAAA,GAAa8H,gBAAAA,CAA4C,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC7E,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AACpD,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE/H,cAAAA,CAAC,aAAA,CAAc,UAAd,EAAuB,KAAA,EAAO,EAAE,OAAA,EAAQ,EACvC,QAAA,kBAAAA,cAAAA,CAAC,QAAK,GAAA,EAAU,qBAAA,EAAqB,SAAU,GAAG,QAAA,EAC/C,UACH,CAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AAED,UAAA,CAAW,WAAA,GAAc,aAAA;AAQzB,IAAM,aAAA,GAAgB+H,gBAAAA,CAA+C,CAAC,KAAA,EAAO,GAAA,KAAQ;AACnF,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE/H,eAAC,IAAA,EAAA,EAAK,GAAA,EAAU,oBAAiB,SAAA,EAAW,GAAG,UAC5C,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,aAAA,CAAc,WAAA,GAAc,gBAAA;AAQ5B,IAAM,YAAA,GAAe+H,gBAAAA,CAA8C,CAAC,KAAA,EAAO,GAAA,KAAQ;AACjF,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE/H,eAAC,IAAA,EAAA,EAAK,GAAA,EAAU,oBAAiB,QAAA,EAAU,GAAG,UAC3C,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,YAAA,CAAa,WAAA,GAAc,eAAA;AAQ3B,IAAM,YAAA,GAAe+H,gBAAAA,CAA8C,CAAC,KAAA,EAAO,GAAA,KAAQ;AACjF,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE/H,eAAC,IAAA,EAAA,EAAK,GAAA,EAAU,oBAAiB,QAAA,EAAU,GAAG,UAC3C,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,YAAA,CAAa,WAAA,GAAc,eAAA;AAQ3B,IAAM,cAAA,GAAiB+H,gBAAAA,CAAgD,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrF,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,KAAA;AAE9B,EAAA,uBACE/H,eAAC,IAAA,EAAA,EAAK,GAAA,EAAU,oBAAiB,UAAA,EAAY,GAAG,UAC7C,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,cAAA,CAAe,WAAA,GAAc,iBAAA;AAMtB,IAAM,MAAA,GAAS;AAAA,EACpB,IAAA,EAAM,UAAA;AAAA,EACN,OAAA,EAAS,aAAA;AAAA,EACT,MAAA,EAAQ,YAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,QAAA,EAAU;AACZ;ACrHA,IAAM,mBAAA,GAAsBE,oBAAoD,MAAS,CAAA;AAEzF,SAAS,sBAAA,GAAyB;AAChC,EAAA,MAAM,OAAA,GAAUD,iBAAW,mBAAmB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,OAAA;AACT;AAQA,IAAM,gBAAA,GAAmB8H,gBAAAA,CAAqD,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC5F,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,YAAA,EAAc,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAa,SAAA,EAAW,GAAG,QAAA,EAAS,GAAI,KAAA;AAC1H,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAE9B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIzH,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAA2C;AACnE,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,YAAA,GAAe,CAAC,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAA2C;AACnE,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,YAAA,GAAe,CAAC,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAA2C;AAC9D,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,OAAA,GAAU,CAAC,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAA2C;AAC7D,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,MAAA,GAAS,CAAC,CAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAA2C;AAClE,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,WAAA,GAAc,CAAC,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2C;AAChE,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,SAAA,GAAY,CAAC,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,uBACEN,cAAAA;AAAA,IAAC,mBAAA,CAAoB,QAAA;AAAA,IAApB;AAAA,MACC,KAAA,EAAO;AAAA,QACL,SAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA,EAAY,CAAC,CAAC;AAAA,OAChB;AAAA,MAEA,QAAA,kBAAAA,cAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,IAAA,EAAK,QAAA;AAAA,UACL,QAAA;AAAA,UACA,YAAA,EAAc,gBAAA;AAAA,UACd,YAAA,EAAc,gBAAA;AAAA,UACd,OAAA,EAAS,WAAA;AAAA,UACT,MAAA,EAAQ,UAAA;AAAA,UACR,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAW,aAAA;AAAA,UACV,GAAG,QAAA;AAAA,UAEH;AAAA;AAAA;AACH;AAAA,GACF;AAEJ,CAAC,CAAA;AAED,gBAAA,CAAiB,WAAA,GAAc,mBAAA;AAQ/B,IAAM,gBAAA,GAAmB+H,gBAAAA,CAAmD,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC1F,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,UAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,MAAA;AAE9B,EAAA,uBACE/H,eAAC,IAAA,EAAA,EAAK,GAAA,EAAU,eAAY,MAAA,EAAQ,GAAG,UACpC,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,gBAAA,CAAiB,WAAA,GAAc,mBAAA;AAW/B,IAAM,iBAAA,GAAoB+H,gBAAAA,CAAoD,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC5F,EAAA,MAAM,EAAE,SAAS,MAAA,GAAS,KAAA,EAAO,UAAU,SAAA,EAAW,GAAG,UAAS,GAAI,KAAA;AACtE,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,MAAA;AAE9B,EAAA,MAAM,WAAA,GAAc,SAChB,yEAAA,GACA,EAAA;AAEJ,EAAA,uBACE/H,cAAAA,CAAC,IAAA,EAAA,EAAK,GAAA,EAAU,SAAA,EAAW,CAAC,WAAA,EAAa,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAI,GAAG,UAChF,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,iBAAA,CAAkB,WAAA,GAAc,oBAAA;AAahC,IAAM,mBAAA,GAAsB+H,gBAAAA,CAAsD,CAAC,KAAA,EAAO,GAAA,KAAQ;AAChG,EAAA,MAAM,EAAE,SAAS,QAAA,GAAW,KAAA,EAAO,cAAc,IAAA,EAAM,QAAA,EAAU,GAAG,QAAA,EAAS,GAAI,KAAA;AACjF,EAAA,MAAM,UAAU,sBAAA,EAAuB;AACvC,EAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,MAAA;AAG9B,EAAA,IAAI,eAAe,CAAC,OAAA,CAAQ,SAAA,IAAa,CAAC,QAAQ,SAAA,EAAW;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE/H,cAAAA,CAAC,IAAA,EAAA,EAAK,GAAA,EAAU,IAAA,EAAK,WAAU,uBAAA,EAAuB,QAAA,EAAW,GAAG,QAAA,EACjE,QAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAED,mBAAA,CAAoB,WAAA,GAAc,sBAAA;AAM3B,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,gBAAA;AAAA,EACN,IAAA,EAAM,gBAAA;AAAA,EACN,KAAA,EAAO,iBAAA;AAAA,EACP,OAAA,EAAS;AACX;AC9KO,SAAS,YAAA,GAA8B;AAC5C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIM,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,kBAAA,GAAqBC,aAA+B,IAAI,CAAA;AAE9D,EAAA,MAAM,aAAA,GAAgBJ,iBAAAA;AAAA,IACpB,OACE,SAAA,EACA,OAAA,EACA,MAAA,KACkB;AAClB,MAAA,cAAA,CAAe,IAAI,CAAA;AAGnB,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,kBAAA,CAAmB,OAAA,GAAU,UAAA;AAG7B,MAAA,MAAM,eAAA,GAAkB,SAAS,MAAM;AAAE,QAAA,UAAA,CAAW,KAAA,EAAM;AAAA,MAAG,CAAA,GAAI,MAAA;AACjE,MAAA,IAAI,UAAU,eAAA,EAAiB;AAC7B,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAAA,MAClD;AAEA,MAAA,IAAI;AACF,QAAA,WAAA,MAAiB,SAAS,SAAA,EAAW;AAEnC,UAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAC7B,YAAA;AAAA,UACF;AAEA,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf;AAAA,MACF,SAAS,KAAA,EAAO;AAEd,QAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAE7B,UAAA;AAAA,QACF;AACA,QAAA,MAAM,KAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,IAAI,UAAU,eAAA,EAAiB;AAC7B,UAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,eAAe,CAAA;AAAA,QACrD;AACA,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,IACnC;AACA,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACvEO,SAASwK,aAAAA,CAAa,OAAA,GAA+B,EAAC,EAAG;AAC9D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIrK,eAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,UAAA,GAAaC,aAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAA,MAAM,OAAO,YAAA,EAAiB;AAC9B,EAAA,MAAM,OAAA,GAAUA,aAAO,IAAI,CAAA;AAC3B,EAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAElB,EAAA,MAAM,aAAA,GAAgBJ,iBAAAA;AAAA,IACpB,OAAO,QAAqC,MAAA,KAAyB;AACnE,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,UAAA,CAAW,EAAE,CAAA;AAEb,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,OAAA,CAAQ,aAAA;AAAA,UACpB,MAAA;AAAA,UACA,CAAC,KAAA,KAAU;AACT,YAAA,IAAA,CAAK,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,IAAA,KAAS,SAAA,KAAc,MAAM,OAAA,EAAS;AACzE,cAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,gBAAA,MAAM,UAAA,GAAa,OAAO,KAAA,CAAM,OAAA;AAChC,gBAAA,UAAA,CAAW,OAAA,CAAQ,UAAU,UAAU,CAAA;AACvC,gBAAA,OAAO,UAAA;AAAA,cACT,CAAC,CAAA;AAAA,YACH,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,cAAA,MAAM,QAAA,GAAW,MAAM,KAAA,IAAS,cAAA;AAChC,cAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,QAAQ,CAAA;AAC9B,cAAA,QAAA,CAAS,GAAG,CAAA;AACZ,cAAA,UAAA,CAAW,OAAA,CAAQ,UAAU,QAAQ,CAAA;AAAA,YACvC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAChC,cAAA,UAAA,CAAW,QAAQ,MAAA,IAAS;AAAA,YAC9B;AAAA,UACF,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,WAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,eAAe,CAAA;AACvE,QAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,QAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,GAAU,QAAA,CAAS,OAAO,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,OAAA,CAAQ,QAAQ,MAAA,EAAO;AAAA,EACzB,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,OAAA,CAAQ,QAAQ,KAAA,EAAM;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,KAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AC3BA,IAAM,QAAA,uBAAe,GAAA,CAAiC;AAAA,EACpD,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,aAAA,CACd,UAAA,EACA,OAAA,GAAgC,EAAC,EACZ;AACrB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIG,cAAAA,CAA4C,EAAE,CAAA;AACtE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxC,EAAA,MAAM,UAAA,GAAaC,YAAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AACzC,EAAA,UAAA,CAAW,UAAU,OAAA,CAAQ,OAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,IAAA;AACnC,EAAA,MAAM,gBAAA,GAAmB,QAAQ,gBAAA,IAAoB,CAAA;AACrD,EAAA,MAAM,mBAAA,GAAsB,QAAQ,mBAAA,IAAuB,GAAA;AAE3D,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAAC,MAAA;AAAA,IAAO;AACtB,IAAA,IAAI,CAAC,WAAW,mBAAA,EAAqB;AAAC,MAAA;AAAA,IAAO;AAE7C,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AAKvC,IAAA,IAAI,YAAA;AACJ,IAAA,MAAM,UAA6C,EAAC;AACpD,IAAA,IAAI,cAAA,GAAiB,KAAA;AAIrB,IAAA,MAAM,qBAAA,uBAA4B,GAAA,EAA2C;AAE7E,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,OAAA,CAAQ,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,GAAG,SAAQ,CAAE,CAAA;AAC3C,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,YAAA,GAAe,MAAA;AAAA,IACjB,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,WAAW,mBAAA,CAAoB;AAAA,MAClD,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,OAAA,EAAS,CAAC,GAAA,KAAQ,UAAA,CAAW,UAAU,GAAG,CAAA;AAAA,MAC1C,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,QAAA,IAAI,GAAA,CAAI,UAAU,UAAA,EAAY;AAC5B,UAAA,cAAA,GAAiB,IAAA;AAMjB,UAAA,MAAMmK,QAAAA,GAAU,qBAAA,CAAsB,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AACvD,UAAA,IAAIA,aAAY,MAAA,EAAW;AACzB,YAAA,YAAA,CAAaA,QAAO,CAAA;AACpB,YAAA,qBAAA,CAAsB,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,UAC5C;AACA,UAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAI;AAAA,YACvB,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,WAAW,GAAA,CAAI;AAAA,WACjB;AACA,UAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,YAAA,YAAA,GAAe,UAAA,CAAW,eAAe,EAAE,CAAA;AAAA,UAC7C;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5B,UAAA,IAAI,oBAAoB,CAAA,EAAG;AAEzB,YAAA,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChB,cAAA,IAAI,EAAE,GAAA,CAAI,SAAA,IAAa,IAAA,CAAA,EAAO;AAAC,gBAAA,OAAO,IAAA;AAAA,cAAK;AAC3C,cAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AACvB,cAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AACzB,cAAA,OAAO,IAAA;AAAA,YACT,CAAC,CAAA;AACD,YAAA;AAAA,UACF;AAIA,UAAA,OAAA,CAAQ,CAAC,IAAA,MAAU;AAAA,YACjB,GAAG,IAAA;AAAA,YACH,CAAC,GAAA,CAAI,SAAS,GAAG;AAAA,cACf,OAAO,GAAA,CAAI,KAAA;AAAA,cACX,QAAQ,GAAA,CAAI,MAAA;AAAA,cACZ,WAAW,GAAA,CAAI;AAAA;AACjB,WACF,CAAE,CAAA;AACF,UAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AACxD,UAAA,IAAI,aAAa,MAAA,EAAW;AAAC,YAAA,YAAA,CAAa,QAAQ,CAAA;AAAA,UAAE;AACpD,UAAA,MAAM,MAAA,GAAS,WAAW,MAAM;AAC9B,YAAA,qBAAA,CAAsB,MAAA,CAAO,IAAI,SAAS,CAAA;AAC1C,YAAA,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChB,cAAA,IAAI,EAAE,GAAA,CAAI,SAAA,IAAa,IAAA,CAAA,EAAO;AAAC,gBAAA,OAAO,IAAA;AAAA,cAAK;AAC3C,cAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AACvB,cAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AACzB,cAAA,OAAO,IAAA;AAAA,YACT,CAAC,CAAA;AAAA,UACH,GAAG,gBAAgB,CAAA;AACnB,UAAA,qBAAA,CAAsB,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AAC/C,UAAA;AAAA,QACF;AAIA,QAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AACvD,QAAA,IAAI,YAAY,MAAA,EAAW;AACzB,UAAA,YAAA,CAAa,OAAO,CAAA;AACpB,UAAA,qBAAA,CAAsB,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,QAC5C;AACA,QAAA,OAAA,CAAQ,CAAC,IAAA,MAAU;AAAA,UACjB,GAAG,IAAA;AAAA,UACH,CAAC,GAAA,CAAI,SAAS,GAAG;AAAA,YACf,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,WAAW,GAAA,CAAI;AAAA;AACjB,SACF,CAAE,CAAA;AAAA,MACJ;AAAA,KACD,CAAA;AAMD,IAAA,YAAA,EAAc,KAAA,CAAM,CAAC,GAAA,KAAiB;AACpC,MAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAAC,QAAA;AAAA,MAAO;AACvC,MAAA,MAAM,UACJ,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,OAAO,CAAA;AAChD,MAAA,UAAA,CAAW,UAAU,OAAO,CAAA;AAAA,IAC9B,CAAC,CAAA;AAKD,IAAA,MAAM,YAAA,GAAe,WAAW,MAAM;AACpC,MAAA,IAAI,CAAC,cAAA,EAAgB;AAAC,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MAAE;AAAA,IACvC,GAAG,mBAAmB,CAAA;AAEtB,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,IAAI,iBAAiB,MAAA,EAAW;AAAC,QAAA,YAAA,CAAa,YAAY,CAAA;AAAA,MAAE;AAC5D,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,KAAA,MAAW,MAAA,IAAU,qBAAA,CAAsB,MAAA,EAAO,EAAG;AACnD,QAAA,YAAA,CAAa,MAAM,CAAA;AAAA,MACrB;AACA,MAAA,qBAAA,CAAsB,KAAA,EAAM;AAAA,IAC9B,CAAA;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,OAAA,EAAS,gBAAA,EAAkB,mBAAmB,CAAC,CAAA;AAE/D,EAAA,MAAM,MAAA,GAASzK,iBAAAA;AAAA,IACb,CAAC,SAAA,KAAsB,IAAA,CAAK,SAAS,CAAA,EAAG,MAAA;AAAA,IACxC,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAO;AAC/B;;;AvC9CA,mBAAA,EAAA;AwC9FO,SAAS,eAAA,CAAgB,OAAA,GAAkC,EAAC,EAA0B;AAC3F,EAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,GAAgB,EAAC,EAAG,OAAO,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAW,GAAI,OAAA;AAElF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIG,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,CAAC,CAAA;AAClD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAA4B,aAAa,CAAA;AAErE,EAAA,MAAM,YAAA,GAAeE,cAAQ,MAAM,MAAA,CAAO,YAAY,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAE/E,EAAA,MAAM,OAAA,GAAUA,cAAQ,MAAM;AAC5B,IAAA,IAAI,IAAA,EAAM;AAAC,MAAA,OAAO,OAAO,MAAA,GAAS,CAAA;AAAA,IAAE;AACpC,IAAA,OAAO,YAAA,GAAe,CAAA;AAAA,EACxB,GAAG,CAAC,YAAA,EAAc,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAC,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAUA,cAAQ,MAAM;AAC5B,IAAA,IAAI,IAAA,EAAM;AAAC,MAAA,OAAO,OAAO,MAAA,GAAS,CAAA;AAAA,IAAE;AACpC,IAAA,OAAO,YAAA,GAAe,OAAO,MAAA,GAAS,CAAA;AAAA,EACxC,GAAG,CAAC,YAAA,EAAc,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAC,CAAA;AAEtC,EAAA,MAAM,IAAA,GAAOL,iBAAAA;AAAA,IACX,CAAC,OAAe,SAAA,KAAkC;AAChD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,SAAS,CAAA;AAAA,MACrB;AACA,MAAA,MAAM,eAAe,SAAA,IAAa,MAAA;AAElC,MAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,QAAA,eAAA,CAAgB,CAAC,CAAA;AACjB,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,KAAA,EAAO,YAAA,CAAa,MAAA,GAAS,CAAC,CAAC,CAAA;AACtE,MAAA,eAAA,CAAgB,SAAS,CAAA;AACzB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,MAAA,GAAS,SAAS,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,QAAQ,MAAM;AAAA,GACjB;AAEA,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,IAAA,GAAOA,kBAAY,MAAM;AAC7B,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AAC/B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,IAAA,EAAM;AAAC,MAAA;AAAA,IAAO;AAE/B,IAAA,eAAA,CAAgB,CAAC,OAAA,KAAY;AAC3B,MAAA,MAAM,QAAA,GAAW,IAAA,GAAA,CACZ,OAAA,GAAU,CAAA,GAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,GACvC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA;AAC3B,MAAA,UAAA,GAAa,UAAU,MAAM,CAAA;AAC7B,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,OAAA,EAAS,MAAM,MAAA,CAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AAE7C,EAAA,MAAM,IAAA,GAAOA,kBAAY,MAAM;AAC7B,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAAC,MAAA;AAAA,IAAO;AAC/B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,IAAA,EAAM;AAAC,MAAA;AAAA,IAAO;AAE/B,IAAA,eAAA,CAAgB,CAAC,OAAA,KAAY;AAC3B,MAAA,MAAM,QAAA,GAAW,IAAA,GAAA,CAAQ,OAAA,GAAU,CAAA,IAAK,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA;AAC/F,MAAA,UAAA,GAAa,UAAU,MAAM,CAAA;AAC7B,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,OAAA,EAAS,MAAM,MAAA,CAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AAE7C,EAAA,MAAM,IAAA,GAAOA,iBAAAA;AAAA,IACX,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,KAAA,EAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAA;AAChE,MAAA,eAAA,CAAgB,SAAS,CAAA;AAAA,IAC3B,CAAA;AAAA,IACA,CAAC,OAAO,MAAM;AAAA,GAChB;AAEA,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,CAAC,SAAA,KAAiC;AACrE,IAAA,SAAA,CAAU,SAAS,CAAA;AAEnB,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,eAAA,CAAgB,CAAC,YAAY,IAAA,CAAK,GAAA,CAAI,SAAS,SAAA,CAAU,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,IACtE;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;ACxHO,SAAS,aAAA,CAAc,OAAA,GAAgC,EAAC,EAAwB;AACrF,EAAA,MAAM,EAAE,SAAA,GAAY,GAAA,EAAK,MAAA,GAAS,IAAA,EAAM,UAAS,GAAI,OAAA;AAErD,EAAA,MAAM,YAAA,GAAeI,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAID,eAAS,IAAI,CAAA;AACjD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,IAAI,CAAA;AAE7D,EAAA,MAAM,eAAA,GAAkBH,iBAAAA;AAAA,IACtB,CAAC,SAAA,KAAoC;AACnC,MAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,EAAa,GAAI,SAAA;AAClD,MAAA,OAAO,YAAA,GAAe,YAAY,YAAA,IAAgB,SAAA;AAAA,IACpD,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,YAAA,GAAeA,iBAAAA;AAAA,IACnB,CAAC,CAAA,KAAqC;AACpC,MAAA,MAAM,YAAY,CAAA,CAAE,aAAA;AACpB,MAAA,MAAM,QAAA,GAAW,gBAAgB,SAAS,CAAA;AAC1C,MAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,MAAA,mBAAA,CAAoB,QAAQ,CAAA;AAC5B,MAAA,QAAA,GAAW,QAAQ,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,iBAAiB,QAAQ;AAAA,GAC5B;AAEA,EAAA,MAAM,cAAA,GAAiBA,iBAAAA;AAAA,IACrB,CAAC,SAAA,KAAwB;AACvB,MAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,MAAA,IAAI,CAAC,SAAA,EAAW;AAAC,QAAA;AAAA,MAAO;AAExB,MAAA,MAAM,eAAe,SAAA,IAAa,MAAA;AAClC,MAAA,SAAA,CAAU,QAAA,CAAS;AAAA,QACjB,KAAK,SAAA,CAAU,YAAA;AAAA,QACf,QAAA,EAAU,eAAe,QAAA,GAAW;AAAA,OACrC,CAAA;AACD,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,aAAA,GAAgBA,iBAAAA,CAAY,CAAC,OAAA,KAAqB;AACtD,IAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,QAAA,CAAS;AAAA,UACjB,KAAK,SAAA,CAAU,YAAA;AAAA,UACf,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAM,gBAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAAC,MAAA;AAAA,IAAO;AAExB,IAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AAC1C,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,IAAI,UAAU,IAAA,EAAM;AAClB,UAAA,KAAA,GAAQ,sBAAsB,MAAM;AAClC,YAAA,SAAA,CAAU,QAAA,CAAS;AAAA,cACjB,KAAK,SAAA,CAAU,YAAA;AAAA,cACf,QAAA,EAAU;AAAA,aACX,CAAA;AACD,YAAA,KAAA,GAAQ,IAAA;AAAA,UACV,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,QAAQ,SAAA,EAAW;AAAA,MAC1B,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA;AAAA,MACT,aAAA,EAAe;AAAA,KAChB,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AC7FO,SAAS,iBAAA,CAAkB,OAAA,GAAoC,EAAC,EAA4B;AACjG,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAa,cAAc,MAAA,EAAQ,cAAA,GAAiB,KAAK,GAAI,OAAA;AAE7E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIH,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,gBAAA,GAAmBC,aAA6C,IAAI,CAAA;AAE1E,EAAAE,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,YAAA,CAAa,iBAAiB,OAAO,CAAA;AACrC,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAON,iBAAAA;AAAA,IACX,OAAO,OAAA,KAAoB;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA;AAC3C,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,MAAA,GAAS,OAAO,CAAA;AAGhB,QAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,UAAA,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAAA,QACvC;AAGA,QAAA,gBAAA,CAAiB,OAAA,GAAU,WAAW,MAAM;AAC1C,UAAA,WAAA,CAAY,KAAK,CAAA;AACjB,UAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,QAC7B,GAAG,cAAc,CAAA;AAAA,MACnB,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,gBAAgB,CAAA;AACvE,QAAA,WAAA,GAAc,GAAG,CAAA;AACjB,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,WAAA,EAAa,cAAc;AAAA,GACtC;AAEA,EAAA,MAAM,UAAA,GAAaA,kBAAY,YAAY;AACzC,IAAA,IAAI,CAAC,YAAA,EAAc;AAAC,MAAA;AAAA,IAAO;AAC3B,IAAA,IAAI,cAAA,EAAgB;AAAC,MAAA;AAAA,IAAO;AAE5B,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,EAAa;AAAA,IACrB,CAAA,SAAE;AACA,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,cAAc,CAAC,CAAA;AAEjC,EAAA,MAAM,IAAA,GAAOA,iBAAAA;AAAA,IACX,OAAO,OAAA,KAAoB;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,QAAA;AAAA,MAAO;AACrB,MAAA,IAAI,SAAA,EAAW;AAAC,QAAA;AAAA,MAAO;AAEvB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,OAAO,CAAA;AAAA,MACtB,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,SAAS;AAAA,GACpB;AAEA,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,MAAA,YAAA,CAAa,iBAAiB,OAAO,CAAA;AACrC,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AC5FA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,qBAAA,GAAwB,KAAK,IAAA,GAAO,IAAA;AAC1C,IAAM,wBAAkC,EAAC;AAiClC,SAAS,cAAA,CAAe,OAAA,GAAiC,EAAC,EAAyB;AACxF,EAAA,MAAM;AAAA,IACJ,QAAA,GAAW,iBAAA;AAAA,IACX,WAAA,GAAc,qBAAA;AAAA,IACd,YAAA,GAAe,qBAAA;AAAA,IACf,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,cAAAA,CAAuB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAAA,CAAgC,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,UAAA,GAAaC,aAA0B,IAAI,CAAA;AAEjD,EAAA,MAAM,YAAA,GAAeC,aAAAA,CAAQ,MAAM,KAAA,CAAM,MAAA,IAAU,UAAU,CAAC,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAC,CAAA;AACrF,EAAA,MAAM,cAAA,GAAiBA,aAAAA,CAAQ,MAAM,IAAA,CAAK,IAAI,CAAA,EAAG,QAAA,GAAW,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAEnG,EAAA,MAAM,YAAA,GAAeL,iBAAAA;AAAA,IACnB,CAAC,MAAY,YAAA,KAAqD;AAEhE,MAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,QAAA,OAAO;AAAA,UACL,IAAA;AAAA,UACA,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,WAAW,QAAQ,CAAA,cAAA;AAAA,SAC9B;AAAA,MACF;AAEA,MAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,QAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACrC,UAAA,OAAO;AAAA,YACL,IAAA;AAAA,YACA,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,CAAA,WAAA,EAAc,IAAA,CAAK,IAAA,IAAQ,SAAS,CAAA,aAAA;AAAA,WAC/C;AAAA,QACF;AACA,QAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AAC3B,UAAA,MAAM,SAAA,GAAA,CAAa,WAAA,IAAe,IAAA,GAAO,IAAA,CAAA,EAAO,QAAQ,CAAC,CAAA;AACzD,UAAA,OAAO;AAAA,YACL,IAAA;AAAA,YACA,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,aAAa,SAAS,CAAA,QAAA;AAAA,WACnD;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI;AACF,UAAA,sBAAA,CAAuB,MAAM,WAAW,CAAA;AAAA,QAC1C,SAAS,GAAA,EAAK;AACZ,UAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,gBAAA,CAAA;AACvE,UAAA,MAAM,MAAA,GAAwC,OAAA,CAAQ,QAAA,CAAS,OAAO,IAAI,MAAA,GAAS,MAAA;AACnF,UAAA,OAAO;AAAA,YACL,IAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAA,GAAc,SAAS,IAAI,CAAA;AACjC,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,OAAO;AAAA,YACL,IAAA;AAAA,YACA,MAAA,EAAQ,QAAA;AAAA,YACR,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,WAAA,EAAa,YAAA,EAAc,QAAQ;AAAA,GAChD;AAEA,EAAA,MAAM,GAAA,GAAMA,iBAAAA;AAAA,IACV,OAAO,QAAA,KAAgC;AACrC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM0K,UAAAA,GAAY,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACrC,QAAA,IAAIA,UAAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,MAAM,gBAAA,GAAmBA,UAAAA,CAAU,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,YAChD,IAAA;AAAA,YACA,MAAA,EAAQ,QAAA;AAAA,YACR,OAAA,EAAS;AAAA,WACX,CAAE,CAAA;AACF,UAAA,SAAA,CAAU,gBAAgB,CAAA;AAC1B,UAAA,OAAA,GAAU,gBAAgB,CAAA;AAAA,QAC5B;AACA,QAAA;AAAA,MACF;AAEA,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACrC,MAAA,MAAM,mBAA0C,EAAC;AACjD,MAAA,MAAM,aAA2B,EAAC;AAClC,MAAA,IAAI,eAAe,KAAA,CAAM,MAAA;AAEzB,MAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,EAAM,YAAY,CAAA;AAC7C,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAC3B,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,UAAA,GAAyB;AAAA,UAC7B,SAAA,EAAW,OAAO,UAAA,EAAW;AAAA,UAC7B,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,WAAW,IAAA,CAAK;AAAA,SAClB;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,MAAM,eAAA,CAAgB,IAAI,CAAA;AAC7C,UAAA,UAAA,CAAW,UAAA,GAAa,UAAA;AACxB,UAAA,IAAI,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAClC,YAAA,UAAA,CAAW,OAAA,GAAU,aAAA,CAAc,UAAA,EAAY,IAAA,CAAK,IAAI,CAAA;AAAA,UAC1D;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,UAAA,CAAW,KAAK,UAAU,CAAA;AAC1B,QAAA,YAAA,EAAA;AAAA,MACF;AAEA,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,SAAA,CAAU,gBAAgB,CAAA;AAC1B,QAAA,OAAA,GAAU,gBAAgB,CAAA;AAAA,MAC5B;AAEA,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,QAAA,CAAS,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,UAAU,CAAC,CAAA;AAC3C,QAAA,KAAA,GAAQ,UAAU,CAAA;AAAA,MACpB;AAEA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,KAAA,CAAM,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,SAAS,YAAY;AAAA,GAC3D;AAEA,EAAA,MAAM,MAAA,GAAS1K,iBAAAA;AAAA,IACb,CAAC,QAAA,KAAkC;AACjC,MAAA,MAAM,EAAA,GAAK,OAAO,QAAA,KAAa,QAAA,GAAW,WAAW,QAAA,CAAS,EAAA;AAC9D,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS;AACjB,QAAA,MAAM2K,QAAAA,GAAU,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,IAAK,IAAA;AACjD,QAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC3C,QAAA,UAAA,CAAW,OAAA,GAAUA,QAAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,GAAW,OAAO,CAAA;AAClB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,KAAA,GAAQ3K,kBAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EACd,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACpC,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EACd,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,QAAA,KAA2B;AAC9D,IAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;ACnOO,SAAS,eAAA,CAAgB,OAAA,GAAkC,EAAC,EAA0B;AAC3F,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAM,MAAA,EAAQ,SAAQ,GAAI,OAAA;AAEnD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIG,cAAAA,iBAA+B,IAAI,KAAK,CAAA;AAChF,EAAA,MAAM,WAAA,GAAcC,YAAAA,iBAAmD,IAAI,GAAA,EAAK,CAAA;AAEhF,EAAAE,gBAAU,MAAM;AACd,IAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY,YAAA,CAAa,OAAO,CAAC,CAAA;AACnD,MAAA,QAAA,CAAS,KAAA,EAAM;AAAA,IACjB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWN,iBAAAA;AAAA,IACf,CAAC,OAAA,KAA6B;AAC5B,MAAA,OAAO,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,IAAK,KAAA;AAAA,IACtC,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,IAAA,GAAOA,iBAAAA;AAAA,IACX,OAAO,OAAA,EAAiB,OAAA,EAAiB,QAAA,KAAsB;AAC7D,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA;AAG3C,QAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,UAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,UAAA,IAAA,CAAK,GAAA,CAAI,SAAS,IAAI,CAAA;AACtB,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAED,QAAA,MAAA,GAAS,SAAS,QAAQ,CAAA;AAG1B,QAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACvD,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,YAAA,CAAa,eAAe,CAAA;AAAA,QAC9B;AAGA,QAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,UAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,YAAA,IAAA,CAAK,GAAA,CAAI,SAAS,KAAK,CAAA;AACvB,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AACD,UAAA,WAAA,CAAY,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,QACpC,GAAG,cAAc,CAAA;AAEjB,QAAA,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAAA,MAC1C,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,gBAAgB,CAAA;AACvE,QAAA,OAAA,GAAU,GAAG,CAAA;AACb,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,MAAA,EAAQ,OAAO;AAAA,GAClC;AAEA,EAAA,MAAM,KAAA,GAAQA,iBAAAA,CAAY,CAAC,OAAA,KAAoB;AAC7C,IAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,GAAA,CAAI,SAAS,KAAK,CAAA;AACvB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAC/C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,WAAA,CAAY,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,kBAAY,MAAM;AACjC,IAAA,eAAA,iBAAgB,IAAI,KAAK,CAAA;AAGzB,IAAA,WAAA,CAAY,QAAQ,OAAA,CAAQ,CAAC,OAAA,KAAY,YAAA,CAAa,OAAO,CAAC,CAAA;AAC9D,IAAA,WAAA,CAAY,QAAQ,KAAA,EAAM;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;ACpIA,IAAM,gBAAA,GAAmB,GAAA;AAwBlB,SAAS,kBAAkB,KAAA,EAA2C;AAC3E,EAAA,MAAM,YAAA,GAAeI,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAID,eAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,eAAA,GAAkBC,aAAO,IAAI,CAAA;AAKnC,EAAA,MAAM,cAAA,GAAiBJ,kBAAY,MAAM;AACvC,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,YAAA,CAAa,QAAQ,MAAA,CAAO;AAAA,QAC1B,GAAA,EAAK,aAAa,OAAA,CAAQ,YAAA;AAAA,QAC1B,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAAC,MAAA;AAAA,IAAO;AAEnC,IAAA,MAAM,UAAU,YAAA,CAAa,OAAA;AAC7B,IAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,EAAa,GAAI,OAAA;AAGlD,IAAA,MAAM,kBAAA,GAAqB,eAAe,SAAA,GAAY,YAAA;AACtD,IAAA,MAAM,eAAe,kBAAA,GAAqB,gBAAA;AAE1C,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,IAAA,mBAAA,CAAoB,CAAC,YAAA,IAAgB,YAAA,GAAe,YAAY,CAAA;AAAA,EAClE,CAAA,EAAG,EAAE,CAAA;AAKL,EAAAM,gBAAU,MAAM;AACd,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAE3B,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,cAAA,EAAe;AAAA,MACjB,GAAG,CAAC,CAAA;AACJ,MAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,cAAc,CAAC,CAAA;AAK1B,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAAC,MAAA;AAAA,IAAO;AAExB,IAAA,SAAA,CAAU,iBAAiB,QAAA,EAAU,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AAGpE,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,YAAA,EAAc,CAAC,CAAA;AAE1C,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,mBAAA,CAAoB,UAAU,YAAY,CAAA;AACpD,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;ACtFO,SAAS,kCACd,OAAA,EACsB;AACtB,EAAA,OAAOD,cAAQ,MAAM;AACnB,IAAA,MAAM,GAAA,GAAM,OAAO,MAAA,KAAW,WAAA,GAAe,OAAyD,kBAAA,GAAqB,MAAA;AAC3H,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,EAAQ,aAAA,IAAiB,MAAA;AACjD,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,MAAA,EAAQ,cAAA,IAAkB,SAAA;AACrD,IAAA,MAAM,SAAA,GACJ,IAAI,OAAA,EAAS,SAAA,KACZ,OAAO,MAAA,KAAW,WAAA,GAAe,MAAA,CAAgD,cAAA,GAAiB,MAAA,CAAA,IACnG,EAAA;AAEF,IAAA,MAAM,QAAQ,OAAQ,WAA4D,GAAA,KAAQ,SAAA,IACpF,SAAuD,EAAK,GAAA;AAClE,IAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,EAAA;AAAA,MACT,WAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA,EAAc,SAAS,YAAA,IAAgB,IAAA;AAAA,MACvC,wBAAwB,OAAA,EAAS;AAAA,KACnC;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,YAAA,EAAc,OAAA,EAAS,sBAAsB,CAAC,CAAA;AAC7D;ACfA,IAAM,kBAAA,GAAqB,oBAAA;AAOpB,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAiD;AAC/C,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,UAAA,CAAW,YAAY,CAAA;AAEnD,EAAA,MAAM,eAAA,GAAkBA,aAAAA;AAAA,IACtB,MAAM,QAAA,CAAS,KAAA,CAAM,kBAAkB,IAAI,CAAC,CAAA;AAAA,IAC5C,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,UAAA,GAAaA,aAAAA;AAAA,IACjB,MAAO,aAAa,WAAA,GAAc,UAAA;AAAA,IAClC,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,UAAA,GAAaL,kBAAY,MAAM;AACnC,IAAA,UAAA,IAAa;AAAA,EACf,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,eAAA,GAAkBA,iBAAAA;AAAA,IACtB,CAAC,SAAA,KAAsB;AACrB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,MAAA,GAAS,aAAa,YAAA,GAAe,EAAA;AAC3C,QAAA,QAAA,CAAS,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE,CAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,UAAA,GAAa,eAAe,GAAG,CAAA;AAAA,MAC1C;AACA,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,UAAA,EAAY,UAAU;AAAA,GACnC;AAEA,EAAA,MAAM,SAAA,GAAYA,kBAAY,MAAM;AAClC,IAAA,QAAA,CAAS,UAAA,GAAa,eAAe,GAAG,CAAA;AACxC,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,QAAA,EAAU,UAAA,EAAY,UAAU,CAAC,CAAA;AAErC,EAAA,MAAM,cAAA,GAAiBA,kBAAY,MAAM;AACvC,IAAA,QAAA,CAAS,WAAW,CAAA;AACpB,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAEzB,EAAA,MAAM,cAAA,GAAiBA,kBAAY,MAAM;AACvC,IAAA,QAAA,CAAS,YAAY,CAAA;AACrB,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAEzB,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,GAAG,CAAA;AACZ,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAEzB,EAAA,MAAM,kBAAA,GAAqBA,iBAAAA;AAAA,IACzB,CAAC,GAAA,KAAkC;AACjC,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,QAAA,CAAS,YAAY,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAG,CAAA;AAAA,MACd;AACA,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,CAAC,UAAU,UAAU;AAAA,GACvB;AAEA,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;A/CuGA,gBAAA,EAAA;AgD/LA,IAAM,aAAA,GAAgBD,oBAAmC,IAAI,CAAA;AAiBtD,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;AAO3D,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,MAAM,gBAAgB,CAAA,CAAE,kBAAA;AACxB,IAAA,MAAM,aAAa,CAAA,CAAE,cAAA;AAErB,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,GAAA,EAAK,aAAA,CAAc,MAAA,EAAQ,aAAA,IAAiB,MAAA;AAAA,UAC5C,MAAA,EAAQ,aAAA,CAAc,MAAA,EAAQ,cAAA,IAAkB;AAAA,SAClD;AAAA,QACA,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAAA,EACF;AAEA,EAAA,uBACEF,cAAAA,CAAC,aAAA,CAAc,UAAd,EAAuB,KAAA,EAAO,gBAC5B,QAAA,EACH,CAAA;AAEJ;AAMO,SAAS,SAAA,GAAiC;AAC/C,EAAA,OAAOC,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;;;ACnHO,IAAM,UAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,SAAA;AAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA;AAAA,IACX,IAAA,EAAM,SAAA;AAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,UAAA,EAAY,SAAA;AAAA;AAAA,IACZ,eAAA,EAAiB,SAAA;AAAA;AAAA,IACjB,QAAA,EAAU,SAAA;AAAA;AAAA,IACV,aAAA,EAAe;AAAA;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;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA;AAAA,IACX,IAAA,EAAM,SAAA;AAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA;AAAA,IACP,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,UAAA,EAAY,SAAA;AAAA;AAAA,IACZ,eAAA,EAAiB,SAAA;AAAA;AAAA,IACjB,QAAA,EAAU,SAAA;AAAA;AAAA,IACV,aAAA,EAAe;AAAA;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,GAAeC,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,CAACE,IAAAA,EAAK,KAAK,CAAA,KAAM;AACrD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,SAAA,EAAYA,IAAG,IAAI,KAAK,CAAA;AAAA,EACjD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,CAAA,CAAE,QAAQ,CAAC,CAACA,IAAAA,EAAK,KAAK,CAAA,KAAM;AACtD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,iBAAA,EAAoBA,IAAG,IAAI,KAAK,CAAA;AAAA,EACzD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,YAAY,CAAA,CAAE,QAAQ,CAAC,CAACA,IAAAA,EAAK,KAAK,CAAA,KAAM;AAC3D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,gBAAA,EAAmBA,IAAG,IAAI,KAAK,CAAA;AAAA,EACxD,CAAC,CAAA;AACH;AAMO,SAAS,aAAA,CAAc,EAAE,KAAA,GAAQ,QAAA,EAAU,UAAS,EAAuB;AAChF,EAAA,MAAM,aAAA,GAAgBI,cAAQ,MAAM,YAAA,CAAa,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEhE,EAAAC,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,uBAAOT,cAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AACxD;AAKO,SAAS,QAAA,GAAkB;AAChC,EAAA,MAAM,OAAA,GAAUC,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;;;ACZA,cAAA,EAAA;AAiCO,SAAS,2BAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,OAAA,CAAQ,KAAK,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,EAAI,OAAA,IAAW,EAAE,CAAA;AACnD;AAMA,SAAS8K,WAAAA,CAAW,KAAA,EAAgB,QAAA,GAAW,EAAA,EAAY;AACzD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,QAAA;AAC7C;AAEA,SAAS,mBAAmB,KAAA,EAA+B;AACzD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,IAAA;AACxC;AAEA,SAAS,gBAAA,CAAiB,KAAA,EAAgB,QAAA,GAAW,CAAA,EAAW;AAC9D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,QAAA;AACvE;AAEA,SAAS,yBAAyB,KAAA,EAAoC;AACpE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,IACrD,KAAA,GACA,MAAA;AACN;AAEA,SAAS,uBAAuB,KAAA,EAA+B;AAC7D,EAAA,MAAM,GAAA,GAAM,mBAAmB,KAAK,CAAA;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC/C,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,YAAY,kBAAA,CAAmB,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAC,CAAA;AAClE,IAAA,OAAO,mBAAmB,SAAS,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AAEN,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC9C,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,YAAY,kBAAA,CAAmB,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAC,CAAA;AAClE,MAAA,OAAO,mBAAmB,SAAS,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,QAAA,EAA+B;AAC1D,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,QAAA,CAAS,IAAI,CAAA;AACjD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,QAAA,CAAS,GAAG,CAAA;AACnD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,QAAA,CAAS,IAAI,CAAA,IAAK,UAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AACpC,EAAA,IAAI,KAAA,KAAU,UAAA,IAAc,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,EAAG;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAG,KAAK,CAAA,SAAA,CAAA;AACjB;AAMA,SAAS,eAAe,OAAA,EAA2C;AACjE,EAAA,IAAI,CAAC7J,SAAAA,CAAS,OAAO,CAAA,EAAG;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,OAAA,CAAQ,EAAA;AACtB,EAAA,MAAM,EAAA,GACJ,kBAAA,CAAmB,KAAK,CAAA,KACvB,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAC/C,MAAA,CAAO,KAAK,CAAA,GACZ,IAAA,CAAA;AACN,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY6J,WAAAA,CAAW,OAAA,CAAQ,SAAS,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAWA,WAAAA,CAAW,OAAA,CAAQ,QAAQ,CAAA;AAC5C,EAAA,MAAM,WACJ,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAA,IACnC,CAAA,EAAG,UAAU,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,QAAA,CAAS,OAAO,CAAC,CAAC,GAAG,IAAA,EAAK,CAAE,aAAY,IACjE,GAAA;AAEF,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,iBAAiB,SAAA,EAA+C;AACvE,EAAA,IAAI,CAAC7J,SAAAA,CAAS,SAAS,CAAA,EAAG;AACxB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO6J,WAAAA,CAAW,SAAA,CAAU,IAAI,EAAE,WAAA,EAAY;AACpD,EAAA,MAAM,MAAA,GAASA,WAAAA,CAAW,SAAA,CAAU,MAAM,EAAE,WAAA,EAAY;AAExD,EAAA,MAAM,cAAA,GACJ,SAAS,OAAA,IACT,IAAA,KAAS,YACT,IAAA,KAAS,QAAA,IACT,IAAA,KAAS,UAAA,GACL,IAAA,GACA,MAAA;AACN,EAAA,MAAM,mBACJ,MAAA,KAAW,OAAA,IAAW,WAAW,QAAA,IAAY,MAAA,KAAW,eACpD,MAAA,GACA,MAAA;AACN,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,KAAY,IAAA,IAAQ,UAAU,OAAA,KAAY,MAAA;AACpE,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,QAAA,KAAa,IAAA,IAAQ,UAAU,QAAA,KAAa,MAAA;AACvE,EAAA,MAAM,gBAAA,GACJ,SAAA,CAAU,gBAAA,KAAqB,IAAA,IAC/B,UAAU,gBAAA,KAAqB,MAAA;AAEjC,EAAA,IACE,cAAA,KAAmB,UACnB,gBAAA,KAAqB,MAAA,IACrB,CAAC,OAAA,IACD,CAAC,QAAA,IACD,CAAC,gBAAA,EACD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,MAAA,EAAQ,gBAAA;AAAA,IACR,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,UAAU,OAAA,EAA8B;AACtD,EAAA,OAAO;AAAA,IACL,EAAA,EAAIA,WAAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAAA,IACzB,KAAA,EAAOA,WAAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC/B,MAAA,EAAQ,OAAA,CAAQ,MAAA,KAAW,UAAA,GAAa,UAAA,GAAa,QAAA;AAAA,IACrD,MAAA,EAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC9B,SAAA,EAAWA,WAAAA,CAAW,OAAA,CAAQ,SAAS,CAAA;AAAA,IACvC,SAAA,EAAWA,WAAAA,CAAW,OAAA,CAAQ,SAAS,CAAA;AAAA,IACvC,KAAA,EAAO,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAAA,IACnC,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,IAChC,aACE,OAAO,OAAA,CAAQ,WAAA,KAAgB,QAAA,GAAW,QAAQ,WAAA,GAAc,MAAA;AAAA,IAClE,MAAA,EAAQ,gBAAA,CAAiB,OAAA,CAAQ,MAAM;AAAA,GACzC;AACF;AAEO,SAAS,kBAAkB,QAAA,EAAwC;AACxE,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,QAAA,CAAS,SAAS,CAAA;AAC1D,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,2BAAA;AAAA,MACE,iDAAA;AAAA,MACA,EAAE,EAAA,EAAI,QAAA,CAAS,EAAA;AAAG,KACpB;AAAA,EACF;AACA,EAAA,MAAM,YAAY,YAAA,IAAgB,0BAAA;AAElC,EAAA,OAAO;AAAA,IACL,EAAA,EAAIA,WAAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,IAC1B,SAAA,EAAWA,WAAAA,CAAW,QAAA,CAAS,SAAS,CAAA;AAAA,IACxC,SAAA,EAAW,kBAAA,CAAmB,QAAA,CAAS,SAAS,CAAA,IAAK,MAAA;AAAA,IACrD,QAAA,EAAU,wBAAA,CAAyB,QAAA,CAAS,QAAQ,CAAA;AAAA,IACpD,IAAA,EAAM,kBAAA,CAAmB,QAAA,CAAS,IAAI,CAAA,IAAK,OAAA;AAAA,IAC3C,IAAA,EAAM,oBAAoB,QAAQ,CAAA;AAAA,IAClC,WAAA,EAAa,kBAAA,CAAmB,QAAA,CAAS,WAAW,CAAA,IAAK,MAAA;AAAA,IACzD,QAAA,EAAU,kBAAA,CAAmB,QAAA,CAAS,QAAQ,CAAA,IAAK,MAAA;AAAA,IACnD,GAAA,EAAK,kBAAA,CAAmB,QAAA,CAAS,GAAG,CAAA,IAAK,MAAA;AAAA,IACzC,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,gBAAA,CAAiB,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,IAC3D,UAAU7J,SAAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,GAAI,SAAS,QAAA,GAAW,MAAA;AAAA,IAC5D;AAAA,GACF;AACF;AAMA,SAAS8J,uBACP,OAAA,EACqC;AACrC,EAAA,MAAM,UAAA,GAAaD,WAAAA,CAAW,OAAO,CAAA,CAClC,IAAA,GACA,WAAA,EAAY,CACZ,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AACzB,EAAA,OAAO,UAAA,KAAe,oBAAoB,iBAAA,GAAoB,eAAA;AAChE;AAEA,SAAS,+BACP,SAAA,EAC2B;AAC3B,EAAA,MAAM,aAAaA,WAAAA,CAAW,SAAS,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC5D,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,kBAAA;AAAA,IACL,KAAK,kBAAA;AAAA,IACL,KAAK,sBAAA;AAAA,IACL,KAAK,sBAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAEA,SAAS,qBAAqB,OAAA,EAA+B;AAC3D,EAAA,MAAM,aAAaA,WAAAA,CAAW,OAAO,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC1D,EAAA,IAAI,UAAA,KAAA,MAAA,aAAiC;AACnC,IAAA,OAAA,MAAA;AAAA,EACF;AACA,EAAA,IAAI,UAAA,KAAA,QAAA,eAAmC;AACrC,IAAA,OAAA,QAAA;AAAA,EACF;AACA,EAAA,IAAI,UAAA,KAAA,MAAA,aAAiC;AACnC,IAAA,OAAA,MAAA;AAAA,EACF;AACA,EAAA,OAAA,WAAA;AACF;AAMA,SAAS,kBAAA,CACP,aAAA,EACA,MAAA,EACA,KAAA,EACmB;AACnB,EAAA,IAAI,CAAC7J,SAAAA,CAAS,aAAa,CAAA,EAAG;AAC5B,IAAA,2BAAA,CAA4B,oCAAA,EAAsC;AAAA,MAChE,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW6J,WAAAA,CAAW,aAAA,CAAc,QAAA,EAAU,YAAY,CAAA;AAChE,EAAA,MAAM,QAAA,GAAWA,WAAAA;AAAA,IACf,aAAA,CAAc,QAAA;AAAA,IACd;AAAA,GACF;AACA,EAAA,MAAM,EAAA,GAAK,kBAAA,CAAmB,aAAA,CAAc,EAAE,CAAA,IAAK,MAAA;AACnD,EAAA,MAAM,SAAA,GACJ,mBAAmB,aAAA,CAAc,SAAS,KAC1C,EAAA,IACA,CAAA,EAAG,MAAM,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA;AAE/B,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,gBAAA,CAAiB,aAAA,CAAc,SAAS,CAAA;AAAA,IACnD,QAAA,EAAU,wBAAA,CAAyB,aAAA,CAAc,QAAQ,CAAA;AAAA,IACzD,UAAA,EAAY,kBAAA,CAAmB,aAAA,CAAc,UAAU,CAAA,IAAK,MAAA;AAAA,IAC5D,GAAA,EAAK,kBAAA,CAAmB,aAAA,CAAc,GAAG,CAAA,IAAK,MAAA;AAAA,IAC9C,OAAA,EAAS,kBAAA,CAAmB,aAAA,CAAc,OAAO,CAAA,IAAK;AAAA,GACxD;AACF;AAEA,SAAS,uBAAA,CACP,gBACA,MAAA,EACc;AACd,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAG;AAClC,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,MAAM,YAAY,kBAAA,CAAmB,cAAA,CAAe,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACjE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,IACvB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,0BAAA,CACP,cACA,MAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAChC,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,YAAgC,EAAC;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,GAAA,GAAM,aAAa,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAC7J,SAAAA,CAAS,GAAG,CAAA,EAAG;AAClB,MAAA,2BAAA,CAA4B,sCAAA,EAAwC;AAAA,QAClE,MAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO6J,WAAAA,CAAW,GAAA,CAAI,IAAI,EAAE,WAAA,EAAY;AAC9C,IAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,KAAA,EAAO;AACtC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,2BAAA,CAA4B,wCAAA,EAA0C;AAAA,QACpE,MAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,IAAA;AAAA,MACA,QAAA,EAAUA,WAAAA,CAAW,GAAA,CAAI,QAAA,EAAU,UAAU,CAAA;AAAA,MAC7C,GAAA;AAAA,MACA,YAAA,EAAc,kBAAA,CAAmB,GAAA,CAAI,YAAY,CAAA,IAAK,MAAA;AAAA,MACtD,QAAA,EACE,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,GAC5D,GAAA,CAAI,QAAA,GACJ,MAAA;AAAA,MACN,WAAA,EAAa,kBAAA,CAAmB,GAAA,CAAI,WAAW,CAAA,IAAK;AAAA,KACrD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,SAAA;AACT;AAMA,SAAS,qBAAA,CACP,gBAAA,EACA,iBAAA,EACA,MAAA,EAC2B;AAC3B,EAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC7J,SAAAA,CAAS,gBAAgB,CAAA,EAAG;AAC/B,IAAA,2BAAA,CAA4B,0CAAA,EAA4C;AAAA,MACtE;AAAA,KACD,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,gBAAA,CAAiB,EAAE,CAAA;AAC1D,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,2BAAA,CAA4B,mCAAA,EAAqC;AAAA,MAC/D;AAAA,KACD,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,iBAAiB,SAAS,CAAA,GACtD,iBAAiB,SAAA,CACd,MAAA,CAAO,CAAC,IAAA,KAASA,UAAS,IAAI,CAAC,EAC/B,GAAA,CAAI,CAAC,MAAM,KAAA,MAAW;AAAA,IACrB,EAAA,EAAI6J,YAAW,IAAA,CAAK,EAAA,EAAI,GAAG,WAAW,CAAA,UAAA,EAAa,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1D,IAAA,EAAMA,WAAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1B,KAAA,EAAOA,WAAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,IAC5B,GAAA,EAAKA,WAAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,IACxB,UAAA,EAAY,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA;AAAA,IAC5C,QAAA,EAAU,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA;AAAA,IACxC,OAAA,EAAS,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA,IAAK;AAAA,GAC/C,CAAE,IACJ,EAAC;AAEL,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,iBAAiB,SAAS,CAAA,GACtD,iBAAiB,SAAA,CACd,MAAA,CAAO,CAAC,IAAA,KAAS7J,UAAS,IAAI,CAAC,EAC/B,GAAA,CAAI,CAAC,MAAM,KAAA,MAAW;AAAA,IACrB,EAAA,EAAI6J,YAAW,IAAA,CAAK,EAAA,EAAI,GAAG,WAAW,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,IACtD,IAAA,EAAMA,WAAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1B,SAAA,EAAWA,WAAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AAAA,IACpC,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,IAC3C,KAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAAK,MAAA;AAAA,IACzC,UAAA,EAAY,gBAAA,CAAiB,IAAA,CAAK,UAAU;AAAA,GAC9C,CAAE,IACJ,EAAC;AAEL,EAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,gBAAA,CAAiB,WAAW,IAC1D,gBAAA,CAAiB,WAAA,CACd,MAAA,CAAO,CAAC,SAAS7J,SAAAA,CAAS,IAAI,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IACd,OAAO,MAAkC;AACvC,MAAA,MAAM,iBAAiB6J,WAAAA,CAAW,IAAA,CAAK,IAAA,EAAM,MAAM,EAAE,WAAA,EAAY;AACjE,MAAA,IAAI,cAAA,KAAmB,OAAA,IAAW,cAAA,KAAmB,OAAA,EAAS;AAC5D,QAAA,OAAO,cAAA;AAAA,MACT;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,GAAG;AAAA,IACH,OAAA,EAASA,WAAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AAAA,IAChC,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,MAAA;AAAA,IAC/C,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,MAAA;AAAA,IAC/C,SAAA,EAAW,wBAAA,CAAyB,IAAA,CAAK,SAAS;AAAA,GACpD,CAAE,IACJ,EAAC;AAEL,EAAA,MAAM,UAAA,GAAa7J,SAAAA,CAAS,gBAAA,CAAiB,KAAK,CAAA,GAC9C;AAAA,IACE,aAAA,EACE,kBAAA,CAAmB,gBAAA,CAAiB,KAAA,CAAM,aAAa,CAAA,IAAK,MAAA;AAAA,IAC9D,SAAA,EACE,kBAAA,CAAmB,gBAAA,CAAiB,KAAA,CAAM,SAAS,CAAA,IAAK,MAAA;AAAA,IAC1D,WAAA,EACE,kBAAA,CAAmB,gBAAA,CAAiB,KAAA,CAAM,WAAW,CAAA,IAAK,MAAA;AAAA,IAC5D,YAAA,EAAc,wBAAA;AAAA,MACZ,iBAAiB,KAAA,CAAM;AAAA,KACzB;AAAA,IACA,OAAA,EACE,kBAAA,CAAmB,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA,IAAK,MAAA;AAAA,IACxD,QAAA,EACE,kBAAA,CAAmB,gBAAA,CAAiB,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAAA,IACzD,SAAA,EACE,kBAAA,CAAmB,gBAAA,CAAiB,KAAA,CAAM,SAAS,CAAA,IAAK,MAAA;AAAA,IAC1D,QAAA,EACE,kBAAA,CAAmB,gBAAA,CAAiB,KAAA,CAAM,QAAQ,CAAA,IAAK,MAAA;AAAA,IACzD,iBAAA,EACE,kBAAA,CAAmB,gBAAA,CAAiB,KAAA,CAAM,iBAAiB,CAAA,IAC3D,MAAA;AAAA,IACF,KAAA,EAAOA,SAAAA,CAAS,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA,GACxC;AAAA,MACE,YAAA,EAAc,gBAAA;AAAA,QACZ,gBAAA,CAAiB,MAAM,KAAA,CAAM;AAAA,OAC/B;AAAA,MACA,gBAAA,EAAkB,gBAAA;AAAA,QAChB,gBAAA,CAAiB,MAAM,KAAA,CAAM;AAAA,OAC/B;AAAA,MACA,WAAA,EAAa,gBAAA;AAAA,QACX,gBAAA,CAAiB,MAAM,KAAA,CAAM;AAAA,OAC/B;AAAA,MACA,YAAA,EAAc,wBAAA;AAAA,QACZ,gBAAA,CAAiB,MAAM,KAAA,CAAM;AAAA,OAC/B;AAAA,MACA,IAAA,EAAM,wBAAA,CAAyB,gBAAA,CAAiB,KAAA,CAAM,MAAM,IAAI;AAAA,KAClE,GACA,MAAA;AAAA,IACJ,OAAO,KAAA,CAAM,OAAA,CAAQ,iBAAiB,KAAA,CAAM,KAAK,IAC7C,gBAAA,CAAiB,KAAA,CAAM,MACpB,MAAA,CAAO,CAAC,SAASA,SAAAA,CAAS,IAAI,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACd,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,MAC3C,IAAA,EAAM6J,WAAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,MAC1B,SAAA,EAAW,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA,IAAK,MAAA;AAAA,MACjD,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,MAC3C,KAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAAK,MAAA;AAAA,MACzC,UAAA,EAAY,wBAAA,CAAyB,IAAA,CAAK,UAAU;AAAA,KACtD,CAAE,IACJ,EAAC;AAAA,IACL,UAAU,KAAA,CAAM,OAAA,CAAQ,iBAAiB,KAAA,CAAM,QAAQ,IACnD,gBAAA,CAAiB,KAAA,CAAM,SACpB,MAAA,CAAO,CAAC,YAAY7J,SAAAA,CAAS,OAAO,CAAC,CAAA,CACrC,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,MACjB,EAAA,EAAI,kBAAA,CAAmB,OAAA,CAAQ,EAAE,CAAA,IAAK,MAAA;AAAA,MACtC,SAAA,EAAW,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAA,IAAK,MAAA;AAAA,MACpD,KAAA,EAAO,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA,IAAK,MAAA;AAAA,MAC5C,QAAA,EAAU,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAA,IAAK,MAAA;AAAA,MAClD,YAAA,EACE,kBAAA,CAAmB,OAAA,CAAQ,YAAY,CAAA,IAAK,MAAA;AAAA,MAC9C,YAAA,EAAc,wBAAA,CAAyB,OAAA,CAAQ,YAAY,CAAA;AAAA,MAC3D,gBAAA,EAAkB,wBAAA;AAAA,QAChB,OAAA,CAAQ;AAAA,OACV;AAAA,MACA,WAAA,EAAa,wBAAA,CAAyB,OAAA,CAAQ,WAAW,CAAA;AAAA,MACzD,YAAA,EAAc,wBAAA,CAAyB,OAAA,CAAQ,YAAY,CAAA;AAAA,MAC3D,IAAA,EAAM,wBAAA,CAAyB,OAAA,CAAQ,IAAI,CAAA;AAAA,MAC3C,SAAA,EAAW,wBAAA,CAAyB,OAAA,CAAQ,SAAS,CAAA;AAAA,MACrD,KAAA,EAAO,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA,IAAK,MAAA;AAAA,MAC5C,MAAA,EAAQ,kBAAA,CAAmB,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA;AAAA,MAC9C,QAAA,EAAU,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAA,IAAK,MAAA;AAAA,MAClD,iBAAA,EACE,kBAAA,CAAmB,OAAA,CAAQ,iBAAiB,CAAA,IAAK,MAAA;AAAA,MACnD,SAAA,EAAW,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAA,IAAK,MAAA;AAAA,MACpD,WAAA,EACE,kBAAA,CAAmB,OAAA,CAAQ,WAAW,CAAA,IAAK,MAAA;AAAA,MAC7C,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,IACtC,OAAA,CAAQ,SAAA,CACL,MAAA,CAAO,CAAC,SAASA,SAAAA,CAAS,IAAI,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACd,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,QAC3C,IAAA,EAAM6J,WAAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,QAC1B,SAAA,EACE,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA,IAAK,MAAA;AAAA,QACxC,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,QAC3C,KAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAAK,MAAA;AAAA,QACzC,UAAA,EAAY,wBAAA,CAAyB,IAAA,CAAK,UAAU;AAAA,OACtD,CAAE,IACJ;AAAC,KACP,CAAE,IACJ,EAAC;AAAA,IACL,OAAO,KAAA,CAAM,OAAA,CAAQ,iBAAiB,KAAA,CAAM,KAAK,IAC7C,gBAAA,CAAiB,KAAA,CAAM,MACpB,MAAA,CAAO,CAAC,SAAS7J,SAAAA,CAAS,IAAI,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACd,EAAA,EAAI,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA,IAAK,MAAA;AAAA,MACnC,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,MAAA;AAAA,MAC/C,YAAA,EACE,kBAAA,CAAmB,IAAA,CAAK,YAAY,CAAA,IAAK,MAAA;AAAA,MAC3C,IAAA,EAAM,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,IAAK,MAAA;AAAA,MACvC,IAAA,EAAM,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,IAAK,MAAA;AAAA,MACvC,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,MAC3C,KAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAAK,MAAA;AAAA,MACzC,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,MAC3C,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,MAAA;AAAA,MAC/C,KAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAAK,MAAA;AAAA,MACzC,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,MAC3C,KAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAAK,MAAA;AAAA,MACzC,UAAA,EAAY,wBAAA,CAAyB,IAAA,CAAK,UAAU,CAAA;AAAA,MACpD,SAAA,EAAW,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA,IAAK,MAAA;AAAA,MACjD,WAAA,EAAa,kBAAA,CAAmB,IAAA,CAAK,WAAW,CAAA,IAAK,MAAA;AAAA,MACrD,YAAYA,SAAAA,CAAS,IAAA,CAAK,UAAU,CAAA,GAChC,KAAK,UAAA,GACL;AAAA,KACN,CAAE,IACJ,EAAC;AAAA,IACL,QAAQ,KAAA,CAAM,OAAA,CAAQ,iBAAiB,KAAA,CAAM,MAAM,IAC/C,gBAAA,CAAiB,KAAA,CAAM,OACpB,MAAA,CAAO,CAAC,SAASA,SAAAA,CAAS,IAAI,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACd,EAAA,EAAI,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA,IAAK,MAAA;AAAA,MACnC,IAAA,EAAM,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,IAAK,MAAA;AAAA,MACvC,IAAA,EAAM,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,IAAK,MAAA;AAAA,MACvC,KAAA,EAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAAK,MAAA;AAAA,MACzC,OAAA,EAAS,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA,IAAK,MAAA;AAAA,MAC7C,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,MAC3C,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA;AAAA,MAC3C,YAAA,EACE,kBAAA,CAAmB,IAAA,CAAK,YAAY,CAAA,IAAK,MAAA;AAAA,MAC3C,SAAA,EAAW,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA,IAAK,MAAA;AAAA,MACjD,YAAYA,SAAAA,CAAS,IAAA,CAAK,UAAU,CAAA,GAChC,KAAK,UAAA,GACL;AAAA,KACN,CAAE,IACJ;AAAC,GACP,GACA,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,oBAAA,CAAqB,gBAAA,CAAiB,IAAI,CAAA;AAAA,IAChD,OAAA,EAAS6J,WAAAA,CAAW,gBAAA,CAAiB,OAAO,CAAA;AAAA,IAC5C,WAAA,EAAa,kBAAA,CAAmB,gBAAA,CAAiB,WAAW,CAAA,IAAK,MAAA;AAAA,IACjE,SAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW,0BAAA,CAA2B,gBAAA,CAAiB,SAAA,EAAW,MAAM,CAAA;AAAA,IACxE,WAAA;AAAA,IACA,SAAA,EAAW,UAAA;AAAA,IACX,KAAA,EAAO,UAAA;AAAA,IACP,SAAA,EAAWA,WAAAA,CAAW,gBAAA,CAAiB,SAAA,EAAW,iBAAiB;AAAA,GACrE;AACF;AAMA,SAAS,wBAAA,CACP,OAAA,EACA,KAAA,EACA,iBAAA,EACyB;AACzB,EAAA,IAAI,CAAC7J,SAAAA,CAAS,OAAO,CAAA,EAAG;AACtB,IAAA,2BAAA;AAAA,MACE,gDAAA;AAAA,MACA,EAAE,KAAA;AAAM,KACV;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAACA,SAAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC/B,IAAA,2BAAA;AAAA,MACE,oDAAA;AAAA,MACA,EAAE,KAAA;AAAM,KACV;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA;AACzD,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,2BAAA;AAAA,MACE,uDAAA;AAAA,MACA,EAAE,KAAA;AAAM,KACV;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS6J,WAAAA,CAAW,OAAA,CAAQ,EAAA,EAAI,UAAU,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IAChB,OAAA,CAAQ,SAAA;AAAA,IACRA,WAAAA,CAAW,QAAQ,QAAA,CAAS,SAAA,EAAA,qBAAe,IAAA,EAAK,EAAE,aAAa;AAAA,GACjE;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,SAAA,EAAWA,WAAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,iBAAiB,CAAA;AAAA,IAC1D,QAAA,EAAU;AAAA,MACR,EAAA,EAAI,UAAA;AAAA,MACJ,OAAA,EAASA,WAAAA,CAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAAA,MAC5C,WAAA,EAAa,uBAAA;AAAA,QACX,QAAQ,QAAA,CAAS,WAAA;AAAA,QACjB;AAAA,OACF;AAAA,MACA,MAAA,EAAQ,cAAA,CAAe,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAAA,MAC9C,SAAA,EAAWA,WAAAA,CAAW,OAAA,CAAQ,QAAA,CAAS,WAAW,SAAS;AAAA,KAC7D;AAAA,IACA,aAAA,EAAe,qBAAA;AAAA,MACb,OAAA,CAAQ,aAAA;AAAA,MACR,SAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,yBAAA,CACd,UACA,SAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,2BAAA;AAAA,MACE,iDAAA;AAAA,MACA,EAAE,SAAA;AAAU,KACd;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,gBAAgB,wBAAA,CAAyB,QAAA,CAAS,CAAC,CAAA,EAAG,GAAG,SAAS,CAAA;AACxE,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,OAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,2BAAA;AAAA,MACE,8CAAA;AAAA,MACA;AAAA,QACE,SAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAO,QAAA,CAAS;AAAA;AAClB,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,uBAAA,CACd,oBACA,SAAA,EACwB;AACxB,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,kBAAA,CAAmB,YAAY,CAAA;AACvE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,2BAAA;AAAA,MACE,wDAAA;AAAA,MACA,EAAE,SAAA;AAAU,KACd;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,kBAAA,CAAmB,SAAS,CAAA,EAAG;AAChD,IAAA,2BAAA;AAAA,MACE,kDAAA;AAAA,MACA;AAAA,QACE,SAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAwB,KAAA,CAAM,OAAA,CAAQ,kBAAA,CAAmB,SAAS,IACpE,kBAAA,CAAmB,SAAA,CAChB,MAAA,CAAO,CAAC,QAAA,KAAa;AACpB,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC7J,SAAAA,CAAS,QAAQ,CAAA,EAAG;AACpC,MAAA,2BAAA;AAAA,QACE,iDAAA;AAAA,QACA;AAAA,UACE,SAAA;AAAA,UACA;AAAA;AACF,OACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,UAAU,KAAA,KAAU;AACxB,IAAA,MAAM,UAAA,GAAa6J,WAAAA;AAAA,MACjB,QAAA,CAAS,EAAA;AAAA,MACT,CAAA,EAAG,YAAY,CAAA,GAAA,EAAM,KAAK,CAAA;AAAA,KAC5B;AACA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,IAC1C,QAAA,CAAS,OAAA,CACN,MAAA,CAAO,CAAC,MAAA,KAAW;AAClB,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC7J,SAAAA,CAAS,MAAM,CAAA,EAAG;AAChC,QAAA,2BAAA;AAAA,UACE,0CAAA;AAAA,UACA;AAAA,YACE,SAAA;AAAA,YACA,YAAA;AAAA,YACA;AAAA;AACF,SACF;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,QAAQ,WAAA,KAAgB;AAC5B,MAAA,MAAM,KAAA,GAAQ6J,WAAAA,CAAW,MAAA,CAAO,KAAK,CAAA;AACrC,MAAA,MAAM,EAAA,GAAKA,WAAAA;AAAA,QACT,MAAA,CAAO,EAAA;AAAA,QACP,CAAA,EAAG,UAAU,CAAA,KAAA,EAAQ,WAAW,CAAA;AAAA,OAClC;AACA,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACT;AAAA,IACF,CAAC,IACH,EAAC;AAEL,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,UAAA;AAAA,MACJ,IAAA,EAAMA,WAAAA,CAAW,QAAA,CAAS,IAAI,CAAA;AAAA,MAC9B,IAAA,EAAMC,sBAAAA,CAAsB,QAAA,CAAS,IAAI,CAAA;AAAA,MACzC;AAAA,KACF;AAAA,EACF,CAAC,IACH,EAAC;AAEL,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,YAAA;AAAA,IACJ,MAAA,EAAQD,WAAAA,CAAW,kBAAA,CAAmB,MAAM,CAAA;AAAA,IAC5C,SAAA,EAAW,kBAAA,CAAmB,kBAAA,CAAmB,SAAS,CAAA,IAAK,MAAA;AAAA,IAC/D,SAAA;AAAA,IACA,MAAA,EAAQ,8BAAA,CAA+B,kBAAA,CAAmB,MAAM;AAAA,GAClE;AACF;AAMA,SAAS,mBAAmB,KAAA,EAAmC;AAC7D,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,SAAS,CAAA,EAAG;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,OAAO,KAAA,IAAS,IAAA,IAAQ,GAAA,GAAM,KAAA,CAAM,SAAS,CAAA,EAAG;AAC9C,IAAA,KAAA,IAAS,IAAA;AACT,IAAA,GAAA,EAAA;AAAA,EACF;AACA,EAAA,MAAM,YAAY,GAAA,KAAQ,CAAA,GAAI,CAAA,GAAI,KAAA,IAAS,KAAK,CAAA,GAAI,CAAA;AACpD,EAAA,OAAO,CAAA,EAAG,MAAM,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA;AAClD;AAEA,SAAS,cAAc,QAAA,EAAwD;AAC7E,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MACJ,QAAA,CAAS,SAAA,IACT,SAAS,QAAA,IACT,QAAA,CAAS,cACT,QAAA,CAAS,SAAA;AACX,EAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,MAAA,CAAO,cAAc,GAAG,CAAA,IAAK,OAAO,CAAA,EAAG;AACpE,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC1B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,OAAO,OAAO,CAAA;AAC7B,IAAA,IAAI,MAAA,CAAO,aAAA,CAAc,MAAM,CAAA,EAAG;AAChC,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBACP,QAAA,EACiC;AACjC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,EAAU,WAAA,EAAY,IAAK,EAAA;AACjD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,WAAA,EAAY,IAAK,EAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,SAAS,GAAA,EAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAY,IAAK,EAAA;AAE9D,EAAA,MAAM,KAAA,GACJ,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA;AAC3E,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GACJ,KAAK,QAAA,CAAS,aAAa,KAC3B,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IACrB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IACpB,QAAA,CAAS,SAAS,OAAO,CAAA,IACzB,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA;AAC1B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,gBAAgB,QAAA,EAAmC;AAC1D,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,IAAA,EAAK;AACjC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,QAAA,CAAS,GAAA,EAAK,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,EAAE,GAAA,EAAI;AACvD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,mBACP,QAAA,EACyB;AACzB,EAAA,IAAI,CAAC,SAAS,GAAA,EAAK;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,kBAAkB,QAAQ,CAAA;AACvC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,QAAA,EAAU,gBAAgB,QAAQ,CAAA;AAAA,IAClC,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,YAAA,EAAc,kBAAA,CAAmB,QAAA,CAAS,SAAS,CAAA;AAAA,IACnD,QAAA,EAAU,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA;AAAA,IACzC,aAAa,QAAA,CAAS;AAAA,GACxB;AACF;AAMA,SAAS,eACP,KAAA,EAC8B;AAC9B,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,QACE,KAAA,CAAM,MAAA,EAAQ,IAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,MAAM,CAAC,GAAI,EAAE,IAAA,IAAQ,EAAG,CAAA,EAAE,CAAE,KAAK,EAAC;AAAA,IACtE,QAAQ,KAAA,CAAM,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA;AAAA,IAC3C,QAAQ,KAAA,CAAM,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA;AAAA,IAC3C,OAAA,EACE,MAAM,OAAA,IACN,OAAO,MAAM,OAAA,KAAY,QAAA,IACzB,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,OAAO,CAAA,GACxB,KAAK,KAAA,CAAM,IAAA,CAAK,UAAU,KAAA,CAAM,OAAO,CAAC,CAAA,GACxC,KAAA,CAAM;AAAA,GACd;AACF;AAEA,SAAS,2BACP,SAAA,EACgC;AAChC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,SAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,IAAI,EAAA,CAAG,IAAA,KAAS,YAAA,IAAgB,EAAA,CAAG,MAAA,EAAQ;AACzC,MAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,EAAA,CAAG,MAAM,CAAA;AACrD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,IAAA,CAAK,cAAA,CAAe,MAAM,CAAC,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,qBAAqB,KAAA,EAAyC;AACrE,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,SAAS,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AAAA,IAClC,SAAS,CAAC,GAAI,KAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AAAA,IAClC,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAG,GAAG,CAAC,CAAA,IAAK;AAAC,GAC/C;AACF;AAEA,SAAS,iCACP,SAAA,EACmB;AACnB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,IAAI,EAAA,CAAG,IAAA,KAAS,cAAA,IAAkB,CAAC,GAAG,MAAA,EAAQ;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,kCAAA,CAAmC,EAAA,CAAG,MAAA,EAAQ,GAAG,EAAE,CAAA;AAClE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,IAAA,CAAK,oBAAA,CAAqB,MAAM,CAAC,CAAA;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,iBAAA,GAA8D;AAAA,EAClE,qBAAA,EAAuB,OAAA;AAAA,EACvB,oBAAA,EAAsB,OAAA;AAAA,EACtB,aAAA,EAAe;AACjB,CAAA;AAEA,SAAS,sCACP,SAAA,EACoB;AACpB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,YAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,EAAA,CAAG,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,EAAA,CAAG,MAAA,EAAQ;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC7J,SAAAA,CAAS,MAAM,CAAA,IAAK,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,MAAA,CAAO,GAAA,EAAK;AACtE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GACJ,OAAO,MAAA,CAAO,QAAA,KAAa,YAAY,MAAA,CAAO,QAAA,GAC1C,MAAA,CAAO,QAAA,GACP,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,UAAA;AAErC,IAAA,MAAM,SACJ,OAAO,MAAA,CAAO,YAAA,KAAiB,QAAA,GAAW,OAAO,YAAA,GAAe,MAAA;AAClE,IAAA,MAAM,SAAA,GACJ,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GACnB,OAAO,IAAA,GACP,MAAA,IAAU,IAAA,GACR,MAAA,GAAS,IAAA,GACT,MAAA;AAER,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,IAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,YAAA,EACE,SAAA,IAAa,IAAA,GAAO,kBAAA,CAAmB,SAAS,CAAA,GAAI,MAAA;AAAA,MACtD,QAAA,EAAU,cAAc,MAAiC,CAAA;AAAA,MACzD,aACE,OAAO,MAAA,CAAO,WAAA,KAAgB,QAAA,GAAW,OAAO,WAAA,GAAc;AAAA,KACjE,CAAA;AAAA,EACH;AACA,EAAA,OAAO,SAAA;AACT;AAMA,SAAS,uBACP,IAAA,EAKe;AACf,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,SAAA,IAAa,EAAC;AAC7C,EAAA,MAAM,aAAA,GAAgB,qCAAA,CAAsC,IAAA,CAAK,SAAS,CAAA;AAC1E,EAAA,MAAM,YAAA,GACJ,IAAA,CAAK,YAAA,IAAgB,gCAAA,CAAiC,KAAK,SAAS,CAAA;AAEtE,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,iBAAiB,CAAA;AACpC,EAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,QAAQ,CAAA,EAAG;AACrE,MAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,KAAK,MAAA,EAAQ,MAAA,GAC3B,KAAK,MAAA,GACL,0BAAA,CAA2B,KAAK,SAAS,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,SAAA,EAAW,GAAA,CAAI,cAAc,KAAK,EAAC;AAClD,EAAA,MAAM,kBAAA,GAAqB,YAAA,CAAa,GAAA,CAAI,oBAAoB,CAAA;AAEhE,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,MAAO,IAAA,CAAK,IAAA,IAAA,WAAA;AAAA,IACZ,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,MAAA,GAAS,MAAA;AAAA,IACjC,YAAA,EAAc,kBAAA;AAAA,IACd,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,EAAC;AAAA,IAC9B,SAAA,EAAW,MAAA;AAAA,IACX,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,EAAC;AAAA,IAClC,SAAA,EAAW,KAAK,SAAA,IAAa;AAAA,GAC/B;AACF;AAEO,SAAS,eAAe,GAAA,EAA6C;AAC1E,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS;AACvB,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,aAAA,EAAe,sBAAA,CAAuB,IAAA,CAAK,aAAa;AAAA,KAC1D;AAAA,EACF,CAAC,CAAA;AACH;AAMA,SAAS,SAAS,KAAA,EAAuB;AACvC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,SAAS,MAAA,CAAO,GAAA;AACnD;AAEO,SAAS,sBAAA,CACd,OACA,SAAA,EACoB;AACpB,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,iBAAA,GAAoB,SAAA,CACvB,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,GAAA,EAAK,MAAA,EAAQ,kBAAA,CAAmB,GAAG,CAAA,EAAE,CAAE,CAAA,CACvD,MAAA;AAAA,IACC,CAAC,KAAA,KACC,KAAA,CAAM,MAAA,KAAW;AAAA,GACrB,CACC,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,SAAS,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,GAAA,CAAI,SAAS,CAAC,CAAA;AAEvE,EAAA,MAAM,cAAA,GAAiB,UACpB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,CAChC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,SAAS,CAAA,CAAE,SAAS,IAAI,QAAA,CAAS,CAAA,CAAE,SAAS,CAAC,CAAA;AAE/D,EAAA,MAAM,cAAA,GAAiB,UACpB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,CAChC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,SAAS,CAAA,CAAE,SAAS,IAAI,QAAA,CAAS,CAAA,CAAE,SAAS,CAAC,CAAA;AAE/D,EAAA,IACE,iBAAA,CAAkB,WAAW,CAAA,IAC7B,cAAA,CAAe,WAAW,CAAA,IAC1B,cAAA,CAAe,WAAW,CAAA,EAC1B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACpC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,aAAA,EAAe;AAAA,QACb,GAAG,IAAA,CAAK,aAAA;AAAA,QACR,WAAW,CAAC,GAAI,KAAK,aAAA,CAAc,SAAA,IAAa,EAAG,CAAA;AAAA,QACnD,MAAA,EAAQ,KAAK,aAAA,CAAc,MAAA,GACvB,CAAC,GAAG,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,GAC7B,MAAA;AAAA,QACJ,YAAA,EAAc,KAAK,aAAA,CAAc,YAAA,GAC7B,CAAC,GAAG,IAAA,CAAK,aAAA,CAAc,YAAY,CAAA,GACnC;AAAA;AACN,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAoB;AAErD,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AACjC,IAAA,oBAAA,CAAqB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,EAAA,EAAI,KAAK,CAAA;AAEhD,IAAA,MAAM,gBAAgB,IAAA,CAAK,aAAA;AAC3B,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA;AAAA,IACF;AACA,IAAA,oBAAA,CAAqB,GAAA,CAAI,aAAA,CAAc,EAAA,EAAI,KAAK,CAAA;AAAA,EAClD,CAAC,CAAA;AAED,EAAA,KAAA,MAAW,SAAS,iBAAA,EAAmB;AACrC,IAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,SAAA;AAI5B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AACtD,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,WAAW,CAAA,EAAG,aAAA;AAC9C,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,cAAc,SAAA,CAAU,IAAA;AAAA,MACrC,CAAC,QAAA,KACC,QAAA,CAAS,GAAA,KAAQ,KAAA,CAAM,OAAO,GAAA,IAC9B,QAAA,CAAS,QAAA,KAAa,KAAA,CAAM,MAAA,CAAO;AAAA,KACvC;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,aAAA,CAAc,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,IAAA,MAAM,YAAY,GAAA,CAAI,SAAA;AACtB,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AACtD,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,WAAW,CAAA,EAAG,aAAA;AAC9C,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,IAAY,aAAa,IAAA,EAAM;AAClE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GACJ,QAAA,CAAS,IAAA,IACT,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,IACzB,QAAA,CAAS,IAAA,KAAS,IAAA,GACb,QAAA,CAAS,IAAA,GACT,QAAA;AAEP,IAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,IAAA,EAAM,GAAA,CAAI,IAAI,CAAA;AACnD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,CAAC,cAAc,MAAA,EAAQ;AACzB,QAAA,aAAA,CAAc,SAAS,EAAC;AAAA,MAC1B;AACA,MAAA,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,IAAA,MAAM,YAAY,GAAA,CAAI,SAAA;AACtB,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AACtD,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,WAAW,CAAA,EAAG,aAAA;AAC9C,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,CAAc,iBAAiB,MAAA,EAAW;AAC5C,MAAA,aAAA,CAAc,YAAA,GAAe,gCAAA;AAAA,QAC3B,aAAA,CAAc;AAAA,OAChB;AAAA,IACF;AACA,IAAA,MAAM,WAAW,aAAA,CAAc,YAAA;AAE/B,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,IAAY,aAAa,IAAA,EAAM;AAClE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,gCAAA;AAAA,MAChB,QAAA;AAAA,MACA,GAAA,CAAI;AAAA,KACN;AACA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KACjB,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACnC,IAAA,MAAMd,IAAAA,GAAM,UAAU,SAAS,CAAA;AAC/B,IAAA,IAAI,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,UAAU,CAAC,CAAA,KAAMA,IAAG,CAAA,EAAG;AAC9C,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,eAAe,CAAC,GAAG,QAAA,EAAU,oBAAA,CAAqB,SAAS,CAAC,CAAA;AAAA,EAC5E;AAEA,EAAA,OAAO,SAAA;AACT;;;ACruCA,SAAS,uBAAuB,GAAA,EAAuB;AACrD,EAAA,IAAI,EAAE,eAAe,kBAAA,CAAA,EAAqB;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AACxD,EAAA,OAAO,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,IAAA,KAAS,mBAAA;AAClD;AAMA,eAAsB,cAAc,OAAA,EAAsC;AACxE,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,yBAAyB,EAAE,KAAA,EAAO,IAAI,CAAA;AACjE,EAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAC/B;AAEA,eAAsB,YAAA,CACpB,EAAA,EACA,OAAA,EACA,cAAA,EAC8B;AAC9B,EAAA,IAAI;AACF,IAAA,MAAM,CAAC,IAAA,EAAM,aAAa,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC9C,OAAA,CAAQ,oBAAA,EAAsB,EAAE,EAAA,EAAI,CAAA;AAAA,MACpC,cAAA,CAAe,EAAA,EAAI,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAC3D,QAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,GAAG,CAAA;AACtD,QAAA,OAAO,EAAE,SAAA,EAAW,IAAyB,OAAA,EAAS,KAAA,EAAO,YAAY,CAAA,EAAE;AAAA,MAC7E,CAAC;AAAA,KACF,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB,yBAAA,CAA0B,IAAA,CAAK,KAAA,EAAO,EAAE,CAAA;AAC/D,IAAA,MAAM,KAAA,GAAQ,sBAAA;AAAA,MACZ,eAAe,cAAc,CAAA;AAAA,MAC7B,aAAA,CAAc,aAAa;AAAC,KAC9B;AACA,IAAA,MAAM,eAAA,GAAkB,uBAAA,CAAwB,IAAA,CAAK,eAAA,EAAiB,EAAE,CAAA;AAExE,IAAA,IAAI,KAAK,eAAA,IAAmB,eAAA,IAAmB,eAAA,CAAgB,SAAA,CAAU,WAAW,CAAA,EAAG;AACrF,MAAA,2BAAA,CAA4B,0DAAA,EAA4D;AAAA,QACtF,SAAA,EAAW,EAAA;AAAA,QACX,cAAc,eAAA,CAAgB;AAAA,OAC/B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAAA,MAC/B,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,sBAAA,CAAuB,GAAG,CAAA,EAAG;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,GAAG,CAAA;AAC7C,IAAA,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,EACxE;AACF;AAEA,eAAsB,YAAA,CACpB,SACA,OAAA,EAK4B;AAC5B,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,qBAAA,EAAuB;AAAA,IAChD,KAAA,EAAO,SAAS,KAAA,IAAS,GAAA;AAAA,IACzB,MAAA,EAAQ,SAAS,MAAA,IAAU,CAAA;AAAA,IAC3B,eAAA,EAAiB,SAAS,eAAA,IAAmB;AAAA,GAC9C,CAAA;AACD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,IACrC,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA,KAAU,WAAW,IAAA,CAAK,KAAA,GAAQ,KAAK,QAAA,CAAS,MAAA;AAAA,IACnE,SAAS,OAAO,IAAA,CAAK,OAAA,KAAY,SAAA,GAAY,KAAK,OAAA,GAAU;AAAA,GAC9D;AACF;AAEA,eAAsB,cAAA,CAAe,SAAoB,SAAA,EAAqC;AAC5F,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,0BAA0B,EAAE,EAAA,EAAI,WAAW,CAAA;AACtE,EAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAC/B;AAEA,eAAsB,gBAAA,CAAiB,SAAoB,SAAA,EAAqC;AAC9F,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,4BAA4B,EAAE,EAAA,EAAI,WAAW,CAAA;AACxE,EAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAC/B;AAEA,eAAsB,UAAA,CAAW,SAAoB,SAAA,EAAqC;AACxF,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,sBAAsB,EAAE,EAAA,EAAI,WAAW,CAAA;AAClE,EAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAC/B;AAEA,eAAsB,YAAA,CAAa,SAAoB,SAAA,EAAqC;AAC1F,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,wBAAwB,EAAE,EAAA,EAAI,WAAW,CAAA;AACpE,EAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAC/B;AAEA,eAAsB,aAAA,CAAc,SAAoB,SAAA,EAAkC;AACxF,EAAA,MAAM,OAAA,CAAQ,uBAAA,EAAyB,EAAE,EAAA,EAAI,WAAW,CAAA;AAC1D;AAEA,eAAsB,aAAA,CAAc,OAAA,EAAoB,SAAA,EAAmB,KAAA,EAAiC;AAC1G,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,4BAAA,EAA8B,EAAE,EAAA,EAAI,SAAA,EAAW,OAAO,CAAA;AACjF,EAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAC/B;AAEA,eAAsB,sBAAA,CAAuB,SAAoB,SAAA,EAAqC;AACpG,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,kCAAkC,EAAE,EAAA,EAAI,WAAW,CAAA;AAC9E,EAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAC/B;AAEA,eAAsB,mBAAA,CAAoB,SAAoB,SAAA,EAI3D;AACD,EAAA,OAAO,OAAA,CAAQ,sBAAA,EAAwB,EAAE,EAAA,EAAI,WAAW,CAAA;AAC1D;AAEA,eAAsB,qBAAA,CAAsB,SAAoB,SAAA,EAA8C;AAC5G,EAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,0BAA0B,EAAE,EAAA,EAAI,WAAW,CAAA;AACxE,EAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,MAAA,CAAO,cAAc,iBAAA,EAAmB;AAC1C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,IAAa,CAAC,OAAO,KAAA,EAAO;AACtC,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,IAAA;AAAA,IACV,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,WAAW,MAAA,CAAO;AAAA,GACpB;AACF;AAEA,eAAsB,UAAU,OAAA,EAA4C;AAC1E,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AACjD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IAC/B,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,IAClB,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,IAC7B,QAAA,EAAU,KAAK,QAAA,IAAY,EAAA;AAAA,IAC3B,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,GAC7B,CAAE,CAAA;AACJ;AAEA,eAAsB,eAAA,CACpB,SACA,OAAA,EAUC;AACD,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,wBAAA,EAA0B;AAAA,IACnD,KAAA,EAAO,SAAS,KAAA,IAAS,EAAA;AAAA,IACzB,MAAA,EAAQ,SAAS,MAAA,IAAU,CAAA;AAAA,IAC3B,eAAA,EAAiB,SAAS,eAAA,IAAmB,KAAA;AAAA,IAC7C,MAAA,EAAQ,SAAS,MAAA,IAAU;AAAA,GAC5B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,IACrC,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA,KAAU,WAAW,IAAA,CAAK,KAAA,GAAQ,KAAK,QAAA,CAAS,MAAA;AAAA,IACnE,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,OAAO;AAAA,GAC/B;AACF;AAEA,eAAsB,kBAAA,CAAmB,SAAoB,SAAA,EAA6C;AACxG,EAAA,MAAM,OAAO,MAAM,OAAA,CAAQ,6BAAA,EAA+B,EAAE,WAAW,CAAA;AACvE,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IACnC,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,MACzB,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MACvB,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAAA,MACtB,QAAA,EAAU,OAAO,IAAA,CAAK;AAAA,KACxB;AAAA,IACA,OAAO,MAAM;AACX,MAAA,MAAM,cAAA,GAAA,CAAkB,MAAA,CAAO,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY;AACvD,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAAC,QAAA,OAAO,OAAA;AAAA,MAAQ;AAChD,MAAA,IAAI,mBAAmB,QAAA,EAAU;AAAC,QAAA,OAAO,QAAA;AAAA,MAAS;AAClD,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,GAAG;AAAA,IACH,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,WAAW,MAAA,CAAO;AAAA,GACpB,CAAE,CAAA;AACJ;AAEA,eAAsB,gBAAA,CACpB,OAAA,EACA,SAAA,EACA,MAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,QAAQ,4BAAA,EAA8B;AAAA,IAC1C,SAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,EAAM,KAAK,WAAA;AAAY,GACxB,CAAA;AACH;AAEA,eAAsB,uBAAA,CACpB,OAAA,EACA,SAAA,EACA,MAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,QAAQ,mCAAA,EAAqC;AAAA,IACjD,SAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,EAAM,KAAK,WAAA;AAAY,GACxB,CAAA;AACH;AAEA,eAAsB,mBAAA,CAAoB,OAAA,EAAoB,SAAA,EAAmB,MAAA,EAA+B;AAC9G,EAAA,MAAM,OAAA,CAAQ,+BAAA,EAAiC,EAAE,SAAA,EAAW,QAAQ,CAAA;AACtE;;;AC7PA,UAAU,iBAAiB,KAAA,EAAqD;AAC9E,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAEpC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAC5B,MAAA,IAAI,YAAY,QAAA,EAAU;AAAC,QAAA;AAAA,MAAS;AAEpC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,MAAM,MAAA;AAAA,MACR,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,kBAAA,EAAoB,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AAEvD,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKA,gBAAuB,eACrB,MAAA,EACyC;AACzC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AAAC,QAAA;AAAA,MAAM;AAEjB,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAClC,MAAA,MAAA,GAAS,MAAA,CAAO,KAAI,IAAK,EAAA;AAEzB,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AAAC,UAAA;AAAA,QAAS;AAC7B,QAAA,OAAO,gBAAA,CAAiB,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,MAAK,EAAG;AACjB,MAAA,OAAO,gBAAA,CAAiB,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAKA,IAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAShD,gBAAuB,kBACrB,MAAA,EAC4C;AAC5C,EAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,EAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAChD,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,KAAA;AAGf,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,UAAU,SAAA,GAAY,OAAA,CAAA;AAElE,IAAA,MAAM,UAAA,GAA0B;AAAA,MAC9B,GAAG,MAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,YAAY,CAAA,EAAG;AACpC,MAAA,eAAA,GAAkB,IAAA;AAAA,IACpB;AAEA,IAAA,MAAM,UAAA;AAAA,EACR;AAGA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,EACvB;AACF;AAQA,gBAAuB,wBACrB,MAAA,EAC4C;AAC5C,EAAA,WAAA,MAAiB,KAAA,IAAS,iBAAA,CAAkB,MAAM,CAAA,EAAG;AACnD,IAAA,MAAM,KAAA,GAAQ,cAAc,KAAK,CAAA;AACjC,IAAA,IAAI,KAAA,EAAO;AAAC,MAAA,MAAM,KAAA;AAAA,IAAM;AAAA,EAC1B;AACF;AAMA,SAAS,cAAc,KAAA,EAAwC;AAC7D,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,KAAA,CAAM,WAAW,EAAA,EAAG;AAAA,IACzD,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,KAAA,CAAM,WAAW,EAAA,EAAG;AAAA,IAC1D,KAAK,YAAA;AACH,MAAA,OAAO,KAAA,CAAM,OAAO,EAAE,IAAA,EAAM,cAAc,IAAA,EAAM,KAAA,CAAM,MAAK,GAAI,IAAA;AAAA,IACjE,KAAK,UAAA;AACH,MAAA,OAAO,KAAA,CAAM,OAAO,EAAE,IAAA,EAAM,YAAY,IAAA,EAAM,KAAA,CAAM,MAAK,GAAI,IAAA;AAAA,IAC/D,KAAK,OAAA;AACH,MAAA,OAAO,KAAA,CAAM,QAAQ,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,KAAA,CAAM,OAAM,GAAI,IAAA;AAAA,IAC/D,KAAK,cAAA;AACH,MAAA,OAAO,KAAA,CAAM,YAAY,EAAE,IAAA,EAAM,gBAAgB,SAAA,EAAW,KAAA,CAAM,WAAU,GAAI,IAAA;AAAA,IAClF,KAAK,WAAA;AACH,MAAA,OAAO,KAAA,CAAM,SAAA,GACT,EAAE,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU,GAC5E,IAAA;AAAA,IACN,KAAK,gBAAA;AAGH,MAAA,OAAO,EAAE,IAAA,EAAM,gBAAA,EAAkB,GAAA,EAAK,KAAA,CAAM,gBAAgB,CAAA,EAAE;AAAA,IAChE,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,MAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,SAAA,EAAW,YAAA,EAAc,MAAM,YAAA,EAAa;AAAA,IACtF,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,SAAS,eAAA,EAAgB;AAAA,IAChE;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;;;AC9JO,IAAM,kBAAA,GAAqB;AAAA,EAChC,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF;AASO,IAAM,2BAAA,GAA8B;AAAA,EACzC,MAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF;AAUO,SAAS,gBAAgB,IAAA,EAA+C;AAC7E,EAAA,OAAQ,2BAAA,CAAkD,SAAS,IAAI,CAAA;AACzE;;;ACCO,SAAS,uBACd,IAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,KAAK,cAAA,IAAkB,GAAA;AACvC,EAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,EAAA,GAAK,IAAI,WAAA,CAAY,IAAA,CAAK,GAAA,EAAK;AAAA,MACnC,eAAA,EAAiB,KAAK,eAAA,IAAmB;AAAA,KAC1C,CAAA;AACD,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAgB;AAC9B,MAAA,IAAI,OAAA,EAAS;AAAC,QAAA;AAAA,MAAO;AACrB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAA,CAAO,GAAG,CAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAI,IAAA,CAAK,OAAO,OAAA,EAAS;AACvB,QAAA,MAAA,EAAO;AACP,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,iBAAiB,OAAA,EAAS,MAAM,QAAO,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IACtE;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAiB,CAAC,GAAA,KAAsB;AACvD,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,MAC9B,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,EAAE,aAAA,EAAe,IAAA,EAAM,KAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAE;AAAA,MACxD;AACA,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,SAAA,CAAU,MAAM,MAAM,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,gBAAA,CAAiB,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAkB,CAAA;AAAA,IAC1D;AAEA,IAAA,EAAA,CAAG,OAAA,GAAU,CAAC,GAAA,KAAQ;AACpB,MAAA,IAAA,CAAK,UAAU,GAAG,CAAA;AAClB,MAAA,IAAI,OAAA,GAAU,KAAK,CAAC,QAAA,IAAY,KAAK,GAAA,EAAI,GAAI,YAAY,OAAA,EAAS;AAChE,QAAA,MAAM,GAAA,GAAM,KAAK,cAAA,GACb,IAAA,CAAK,eAAe,GAAG,CAAA,GACvB,IAAI,KAAA,CAAM,kDAAkD,CAAA;AAChE,QAAA,MAAA,CAAO,GAAG,CAAA;AAAA,MACZ;AAAA,IAEF,CAAA;AAAA,EACF,CAAC,CAAA;AACH;;;AC3GA,cAAA,EAAA;AAyBA,IAAM,iBAAA,GAA4C;AAAA,EAChD,YAAA,EAAc,KAAA;AAAA,EACd,WAAA,EAAa,KAAA;AAAA,EACb,WAAA,EAAa,KAAA;AAAA,EACb,iBAAA,EAAmB;AACrB,CAAA;AAEA,IAAM,8BAA8B,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAC,CAAA;AAM1E,SAAS,wBAAwB,KAAA,EAAuC;AACtE,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,IAAA,MAAM,KAAA,GACJ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IACb,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IACb,KAAA,CAAM,CAAC,CAAA,KAAM,MACb,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IACb,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IACb,MAAM,CAAC,CAAA,KAAM,EAAA,IACb,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IACb,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA;AACf,IAAA,IAAI,KAAA,EAAO;AAAC,MAAA,OAAO,WAAA;AAAA,IAAY;AAAA,EACjC;AAEA,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA;AACtE,IAAA,IAAI,MAAA,EAAQ;AAAC,MAAA,OAAO,YAAA;AAAA,IAAa;AAAA,EACnC;AAEA,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,IAAA,MAAM,KAAA,GACJ,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IACb,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IACb,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IACb,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,KACZ,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,CAAA,IACnC,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA;AACf,IAAA,IAAI,KAAA,EAAO;AAAC,MAAA,OAAO,WAAA;AAAA,IAAY;AAAA,EACjC;AAEA,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,IAAA,MAAM,KAAA,GACJ,KAAA,CAAM,CAAC,CAAA,KAAM,MAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAM,CAAC,CAAA,KAAM,EAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA;AAC9E,IAAA,IAAI,KAAA,EAAO;AAAC,MAAA,OAAO,iBAAA;AAAA,IAAkB;AAAA,EACvC;AAEA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,wBAAA,CAAyB,UAAkB,QAAA,EAA0B;AAC5E,EAAA,MAAM,WAAA,GAAc,kBAAkB,QAAQ,CAAA;AAC9C,EAAA,IAAI,CAAC,WAAA,EAAa;AAAC,IAAA,OAAO,QAAA;AAAA,EAAS;AAEnC,EAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,EAAY;AACnC,EAAA,IAAI,QAAA,KAAa,iBAAiB,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI;AACpF,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAA,EAAI,WAAW,EAAE,CAAA,EAAG;AACrC,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACzC,EAAA,MAAM,WAAW,QAAA,GAAW,CAAA,GAAI,SAAS,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,QAAA;AAC9D,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AACnC;AAMA,SAAS,sBAAA,CACP,OACA,OAAA,EACM;AACN,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,MAAA,EAAQ,gBAAA;AAAA,IACR,KAAA;AAAA,IACA,GAAG;AAAA,GACL;AAEA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,IAAA,CAAK,wBAAwB,OAAO,CAAA;AAC5C,IAAA;AAAA,EACF;AAEF;AAMA,eAAe,uBAAA,CAAwB,YAAwB,IAAA,EAA2B;AACxF,EAAA,MAAM,cAAA,GAAiB,IAAI,UAAA,CAAW,MAAM,IAAA,CAAK,MAAM,CAAA,EAAG,EAAE,CAAA,CAAE,WAAA,EAAa,CAAA;AAC3E,EAAA,MAAM,gBAAA,GAAmB,wBAAwB,cAAc,CAAA;AAC/D,EAAA,MAAM,gBAAA,GAAA,CAAoB,WAAW,QAAA,IAAY,IAAA,CAAK,QAAQ,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY;AAErF,EAAA,IAAI,gBAAA,GAAmB,oBAAoB,gBAAA,IAAoB,0BAAA;AAC/D,EAAA,IAAI,qBAAA,GAAwB,KAAA;AAE5B,EAAA,IAAI,gBAAA,IAAoB,gBAAA,IAAoB,gBAAA,KAAqB,gBAAA,EAAkB;AACjF,IAAA,MAAM,gBACJ,2BAAA,CAA4B,GAAA,CAAI,gBAAgB,CAAA,IAChD,2BAAA,CAA4B,IAAI,gBAAgB,CAAA;AAElD,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,eAAe,UAAA,CAAW,QAAQ,CAAA,2BAAA,EAA8B,gBAAgB,gBAAgB,gBAAgB,CAAA,CAAA;AAAA,OAClH;AAAA,IACF;AAEA,IAAA,gBAAA,GAAmB,gBAAA;AACnB,IAAA,qBAAA,GAAwB,IAAA;AAAA,EAC1B,CAAA,MAAA,IAAW,gBAAA,IAAoB,CAAC,gBAAA,EAAkB;AAChD,IAAA,gBAAA,GAAmB,gBAAA;AAAA,EACrB;AAEA,EAAA,MAAM,cAAA,GAAiB,wBAAA,CAAyB,UAAA,CAAW,QAAA,EAAU,gBAAgB,CAAA;AACrF,EAAA,MAAM,aAAa,IAAI,IAAA,CAAK,CAAC,IAAI,GAAG,cAAA,EAAgB;AAAA,IAClD,IAAA,EAAM,gBAAA;AAAA,IACN,cAAc,IAAA,CAAK;AAAA,GACpB,CAAA;AAED,EAAA,sBAAA,CAAuB,2BAAA,EAA6B;AAAA,IAClD,eAAe,UAAA,CAAW,SAAA;AAAA,IAC1B,UAAU,UAAA,CAAW,QAAA;AAAA,IACrB,oBAAoB,UAAA,CAAW,IAAA;AAAA,IAC/B,kBAAkB,gBAAA,IAAoB,MAAA;AAAA,IACtC,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,qBAAA;AAAA,IACA,WAAW,UAAA,CAAW;AAAA,GACvB,CAAA;AAED,EAAA,OAAO,UAAA;AACT;AAMA,eAAe,iBAAiB,UAAA,EAAuC;AACrE,EAAA,IAAI,WAAW,UAAA,IAAc,UAAA,CAAW,WAAW,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,UAAA,CAAW,UAAA,CAAW,IAAA,EAAK;AAC9C,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,GACzC,UAAA,GACA,CAAA,KAAA,EAAQ,UAAA,CAAW,QAAA,IAAY,0BAA0B,CAAA,QAAA,EAAW,UAAU,CAAA,CAAA;AAClF,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,QAAA,KAAa,QAAA,CAAS,IAAA,EAAM,CAAA;AACpE,MAAA,OAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,WAAW,QAAA,EAAU;AAAA,QAC3C,IAAA,EAAM,UAAA,CAAW,QAAA,IAAY,IAAA,CAAK,IAAA,IAAQ;AAAA,OAC3C,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,sBAAA;AACrD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,WAAW,QAAQ,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAAA,IACjF;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAI,GAAA,CAAI,UAAA,CAAW,KAAK,MAAA,CAAO,QAAA,EAAU,UAAU,mBAAmB,CAAA;AAC/E,MAAA,IAAI,CAAC,CAAC,OAAA,EAAS,QAAQ,EAAE,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAClD,QAAA,MAAM,IAAI,MAAM,CAAA,YAAA,EAAe,UAAA,CAAW,QAAQ,CAAA,+BAAA,EAAkC,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAAA,MACvG;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,eAAe,KAAA,IAAS,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,EAAG;AAAC,QAAA,MAAM,GAAA;AAAA,MAAI;AAC3E,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,UAAA,CAAW,QAAQ,CAAA,8BAAA,CAAgC,CAAA;AAAA,IACpF;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,YAAA,EAAe,UAAA,CAAW,QAAQ,CAAA,6BAAA,EAAgC,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACrG;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,WAAW,QAAA,EAAU;AAAA,MAC3C,IAAA,EAAM,UAAA,CAAW,QAAA,IAAY,IAAA,CAAK,IAAA,IAAQ;AAAA,KAC3C,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,UAAA,CAAW,QAAQ,CAAA,wBAAA,CAA0B,CAAA;AAC9E;AAMA,eAAsB,UAAA,CACpB,IAAA,EACA,OAAA,EACA,cAAA,EACA,mBAAA,EAC6B;AAC7B,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,EAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAE5B,EAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI;AAAA,IAC1D,MAAA,EAAQ,MAAA;AAAA,IACR,SAAS,mBAAA,EAAoB;AAAA,IAC7B,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,IAAI,OAAA,GAAmB,IAAA;AACvB,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,SAAS,IAAA,EAAK;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AAEA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,YAAA,GAAec,SAAAA,CAAS,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,GAC/D,OAAA,CAAQ,KAAA,GACR,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAA;AAC1C,IAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,CAACA,SAAAA,CAAS,OAAO,CAAA,IAAK,OAAO,QAAQ,EAAA,KAAO,QAAA,IAAY,OAAA,CAAQ,EAAA,IAAM,CAAA,EAAG;AAC3E,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,KAAK,OAAO,OAAA,CAAQ,GAAA,KAAQ,QAAA,GAAW,QAAQ,GAAA,GAAM,EAAA;AAAA,IACrD,MAAM,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,QAAQ,IAAA,GAAO,EAAA;AAAA,IACxD,MAAM,OAAO,OAAA,CAAQ,SAAS,QAAA,GAAW,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA;AAAA,IAC7D,UAAU,OAAO,OAAA,CAAQ,aAAa,QAAA,GAAW,OAAA,CAAQ,WAAW,IAAA,CAAK,IAAA;AAAA,IACzE,IAAA,EAAM,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK;AAAA,GAChG;AACF;AAMO,SAAS,uBAAuB,OAAA,EAA4D;AACjG,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AACpC,IAAA,IAAI,OAAO,MAAA,CAAO,EAAA,KAAO,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,IAAK,MAAA,CAAO,EAAA,IAAM,CAAA,EAAG;AAClF,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gDAAA,EAAmD,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5E;AACA,IAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,EAAA,EAAG;AAAA,EAC/B,CAAC,CAAA;AACH;AAMA,eAAsB,sBAAA,CACpB,UAAA,EACA,OAAA,EACA,YAAA,EAC6B;AAC7B,EAAA,IAAI,OAAO,UAAA,CAAW,QAAA,KAAa,QAAA,IAAY,UAAA,CAAW,WAAW,CAAA,EAAG;AACtE,IAAA,sBAAA,CAAuB,2BAAA,EAA6B;AAAA,MAClD,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,eAAe,UAAA,CAAW,SAAA;AAAA,MAC1B,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,cAAA,EAAgB;AAAA,KACjB,CAAA;AACD,IAAA,OAAO;AAAA,MACL,IAAI,UAAA,CAAW,QAAA;AAAA,MACf,GAAA,EAAK,WAAW,GAAA,IAAO,EAAA;AAAA,MACvB,IAAA,EAAM,EAAA;AAAA,MACN,MAAM,UAAA,CAAW,QAAA;AAAA,MACjB,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,MAAM,UAAA,CAAW;AAAA,KACnB;AAAA,EACF;AAEA,EAAA,sBAAA,CAAuB,yBAAA,EAA2B;AAAA,IAChD,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,eAAe,UAAA,CAAW,SAAA;AAAA,IAC1B,UAAU,UAAA,CAAW,QAAA;AAAA,IACrB,aAAA,EAAe,QAAQ,UAAA,CAAW,UAAA,IAAc,WAAW,UAAA,CAAW,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAAA,IACvF,MAAA,EAAQ,OAAA,CAAQ,UAAA,CAAW,GAAG;AAAA,GAC/B,CAAA;AAED,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAiB,UAAU,CAAA;AACjD,IAAA,IAAA,GAAO,MAAM,uBAAA,CAAwB,UAAA,EAAY,OAAO,CAAA;AACxD,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,EAC7B,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4CAAA;AACrD,IAAA,sBAAA,CAAuB,wBAAA,EAA0B;AAAA,MAC/C,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,eAAe,UAAA,CAAW,SAAA;AAAA,MAC1B,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,EACzB;AAEA,EAAA,sBAAA,CAAuB,yBAAA,EAA2B;AAAA,IAChD,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,eAAe,UAAA,CAAW,SAAA;AAAA,IAC1B,UAAU,IAAA,CAAK,IAAA;AAAA,IACf,UAAU,IAAA,CAAK,IAAA;AAAA,IACf,WAAW,IAAA,CAAK;AAAA,GACjB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAEtC,IAAA,UAAA,CAAW,WAAW,MAAA,CAAO,EAAA;AAC7B,IAAA,UAAA,CAAW,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,IAAA;AAC9C,IAAA,UAAA,CAAW,QAAA,GAAW,MAAA,CAAO,IAAA,IAAQ,IAAA,CAAK,IAAA;AAC1C,IAAA,UAAA,CAAW,SAAA,GAAY,MAAA,CAAO,IAAA,IAAQ,IAAA,CAAK,IAAA;AAC3C,IAAA,sBAAA,CAAuB,2BAAA,EAA6B;AAAA,MAClD,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,eAAe,UAAA,CAAW,SAAA;AAAA,MAC1B,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,UAAU,MAAA,CAAO,EAAA;AAAA,MACjB,cAAA,EAAgB;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,sBAAA;AACrD,IAAA,sBAAA,CAAuB,wBAAA,EAA0B;AAAA,MAC/C,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,eAAe,UAAA,CAAW,SAAA;AAAA,MAC1B,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,WAAW,QAAQ,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAAA,EACjF;AACF;;;AC9UO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAE/C,WAAA,CAAY,SAAiB,KAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;AAuDA,SAAS,iBAAA,GAA4B;AACnC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,eAAe,UAAA,EAAY;AAC5E,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC3B;AAGA,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AAAA,EAC3C;AACA,EAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,EAAA,GAAQ,EAAA;AAC/B,EAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,EAAA,GAAQ,GAAA;AAC/B,EAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC7E,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAC1G;AAMA,gBAAuB,WAAA,CACrB,MACA,SAAA,EACA,OAAA,EACA,cAA4B,EAAC,EAC7B,QACA,OAAA,EAC6B;AAE7B,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAG5C,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,eAAA,GAAkB,MAAM;AAAE,MAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,IAAG,CAAA;AACnD,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,KAAK,cAAc,CAAA,CAAA;AAEjD,EAAA,IAAI,mBAAA;AACJ,EAAA,IAAI,kBAAA,GAAqB,KAAA;AACzB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC5B,WAAA,CAAY,GAAA;AAAA,QAAI,CAAC,YAAY,eAAA,KAC3B,sBAAA;AAAA,UACE,UAAA;AAAA,UACA,EAAE,WAAW,eAAA,EAAgB;AAAA,UAC7B,IAAA,CAAK;AAAA;AACP;AACF,KACF;AACA,IAAA,MAAM,iBAAA,GAAoB,uBAAuB,OAAO,CAAA;AACxD,IAAA,IAAA,CAAK,uBAAuB,6BAAA,EAA+B;AAAA,MACzD,SAAA;AAAA,MACA,iBAAiB,iBAAA,CAAkB;AAAA,KACpC,CAAA;AAMD,IAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,iBAAA,EAAkB;AAC1D,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,SAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,SAAS,SAAA,IAAa,KAAA;AAAA,MACjC,sBAAsB,OAAA,EAAS,oBAAA;AAAA,MAC/B,WAAA,EAAa,iBAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,MAAA,OAAA,CAAQ,kBAAkB,OAAA,CAAQ,eAAA;AAAA,IACpC;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,QAAQ,OAAA,CAAQ,KAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,sBAAA,IAA0B,CAAA;AACjD,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,mBAAA,GAAsB,WAAW,MAAM;AACrC,QAAA,kBAAA,GAAqB,IAAA;AACrB,QAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,MACxB,GAAG,SAAS,CAAA;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAK,aAAA,EAAc;AAAA,MAC5B,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,MAC5B,QAAQ,eAAA,CAAgB;AAAA,KACzB,CAAA;AACD,IAAA,IAAI,wBAAwB,KAAA,CAAA,EAAW;AACrC,MAAA,YAAA,CAAa,mBAAmB,CAAA;AAChC,MAAA,mBAAA,GAAsB,KAAA,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,IACzC;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AAEvC,IAAA,WAAA,MAAiB,KAAA,IAAS,iBAAA,CAAkB,MAAM,CAAA,EAAG;AACnD,MAAA,MAAM,KAAA;AAEN,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,OAAA,EAAS;AACnD,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAO7B,QAAA,IAAI,kBAAA,EAAoB;AACtB,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,CAAA,+BAAA,EAAkC,IAAA,CAAK,sBAAsB,CAAA,EAAA;AAAA,WACtE;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,GAAA;AAAA,QACR;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,OAAO,GAAA,CAAI;AAAA,SACb;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,IAAI,wBAAwB,MAAA,EAAW;AACrC,MAAA,YAAA,CAAa,mBAAmB,CAAA;AAAA,IAClC;AACA,IAAA,IAAI,UAAU,eAAA,EAAiB;AAC7B,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,eAAe,CAAA;AAAA,IACrD;AAAA,EACF;AACF;AAMA,SAAS,cAAA,CACP,MACA,IAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,OAAO,EAAE,CAAA;AACxD,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,UAAU,GAAG,IAAI,CAAA,CAAA;AACpC;AAEA,IAAM,8BAAA,GAAiC,GAAA;AAEvC,eAAsB,UAAA,CACpB,MACA,SAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,8BAAA;AACpC,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAChE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,IAAA,EAAM,OAAO,CAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAS;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAK,aAAA,EAAc;AAAA,MAC5B,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAW,CAAA;AAAA,MAClC,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,6BAAA,EAA+B,QAAA,CAAS,MAAM,CAAA;AAAA,IAC7D;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,MAAA,OAAA,CAAQ,KAAK,+BAA+B,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,SAAS,CAAA;AAAA,EACxB;AACF;AAMA,IAAM,gCAAA,GAAmC,GAAA;AAOzC,eAAsB,eAAA,CACpB,MACA,SAAA,EAC8B;AAC9B,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,gCAAA;AACpC,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAChE,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,cAAA,CAAe,IAAA,EAAM,qBAAqB,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAE,CAAA;AACrF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,KAAK,aAAA,EAAc;AAAA,MAC5B,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,+BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,GAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,SAAS,CAAA;AAAA,EACxB;AACF;AAEA,eAAsB,YAAA,CACpB,IAAA,EACA,SAAA,EACA,KAAA,EACA,SACA,MAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAM,cAAA,CAAe,IAAA,EAAM,SAAS,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,IAAI,SAAA;AACJ,EAAA,MAAM,YAAY,IAAA,CAAK,gBAAA;AACvB,EAAA,IAAI,SAAA,IAAa,IAAA,IAAQ,SAAA,GAAY,CAAA,EAAG;AACtC,IAAA,SAAA,GAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,OAAO,CAAA;AAAA,EAC3D;AACA,EAAA,IAAI;AACF,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,SAAA,EAAW,OAAO,CAAA;AAAA,MACzC,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,cAAc,KAAA,CAAA,EAAW;AAC3B,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,SAAA,GAAY,KAAA,CAAA;AAAA,IACd;AACA,IAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AACA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,IAAA,WAAA,MAAiB,KAAA,IAAS,iBAAA,CAAkB,MAAM,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,OAAA,EAAS;AACnD,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AACF;AAiCO,SAAS,kBAAA,CACd,IAAA,EACA,SAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,SAAS,CAAA;AAC3C,EAAA,MAAM,KAAK,IAAI,eAAA,CAAgB,EAAE,SAAA,EAAW,OAAO,CAAA;AACnD,EAAA,MAAM,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,UAAU,CAAA,CAAA;AASpC,EAAA,MAAM,aAAa,OAAA,CAAQ,WAAA,GACvB,CAAA,EAAG,GAAG,IAAI,IAAI,eAAA,CAAgB,EAAE,WAAA,EAAa,QAAQ,WAAA,EAAa,CAAA,CAAE,QAAA,EAAU,CAAA,CAAA,GAC9E,GAAA;AAKJ,EAAA,MAAM,gBAAA,GAAmB,IAAI,eAAA,EAAgB;AAC7C,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS;AAC1B,MAAA,gBAAA,CAAiB,KAAA,EAAM;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,OAAO,gBAAA,CAAiB,OAAA,EAAS,MAAM,gBAAA,CAAiB,OAAM,EAAG;AAAA,QACvE,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,sBAAA,CAAuB;AAAA,IAC5B,GAAA,EAAK,UAAA;AAAA,IACL,MAAA,EAAQ,kBAAA;AAAA,IACR,eAAA,EAAiB,IAAA;AAAA,IACjB,QAAQ,gBAAA,CAAiB,MAAA;AAAA,IACzB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,cAAA,EAAgB,CAAC,GAAA,KACf,IAAI,qBAAA;AAAA,MACF,kDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACF,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KAAS;AACzB,MAAA,IACE,OAAO,IAAA,KAAS,QAAA,IAChB,IAAA,KAAS,IAAA,IACR,KAAqC,aAAA,EACtC;AAIA,QAAA,OAAA,CAAQ,OAAA,CAAQ;AAAA,UACd,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,CAAA,uBAAA,EAA2B,IAAA,CAAyB,GAAG,CAAA;AAAA,SAC/D,CAAA;AACD,QAAA;AAAA,MACF;AAIA,MAAA,MAAM,MAAA,GAAS,IAAA;AACf,MAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,QAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AAAA,MAChB;AACA,MAAA,OAAA,CAAQ,QAAQ,MAAqB,CAAA;AACrC,MAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,IAAK,eAAA,CAAgB,OAAO,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG;AACjE,QAAA,gBAAA,CAAiB,KAAA,EAAM;AAAA,MACzB;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAsBO,SAAS,mBAAA,CACd,MACA,OAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAM,cAAA,CAAe,IAAA,EAAM,cAAc,CAAA;AAC/C,EAAA,OAAO,sBAAA,CAAuB;AAAA,IAC5B,GAAA;AAAA,IACA,MAAA,EAAQ,CAAC,UAAA,EAAY,QAAQ,CAAA;AAAA,IAC7B,eAAA,EAAiB,IAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KAAS;AACzB,MAAA,IACE,OAAO,IAAA,KAAS,QAAA,IAChB,IAAA,KAAS,IAAA,IACR,KAAqC,aAAA,EACtC;AAGA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,OAAA,CAAQ,QAAQ,EAAE,KAAA,EAAO,IAAA,EAAoC,GAAG,MAAM,CAAA;AAAA,IACxE;AAAA,GACD,CAAA;AACH;AAMA,eAAsB,qBAAA,CACpB,OAAA,EACA,SAAA,EACA,UAAA,EACA,OAAA,EACmC;AACnC,EAAA,IAAI;AAEF,IAAA,MAAM,cAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACvD,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,WAAA,CAAY,GAAG,IAAI,UAAA,CAAW,UAAA;AAAA,MAChC,CAAA,MAAA,IAAW,UAAA,CAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACxC,QAAA,WAAA,CAAY,GAAG,CAAA,GAAI,UAAA,CAAW,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,MACjD;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,wBAAA,EAA0B;AAAA,MACrD,SAAA;AAAA,MACA,YAAA,EAAc,UAAA;AAAA,MACd,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,0BAA0B,MAAM;AAAA,KACxC;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,eAAA,EAAgB;AAAA,EACvF;AACF;AAEA,eAAsB,qBAAA,CACpB,SACA,SAAA,EACmC;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,wBAAA,EAA0B,EAAE,WAAW,CAAA;AACpE,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,yBAAA,CAA0B,MAAM,CAAA,EAAE;AAAA,EAClE,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,eAAA,EAAgB;AAAA,EACvF;AACF;AAEA,SAAS,oBAAoB,KAAA,EAAuD;AAClF,EAAA,OAAO,KAAA,KAAU,iBAAA,IAAqB,KAAA,KAAU,iBAAA,IAAqB,KAAA,KAAU,iBAAA;AACjF;AAEA,SAAS,0BAA0B,KAAA,EAMd;AACnB,EAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACnB,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,CAAC,mBAAA,CAAoB,KAAA,CAAM,SAAS,CAAA,EAAG;AACzC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,SAAA,IAAa,CAAC,MAAM,KAAA,EAAO;AACpC,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,IAAA;AAAA,IACV,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,WAAW,KAAA,CAAM;AAAA,GACnB;AACF;;;AChlBA,eAAsB,qBAAA,CACpB,OAAA,EACA,SAAA,EACA,OAAA,EACmF;AACnF,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,EAAA;AAChC,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,0BAAA,EAA4B;AAAA,IACrD,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,SAAA,GAAA,CAAa,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,IAAI,CAAC,QAAA,KAAa,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AACtF,EAAA,MAAM,OAAA,GACJ,OAAO,IAAA,CAAK,OAAA,KAAY,YACpB,IAAA,CAAK,OAAA,GACL,UAAU,MAAA,IAAU,KAAA;AAC1B,EAAA,MAAM,UAAA,GACJ,OAAO,IAAA,CAAK,UAAA,KAAe,WACvB,IAAA,CAAK,UAAA,GACL,SAAS,SAAA,CAAU,MAAA;AAEzB,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAsB,sBAAA,CACpB,OAAA,EACA,SAAA,EACA,KAAA,EACA,YAAA,EAC2C;AAC3C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC/C,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AAAA,EACzB;AAEA,EAAA,iBAAA,CAAkB,CAAA,EAAG,KAAA,CAAM,MAAA,EAAQ,EAAE,CAAA;AACrC,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS,sBAAA,CAAuB,IAAI,CAAC,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAAa,IAAI,CAAC,CAAC,CAAA;AAEzE,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,gCAAA,EAAkC;AAAA,IAC3D,SAAA;AAAA,IACA,WAAA,EAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MACpC,EAAA,EAAI,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,MACpB,UAAU,MAAA,CAAO,IAAA;AAAA,MACjB,UAAU,MAAA,CAAO,EAAA;AAAA,MACjB,QAAA,EAAU,OAAO,QAAA,IAAY,0BAAA;AAAA,MAC7B,WAAW,MAAA,CAAO,IAAA;AAAA,MAClB,KAAK,MAAA,CAAO;AAAA,KACd,CAAE;AAAA,GACH,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA,EAAA,CAAY,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,IAAI,CAAC,QAAA,KAAa,iBAAA,CAAkB,QAAQ,CAAC;AAAA,GACjF;AACF;AAEA,eAAsB,qBAAA,CACpB,OAAA,EACA,UAAA,EACA,IAAA,EACA,cAAsB,EAAA,EACI;AAC1B,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,wBAAA,EAA0B;AAAA,IACnD,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,iBAAA,CAAkB,KAAK,QAAuB,CAAA;AACvD;AAEA,eAAsB,qBAAA,CACpB,SACA,UAAA,EACe;AACf,EAAA,MAAM,OAAA,CAAQ,wBAAA,EAA0B,EAAE,EAAA,EAAI,YAAY,CAAA;AAC5D;;;ACzDO,IAAM,iBAAN,MAA+C;AAAA,EAKpD,YAAY,MAAA,EAA8B;AAH1C,IAAA,IAAA,CAAQ,eAAA,GAA0C,IAAA;AA2DlD,IAAA,IAAA,CAAQ,YAAA,GAAe,CACrB,MAAA,EACA,MAAA,KAC0C;AAC1C,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,IACpC,CAAA;AAEA,IAAA,IAAA,CAAQ,eAAA,GAAkB,CAAC,IAAA,KAAe;AACxC,MAAA,OAAO,UAAA;AAAA,QACL,IAAA;AAAA,QACA,KAAK,MAAA,CAAO,OAAA;AAAA,QACZ,KAAK,MAAA,CAAO,cAAA;AAAA,QACZ,MAAM,KAAK,mBAAA;AAAoB,OACjC;AAAA,IACF,CAAA;AArEE,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,cAAA,EAAgB,SAAA;AAAA,MAChB,cAAA,EAAgB,cAAA;AAAA,MAChB,GAAG,MAAA;AAAA,MACH,cAAc,OAAO,MAAA,CAAO,YAAA,KAAiB,QAAA,GAAW,OAAO,YAAA,GAAe,IAAA;AAAA,MAC9E,wBAAwB,OAAO,MAAA,CAAO,sBAAA,KAA2B,QAAA,GAC7D,OAAO,sBAAA,GACP;AAAA,KACN;AACA,IAAA,IAAA,CAAK,MAAM,qBAAA,CAAsB;AAAA,MAC/B,QAAA,EAAU,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,WAAW,CAAA,CAAA;AAAA,MAC1D,SAAA,EAAW,KAAK,MAAA,CAAO;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAAC,MAAA,OAAO,EAAA;AAAA,IAAG;AACvC,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,EAEQ,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;AACD,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,IAAI,SAAA,EAAW;AAAC,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,SAAS,CAAA;AAAA,IAAE;AACvD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,oBAAoB,iBAAA,EAAqD;AAC/E,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ;AAAA,MAC1B,GAAG,KAAK,MAAA,CAAO,OAAA;AAAA,MACf,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,IAAI,SAAA,EAAW;AAAC,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,SAAS,CAAA;AAAA,IAAE;AACvD,IAAA,OAAA,CAAQ,OAAO,cAAc,CAAA;AAC7B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,OAAA,CACN,QACA,MAAA,EACuC;AACvC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,CAA8B,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,aAAA,GAAkC;AACtC,IAAA,OAAgB,aAAA,CAAc,KAAK,YAAY,CAAA;AAAA,EACjD;AAAA,EAEA,MAAM,aAAa,EAAA,EAA0C;AAC3D,IAAA,OAAgB,YAAA;AAAA,MACd,EAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,CAAC,SAAA,EAAW,OAAA,KAAY,IAAA,CAAK,qBAAA,CAAsB,WAAW,OAAO;AAAA,KACvE;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,OAAA,EAIY;AAC7B,IAAA,OAAgB,YAAA,CAAa,IAAA,CAAK,YAAA,EAAc,OAAO,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,eAAe,SAAA,EAAqC;AACxD,IAAA,OAAgB,cAAA,CAAe,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,iBAAiB,SAAA,EAAqC;AAC1D,IAAA,OAAgB,gBAAA,CAAiB,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,WAAW,SAAA,EAAqC;AACpD,IAAA,OAAgB,UAAA,CAAW,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,aAAa,SAAA,EAAqC;AACtD,IAAA,OAAgB,YAAA,CAAa,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,cAAc,SAAA,EAAkC;AACpD,IAAA,OAAgB,aAAA,CAAc,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,aAAA,CAAc,SAAA,EAAmB,KAAA,EAAiC;AACtE,IAAA,OAAgB,aAAA,CAAc,IAAA,CAAK,YAAA,EAAc,SAAA,EAAW,KAAK,CAAA;AAAA,EACnE;AAAA,EAEA,MAAM,uBAAuB,SAAA,EAAqC;AAChE,IAAA,OAAgB,sBAAA,CAAuB,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,oBAAoB,SAAA,EAIvB;AACD,IAAA,OAAgB,mBAAA,CAAoB,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,sBAAsB,SAAA,EAA8C;AACxE,IAAA,OAAgB,qBAAA,CAAsB,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,SAAA,GAAoC;AACxC,IAAA,OAAgB,SAAA,CAAU,KAAK,YAAY,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,gBAAgB,OAAA,EASnB;AACD,IAAA,OAAgB,eAAA,CAAgB,IAAA,CAAK,YAAA,EAAc,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,mBAAmB,SAAA,EAA6C;AACpE,IAAA,OAAgB,kBAAA,CAAmB,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,gBAAA,CAAiB,SAAA,EAAmB,MAAA,EAAgB,IAAA,EAA0C;AAClG,IAAA,OAAgB,gBAAA,CAAiB,IAAA,CAAK,YAAA,EAAc,SAAA,EAAW,QAAQ,IAAI,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,uBAAA,CAAwB,SAAA,EAAmB,MAAA,EAAgB,IAAA,EAA0C;AACzG,IAAA,OAAgB,uBAAA,CAAwB,IAAA,CAAK,YAAA,EAAc,SAAA,EAAW,QAAQ,IAAI,CAAA;AAAA,EACpF;AAAA,EAEA,MAAM,mBAAA,CAAoB,SAAA,EAAmB,MAAA,EAA+B;AAC1E,IAAA,OAAgB,mBAAA,CAAoB,IAAA,CAAK,YAAA,EAAc,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,SAAA,EAAkC;AACrD,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,MAAe,UAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,cAAA,EAAgB,KAAK,MAAA,CAAO,cAAA;AAAA,QAC5B,aAAA,EAAe,CAAC,CAAA,KAAM,IAAA,CAAK,cAAc,CAAC;AAAA,OAC5C;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,SAAA,EAAiD;AACrE,IAAA,OAAgB,eAAA;AAAA,MACd;AAAA,QACE,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,cAAA,EAAgB,KAAK,MAAA,CAAO,cAAA;AAAA,QAC5B,aAAA,EAAe,CAAC,CAAA,KAAM,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,QAC1C,SAAA,EAAW,KAAK,MAAA,CAAO;AAAA,OACzB;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CACJ,SAAA,EACA,KAAA,EACA,SACA,MAAA,EACe;AACf,IAAA,MAAe,YAAA;AAAA,MACb;AAAA,QACE,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,cAAA,EAAgB,KAAK,MAAA,CAAO,cAAA;AAAA,QAC5B,aAAA,EAAe,CAAC,CAAA,KAAM,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,QAC1C,gBAAA,EAAkB,KAAK,MAAA,CAAO;AAAA,OAChC;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAA,CACE,SAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,IAAA,OAAgB,kBAAA;AAAA,MACd;AAAA,QACE,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,cAAA,EAAgB,KAAK,MAAA,CAAO;AAAA,OAC9B;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBACE,OAAA,EACe;AACf,IAAA,OAAgB,mBAAA;AAAA,MACd;AAAA,QACE,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,cAAA,EAAgB,KAAK,MAAA,CAAO;AAAA,OAC9B;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAO,YACL,SAAA,EACA,OAAA,EACA,cAA4B,EAAC,EAC7B,QACA,OAAA,EAC6B;AAC7B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAG3C,IAAA,IAAI,eAAA;AACJ,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,eAAA,GAAkB,MAAM;AAAE,QAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,MAAG,CAAA;AACzD,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,KAAK,eAAA,CAAgB,MAAA;AACzC,MAAA,OAAgB,WAAA;AAAA,QACd;AAAA,UACE,SAAS,IAAA,CAAK,YAAA;AAAA,UACd,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,UACrB,cAAA,EAAgB,KAAK,MAAA,CAAO,cAAA;AAAA,UAC5B,YAAA,EAAc,KAAK,MAAA,CAAO,YAAA;AAAA,UAC1B,sBAAA,EAAwB,KAAK,MAAA,CAAO,sBAAA;AAAA,UACpC,aAAA,EAAe,CAAC,UAAA,KAAe,IAAA,CAAK,cAAc,UAAU,CAAA;AAAA,UAC5D,cAAc,IAAA,CAAK,eAAA;AAAA,UACnB,wBAAwB,MAAM;AAAA,UAE9B;AAAA,SACF;AAAA,QACA,SAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,UAAU,eAAA,EAAiB;AAC7B,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,eAAe,CAAA;AAAA,MACrD;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,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,EAEA,MAAM,qBAAA,CACJ,SAAA,EACA,UAAA,EACA,OAAA,EAKC;AACD,IAAA,OAAgB,qBAAA,CAAsB,IAAA,CAAK,YAAA,EAAc,SAAA,EAAW,YAAY,OAAO,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,sBAAsB,SAAA,EAA2F;AACrH,IAAA,OAAgB,qBAAA,CAAsB,IAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAA,CACJ,SAAA,EACA,OAAA,EACmF;AACnF,IAAA,OAAiB,qBAAA,CAAsB,IAAA,CAAK,YAAA,EAAc,SAAA,EAAW,OAAO,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,sBAAA,CACJ,SAAA,EACA,KAAA,EAC2C;AAC3C,IAAA,OAAiB,sBAAA;AAAA,MACf,IAAA,CAAK,YAAA;AAAA,MACL,SAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEA,MAAM,qBAAA,CACJ,UAAA,EACA,IAAA,EACA,cAAsB,EAAA,EACI;AAC1B,IAAA,OAAiB,qBAAA,CAAsB,IAAA,CAAK,YAAA,EAAc,UAAA,EAAY,MAAM,WAAW,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,sBAAsB,UAAA,EAAmC;AAC7D,IAAA,OAAiB,qBAAA,CAAsB,IAAA,CAAK,YAAA,EAAc,UAAU,CAAA;AAAA,EACtE;AAEF;AAKO,SAAS,qBAAqB,MAAA,EAA8C;AACjF,EAAA,OAAO,IAAI,eAAe,MAAM,CAAA;AAClC;;;AC/XO,SAAS,mBAAA,CACd,SACA,OAAA,EACsB;AACtB,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,IAAA,OAAO,CAAC,EAAE,GAAA,EAAK,CAAA,EAAG,SAAS,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,OAAO,CAAA,CAC1B,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAC,CAAC,CAAA,CAC/D,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAEvB,EAAA,MAAM,SAA+B,EAAC;AACtC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,GAAG,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,EAAE,GAAA,EAAK,OAAO,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,IACpD;AACA,IAAA,MAAA,GAAS,GAAA;AAAA,EACX;AACA,EAAA,IAAI,MAAA,GAAS,QAAQ,MAAA,EAAQ;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,MAAA,CAAO,MAAA,EAAQ,SAAS,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,EAAG,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,qBACd,eAAA,EACU;AACV,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,GAAA,GAAM,gBAAgB,oBAAoB,CAAA;AAChD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,SAAS,GAAA,EAAK;AACvB,IAAA,IAAI,OAAO,UAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,SAAS,CAAA,EAAG;AACrE,MAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IAC5B;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT","file":"index.cjs","sourcesContent":["/**\n * IOTA SDK integration context provider\n * Consumes server-side context from window.__APPLET_CONTEXT__ or accepts it as a prop.\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  /**\n   * Explicit context object. When provided, the window global is not read.\n   * Useful for tests, Storybook, or apps that manage their own context.\n   */\n  context?: IotaContextType\n  children: ReactNode\n}\n\nexport function IotaContextProvider({ context, children }: IotaContextProviderProps) {\n  // Prefer explicit prop; fall back to window global\n  const resolved = context ?? (typeof window !== 'undefined' ? window.__APPLET_CONTEXT__ : undefined);\n\n  if (!resolved) {\n    throw new Error('APPLET_CONTEXT not found. Pass a `context` prop or ensure the server injected context into window.__APPLET_CONTEXT__.');\n  }\n\n  return (\n    <IotaContext.Provider value={resolved}>\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 = typeof window !== 'undefined' ? window.__APPLET_CONTEXT__ : undefined;\n  if (!context) {\n    return false;\n  }\n  return context.user.permissions.includes(permission);\n}\n","/**\n * Translation hook using locale from IotaContext\n */\n\nimport { useCallback } from 'react';\nimport { useIotaContext } from '../context/IotaContext';\n\nexport function useTranslation() {\n  const { locale } = useIotaContext();\n  const { translations, language } = locale;\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 = useCallback(\n    (key: string, params?: Record<string, string | number | boolean>): string => {\n      const raw = translations[key];\n      let text = typeof raw === 'string' && raw.trim() ? raw : 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.trim() ? text : key;\n    },\n    [translations]\n  );\n\n  return {\n    t,\n    locale: language,\n  };\n}\n","/**\n * ChartCard Component\n * Renders chart visualizations using ApexCharts\n *\n * Supports multiple chart types: line, bar, pie, area, donut\n * Includes PNG export functionality and responsive styling\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport ReactApexChart from 'react-apexcharts';\nimport ApexCharts, { ApexOptions } from 'apexcharts';\nimport { DownloadSimple } from '@phosphor-icons/react';\nimport type { ChartData } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\n/** External container control. When provided, the card runs in embedded mode. */\nexport interface ChartCardHost {\n  isFullscreen: boolean\n}\n\ninterface ChartCardProps {\n  chartData: ChartData\n  onExportError?: (error: string) => void\n  /** When provided, the card runs in embedded mode — strips outer chrome, fills container height in fullscreen. */\n  host?: ChartCardHost\n}\n\ninterface InlineTooltipState {\n  left: number\n  top: number\n  label: string\n  seriesName: string\n  value: string\n}\n\ninterface HoverEventLike {\n  target?: EventTarget | null\n  clientX?: number\n  clientY?: number\n}\n\n// Default color palette if none provided\nconst DEFAULT_COLORS = ['#6366f1', '#06b6d4', '#f59e0b', '#ef4444', '#8b5cf6'];\nconst TOOLTIP_X_PADDING = 12;\nconst TOOLTIP_Y_PADDING = 8;\nconst TOOLTIP_CURSOR_Y_OFFSET = 12;\n\nfunction clamp(value: number, min: number, max: number): number {\n  return Math.min(Math.max(value, min), max);\n}\n\nfunction getEventClientValue(event: unknown, key: 'clientX' | 'clientY'): number | null {\n  if (!event || typeof event !== 'object') {\n    return null;\n  }\n\n  const value = (event as HoverEventLike)[key];\n  return typeof value === 'number' ? value : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction cloneDeep<T>(value: T): T {\n  if (Array.isArray(value)) {\n    return value.map((item) => cloneDeep(item)) as T;\n  }\n  if (isRecord(value)) {\n    const out: Record<string, unknown> = {};\n    Object.entries(value).forEach(([k, v]) => {\n      out[k] = cloneDeep(v);\n    });\n    return out as T;\n  }\n  return value;\n}\n\nfunction detectCurrencyHint(text: string): string | null {\n  const codeMatch = text.match(/\\b(USD|EUR|GBP|JPY|CHF|AUD|CAD|NZD|CNY|INR|RUB|UZS)\\b/i);\n  if (codeMatch) {return codeMatch[1].toUpperCase();}\n  if (text.includes('$')) {return 'USD';}\n  if (text.includes('EUR') || text.includes('€')) {return 'EUR';}\n  if (text.includes('GBP') || text.includes('£')) {return 'GBP';}\n  if (text.includes('JPY') || text.includes('¥')) {return 'JPY';}\n  return null;\n}\n\nfunction extractYValues(\n  chartType: ChartData['chartType'],\n  series: ChartData['series'],\n  richSeries?: unknown\n): number[] {\n  if (chartType === 'pie' || chartType === 'donut') {\n    if (Array.isArray(richSeries)) {\n      return richSeries.filter((v): v is number => typeof v === 'number' && Number.isFinite(v));\n    }\n    return series[0]?.data || [];\n  }\n  return series.flatMap((s) => s.data).filter((v): v is number => Number.isFinite(v));\n}\n\nfunction createMoneyFormatter(\n  title: string,\n  seriesNames: string[],\n  yValues: number[]\n): ((value: number) => string) | null {\n  if (yValues.length === 0) {return null;}\n  const textSignals = [title, ...seriesNames].join(' ');\n  const currencyHint = detectCurrencyHint(textSignals);\n  const monetaryKeywords =\n    /\\b(revenue|sales|amount|price|cost|profit|income|expense|balance|payment|salary|budget|currency|premium)\\b/i.test(\n      textSignals\n    ) || /[$€£¥]/.test(textSignals);\n  if (!monetaryKeywords && !currencyHint) {return null;}\n\n  const currency = currencyHint || 'USD';\n  const maxFractionDigits = yValues.some((value) => Math.abs(value) < 1) ? 4 : 2;\n  try {\n    const formatter = new Intl.NumberFormat(undefined, {\n      style: 'currency',\n      currency,\n      maximumFractionDigits: maxFractionDigits,\n    });\n    return (value: number): string => formatter.format(value);\n  } catch {\n    const fallback = new Intl.NumberFormat(undefined, { maximumFractionDigits: maxFractionDigits });\n    return (value: number): string => fallback.format(value);\n  }\n}\n\nfunction applyMoneyFormatting(\n  options: ApexOptions,\n  formatter: ((value: number) => string) | null\n): ApexOptions {\n  if (!formatter) {return options;}\n\n  const next: ApexOptions = { ...options };\n  const yaxis = next.yaxis;\n  if (Array.isArray(yaxis)) {\n    next.yaxis = yaxis.map((axis) => ({\n      ...axis,\n      labels: {\n        ...(axis?.labels || {}),\n        formatter: axis?.labels?.formatter || ((value: number) => formatter(value)),\n      },\n    }));\n  } else {\n    next.yaxis = {\n      ...(yaxis || {}),\n      labels: {\n        ...(yaxis?.labels || {}),\n        formatter: yaxis?.labels?.formatter || ((value: number) => formatter(value)),\n      },\n    };\n  }\n  const tooltipY = next.tooltip?.y;\n  const tooltipYObject = !Array.isArray(tooltipY) && isRecord(tooltipY) ? tooltipY : {};\n  const existingFormatter =\n    !Array.isArray(tooltipY) && isRecord(tooltipY) && typeof tooltipY.formatter === 'function'\n      ? tooltipY.formatter\n      : undefined;\n\n  next.tooltip = {\n    ...(next.tooltip || {}),\n    y: {\n      ...tooltipYObject,\n      formatter: existingFormatter || ((value: number) => formatter(value)),\n    },\n  };\n  return next;\n}\n\n/**\n * ChartCard renders a single chart visualization with optional PNG export.\n */\nexport function ChartCard({ chartData, onExportError, host }: ChartCardProps) {\n  const { t } = useTranslation();\n  const chartId = useId().replace(/:/g, '_');\n  const [isExporting, setIsExporting] = useState(false);\n  const [useInlineTooltip, setUseInlineTooltip] = useState(false);\n  const [inlineTooltip, setInlineTooltip] = useState<InlineTooltipState | null>(null);\n  const cardRef = useRef<HTMLDivElement>(null);\n\n  const { chartType, title, series, labels, colors, height = 350 } = chartData;\n  const richOptions = useMemo(\n    () => (isRecord(chartData.options) ? cloneDeep(chartData.options) : null),\n    [chartData.options]\n  );\n  const chartLabels = useMemo(\n    () => (labels ?? []).filter((label): label is string => label !== null),\n    [labels]\n  );\n\n  const hasValidData =\n    series && series.length > 0 && series.some((s) => s.data && s.data.length > 0);\n\n  useEffect(() => {\n    const rootNode = cardRef.current?.getRootNode();\n    const inShadowRoot =\n      typeof ShadowRoot !== 'undefined' && rootNode instanceof ShadowRoot;\n    setUseInlineTooltip(chartType === 'bar' && inShadowRoot);\n  }, [chartType]);\n\n  useEffect(() => {\n    if (!useInlineTooltip) {\n      setInlineTooltip(null);\n    }\n  }, [useInlineTooltip]);\n\n  const apexSeries = useMemo(() => {\n    if (richOptions && Array.isArray(richOptions.series)) {\n      if (chartType === 'pie' || chartType === 'donut') {\n        const numeric = richOptions.series.filter((v): v is number => typeof v === 'number' && Number.isFinite(v));\n        if (numeric.length > 0) {return numeric;}\n      } else {\n        const mapped = richOptions.series\n          .filter((item): item is { name?: unknown; data: unknown[] } => isRecord(item) && Array.isArray(item.data))\n          .map((item, idx) => ({\n            name: typeof item.name === 'string' && item.name.trim() ? item.name : `Series ${idx + 1}`,\n            data: item.data.map((v) => (typeof v === 'number' && Number.isFinite(v) ? v : null)),\n          }))\n          .filter((item) => item.data.some((v) => v !== null));\n        if (mapped.length > 0) {return mapped;}\n      }\n    }\n\n    return chartType === 'pie' || chartType === 'donut'\n      ? series[0]?.data ?? []\n      : series.map((s) => ({ name: s.name, data: s.data }));\n  }, [chartType, series, richOptions]);\n\n  const xaxisConfig = useMemo(() => {\n    if (chartType === 'pie' || chartType === 'donut') {return {};}\n    if (richOptions && isRecord(richOptions.xaxis)) {\n      return richOptions.xaxis;\n    }\n    return { categories: chartLabels };\n  }, [chartType, chartLabels, richOptions]);\n\n  const labelsConfig = useMemo(() => {\n    if (chartType !== 'pie' && chartType !== 'donut') {return [];}\n    if (richOptions && Array.isArray(richOptions.labels)) {\n      const fromOptions = richOptions.labels.filter((v): v is string => typeof v === 'string');\n      if (fromOptions.length > 0) {return fromOptions;}\n    }\n    return chartLabels;\n  }, [chartType, chartLabels, richOptions]);\n\n  const handleDataPointMouseEnter = useCallback(\n    (event: unknown, _chartContext: unknown, config: { seriesIndex?: number; dataPointIndex?: number }) => {\n      if (!useInlineTooltip || chartType !== 'bar' || !cardRef.current) {\n        return;\n      }\n\n      const target =\n        (event &&\n          typeof event === 'object' &&\n          'target' in event &&\n          (event as { target?: Element | null }).target?.closest('.apexcharts-bar-area')) ||\n        null;\n\n      if (!(target instanceof SVGGraphicsElement)) {\n        return;\n      }\n\n      const seriesIndex = typeof config?.seriesIndex === 'number' ? config.seriesIndex : 0;\n      const dataPointIndex = typeof config?.dataPointIndex === 'number' ? config.dataPointIndex : -1;\n      if (dataPointIndex < 0) {\n        return;\n      }\n\n      const cardRect = cardRef.current.getBoundingClientRect();\n      const barRect = target.getBoundingClientRect();\n      const rawValue = series?.[seriesIndex]?.data?.[dataPointIndex] ?? target.getAttribute('val') ?? '';\n      const value =\n        typeof rawValue === 'number' && Number.isFinite(rawValue)\n          ? rawValue.toLocaleString()\n          : String(rawValue);\n      const label = chartLabels[dataPointIndex] || '';\n      const seriesName = series?.[seriesIndex]?.name || 'Value';\n\n      const cursorX = getEventClientValue(event, 'clientX');\n      const cursorY = getEventClientValue(event, 'clientY');\n      const fallbackLeft = barRect.left - cardRect.left + barRect.width / 2;\n      const fallbackTop = barRect.top - cardRect.top - TOOLTIP_Y_PADDING;\n      const maxLeft = Math.max(cardRect.width - TOOLTIP_X_PADDING, TOOLTIP_X_PADDING);\n      const maxTop = Math.max(cardRect.height - TOOLTIP_Y_PADDING, TOOLTIP_Y_PADDING);\n\n      const left = clamp(\n        cursorX !== null ? cursorX - cardRect.left : fallbackLeft,\n        TOOLTIP_X_PADDING,\n        maxLeft\n      );\n      const top = clamp(\n        cursorY !== null ? cursorY - cardRect.top - TOOLTIP_CURSOR_Y_OFFSET : fallbackTop,\n        TOOLTIP_Y_PADDING,\n        maxTop\n      );\n\n      setInlineTooltip({ left, top, label, seriesName, value });\n    },\n    [chartLabels, chartType, series, useInlineTooltip]\n  );\n\n  const handleMouseLeave = useCallback(() => {\n    setInlineTooltip(null);\n  }, []);\n\n  const options: ApexOptions = useMemo(() => {\n    const base = richOptions\n      ? (richOptions as ApexOptions)\n      : ({\n          plotOptions: {\n            bar: { columnWidth: '60%' },\n          },\n          legend: { position: 'bottom', horizontalAlign: 'center' },\n          dataLabels: { enabled: chartType === 'pie' || chartType === 'donut' },\n          stroke: {\n            curve: 'smooth',\n            width: chartType === 'line' || chartType === 'area' ? 2 : 0,\n          },\n          fill: { opacity: chartType === 'area' ? 0.4 : 1 },\n          grid: {\n            borderColor: 'var(--bichat-color-chart-grid, rgba(148, 163, 184, 0.15))',\n            strokeDashArray: 3,\n          },\n        } as ApexOptions);\n\n    const yValues = extractYValues(chartType, series, richOptions?.series);\n    const moneyFormatter = createMoneyFormatter(\n      title,\n      series.map((s) => s.name),\n      yValues\n    );\n\n    const next: ApexOptions = {\n      ...base,\n      chart: {\n        ...(base.chart || {}),\n        id: chartId,\n        type: chartType as 'line' | 'bar' | 'area' | 'pie' | 'donut',\n        toolbar: {\n          ...(base.chart?.toolbar || {}),\n          show: false,\n        },\n        animations: {\n          ...(base.chart?.animations || {}),\n          enabled: false,\n        },\n        fontFamily: 'inherit',\n        ...(useInlineTooltip\n          ? {\n              events: {\n                dataPointMouseEnter: handleDataPointMouseEnter,\n                mouseLeave: handleMouseLeave,\n              },\n            }\n          : {}),\n      },\n      tooltip: {\n        ...(base.tooltip || {}),\n        enabled: !useInlineTooltip,\n        followCursor: true,\n      },\n      title: {\n        ...(base.title || {}),\n        text: title,\n        align: base.title?.align || 'left',\n        style: { fontSize: '14px', fontWeight: 600, ...(base.title?.style || {}) },\n      },\n      colors: colors?.length ? colors : (base.colors && base.colors.length ? base.colors : DEFAULT_COLORS),\n      xaxis: xaxisConfig,\n      labels: labelsConfig,\n    };\n\n    if (chartData.logarithmic && chartType !== 'pie' && chartType !== 'donut') {\n      if (Array.isArray(next.yaxis)) {\n        next.yaxis = next.yaxis.map((axis) => ({ ...axis, logarithmic: true }));\n      } else {\n        next.yaxis = { ...(next.yaxis || {}), logarithmic: true };\n      }\n    }\n\n    return applyMoneyFormatting(next, moneyFormatter);\n  }, [richOptions, chartType, series, title, chartId, useInlineTooltip, handleDataPointMouseEnter, handleMouseLeave, colors, xaxisConfig, labelsConfig, chartData.logarithmic]);\n\n  if (!hasValidData) {\n    return (\n      <div className=\"rounded-xl border border-gray-200/80 bg-white p-4 shadow-sm dark:border-gray-700/60 dark:bg-gray-800\">\n        <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n          {title && <span className=\"font-medium\">{title}: </span>}\n          {t('BiChat.Chart.NoData')}\n        </p>\n      </div>\n    );\n  }\n\n  const handleExportPNG = async () => {\n    setIsExporting(true);\n\n    try {\n      const chart = ApexCharts.getChartByID(chartId);\n      if (!chart) {\n        const msg = 'Chart instance not available';\n        console.error(msg);\n        onExportError?.(msg);\n        return;\n      }\n      const result = await chart.dataURI({ scale: 2 });\n\n      if (!('imgURI' in result)) {\n        const msg = 'Unexpected dataURI result format';\n        console.error(msg);\n        onExportError?.(msg);\n        return;\n      }\n\n      const link = document.createElement('a');\n      link.href = result.imgURI;\n      link.download = `${title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}_chart.png`;\n      link.click();\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : 'Failed to export chart';\n      console.error('Failed to export chart:', error);\n      onExportError?.(msg);\n    } finally {\n      setIsExporting(false);\n    }\n  };\n\n  const fillHeight = host?.isFullscreen ?? false;\n  const cardClassName = host\n    ? `group/chart relative w-full min-w-0 overflow-hidden${fillHeight ? ' flex flex-col flex-1' : ''}`\n    : 'group/chart relative rounded-xl border border-gray-200/80 bg-white p-4 shadow-sm transition-shadow duration-200 hover:shadow dark:border-gray-700/60 dark:bg-gray-800';\n  const chartHeight = fillHeight\n    ? '100%'\n    : isRecord(options.chart) && typeof options.chart.height === 'number' ? options.chart.height : height;\n\n  return (\n    <div\n      ref={cardRef}\n      className={cardClassName}\n      onMouseLeave={handleMouseLeave}\n    >\n      <div className={fillHeight ? 'flex-1 min-h-0 p-4' : undefined}>\n        <ReactApexChart\n          options={options}\n          series={apexSeries}\n          type={chartType}\n          width=\"100%\"\n          height={chartHeight}\n        />\n      </div>\n      {useInlineTooltip && inlineTooltip && (\n        <div\n          className=\"pointer-events-none absolute z-20\"\n          style={{\n            left: `${inlineTooltip.left}px`,\n            top: `${inlineTooltip.top}px`,\n            transform: 'translate(-50%, -100%)',\n          }}\n        >\n          <div className=\"min-w-[140px] overflow-hidden rounded-md border border-gray-200 bg-white text-xs text-gray-700 shadow-md dark:border-gray-600 dark:bg-gray-900 dark:text-gray-200\">\n            {inlineTooltip.label && (\n              <div className=\"border-b border-gray-200 px-2.5 py-1.5 font-medium dark:border-gray-600\">\n                {inlineTooltip.label}\n              </div>\n            )}\n            <div className=\"flex items-center gap-2 px-2.5 py-1.5\">\n              <span className=\"h-2 w-2 rounded-full bg-primary-600\" />\n              <span>\n                {inlineTooltip.seriesName}: <strong>{inlineTooltip.value}</strong>\n              </span>\n            </div>\n          </div>\n        </div>\n      )}\n      <div className=\"flex justify-end pt-2\">\n        <button\n          type=\"button\"\n          onClick={handleExportPNG}\n          disabled={isExporting}\n          className=\"inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-gray-400 opacity-0 transition-all duration-150 hover:bg-gray-100 hover:text-gray-600 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 group-hover/chart:opacity-100 disabled:opacity-50 dark:text-gray-500 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n          title={t('BiChat.Chart.Download')}\n        >\n          {isExporting ? (\n            <span className=\"text-gray-500 dark:text-gray-400\">{t('BiChat.Chart.Exporting')}</span>\n          ) : (\n            <>\n              <DownloadSimple className=\"h-3.5 w-3.5\" weight=\"bold\" />\n              <span>{t('BiChat.Chart.DownloadPNG')}</span>\n            </>\n          )}\n        </button>\n      </div>\n    </div>\n  );\n}\n","/**\n * TableExportButton Component\n * Small inline button for exporting markdown tables to Excel\n */\n\nimport { memo } from 'react';\nimport { FileXls } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface TableExportButtonProps {\n  /** Click handler for export action */\n  onClick: () => void\n  /** Whether the button should be disabled */\n  disabled?: boolean\n  /** Export button label (defaults to \"Export\") */\n  label?: string\n  /** Disabled tooltip text */\n  disabledTooltip?: string\n}\n\nexport const TableExportButton = memo(function TableExportButton({\n  onClick,\n  disabled = false,\n  label,\n  disabledTooltip,\n}: TableExportButtonProps) {\n  const { t } = useTranslation();\n  const resolvedLabel = label ?? t('BiChat.Export');\n  const resolvedDisabledTooltip = disabledTooltip ?? t('BiChat.Common.PleaseWait');\n  return (\n    <button\n      type=\"button\"\n      onClick={onClick}\n      disabled={disabled}\n      className=\"cursor-pointer inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-green-700 dark:text-green-400 hover:text-green-800 dark:hover:text-green-300 disabled:text-gray-400 disabled:cursor-not-allowed transition-colors rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n      aria-label={resolvedLabel}\n      title={disabled ? resolvedDisabledTooltip : resolvedLabel}\n    >\n      <FileXls size={16} weight=\"fill\" />\n      <span>{resolvedLabel}</span>\n    </button>\n  );\n});\n","/**\n * Citation Processing Utility\n *\n * Transforms OpenAI citations from raw markers (e.g., ≡cite≡turn0search2≡)\n * to formatted inline citation markers (e.g., [1], [2]).\n *\n * Process:\n * 1. Sort citations by startIndex (descending) to process from end to start\n * 2. Replace character ranges [startIndex, endIndex] with numbered markers\n * 3. Return processed content with clean inline citation references\n */\n\nimport type { Citation } from '../types';\n\nexport interface ProcessedContent {\n  /** Content with citation markers replaced by [1], [2], etc. */\n  content: string\n  /** Citations array with their display indices */\n  citations: Array<Citation & { displayIndex: number }>\n}\n\n/**\n * Process message content to replace raw citation markers with formatted inline citations\n *\n * @param content - Raw message content with potential citation markers\n * @param citations - Array of citations with startIndex/endIndex positions\n * @returns Processed content with clean citation markers and indexed citations\n *\n * @example\n * ```ts\n * const result = processCitations(\n *   \"Tesla reported $28B ≡cite≡turn0search2≡ revenue\",\n *   [{ startIndex: 20, endIndex: 42, title: \"...\", url: \"...\", type: \"url_citation\" }]\n * )\n * // result.content = \"Tesla reported $28B [1] revenue\"\n * // result.citations = [{ ..., displayIndex: 1 }]\n * ```\n */\nexport function processCitations(\n  content: string,\n  citations: Citation[] | null | undefined\n): ProcessedContent {\n  // If no citations, return content as-is\n  if (!citations || citations.length === 0) {\n    return { content, citations: [] };\n  }\n\n  // Sort citations by startIndex (descending) to process from end to start\n  // This prevents index shifting issues when replacing text\n  const sortedCitations = [...citations].sort((a, b) => b.startIndex - a.startIndex);\n\n  let processedContent = content;\n  const processedCitations: Array<Citation & { displayIndex: number }> = [];\n\n  // Process each citation from end to start\n  sortedCitations.forEach((citation, index) => {\n    const { startIndex, endIndex } = citation;\n\n    // Validate indices\n    if (startIndex < 0 || endIndex > processedContent.length || startIndex >= endIndex) {\n      console.warn('[citationProcessor] Invalid citation indices:', {\n        startIndex,\n        endIndex,\n        contentLength: processedContent.length,\n      });\n      return;\n    }\n\n    // Calculate display index (1-based, in original order)\n    const displayIndex = citations.length - index;\n\n    // Replace the citation marker range with [N]\n    const before = processedContent.slice(0, startIndex);\n    const after = processedContent.slice(endIndex);\n    processedContent = `${before}[${displayIndex}]${after}`;\n\n    // Store citation with its display index\n    processedCitations.unshift({\n      ...citation,\n      displayIndex,\n    });\n  });\n\n  return {\n    content: processedContent,\n    citations: processedCitations,\n  };\n}\n","/**\n * Shared chart spec parsing for draw_chart tool output and artifact metadata.\n * Used by SessionArtifactPreview, HttpDataSource (turn.charts), and MarkdownRenderer (code blocks).\n */\n\nimport type { ChartData, ChartSeries } from '../types';\n\nexport const SUPPORTED_CHART_TYPES = new Set<ChartData['chartType']>([\n  'line',\n  'bar',\n  'area',\n  'pie',\n  'donut',\n]);\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction cloneValue<T>(value: T): T {\n  if (Array.isArray(value)) {\n    return value.map((item) => cloneValue(item)) as T;\n  }\n  if (isRecord(value)) {\n    const out: Record<string, unknown> = {};\n    Object.entries(value).forEach(([key, nested]) => {\n      out[key] = cloneValue(nested);\n    });\n    return out as T;\n  }\n  return value;\n}\n\nfunction toStringArray(value: unknown): string[] | undefined {\n  if (!Array.isArray(value)) {return undefined;}\n  const result = value\n    .map((item) => {\n      if (typeof item === 'string') {return item;}\n      if (typeof item === 'number' && Number.isFinite(item)) {return String(item);}\n      return null;\n    })\n    .filter((item): item is string => typeof item === 'string');\n  return result.length > 0 ? result : undefined;\n}\n\nfunction toChartSeriesFromApex(value: unknown): ChartSeries[] | null {\n  if (!Array.isArray(value) || value.length === 0) {\n    return null;\n  }\n\n  const result: ChartSeries[] = [];\n  for (let i = 0; i < value.length; i++) {\n    const item = value[i];\n    if (!isRecord(item) || !Array.isArray(item.data)) {\n      return null;\n    }\n\n    const data: number[] = [];\n    for (const point of item.data) {\n      if (typeof point === 'number' && Number.isFinite(point)) {\n        data.push(point);\n        continue;\n      }\n      if (isRecord(point) && typeof point.y === 'number' && Number.isFinite(point.y)) {\n        data.push(point.y);\n        continue;\n      }\n      return null;\n    }\n\n    if (data.length === 0) {\n      return null;\n    }\n\n    const fallbackName = `Series ${i + 1}`;\n    const name = typeof item.name === 'string' && item.name.trim() ? item.name : fallbackName;\n    result.push({ name, data });\n  }\n\n  return result.length > 0 ? result : null;\n}\n\nfunction normalizeChartType(value: unknown): ChartData['chartType'] | null {\n  if (typeof value !== 'string') {return null;}\n  const normalized = value.trim().toLowerCase();\n  if (SUPPORTED_CHART_TYPES.has(normalized as ChartData['chartType'])) {\n    return normalized as ChartData['chartType'];\n  }\n  return null;\n}\n\nfunction readLogarithmicFromOptions(options: Record<string, unknown>): boolean | undefined {\n  const yaxis = options.yaxis;\n  if (isRecord(yaxis) && typeof yaxis.logarithmic === 'boolean') {\n    return yaxis.logarithmic;\n  }\n  if (Array.isArray(yaxis)) {\n    for (const axis of yaxis) {\n      if (isRecord(axis) && typeof axis.logarithmic === 'boolean') {\n        if (axis.logarithmic) {return true;}\n      }\n    }\n  }\n  return undefined;\n}\n\nfunction parseApexChartDataFromSpec(\n  spec: Record<string, unknown>,\n  fallbackTitle: string\n): ChartData | null {\n  const options = isRecord(spec.options) ? spec.options : spec;\n  const chart = isRecord(options.chart) ? options.chart : undefined;\n  const chartType = normalizeChartType(chart?.type);\n  if (!chartType) {return null;}\n\n  const titleRaw = isRecord(options.title) ? options.title.text : options.title;\n  const title = typeof titleRaw === 'string' && titleRaw.trim() ? titleRaw : fallbackTitle;\n\n  const seriesRaw = options.series;\n  let series: ChartSeries[] | null = null;\n  if (chartType === 'pie' || chartType === 'donut') {\n    if (Array.isArray(seriesRaw)) {\n      const numeric = seriesRaw.filter((point): point is number => typeof point === 'number' && Number.isFinite(point));\n      if (numeric.length > 0) {\n        series = [{ name: title, data: numeric }];\n      } else {\n        series = toChartSeriesFromApex(seriesRaw);\n      }\n    }\n  } else {\n    series = toChartSeriesFromApex(seriesRaw);\n  }\n  if (!series) {return null;}\n\n  const labels =\n    toStringArray(options.labels) ||\n    (isRecord(options.xaxis) ? toStringArray(options.xaxis.categories) : undefined);\n\n  const colors = toStringArray(options.colors);\n  const height =\n    chart && typeof chart.height === 'number' && Number.isFinite(chart.height)\n      ? chart.height\n      : undefined;\n  const logarithmic = readLogarithmicFromOptions(options);\n\n  return {\n    chartType,\n    title,\n    series,\n    labels,\n    colors,\n    height,\n    options: cloneValue(options),\n    logarithmic,\n  };\n}\n\n/**\n * Parses a chart spec object (Apex options at top-level or under `options`) into ChartData.\n */\nexport function parseChartDataFromSpec(\n  spec: Record<string, unknown>,\n  fallbackTitle = 'Chart'\n): ChartData | null {\n  return parseApexChartDataFromSpec(spec, fallbackTitle);\n}\n\n/**\n * Parses a JSON string as a chart spec (e.g. from a ```chart or ```json code block).\n */\nexport function parseChartDataFromJsonString(\n  json: string,\n  fallbackTitle = 'Chart'\n): ChartData | null {\n  const trimmed = json.trim();\n  if (!trimmed) {return null;}\n\n  let spec: unknown;\n  try {\n    spec = JSON.parse(trimmed);\n  } catch {\n    return null;\n  }\n\n  if (!isRecord(spec)) {return null;}\n  return parseChartDataFromSpec(spec, fallbackTitle);\n}\n","/**\n * Normalizes common LaTeX delimiters used by LLMs into remark-math compatible\n * delimiters while preserving fenced and inline code sections.\n *\n * Supported conversions:\n * - \\[ ... \\] -> $$ ... $$\n * - \\( ... \\) -> $ ... $\n */\nexport function normalizeLatexDelimiters(markdown: string): string {\n  if (!markdown || !hasLatexDelimiters(markdown)) {\n    return markdown;\n  }\n\n  const lines = markdown.split('\\n');\n  let inFence = false;\n  let fenceMarker = '';\n  const output: string[] = [];\n\n  for (const line of lines) {\n    const fence = parseFenceLine(line);\n    if (fence) {\n      if (!inFence) {\n        inFence = true;\n        fenceMarker = fence;\n      } else if (fence[0] === fenceMarker[0] && fence.length >= fenceMarker.length) {\n        inFence = false;\n        fenceMarker = '';\n      }\n      output.push(line);\n      continue;\n    }\n\n    if (inFence) {\n      output.push(line);\n      continue;\n    }\n\n    output.push(rewriteOutsideInlineCode(line));\n  }\n\n  return output.join('\\n');\n}\n\nfunction hasLatexDelimiters(markdown: string): boolean {\n  return markdown.includes('\\\\[') || markdown.includes('\\\\]') || markdown.includes('\\\\(') || markdown.includes('\\\\)');\n}\n\nfunction parseFenceLine(line: string): string | null {\n  const match = line.match(/^\\s*(`{3,}|~{3,})/);\n  return match ? match[1] : null;\n}\n\nfunction rewriteOutsideInlineCode(line: string): string {\n  const segments = line.split(/(`+[^`]*`+)/g);\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    if (segment.startsWith('`') && segment.endsWith('`')) {\n      continue;\n    }\n    segments[i] = segment\n      .replace(/\\\\\\[/g, () => '$$')\n      .replace(/\\\\\\]/g, () => '$$')\n      .replace(/\\\\\\(/g, '$')\n      .replace(/\\\\\\)/g, '$');\n  }\n  return segments.join('');\n}\n","/**\n * TableWithExport Component\n * Wraps markdown tables with an export button that sends a message to export the table\n */\n\nimport { memo, useCallback, type ReactNode } from 'react';\nimport { TableExportButton } from './TableExportButton';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface TableWithExportProps {\n  /** The table content to render */\n  children: ReactNode\n  /** Function to send a message (from chat context) */\n  sendMessage?: (content: string) => void\n  /** Whether sending is disabled (loading or streaming) */\n  disabled?: boolean\n  /** Custom export message to send */\n  exportMessage?: string\n  /** Export button label */\n  exportLabel?: string\n}\n\nexport const TableWithExport = memo(function TableWithExport({\n  children,\n  sendMessage,\n  disabled = false,\n  exportMessage,\n  exportLabel,\n}: TableWithExportProps) {\n  const { t } = useTranslation();\n  const resolvedExportMessage = exportMessage ?? t('BiChat.ExportTableToExcel');\n  const resolvedExportLabel = exportLabel ?? t('BiChat.Export');\n  const handleExport = useCallback(() => {\n    sendMessage?.(resolvedExportMessage);\n  }, [sendMessage, resolvedExportMessage]);\n\n  return (\n    <>\n      <div className=\"markdown-table-wrapper overflow-x-auto\">\n        <table className=\"markdown-table w-full border-collapse\">{children}</table>\n      </div>\n      {sendMessage && (\n        <div className=\"flex justify-end mt-1\">\n          <TableExportButton onClick={handleExport} disabled={disabled} label={resolvedExportLabel} />\n        </div>\n      )}\n    </>\n  );\n});\n","/**\n * CodeBlock Component\n * Syntax highlighted code blocks with copy functionality and dark mode support\n */\n\nimport { useState, useEffect, useRef, useSyncExternalStore, memo } from 'react';\nimport { Copy, Check } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { vscDarkPlus, vs } from 'react-syntax-highlighter/dist/esm/styles/prism';\n\ninterface CodeBlockProps {\n  /** Programming language for syntax highlighting */\n  language: string\n  /** Code content to display */\n  value: string\n  /** Whether to render as inline code */\n  inline?: boolean\n  /** Copy button label (defaults to \"Copy\") */\n  copyLabel?: string\n  /** Copied confirmation label (defaults to \"Copied!\") */\n  copiedLabel?: string\n}\n\n// Module-level singleton dark mode detection — shared across all CodeBlock instances\nconst darkModeStore = (() => {\n  let current =\n    typeof document !== 'undefined' &&\n    (document.documentElement.classList.contains('dark') ||\n      (!document.documentElement.classList.contains('light') &&\n        window.matchMedia('(prefers-color-scheme: dark)').matches));\n  const listeners = new Set<() => void>();\n\n  function check() {\n    const next =\n      typeof document !== 'undefined' &&\n      (document.documentElement.classList.contains('dark') ||\n        (!document.documentElement.classList.contains('light') &&\n          window.matchMedia('(prefers-color-scheme: dark)').matches));\n    if (next !== current) {\n      current = next;\n      listeners.forEach((fn) => fn());\n    }\n  }\n\n  if (typeof document !== 'undefined') {\n    const observer = new MutationObserver(check);\n    observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n    window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', check);\n  }\n\n  return {\n    subscribe: (fn: () => void) => {\n      listeners.add(fn);\n      return () => { listeners.delete(fn); };\n    },\n    getSnapshot: () => current,\n    getServerSnapshot: () => false,\n  };\n})();\n\nfunction useDarkMode() {\n  return useSyncExternalStore(darkModeStore.subscribe, darkModeStore.getSnapshot, darkModeStore.getServerSnapshot);\n}\n\n// Language aliases for normalization\nconst languageMap: Record<string, string> = {\n  js: 'javascript',\n  ts: 'typescript',\n  jsx: 'jsx',\n  tsx: 'tsx',\n  py: 'python',\n  rb: 'ruby',\n  yml: 'yaml',\n  yaml: 'yaml',\n  sh: 'bash',\n  bash: 'bash',\n  json: 'json',\n  xml: 'xml',\n  html: 'html',\n  css: 'css',\n  sql: 'sql',\n  go: 'go',\n  java: 'java',\n  cpp: 'cpp',\n  c: 'c',\n  csharp: 'csharp',\n  php: 'php',\n};\n\nfunction normalizeLanguage(lang: string): string {\n  if (!lang) {return 'text';}\n  return languageMap[lang.toLowerCase()] || lang.toLowerCase();\n}\n\nfunction CodeBlock({\n  language,\n  value,\n  inline,\n  copyLabel,\n  copiedLabel,\n}: CodeBlockProps) {\n  const { t } = useTranslation();\n  const resolvedCopyLabel = copyLabel ?? t('BiChat.Message.Copy');\n  const resolvedCopiedLabel = copiedLabel ?? t('BiChat.Message.Copied');\n  const [copied, setCopied] = useState(false);\n  const [copyFailed, setCopyFailed] = useState(false);\n  const isDarkMode = useDarkMode();\n  const copyTimeoutRef = useRef<number | null>(null);\n  const copyFailedTimeoutRef = useRef<number | null>(null);\n\n  const normalizedLanguage = normalizeLanguage(language);\n\n  // Cleanup timeouts on unmount\n  useEffect(() => {\n    return () => {\n      if (copyTimeoutRef.current !== null) {\n        clearTimeout(copyTimeoutRef.current);\n      }\n      if (copyFailedTimeoutRef.current !== null) {\n        clearTimeout(copyFailedTimeoutRef.current);\n      }\n    };\n  }, []);\n\n  const handleCopy = async () => {\n    try {\n      await navigator.clipboard.writeText(value);\n      setCopied(true);\n      setCopyFailed(false);\n      // Clear any existing timeout before setting a new one\n      if (copyTimeoutRef.current !== null) {\n        clearTimeout(copyTimeoutRef.current);\n      }\n      copyTimeoutRef.current = window.setTimeout(() => {\n        setCopied(false);\n        copyTimeoutRef.current = null;\n      }, 2000);\n    } catch (err) {\n      console.error('Failed to copy:', err);\n      setCopyFailed(true);\n      if (copyFailedTimeoutRef.current !== null) {\n        clearTimeout(copyFailedTimeoutRef.current);\n      }\n      copyFailedTimeoutRef.current = window.setTimeout(() => {\n        setCopyFailed(false);\n        copyFailedTimeoutRef.current = null;\n      }, 2000);\n    }\n  };\n\n  // Inline code styling\n  if (inline) {\n    return (\n      <code className=\"px-1.5 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 rounded text-sm font-mono\">\n        {value}\n      </code>\n    );\n  }\n\n  // Code block with syntax highlighting\n  return (\n    <div className=\"relative group my-4 rounded-lg overflow-hidden border border-gray-300 dark:border-gray-700\">\n      {/* Language label and copy button */}\n      <div className=\"flex items-center justify-between px-4 py-2 bg-gray-100 dark:bg-gray-800 border-b border-gray-300 dark:border-gray-700\">\n        <span className=\"text-xs text-gray-600 dark:text-gray-400 font-medium uppercase\">\n          {normalizedLanguage}\n        </span>\n        <button\n          onClick={handleCopy}\n          className={`text-xs transition-colors flex items-center gap-1.5 ${\n            copyFailed\n              ? 'text-red-500 dark:text-red-400'\n              : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white'\n          }`}\n          title={resolvedCopyLabel}\n          aria-live=\"polite\"\n        >\n          {copied ? (\n            <>\n              <Check size={16} className=\"w-4 h-4\" />\n              <span>{resolvedCopiedLabel}</span>\n            </>\n          ) : (\n            <>\n              <Copy size={16} className=\"w-4 h-4\" />\n              <span>{copyFailed ? t('BiChat.Message.CopyFailed') : resolvedCopyLabel}</span>\n            </>\n          )}\n        </button>\n      </div>\n\n      {/* Code content */}\n      <SyntaxHighlighter\n        language={normalizedLanguage}\n        style={isDarkMode ? vscDarkPlus : vs}\n        customStyle={{\n          margin: 0,\n          borderRadius: 0,\n          fontSize: '0.875rem',\n          lineHeight: '1.5',\n          padding: '1rem',\n        }}\n        showLineNumbers={false}\n        wrapLines={true}\n        codeTagProps={{\n          style: {\n            fontFamily: '\"JetBrains Mono\", \"Fira Code\", \"Menlo\", monospace',\n          },\n        }}\n      >\n        {value}\n      </SyntaxHighlighter>\n    </div>\n  );\n}\n\nconst MemoizedCodeBlock = memo(CodeBlock);\nMemoizedCodeBlock.displayName = 'CodeBlock';\n\nexport { MemoizedCodeBlock as CodeBlock };\nexport default MemoizedCodeBlock;\n","/**\n * MarkdownRenderer Component\n * Renders markdown with syntax highlighting, citations, and table export\n *\n * Features:\n * - Lazy-loaded CodeBlock for bundle optimization\n * - Citation processing (converts raw markers to numbered references)\n * - Table export functionality\n * - Custom CSS class names for styling flexibility\n * - GFM (GitHub Flavored Markdown) support\n */\n\nimport { memo, lazy, Suspense, useMemo, Children, isValidElement, type ReactNode } from 'react';\nimport ReactMarkdown, { Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { processCitations } from '../utils/citationProcessor';\nimport { parseChartDataFromJsonString } from '../utils/chartSpec';\nimport { normalizeLatexDelimiters } from '../utils/markdownMath';\nimport type { Citation } from '../types';\nimport { TableWithExport } from './TableWithExport';\nimport { ChartCard } from './ChartCard';\nimport { useTranslation } from '../hooks/useTranslation';\n\n// Lazy load CodeBlock for bundle optimization\nconst CodeBlock = lazy(() => import('./CodeBlock').then((module) => ({ default: module.CodeBlock })));\n\ninterface MarkdownRendererProps {\n  /** Markdown content to render */\n  content: string\n  /** Optional citations to process and display */\n  citations?: Citation[] | null\n  /** Optional function to send messages (enables table export) */\n  sendMessage?: (content: string) => void\n  /** Whether message sending is disabled */\n  sendDisabled?: boolean\n  /** Copy button label for code blocks */\n  copyLabel?: string\n  /** Copied confirmation label for code blocks */\n  copiedLabel?: string\n  /** Export button label for tables */\n  exportLabel?: string\n}\n\ninterface CodeProps {\n  inline?: boolean\n  className?: string\n  children?: React.ReactNode\n  node?: {\n    position?: {\n      start?: { line?: number }\n      end?: { line?: number }\n    }\n  }\n}\n\nconst INLINE_TAGS = new Set([\n  'a',\n  'abbr',\n  'b',\n  'br',\n  'code',\n  'em',\n  'i',\n  'img',\n  'kbd',\n  'mark',\n  's',\n  'small',\n  'span',\n  'strong',\n  'sub',\n  'sup',\n  'u',\n]);\n\nfunction hasBlockChildren(children: ReactNode): boolean {\n  return Children.toArray(children).some((child) => {\n    if (!isValidElement(child)) {\n      return false;\n    }\n\n    if (typeof child.type === 'string') {\n      if (!INLINE_TAGS.has(child.type)) {\n        return true;\n      }\n\n      return hasBlockChildren((child.props as { children?: ReactNode }).children);\n    }\n\n    // Non-DOM React components can render block nodes (e.g. lazy CodeBlock).\n    return true;\n  });\n}\n\nfunction MarkdownRenderer({\n  content,\n  citations,\n  sendMessage,\n  sendDisabled = false,\n  copyLabel,\n  copiedLabel,\n  exportLabel,\n}: MarkdownRendererProps) {\n  const { t } = useTranslation();\n  const resolvedCopyLabel = copyLabel ?? t('BiChat.Message.Copy');\n  const resolvedCopiedLabel = copiedLabel ?? t('BiChat.Message.Copied');\n  const resolvedExportLabel = exportLabel ?? t('BiChat.Export');\n  // Process citations to replace raw markers with [1], [2], etc.\n  const processed = useMemo(() => {\n    return processCitations(content, citations);\n  }, [content, citations]);\n  const normalizedContent = useMemo(() => normalizeLatexDelimiters(processed.content), [processed.content]);\n\n  const components: Components = useMemo(\n    () => ({\n      // Remove <pre> wrapper for code blocks - CodeBlock provides its own container\n      pre: ({ children }) => <>{children}</>,\n      code({ inline, className, children, node }: CodeProps) {\n        const match = /language-(\\w+)/.exec(className || '');\n        const language = match ? match[1] : '';\n        const value = String(children).replace(/\\n$/, '');\n\n        // Some react-markdown versions may omit `inline`.\n        // In that case, infer inline code conservatively from content shape.\n        const hasLineBreak = value.includes('\\n');\n        const startLine = node?.position?.start?.line;\n        const endLine = node?.position?.end?.line;\n        const spansSingleLine = startLine !== undefined && endLine !== undefined && startLine === endLine;\n        const inferredInline = !className && !hasLineBreak && (spansSingleLine || startLine === undefined || endLine === undefined);\n        const isInline = inline === true || (inline !== false && inferredInline);\n\n        if (isInline) {\n          return (\n            <code className=\"px-1.5 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 rounded text-sm font-mono\">\n              {value}\n            </code>\n          );\n        }\n\n        const lang = language.toLowerCase();\n        const chartData =\n          lang === 'chart'\n            ? parseChartDataFromJsonString(value, 'Chart')\n            : lang === 'json' && value.includes('\"chartType\"')\n              ? parseChartDataFromJsonString(value, 'Chart')\n              : null;\n\n        if (chartData) {\n          return (\n            <div className=\"my-4\">\n              <ChartCard chartData={chartData} />\n            </div>\n          );\n        }\n\n        // Block code - rendered outside of <p> context due to pre handler above\n        return (\n          <Suspense\n            fallback={\n              <pre className=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto my-4\">\n                <code className=\"text-sm font-mono\">{value}</code>\n              </pre>\n            }\n          >\n            <CodeBlock\n              language={language}\n              value={value}\n              inline={false}\n              copyLabel={resolvedCopyLabel}\n              copiedLabel={resolvedCopiedLabel}\n            />\n          </Suspense>\n        );\n      },\n      p: ({ children }) => {\n        if (hasBlockChildren(children)) {\n          return <div className=\"markdown-p my-2\">{children}</div>;\n        }\n\n        return <p className=\"markdown-p my-2\">{children}</p>;\n      },\n      a: ({ href, children }) => (\n        <a\n          href={href}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"markdown-link text-[var(--bichat-color-accent)] underline decoration-[var(--bichat-color-accent)] decoration-from-font hover:text-[var(--bichat-color-accent-hover)] hover:decoration-[var(--bichat-color-accent-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bichat-color-accent)] focus-visible:ring-offset-2 rounded\"\n        >\n          {children}\n        </a>\n      ),\n      h1: ({ children }) => <h1 className=\"markdown-h1 text-2xl font-bold mt-6 mb-3\">{children}</h1>,\n      h2: ({ children }) => <h2 className=\"markdown-h2 text-xl font-bold mt-5 mb-2\">{children}</h2>,\n      h3: ({ children }) => <h3 className=\"markdown-h3 text-lg font-semibold mt-4 mb-2\">{children}</h3>,\n      h4: ({ children }) => <h4 className=\"markdown-h4 text-base font-semibold mt-3 mb-1\">{children}</h4>,\n      h5: ({ children }) => <h5 className=\"markdown-h5 text-sm font-semibold mt-2 mb-1\">{children}</h5>,\n      h6: ({ children }) => <h6 className=\"markdown-h6 text-sm font-medium mt-2 mb-1\">{children}</h6>,\n      ul: ({ children }) => <ul className=\"markdown-ul list-disc list-inside my-2 space-y-1\">{children}</ul>,\n      ol: ({ children }) => <ol className=\"markdown-ol list-decimal list-inside my-2 space-y-1\">{children}</ol>,\n      li: ({ children }) => <li className=\"markdown-li\">{children}</li>,\n      blockquote: ({ children }) => (\n        <blockquote className=\"markdown-blockquote border-l-4 border-gray-300 dark:border-gray-600 pl-4 my-2 italic text-gray-600 dark:text-gray-400\">\n          {children}\n        </blockquote>\n      ),\n      table: ({ children }) => (\n        <TableWithExport\n          sendMessage={sendMessage}\n          disabled={sendDisabled}\n          exportLabel={resolvedExportLabel}\n        >\n          {children}\n        </TableWithExport>\n      ),\n      thead: ({ children }) => (\n        <thead className=\"markdown-thead bg-gray-100 dark:bg-gray-800\">{children}</thead>\n      ),\n      tbody: ({ children }) => <tbody className=\"markdown-tbody\">{children}</tbody>,\n      tr: ({ children }) => (\n        <tr className=\"markdown-tr border-b border-gray-200 dark:border-gray-700\">{children}</tr>\n      ),\n      th: ({ children }) => (\n        <th className=\"markdown-th px-3 py-2 text-left text-sm font-semibold text-gray-700 dark:text-gray-300\">\n          {children}\n        </th>\n      ),\n      td: ({ children }) => (\n        <td className=\"markdown-td px-3 py-2 text-sm text-gray-600 dark:text-gray-400\">{children}</td>\n      ),\n      hr: () => <hr className=\"markdown-hr my-4 border-gray-200 dark:border-gray-700\" />,\n      strong: ({ children }) => <strong className=\"markdown-strong font-semibold\">{children}</strong>,\n      em: ({ children }) => <em className=\"markdown-em italic\">{children}</em>,\n    }),\n    [resolvedCopyLabel, resolvedCopiedLabel, resolvedExportLabel, sendMessage, sendDisabled],\n  );\n\n  return (\n    <div className=\"markdown-content\">\n      <ReactMarkdown\n        remarkPlugins={[remarkGfm, remarkMath]}\n        rehypePlugins={[[rehypeKatex, { strict: 'ignore', throwOnError: false, output: 'mathml' }]]}\n        components={components}\n      >\n        {normalizedContent}\n      </ReactMarkdown>\n    </div>\n  );\n}\n\nconst MemoizedMarkdownRenderer = memo(MarkdownRenderer);\nMemoizedMarkdownRenderer.displayName = 'MarkdownRenderer';\n\nexport { MemoizedMarkdownRenderer as MarkdownRenderer };\nexport default MemoizedMarkdownRenderer;\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","export function shouldEnableAppletDevtools(): boolean {\n  if (typeof window === 'undefined') {return false;}\n\n  const url = new URL(window.location.href);\n  if (url.searchParams.get('appletDebug') === '1') {return true;}\n\n  try {\n    return window.localStorage.getItem('iotaAppletDevtools') === '1';\n  } catch {\n    return false;\n  }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled';\n\nexport interface AppletRPCError {\n  code: string\n  message: string\n  details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n  code: string;\n  details?: unknown;\n  cause?: unknown;\n\n  constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n    super(args.message);\n    this.name = 'AppletRPCException';\n    this.code = args.code;\n    this.details = args.details;\n    this.cause = args.cause;\n  }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n  id: string\n  method: string\n  params: unknown\n}\n\ninterface RPCResponse<TResult> {\n  id: string\n  result?: TResult\n  error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n  endpoint: string\n  fetcher?: typeof fetch\n  timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n  const fetcher = options.fetcher ?? fetch;\n  const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0;\n\n  async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n    const req: RPCRequest = { id: crypto.randomUUID(), method, params };\n    const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();\n    const abortController = timeoutMs > 0 ? new AbortController() : undefined;\n    let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n    let timedOut = false;\n    maybeDispatchRPCEvent({\n      id: req.id,\n      method: req.method,\n      status: 'start',\n    });\n\n    try {\n      if (abortController) {\n        timeoutHandle = setTimeout(() => {\n          timedOut = true;\n          abortController.abort();\n        }, timeoutMs);\n      }\n\n      const resp = await fetcher(options.endpoint, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify(req),\n        signal: abortController?.signal,\n      });\n\n      if (!resp.ok) {\n        throw new AppletRPCException({\n          code: 'http_error',\n          message: `HTTP ${resp.status}`,\n          details: { status: resp.status },\n        });\n      }\n\n      const json = (await resp.json()) as RPCResponse<TResult>;\n      if (json.error) {\n        throw new AppletRPCException({\n          code: json.error.code,\n          message: json.error.message,\n          details: json.error.details,\n        });\n      }\n\n      if (json.result === undefined) {\n        throw new AppletRPCException({\n          code: 'invalid_response',\n          message: 'Missing result in successful response',\n        });\n      }\n\n      maybeDispatchRPCEvent({\n        id: req.id,\n        method: req.method,\n        status: 'success',\n        durationMs: elapsedMs(startedAt),\n      });\n\n      return json.result as TResult;\n    } catch (err) {\n      let rpcErr: unknown = err;\n      if (err instanceof Error && err.name === 'AbortError') {\n        rpcErr = new AppletRPCException({\n          code: timedOut ? 'timeout' : 'aborted',\n          message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n          cause: err,\n        });\n      }\n      maybeDispatchRPCEvent({\n        id: req.id,\n        method: req.method,\n        status: 'error',\n        durationMs: elapsedMs(startedAt),\n        error: rpcErr,\n      });\n      throw rpcErr;\n    } finally {\n      if (timeoutHandle !== undefined) {\n        clearTimeout(timeoutHandle);\n      }\n    }\n  }\n\n  async function callTyped<\n    TRouter extends AppletRPCSchema,\n    TMethod extends keyof TRouter & string,\n  >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n    return call(method, params) as Promise<TRouter[TMethod]['result']>;\n  }\n\n  return { call, callTyped };\n}\n\ntype RPCDevEvent = {\n  id: string\n  method: string\n  status: 'start' | 'success' | 'error'\n  durationMs?: number\n  error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n  if (typeof window === 'undefined') {return;}\n\n  if (!shouldEnableAppletDevtools()) {return;}\n\n  window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }));\n}\n\nfunction elapsedMs(startedAt: number): number {\n  const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n  return Math.max(0, Math.round(now - startedAt));\n}\n","/**\n * Error display utilities for structured RPC error handling.\n * Distinguishes permission-denied errors (amber styling) from generic errors (red styling).\n */\n\nimport { AppletRPCException } from '../../applet-host';\n\nexport interface RPCErrorDisplay {\n  title: string\n  description: string\n  isPermissionDenied: boolean\n}\n\nexport interface NormalizedRPCError extends RPCErrorDisplay {\n  code: string\n  retryable: boolean\n  userMessage: string\n  isTimeout: boolean\n  isOffline: boolean\n  isCanceled: boolean\n  isNotFound: boolean\n}\n\n/**\n * Check whether an error represents a permission-denied / forbidden response.\n */\nexport function isPermissionDeniedError(error: unknown): boolean {\n  if (!error) {return false;}\n\n  if (error instanceof Error) {\n    const msg = error.message.toLowerCase();\n    if (msg.includes('forbidden') || msg.includes('permission denied')) {return true;}\n  }\n\n  if (typeof error === 'object' && error !== null) {\n    const obj = error as Record<string, unknown>;\n\n    // RPC error shape: { code: 'forbidden' } or { status: 403 }\n    if (obj.code === 'forbidden' || obj.code === 403) {return true;}\n    if (obj.status === 403) {return true;}\n    if (obj.statusCode === 403) {return true;}\n\n    // Nested response: { response: { status: 403 } }\n    if (typeof obj.response === 'object' && obj.response !== null) {\n      const resp = obj.response as Record<string, unknown>;\n      if (resp.status === 403) {return true;}\n    }\n  }\n\n  if (typeof error === 'string') {\n    const lower = error.toLowerCase();\n    if (lower.includes('forbidden') || lower.includes('permission denied')) {return true;}\n  }\n\n  return false;\n}\n\nfunction extractStatus(error: unknown): number | undefined {\n  if (!error || typeof error !== 'object') {return undefined;}\n  const obj = error as Record<string, unknown>;\n\n  if (typeof obj.status === 'number') {return obj.status;}\n  if (typeof obj.statusCode === 'number') {return obj.statusCode;}\n\n  if (typeof obj.details === 'object' && obj.details !== null) {\n    const details = obj.details as Record<string, unknown>;\n    if (typeof details.status === 'number') {return details.status;}\n    if (typeof details.statusCode === 'number') {return details.statusCode;}\n  }\n\n  if (typeof obj.response === 'object' && obj.response !== null) {\n    const response = obj.response as Record<string, unknown>;\n    if (typeof response.status === 'number') {return response.status;}\n  }\n\n  return undefined;\n}\n\nfunction isOfflineNow(): boolean {\n  return typeof navigator !== 'undefined' && navigator.onLine === false;\n}\n\nfunction inferErrorCode(error: unknown): string {\n  if (isOfflineNow()) {return 'offline';}\n\n  if (error instanceof AppletRPCException) {\n    const code = String(error.code || '').toLowerCase().trim();\n    if (code) {return code;}\n  }\n\n  if (typeof error === 'object' && error !== null) {\n    const obj = error as Record<string, unknown>;\n    if (typeof obj.code === 'string' && obj.code.trim() !== '') {\n      return obj.code.toLowerCase();\n    }\n    if (typeof obj.error === 'string' && obj.error.trim() !== '') {\n      return obj.error.toLowerCase();\n    }\n  }\n\n  const status = extractStatus(error);\n  if (status === 401 || status === 403) {return 'forbidden';}\n  if (status === 404) {return 'not_found';}\n  if (status === 408) {return 'timeout';}\n  if (status === 413) {return 'payload_too_large';}\n  if (status === 429) {return 'rate_limited';}\n  if (status && status >= 500) {return 'server_error';}\n  if (status && status >= 400) {return 'bad_request';}\n\n  let message = '';\n  if (error instanceof Error) {message = error.message;}\n  if (!message && typeof error === 'string') {message = error;}\n  const lower = message.toLowerCase();\n\n  if (lower.includes('timeout') || lower.includes('timed out')) {return 'timeout';}\n  if (lower.includes('abort') || lower.includes('cancel')) {return 'aborted';}\n  if (lower.includes('forbidden') || lower.includes('permission denied')) {return 'forbidden';}\n  if (lower.includes('not found') || lower.includes('session not found')) {return 'not_found';}\n  if (lower.includes('payload too large') || lower.includes('request too large') || lower.includes('413')) {return 'payload_too_large';}\n  if (lower.includes('network') || lower.includes('failed to fetch')) {return 'network_error';}\n\n  return 'unknown';\n}\n\nfunction describeCode(code: string, fallbackTitle: string): { title: string; description: string; retryable: boolean } {\n  switch (code) {\n    case 'offline':\n      return {\n        title: 'You are offline',\n        description: 'Check your internet connection and try again.',\n        retryable: true,\n      };\n    case 'timeout':\n      return {\n        title: 'Request timed out',\n        description: 'The request took too long. Please try again.',\n        retryable: true,\n      };\n    case 'aborted':\n      return {\n        title: 'Request canceled',\n        description: 'The request was canceled before completion.',\n        retryable: true,\n      };\n    case 'forbidden':\n      return {\n        title: 'Access denied',\n        description: 'Your account does not have permission for this action.',\n        retryable: false,\n      };\n    case 'not_found':\n      return {\n        title: 'Not found',\n        description: 'The requested resource could not be found.',\n        retryable: false,\n      };\n    case 'payload_too_large':\n      return {\n        title: 'Attachment too large',\n        description: 'The uploaded payload exceeds allowed limits. Reduce file size and retry.',\n        retryable: false,\n      };\n    case 'invalid_request':\n    case 'validation':\n    case 'bad_request':\n      return {\n        title: 'Invalid request',\n        description: 'The request could not be processed. Review the input and try again.',\n        retryable: false,\n      };\n    case 'rate_limited':\n      return {\n        title: 'Too many requests',\n        description: 'Please wait a moment before trying again.',\n        retryable: true,\n      };\n    case 'http_error':\n    case 'server_error':\n      return {\n        title: 'Server error',\n        description: 'The server failed to process this request. Please retry shortly.',\n        retryable: true,\n      };\n    case 'network_error':\n      return {\n        title: 'Network error',\n        description: 'A network issue interrupted the request. Please try again.',\n        retryable: true,\n      };\n    default:\n      return {\n        title: fallbackTitle,\n        description: 'Something went wrong. Please try again.',\n        retryable: true,\n      };\n  }\n}\n\nexport function normalizeRPCError(error: unknown, fallbackTitle: string): NormalizedRPCError {\n  const code = inferErrorCode(error);\n  const base = describeCode(code, fallbackTitle);\n  const permissionDenied = code === 'forbidden' || isPermissionDeniedError(error);\n\n  let description = base.description;\n  if (error instanceof AppletRPCException && typeof error.message === 'string' && error.message.trim() !== '' && base.title === fallbackTitle) {\n    description = error.message;\n  } else if (error instanceof Error && error.message && code === 'unknown') {\n    description = error.message;\n  }\n\n  return {\n    code,\n    title: base.title,\n    description,\n    userMessage: description || base.title,\n    retryable: base.retryable,\n    isPermissionDenied: permissionDenied,\n    isTimeout: code === 'timeout',\n    isOffline: code === 'offline',\n    isCanceled: code === 'aborted',\n    isNotFound: code === 'not_found',\n  };\n}\n\n/**\n * Convert an unknown error into a structured display object.\n */\nexport function toErrorDisplay(error: unknown, fallbackTitle: string): RPCErrorDisplay {\n  const normalized = normalizeRPCError(error, fallbackTitle);\n  return {\n    title: normalized.title,\n    description: normalized.description,\n    isPermissionDenied: normalized.isPermissionDenied,\n  };\n}\n","import type { QueuedMessage } from '../types';\n\nconst STORAGE_PREFIX = 'bichat.queue.';\nconst MAX_BYTES = 512 * 1024; // 512KB safety limit for sessionStorage payloads\n\nfunction key(sessionId: string): string {\n  return `${STORAGE_PREFIX}${sessionId}`;\n}\n\nfunction safeSerialize(queue: QueuedMessage[]): string | null {\n  try {\n    const json = JSON.stringify(queue);\n    if (json.length > MAX_BYTES) {return null;}\n    return json;\n  } catch {\n    return null;\n  }\n}\n\nexport function saveQueue(sessionId: string, queue: QueuedMessage[]) {\n  if (typeof window === 'undefined') {return;}\n  if (!sessionId || sessionId === 'new') {return;}\n\n  try {\n    if (!queue || queue.length === 0) {\n      window.sessionStorage.removeItem(key(sessionId));\n      return;\n    }\n\n    const serialized = safeSerialize(queue);\n    if (!serialized) {return;}\n\n    window.sessionStorage.setItem(key(sessionId), serialized);\n  } catch {\n    // ignore storage errors (quota, privacy mode)\n  }\n}\n\nexport function loadQueue(sessionId: string): QueuedMessage[] {\n  if (typeof window === 'undefined') {return [];}\n  if (!sessionId || sessionId === 'new') {return [];}\n\n  try {\n    const raw = window.sessionStorage.getItem(key(sessionId));\n    if (!raw) {return [];}\n\n    const parsed = JSON.parse(raw) as unknown;\n    if (!Array.isArray(parsed)) {return [];}\n\n    // Minimal validation\n    return parsed\n      .map((item) => {\n        const obj = item as Record<string, unknown>;\n        return {\n          content: typeof obj?.content === 'string' ? obj.content : '',\n          attachments: Array.isArray(obj?.attachments) ? obj.attachments : [],\n        } satisfies QueuedMessage;\n      })\n      .filter((m) => m.content.trim() !== '' || (m.attachments?.length ?? 0) > 0);\n  } catch {\n    return [];\n  }\n}\n\nexport function clearQueue(sessionId: string) {\n  if (typeof window === 'undefined') {return;}\n  if (!sessionId || sessionId === 'new') {return;}\n  try {\n    window.sessionStorage.removeItem(key(sessionId));\n  } catch {\n    // ignore\n  }\n}\n\n","const STORAGE_PREFIX = 'bichat.debug.';\n\nfunction key(sessionId: string): string {\n  return `${STORAGE_PREFIX}${sessionId}`;\n}\n\nfunction isPersistableSessionId(sessionId: string): boolean {\n  return Boolean(sessionId && sessionId !== 'new');\n}\n\nexport function saveDebugMode(sessionId: string, enabled: boolean): void {\n  if (typeof window === 'undefined') {return;}\n  if (!isPersistableSessionId(sessionId)) {return;}\n\n  try {\n    if (enabled) {\n      window.sessionStorage.setItem(key(sessionId), '1');\n      return;\n    }\n    window.sessionStorage.removeItem(key(sessionId));\n  } catch {\n    // ignore storage errors (quota, privacy mode)\n  }\n}\n\nexport function loadDebugMode(sessionId: string): boolean {\n  if (typeof window === 'undefined') {return false;}\n  if (!isPersistableSessionId(sessionId)) {return false;}\n\n  try {\n    return window.sessionStorage.getItem(key(sessionId)) === '1';\n  } catch {\n    return false;\n  }\n}\n","const STORAGE_KEY = 'bichat.reasoningEffort';\n\nexport function saveReasoningEffort(effort: string): void {\n  if (typeof window === 'undefined') {\n    return;\n  }\n  try {\n    window.sessionStorage.setItem(STORAGE_KEY, effort);\n  } catch {\n    // ignore storage errors (quota, privacy mode)\n  }\n}\n\nexport function loadReasoningEffort(): string | null {\n  if (typeof window === 'undefined') {\n    return null;\n  }\n  try {\n    return window.sessionStorage.getItem(STORAGE_KEY);\n  } catch {\n    return null;\n  }\n}\n\nexport function clearReasoningEffort(): void {\n  if (typeof window === 'undefined') {\n    return;\n  }\n  try {\n    window.sessionStorage.removeItem(STORAGE_KEY);\n  } catch {\n    // ignore storage errors (quota, privacy mode)\n  }\n}\n","import type { ConversationTurn, DebugTrace, SessionDebugUsage } from '../types';\n\nexport function hasMeaningfulUsage(trace?: DebugTrace['usage']): boolean {\n  if (!trace) {return false;}\n  return (\n    trace.promptTokens > 0 ||\n    trace.completionTokens > 0 ||\n    trace.totalTokens > 0 ||\n    (trace.cachedTokens ?? 0) > 0 ||\n    (trace.cost ?? 0) > 0\n  );\n}\n\nexport function hasDebugTrace(trace: DebugTrace): boolean {\n  return (\n    trace.tools.length > 0 ||\n    (trace.attempts?.length ?? 0) > 0 ||\n    (trace.spans?.length ?? 0) > 0 ||\n    (trace.events?.length ?? 0) > 0 ||\n    hasMeaningfulUsage(trace.usage) ||\n    !!trace.generationMs ||\n    !!trace.traceId ||\n    !!trace.traceUrl ||\n    !!trace.thinking\n  );\n}\n\nexport function getSessionDebugUsage(turns: ConversationTurn[]): SessionDebugUsage {\n  let promptTokens = 0;\n  let completionTokens = 0;\n  let totalTokens = 0;\n  let turnsWithUsage = 0;\n  let latestPromptTokens = 0;\n  let latestCompletionTokens = 0;\n  let latestTotalTokens = 0;\n\n  for (const turn of turns) {\n    const usage = turn.assistantTurn?.debug?.usage;\n    if (!hasMeaningfulUsage(usage) || !usage) {\n      continue;\n    }\n\n    turnsWithUsage++;\n    promptTokens += usage.promptTokens;\n    completionTokens += usage.completionTokens;\n    totalTokens += usage.totalTokens;\n    latestPromptTokens = usage.promptTokens;\n    latestCompletionTokens = usage.completionTokens;\n    latestTotalTokens = usage.totalTokens;\n  }\n\n  return {\n    promptTokens,\n    completionTokens,\n    totalTokens,\n    turnsWithUsage,\n    latestPromptTokens,\n    latestCompletionTokens,\n    latestTotalTokens,\n  };\n}\n\n","/**\n * Type definitions for BI-Chat UI components\n */\n\n// ============================================================================\n// Session Types\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  owner?: SessionUser;\n  isGroup?: boolean;\n  memberCount?: number;\n  access?: SessionAccess;\n}\n\nexport interface SessionAccess {\n  role: \"owner\" | \"editor\" | \"viewer\" | \"read_all\" | \"none\";\n  source: \"owner\" | \"member\" | \"permission\" | \"none\";\n  canRead: boolean;\n  canWrite: boolean;\n  canManageMembers: boolean;\n}\n\n// ============================================================================\n// Turn-Based Architecture Types\n// ============================================================================\n\n/**\n * A conversation turn groups a user message with its assistant response.\n * This provides a cleaner mental model than flat message lists.\n */\nexport interface ConversationTurn {\n  id: string;\n  sessionId: string;\n  userTurn: UserTurn;\n  assistantTurn?: AssistantTurn;\n  createdAt: string;\n}\n\n/**\n * Content of a user's message in a conversation turn\n */\nexport interface UserTurn {\n  id: string;\n  content: string;\n  attachments: Attachment[];\n  author?: SessionUser;\n  createdAt: string;\n}\n\n/**\n * Assistant turn lifecycle used by renderers to distinguish completed output\n * from HITL checkpoints that require user input.\n */\nexport type AssistantTurnLifecycle = \"complete\" | \"waiting_for_human_input\";\n\n/**\n * Content of an assistant's response in a conversation turn\n */\nexport interface AssistantTurn {\n  id: string;\n  role: MessageRole;\n  content: string;\n  explanation?: string;\n  citations: Citation[];\n  toolCalls?: ToolCall[];\n  charts?: ChartData[];\n  renderTables?: RenderTableData[];\n  artifacts: Artifact[];\n  codeOutputs: CodeOutput[];\n  lifecycle: AssistantTurnLifecycle;\n  debug?: DebugTrace;\n  createdAt: string;\n}\n\n// ============================================================================\n// Message Role Enum\n// ============================================================================\n\n/**\n * Role of a message in a conversation\n */\nexport enum MessageRole {\n  User = \"user\",\n  Assistant = \"assistant\",\n  System = \"system\",\n  Tool = \"tool\",\n}\n\n// ============================================================================\n// Tool Call Types\n// ============================================================================\n\n/**\n * A tool/function call made by the assistant\n */\nexport interface ToolCall {\n  id: string;\n  name: string;\n  arguments: string;\n  result?: string;\n  error?: string;\n  durationMs?: number;\n}\n\n// ============================================================================\n// Citation Types\n// ============================================================================\n\n/**\n * Citation with position information for inline replacement\n */\nexport interface Citation {\n  id: string;\n  /** Type of citation (e.g., \"url_citation\") */\n  type: string;\n  /** Title of the cited source */\n  title: string;\n  /** URL of the cited source */\n  url: string;\n  /** Starting character index in the message content where this citation is referenced */\n  startIndex: number;\n  /** Ending character index in the message content where this citation is referenced */\n  endIndex: number;\n  /** Optional excerpt from the source */\n  excerpt?: string;\n}\n\nexport interface Attachment {\n  id?: string;\n  clientKey: string;\n  uploadId?: number;\n  filename: string;\n  mimeType: string;\n  sizeBytes: number;\n  base64Data?: string;\n  url?: string;\n  preview?: string;\n}\n\n// Image attachment with preview for MessageInput\nexport type ImageAttachment = Attachment & {\n  base64Data: string;\n  preview: string;\n};\n\n// ============================================================================\n// Code Interpreter Output Types\n// ============================================================================\n\n/**\n * Output from code interpreter tool\n */\nexport interface CodeOutput {\n  type: \"image\" | \"text\" | \"error\";\n  content: string;\n  /** File metadata for downloadable outputs */\n  filename?: string;\n  mimeType?: string;\n  sizeBytes?: number;\n}\n\n// ============================================================================\n// Message Queue Types\n// ============================================================================\n\n/**\n * Queued message for offline/loading state\n */\nexport interface QueuedMessage {\n  content: string;\n  attachments: Attachment[];\n}\n\n// ============================================================================\n// Chart Types (ApexCharts format)\n// ============================================================================\n\n/**\n * Chart visualization data for ApexCharts\n */\nexport interface ChartData {\n  /** Type of chart: line, bar, pie, area, or donut */\n  chartType: \"line\" | \"bar\" | \"area\" | \"pie\" | \"donut\";\n  /** Chart title displayed above the chart */\n  title: string;\n  /** Data series (multiple allowed for line/bar/area, single for pie/donut) */\n  series: ChartSeries[];\n  /** X-axis category labels or segment labels for pie/donut */\n  labels?: string[];\n  /** Hex color codes for series (e.g., '#4CAF50') */\n  colors?: string[];\n  /** Chart height in pixels */\n  height?: number;\n  /** Optional original Apex options (used by richer renderers) */\n  options?: Record<string, unknown>;\n  /** Optional logarithmic Y-axis hint */\n  logarithmic?: boolean;\n}\n\n/**\n * A single data series in a chart\n */\nexport interface ChartSeries {\n  /** Display name for this series */\n  name: string;\n  /** Numeric data values */\n  data: number[];\n}\n\nexport interface RenderTableExport {\n  url: string;\n  filename: string;\n  rowCount?: number;\n  fileSizeKB?: number;\n}\n\nexport interface RenderTableData {\n  id: string;\n  title?: string;\n  query: string;\n  columns: string[];\n  columnTypes?: string[];\n  headers: string[];\n  rows: unknown[][];\n  totalRows: number;\n  pageSize: number;\n  truncated: boolean;\n  truncatedReason?: string;\n  export?: RenderTableExport;\n  exportPrompt?: 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 SessionArtifact {\n  id: string;\n  sessionId: string;\n  messageId?: string;\n  uploadId?: number;\n  type: string;\n  name: string;\n  description?: string;\n  mimeType?: string;\n  url?: string;\n  sizeBytes: number;\n  metadata?: Record<string, unknown>;\n  createdAt: string;\n}\n\n// ============================================================================\n// HITL (Human-in-the-Loop) Question Types\n// ============================================================================\n\nexport interface PendingQuestion {\n  id: string;\n  turnId: string;\n  agentName?: string;\n  questions: Question[];\n  status:\n    | \"PENDING\"\n    | \"ANSWER_SUBMITTED\"\n    | \"REJECT_SUBMITTED\"\n    | \"ANSWER_RESUME_FAILED\"\n    | \"REJECT_RESUME_FAILED\"\n    | \"ANSWERED\"\n    | \"REJECTED\"\n    | \"CANCELLED\";\n}\n\nexport interface Question {\n  id: string;\n  text: string;\n  type: \"SINGLE_CHOICE\" | \"MULTIPLE_CHOICE\";\n  options?: QuestionOption[];\n  required?: boolean;\n}\n\nexport interface QuestionOption {\n  id: string;\n  label: string;\n  value: string;\n}\n\n/**\n * Answer data for a single question, including predefined options and custom \"Other\" text.\n */\nexport interface QuestionAnswerData {\n  /** Selected predefined options (option IDs) */\n  options: string[];\n  /** Custom text entered for an \"Other\" answer; mutually exclusive with options */\n  customText?: string;\n}\n\n/**\n * Map of question IDs to answer data.\n * Supports both multi-select options and custom \"Other\" text input.\n */\nexport interface QuestionAnswers {\n  [questionId: string]: QuestionAnswerData;\n}\n\n// ---------------------------------------------------------------------------\n// Activity Trace — ephemeral state during streaming\n// ---------------------------------------------------------------------------\n\n/**\n * A single step in the ephemeral activity trace shown during streaming.\n * Steps represent thinking, tool calls, or sub-agent delegations.\n */\nexport interface ActivityStep {\n  id: string;\n  type: \"thinking\" | \"tool\" | \"agent_delegation\";\n  toolName: string;\n  /** Raw tool arguments JSON string (used for label interpolation, e.g., delegation agent name). */\n  arguments?: string;\n  agentName?: string;\n  status: \"active\" | \"completed\" | \"failed\";\n  startedAt: number;\n  completedAt?: number;\n  durationMs?: number;\n  error?: string;\n}\n\n// ---------------------------------------------------------------------------\n// StreamEvent — discriminated union for type-safe stream handling\n// ---------------------------------------------------------------------------\n\nexport type StreamEvent =\n  | { type: \"content\"; content: string }\n  | { type: \"thinking\"; content: string }\n  | { type: \"tool_start\"; tool: StreamToolPayload }\n  | { type: \"tool_end\"; tool: StreamToolPayload }\n  | { type: \"usage\"; usage: DebugUsage }\n  | { type: \"user_message\"; sessionId: string }\n  | { type: \"interrupt\"; interrupt: StreamInterruptPayload; sessionId?: string }\n  | { type: \"text_block_end\"; seq: number }\n  | { type: \"done\"; sessionId?: string; generationMs?: number }\n  | { type: \"error\"; error: string };\n\n/** Partial state when resuming a stream after refresh */\nexport interface StreamSnapshotPayload {\n  partialContent?: string;\n  partialMetadata?: Record<string, unknown>;\n}\n\n/** Active stream status for a session (from GET /stream/status) */\nexport interface StreamStatus {\n  active: boolean;\n  runId?: string;\n  snapshot?: StreamSnapshotPayload;\n  startedAt?: number;\n}\n\nexport interface AsyncRunAccepted {\n  accepted: true;\n  operation: \"question_submit\" | \"question_reject\" | \"session_compact\";\n  sessionId: string;\n  runId: string;\n  startedAt: number;\n}\n\n/**\n * @deprecated Use `StreamEvent` instead. `StreamChunk` is kept for backwards\n * compatibility but the flat all-optional shape is unsound.\n */\nexport interface StreamChunk {\n  type:\n    | \"chunk\"\n    | \"content\"\n    | \"thinking\"\n    | \"tool_start\"\n    | \"tool_end\"\n    | \"usage\"\n    | \"done\"\n    | \"error\"\n    | \"user_message\"\n    | \"interrupt\"\n    | \"snapshot\"\n    | \"stream_started\"\n    | \"text_block_end\";\n  content?: string;\n  error?: string;\n  sessionId?: string;\n  usage?: DebugUsage;\n  tool?: StreamToolPayload;\n  interrupt?: StreamInterruptPayload;\n  generationMs?: number;\n  timestamp?: number;\n  snapshot?: StreamSnapshotPayload;\n  /** Set when type is 'stream_started'; client should store for refresh-safe resume */\n  runId?: string;\n  /**\n   * Zero-based ordinal of the assistant text segment that just ended.\n   * Populated only when type === \"text_block_end\". Used to split the\n   * accumulated assistant content into distinct blocks interleaved with\n   * tool_call UI (text → tool → text → tool → final_text).\n   */\n  textBlockSeq?: number;\n}\n\n/**\n * Per-tenant active-run status event. Delivered via the\n * GET /bi-chat/stream/active-runs SSE endpoint. The first batch after\n * connect carries `event === \"snapshot\"` for each currently-running\n * session; subsequent rows carry `event === \"update\"` as runs\n * transition (queued → streaming → completed / cancelled / failed).\n */\nexport interface ActiveRunDelivery {\n  event: \"snapshot\" | \"update\";\n  sessionId: string;\n  runId: string;\n  status: \"queued\" | \"streaming\" | \"completed\" | \"cancelled\" | \"failed\";\n  updatedAt: number;\n}\n\nexport interface StreamInterruptPayload {\n  checkpointId: string;\n  agentName?: string;\n  questions: StreamInterruptQuestion[];\n}\n\nexport interface StreamInterruptQuestion {\n  id: string;\n  text: string;\n  type: string;\n  options: Array<{ id: string; label: string }>;\n}\n\nexport interface DebugUsage {\n  promptTokens: number;\n  completionTokens: number;\n  totalTokens: number;\n  cachedTokens?: number;\n  cost?: number;\n}\n\nexport interface StreamToolPayload {\n  callId?: string;\n  name: string;\n  arguments?: string;\n  result?: string;\n  error?: string;\n  durationMs?: number;\n  agentName?: string;\n}\n\nexport interface DebugTrace {\n  schemaVersion?: string;\n  startedAt?: string;\n  completedAt?: string;\n  generationMs?: number;\n  usage?: DebugUsage;\n  tools: StreamToolPayload[];\n  attempts?: DebugGeneration[];\n  spans?: DebugSpan[];\n  events?: DebugEvent[];\n  traceId?: string;\n  traceUrl?: string;\n  sessionId?: string;\n  thinking?: string;\n  observationReason?: string;\n}\n\nexport interface DebugGeneration {\n  id?: string;\n  requestId?: string;\n  model?: string;\n  provider?: string;\n  finishReason?: string;\n  promptTokens?: number;\n  completionTokens?: number;\n  totalTokens?: number;\n  cachedTokens?: number;\n  cost?: number;\n  latencyMs?: number;\n  input?: string;\n  output?: string;\n  thinking?: string;\n  observationReason?: string;\n  startedAt?: string;\n  completedAt?: string;\n  toolCalls?: StreamToolPayload[];\n}\n\nexport interface DebugSpan {\n  id?: string;\n  parentId?: string;\n  generationId?: string;\n  name?: string;\n  type?: string;\n  status?: string;\n  level?: string;\n  callId?: string;\n  toolName?: string;\n  input?: string;\n  output?: string;\n  error?: string;\n  durationMs?: number;\n  startedAt?: string;\n  completedAt?: string;\n  attributes?: Record<string, unknown>;\n}\n\nexport interface DebugEvent {\n  id?: string;\n  name?: string;\n  type?: string;\n  level?: string;\n  message?: string;\n  reason?: string;\n  spanId?: string;\n  generationId?: string;\n  timestamp?: string;\n  attributes?: Record<string, unknown>;\n}\n\nexport interface DebugLimits {\n  policyMaxTokens: number;\n  modelMaxTokens: number;\n  effectiveMaxTokens: number;\n  completionReserveTokens: number;\n}\n\nexport interface SessionDebugUsage {\n  promptTokens: number;\n  completionTokens: number;\n  totalTokens: number;\n  turnsWithUsage: number;\n  latestPromptTokens: number;\n  latestCompletionTokens: number;\n  latestTotalTokens: number;\n}\n\nexport interface SendMessageOptions {\n  debugMode?: boolean;\n  replaceFromMessageID?: string;\n  reasoningEffort?: string;\n  model?: string;\n  /**\n   * Client-generated idempotency key. Duplicate sends sharing the same\n   * requestId within the backend's dedupe window (~30 min) converge on\n   * a single server-side run. Omit to disable dedupe for a particular\n   * send; the data source auto-generates one per call otherwise.\n   */\n  requestId?: string;\n}\n\n// ============================================================================\n// Data Source Interface\n// ============================================================================\n\nexport interface SessionListResult {\n  sessions: Session[];\n  total: number;\n  hasMore: boolean;\n}\n\nexport interface SessionUser {\n  id: string;\n  firstName: string;\n  lastName: string;\n  initials: string;\n}\n\nexport interface SessionMember {\n  user: SessionUser;\n  role: \"owner\" | \"editor\" | \"viewer\";\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface SessionGroup {\n  name: string;\n  sessions: Session[];\n}\n\n// Re-export split interfaces for consumers that only need a subset\nexport type {\n  SessionStore,\n  MessageTransport,\n  ArtifactStore,\n  AdminStore,\n} from \"./data-source\";\n\n/**\n * Full data source interface for BiChat.\n *\n * Combines session CRUD, message transport, and optional artifact/admin\n * methods. Existing implementations satisfy this without changes.\n *\n * For new code, prefer the focused interfaces (`SessionStore`,\n * `MessageTransport`, `ArtifactStore`, `AdminStore`) when you only need a\n * subset of capabilities.\n */\nexport interface ChatDataSource {\n  // Core operations\n  createSession(): Promise<Session>;\n  fetchSession(id: string): Promise<{\n    session: Session;\n    turns: ConversationTurn[];\n    pendingQuestion?: PendingQuestion | null;\n  } | null>;\n  fetchSessionArtifacts?(\n    sessionId: string,\n    options?: { limit?: number; offset?: number },\n  ): Promise<{\n    artifacts: SessionArtifact[];\n    hasMore?: boolean;\n    nextOffset?: number;\n  }>;\n  uploadSessionArtifacts?(\n    sessionId: string,\n    files: File[],\n  ): Promise<{ artifacts: SessionArtifact[] }>;\n  renameSessionArtifact?(\n    artifactId: string,\n    name: string,\n    description?: string,\n  ): Promise<SessionArtifact>;\n  deleteSessionArtifact?(artifactId: string): Promise<void>;\n  sendMessage(\n    sessionId: string,\n    content: string,\n    attachments?: Attachment[],\n    signal?: AbortSignal,\n    options?: SendMessageOptions,\n  ): AsyncGenerator<StreamChunk>;\n  clearSessionHistory(sessionId: string): Promise<{\n    success: boolean;\n    deletedMessages: number;\n    deletedArtifacts: number;\n  }>;\n  compactSessionHistory(sessionId: string): Promise<AsyncRunAccepted>;\n  submitQuestionAnswers(\n    sessionId: string,\n    questionId: string,\n    answers: QuestionAnswers,\n  ): Promise<{\n    success: boolean;\n    data?: AsyncRunAccepted;\n    error?: string;\n  }>;\n  rejectPendingQuestion(\n    sessionId: string,\n  ): Promise<{ success: boolean; data?: AsyncRunAccepted; error?: string }>;\n  /**\n   * Stops the active stream for the given session. No partial assistant message is persisted.\n   * Optional for backward compatibility with data sources that do not support stop.\n   */\n  stopGeneration?(sessionId: string): Promise<void>;\n  /**\n   * Returns active stream status for the session (for refresh-safe resume).\n   * Optional; if absent, no resume/passive flow is used.\n   */\n  getStreamStatus?(sessionId: string): Promise<StreamStatus | null>;\n  /**\n   * Resumes an active stream: delivers snapshot then new chunks. Use when getStreamStatus\n   * reported active and the client has the same-browser run marker.\n   * Optional; if absent, resume is not supported.\n   */\n  resumeStream?(\n    sessionId: string,\n    runId: string,\n    onChunk: (chunk: StreamChunk) => void,\n    signal?: AbortSignal,\n  ): Promise<void>;\n  /**\n   * Tail a run via native EventSource against GET /stream/events. Honours\n   * Last-Event-ID for auto-reconnect on wifi drops / tab sleep. Prefer\n   * over resumeStream when connecting to a run that was started by\n   * another tab (same request_id) or that needs to survive a reload\n   * via cursor-based replay. Optional; data sources that don't\n   * implement it fall back to resumeStream.\n   */\n  subscribeRunEvents?(\n    sessionId: string,\n    runId: string,\n    options: {\n      lastEventId?: string;\n      onChunk: (chunk: StreamChunk) => void;\n      onError?: (event: Event) => void;\n      signal?: AbortSignal;\n    },\n  ): Promise<void>;\n  /**\n   * Subscribe to the per-tenant active-run fan-out\n   * (GET /stream/active-runs). Emits one \"snapshot\" event per\n   * currently-running session on connect, then live \"update\" deltas.\n   * Optional; data sources that don't implement it fall back to\n   * per-session polling via getStreamStatus.\n   */\n  subscribeActiveRuns?(options: {\n    onEvent: (event: ActiveRunDelivery) => void;\n    onError?: (event: Event) => void;\n    signal?: AbortSignal;\n  }): Promise<void>;\n  // Session management\n  listSessions(options?: {\n    limit?: number;\n    offset?: number;\n    includeArchived?: boolean;\n  }): Promise<SessionListResult>;\n  archiveSession(sessionId: string): Promise<Session>;\n  unarchiveSession(sessionId: string): Promise<Session>;\n  pinSession(sessionId: string): Promise<Session>;\n  unpinSession(sessionId: string): Promise<Session>;\n  deleteSession(sessionId: string): Promise<void>;\n  renameSession(sessionId: string, title: string): Promise<Session>;\n  regenerateSessionTitle(sessionId: string): Promise<Session>;\n\n  // Organization-wide features (optional)\n  listUsers?(): Promise<SessionUser[]>;\n  listAllSessions?(options?: {\n    limit?: number;\n    offset?: number;\n    includeArchived?: boolean;\n    userId?: string | null;\n  }): Promise<{\n    sessions: Session[];\n    total: number;\n    hasMore: boolean;\n  }>;\n  listSessionMembers?(sessionId: string): Promise<SessionMember[]>;\n  addSessionMember?(\n    sessionId: string,\n    userId: string,\n    role: \"editor\" | \"viewer\",\n  ): Promise<void>;\n  updateSessionMemberRole?(\n    sessionId: string,\n    userId: string,\n    role: \"editor\" | \"viewer\",\n  ): Promise<void>;\n  removeSessionMember?(sessionId: string, userId: string): Promise<void>;\n}\n\n// ============================================================================\n// Context Value Types\n// ============================================================================\n\n// ============================================================================\n// Split Context Value Types\n// ============================================================================\n\nexport interface ChatSessionStateValue {\n  session: Session | null;\n  currentSessionId?: string;\n  fetching: boolean;\n  error: string | null;\n  errorRetryable: boolean;\n  debugMode: boolean;\n  sessionDebugUsage: SessionDebugUsage;\n  debugLimits: DebugLimits | null;\n  reasoningEffort: string | undefined;\n  reasoningEffortOptions: string[] | undefined;\n  model: string | undefined;\n  setError: (error: string | null) => void;\n  retryFetchSession: () => void;\n  setReasoningEffort: (effort: string) => void;\n  setModel: (model: string | undefined) => void;\n}\n\nexport interface ChatMessagingStateValue {\n  turns: ConversationTurn[];\n  streamingContent: string;\n  isStreaming: boolean;\n  streamError: string | null;\n  streamErrorRetryable: boolean;\n  loading: boolean;\n  pendingQuestion: PendingQuestion | null;\n  codeOutputs: CodeOutput[];\n  isCompacting: boolean;\n  compactionSummary: string | null;\n  /** Bumped when artifacts should be refetched (e.g. tool_end for artifact-producing tools). */\n  artifactsInvalidationTrigger: number;\n  /** Ephemeral reasoning/thinking content, cleared when final answer arrives. */\n  thinkingContent: string;\n  /** Ephemeral activity steps (tools, thinking, delegations), cleared on done. */\n  activeSteps: ActivityStep[];\n  showActivityTrace: boolean;\n  showTypingIndicator: boolean;\n  sendMessage: (content: string, attachments?: Attachment[]) => Promise<void>;\n  handleRegenerate?: (turnId: string, model?: string) => Promise<void>;\n  handleEdit?: (turnId: string, newContent: string) => Promise<void>;\n  handleCopy: (text: string) => Promise<void>;\n  handleSubmitQuestionAnswers: (answers: QuestionAnswers) => void;\n  handleRejectPendingQuestion: () => Promise<void>;\n  retryLastMessage: () => Promise<void>;\n  clearStreamError: () => void;\n  cancel: () => void;\n  setCodeOutputs: (outputs: CodeOutput[]) => void;\n}\n\nexport interface ChatInputStateValue {\n  message: string;\n  inputError: string | null;\n  messageQueue: QueuedMessage[];\n  setMessage: (message: string) => void;\n  setInputError: (error: string | null) => void;\n  handleSubmit: (\n    e: { preventDefault: () => void },\n    attachments?: Attachment[],\n  ) => void;\n  handleUnqueue: () => { content: string; attachments: Attachment[] } | null;\n  enqueueMessage: (content: string, attachments: Attachment[]) => boolean;\n  removeQueueItem: (index: number) => void;\n  updateQueueItem: (index: number, content: string) => void;\n}\n\n// ============================================================================\n// Combined Context Value (backwards compatible)\n// ============================================================================\n\nexport interface ChatSessionContextValue\n  extends ChatSessionStateValue,\n    ChatMessagingStateValue,\n    ChatInputStateValue {\n  /**\n   * @deprecated Use `retryLastMessage` from `ChatMessagingStateValue` instead.\n   * This field is not populated by the current ChatMachine-based provider and\n   * will always be `undefined` at runtime.\n   */\n  handleRetry?: () => Promise<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 * Pure helper functions for the ChatContext provider.\n * Extracted to keep the main provider file focused on state and handlers.\n */\n\nimport {\n  MessageRole,\n  type ConversationTurn,\n  type Attachment,\n  type DebugLimits,\n} from '../types';\n\n/** Tool names that produce persisted artifacts; must match server ArtifactHandler. */\nexport const ARTIFACT_TOOL_NAMES = new Set([\n  'code_interpreter',\n  'draw_chart',\n  'export_query_to_excel',\n  'export_data_to_excel',\n  'export_to_pdf',\n]);\n\nexport function generateTempId(prefix: string): string {\n  return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nexport function createPendingTurn(\n  sessionId: string,\n  content: string,\n  attachments: Attachment[] = []\n): ConversationTurn {\n  const now = new Date().toISOString();\n  return {\n    id: generateTempId('turn'),\n    sessionId,\n    userTurn: {\n      id: generateTempId('user'),\n      content,\n      attachments,\n      createdAt: now,\n    },\n    createdAt: now,\n  };\n}\n\nexport function createCompactedSystemTurn(sessionId: string, summary: string): ConversationTurn {\n  const now = new Date().toISOString();\n  return {\n    id: generateTempId('turn'),\n    sessionId,\n    userTurn: {\n      id: generateTempId('user'),\n      content: '',\n      attachments: [],\n      createdAt: now,\n    },\n    assistantTurn: {\n      id: generateTempId('assistant'),\n      role: MessageRole.System,\n      content: summary,\n      citations: [],\n      artifacts: [],\n      codeOutputs: [],\n      lifecycle: 'complete',\n      createdAt: now,\n    },\n    createdAt: now,\n  };\n}\n\nexport type SlashCommandName = '/clear' | '/debug' | '/compact'\n\nexport interface ParsedSlashCommand {\n  name: SlashCommandName\n  hasArgs: boolean\n}\n\nexport function parseSlashCommand(input: string): ParsedSlashCommand | null {\n  const trimmed = input.trim();\n  if (!trimmed.startsWith('/')) {return null;}\n\n  const parts = trimmed.split(/\\s+/).filter(Boolean);\n  if (parts.length === 0) {return null;}\n\n  const candidate = parts[0].toLowerCase();\n  if (candidate !== '/clear' && candidate !== '/debug' && candidate !== '/compact') {\n    return null;\n  }\n\n  return {\n    name: candidate,\n    hasArgs: parts.length > 1,\n  };\n}\n\nexport function readDebugLimitsFromGlobalContext(): DebugLimits | null {\n  if (typeof window === 'undefined') {\n    return null;\n  }\n\n  const limits = window.__APPLET_CONTEXT__?.extensions?.debug?.limits;\n  if (!limits) {\n    return null;\n  }\n\n  const {\n    policyMaxTokens,\n    modelMaxTokens,\n    effectiveMaxTokens,\n    completionReserveTokens,\n  } = limits;\n\n  if (\n    typeof policyMaxTokens !== 'number' ||\n    typeof modelMaxTokens !== 'number' ||\n    typeof effectiveMaxTokens !== 'number' ||\n    typeof completionReserveTokens !== 'number'\n  ) {\n    return null;\n  }\n\n  return {\n    policyMaxTokens,\n    modelMaxTokens,\n    effectiveMaxTokens,\n    completionReserveTokens,\n  };\n}\n\nexport function readReasoningEffortOptionsFromGlobalContext(): string[] | undefined {\n  if (typeof window === 'undefined') {\n    return undefined;\n  }\n\n  const opts = window.__APPLET_CONTEXT__?.extensions?.llm?.reasoningEffortOptions;\n  if (!Array.isArray(opts) || opts.length === 0) {\n    return undefined;\n  }\n\n  const filtered = opts.filter((o: unknown): o is string => typeof o === 'string');\n  if (filtered.length === 0) {\n    return undefined;\n  }\n\n  return filtered;\n}\n","/**\n * Snapshot derivation helpers for the ChatMachine.\n *\n * These are pure functions that derive public snapshots from internal state.\n */\n\nimport { getSessionDebugUsage } from '../utils/debugTrace';\nimport type { ChatMachineState, SessionSnapshot, MessagingSnapshot, InputSnapshot } from './types';\n\nexport function deriveDebugMode(state: ChatMachineState): boolean {\n  const key = state.session.currentSessionId || 'new';\n  return state.session.debugModeBySession[key] ?? false;\n}\n\nexport function deriveSessionSnapshot(\n  state: ChatMachineState,\n  methods: Pick<SessionSnapshot, 'setError' | 'retryFetchSession' | 'setReasoningEffort' | 'setModel'>\n): SessionSnapshot {\n  return {\n    session: state.session.session,\n    currentSessionId: state.session.currentSessionId,\n    fetching: state.session.fetching,\n    error: state.session.error,\n    errorRetryable: state.session.errorRetryable,\n    debugMode: deriveDebugMode(state),\n    sessionDebugUsage: getSessionDebugUsage(state.messaging.turns),\n    debugLimits: state.session.debugLimits,\n    reasoningEffort: state.session.reasoningEffort,\n    reasoningEffortOptions: state.session.reasoningEffortOptions,\n    model: state.session.model,\n    setError: methods.setError,\n    retryFetchSession: methods.retryFetchSession,\n    setReasoningEffort: methods.setReasoningEffort,\n    setModel: methods.setModel,\n  };\n}\n\nexport function deriveMessagingSnapshot(\n  state: ChatMachineState,\n  methods: Pick<\n    MessagingSnapshot,\n    | 'sendMessage'\n    | 'handleRegenerate'\n    | 'handleEdit'\n    | 'handleCopy'\n    | 'handleSubmitQuestionAnswers'\n    | 'handleRejectPendingQuestion'\n    | 'retryLastMessage'\n    | 'clearStreamError'\n    | 'cancel'\n    | 'setCodeOutputs'\n  >\n): MessagingSnapshot {\n  const {\n    turns, loading, isStreaming, streamingContent, isCompacting,\n    streamError, streamErrorRetryable, pendingQuestion, codeOutputs,\n    artifactsInvalidationTrigger, thinkingContent, activeSteps,\n    generationInProgress,\n  } = state.messaging;\n\n  // ---------------------------------------------------------------------------\n  // Activity indicator visibility\n  //\n  // UX phases during a streaming response:\n  //\n  //   Phase              | ActivityTrace | TypingIndicator\n  //   -------------------|:---:|:---:\n  //   Waiting            |  -  | visible    (message sent, no events yet)\n  //   Tool execution     | vis | visible    (tool events arriving, no content)\n  //   Streaming          |  -  |  -         (content flowing, all tools done)\n  //   Streaming + tools  | vis |  -         (content flowing, new tool starts)\n  // ---------------------------------------------------------------------------\n\n  const hasAnySteps = activeSteps.length > 0;\n  const hasActiveSteps = activeSteps.some(s => s.status === 'active');\n\n  // Before content: show if any steps exist (including completed).\n  // After content starts: show only if a tool is still actively running.\n  const showActivityTrace = !isCompacting && isStreaming\n    && (streamingContent ? hasActiveSteps : hasAnySteps);\n\n  const showTypingIndicator = !isCompacting && !thinkingContent && !streamingContent\n    && (loading || (isStreaming && hasAnySteps));\n\n  return {\n    turns,\n    streamingContent,\n    isStreaming,\n    streamError,\n    streamErrorRetryable,\n    loading,\n    pendingQuestion,\n    codeOutputs,\n    isCompacting,\n    compactionSummary: null,\n    artifactsInvalidationTrigger,\n    thinkingContent,\n    activeSteps,\n    generationInProgress,\n    showActivityTrace,\n    showTypingIndicator,\n    ...methods,\n  };\n}\n\nexport function deriveInputSnapshot(\n  state: ChatMachineState,\n  methods: Pick<\n    InputSnapshot,\n    | 'setMessage'\n    | 'setInputError'\n    | 'handleSubmit'\n    | 'handleUnqueue'\n    | 'enqueueMessage'\n    | 'removeQueueItem'\n    | 'updateQueueItem'\n  >\n): InputSnapshot {\n  return {\n    message: state.input.message,\n    inputError: state.input.inputError,\n    messageQueue: state.input.messageQueue,\n    ...methods,\n  };\n}\n","import type { AssistantTurn } from '../types';\n\nexport function isEmptyAssistantTurn(turn: AssistantTurn): boolean {\n  if (turn.content.trim().length > 0) {return false;}\n  if ((turn.explanation?.trim().length ?? 0) > 0) {return false;}\n  if ((turn.citations?.length ?? 0) > 0) {return false;}\n  if ((turn.toolCalls?.length ?? 0) > 0) {return false;}\n  if ((turn.charts?.length ?? 0) > 0) {return false;}\n  if ((turn.renderTables?.length ?? 0) > 0) {return false;}\n  if ((turn.artifacts?.length ?? 0) > 0) {return false;}\n  if ((turn.codeOutputs?.length ?? 0) > 0) {return false;}\n  if (turn.debug) {return false;}\n  return true;\n}\n\nexport function isPlaceholderWaitingAssistantTurn(turn: AssistantTurn): boolean {\n  return turn.lifecycle === 'waiting_for_human_input' && isEmptyAssistantTurn(turn);\n}\n\nexport function shouldRenderInlineRetry(turn: AssistantTurn, canRegenerate: boolean): boolean {\n  if (!canRegenerate) {return false;}\n  if (turn.lifecycle === 'waiting_for_human_input') {return false;}\n  return isEmptyAssistantTurn(turn);\n}\n","import type {\n  AssistantTurnLifecycle,\n  ConversationTurn,\n  PendingQuestion,\n  StreamInterruptPayload,\n} from \"../types\";\nimport { MessageRole } from \"../types\";\nimport { isPlaceholderWaitingAssistantTurn } from \"../utils/assistantTurnState\";\n\nexport function normalizeQuestionType(\n  rawType: unknown,\n): \"SINGLE_CHOICE\" | \"MULTIPLE_CHOICE\" {\n  const normalized = String(rawType || \"\")\n    .trim()\n    .toUpperCase()\n    .replace(/[\\s-]+/g, \"_\");\n  return normalized === \"MULTIPLE_CHOICE\" ? \"MULTIPLE_CHOICE\" : \"SINGLE_CHOICE\";\n}\n\nexport function isOpenQuestionStatus(\n  status: PendingQuestion[\"status\"] | undefined,\n): boolean {\n  return (\n    status === \"PENDING\" ||\n    status === \"ANSWER_SUBMITTED\" ||\n    status === \"REJECT_SUBMITTED\" ||\n    status === \"ANSWER_RESUME_FAILED\" ||\n    status === \"REJECT_RESUME_FAILED\"\n  );\n}\n\nexport function shouldPromptForHumanInput(\n  status: PendingQuestion[\"status\"] | undefined,\n): boolean {\n  return (\n    status === \"PENDING\" ||\n    status === \"ANSWER_RESUME_FAILED\" ||\n    status === \"REJECT_RESUME_FAILED\"\n  );\n}\n\nexport function pendingQuestionFromInterrupt(\n  interrupt: StreamInterruptPayload | undefined,\n  fallbackTurnId: string,\n): PendingQuestion | null {\n  if (!interrupt) {\n    return null;\n  }\n\n  const checkpointId = interrupt.checkpointId?.trim();\n  if (!checkpointId) {\n    return null;\n  }\n\n  const questions = Array.isArray(interrupt.questions)\n    ? interrupt.questions\n        .filter((question) => !!question && typeof question.id === \"string\")\n        .map((question) => ({\n          id: question.id,\n          text: typeof question.text === \"string\" ? question.text : \"\",\n          type: normalizeQuestionType(question.type),\n          options: Array.isArray(question.options)\n            ? question.options\n                .filter((option) => !!option && typeof option.id === \"string\")\n                .map((option) => ({\n                  id: option.id,\n                  label: typeof option.label === \"string\" ? option.label : \"\",\n                  value: option.id,\n                }))\n            : [],\n        }))\n    : [];\n\n  return {\n    id: checkpointId,\n    turnId: fallbackTurnId,\n    agentName: interrupt.agentName,\n    questions,\n    status: \"PENDING\",\n  };\n}\n\nexport function resolvePendingQuestionTurnIndex(\n  turns: ConversationTurn[],\n  pendingQuestion: PendingQuestion | null,\n): number {\n  if (\n    !pendingQuestion ||\n    !isOpenQuestionStatus(pendingQuestion.status) ||\n    turns.length === 0\n  ) {\n    return -1;\n  }\n\n  const pendingTurnId = pendingQuestion.turnId?.trim();\n  if (pendingTurnId) {\n    const explicitMatch = turns.findIndex(\n      (turn) =>\n        turn.id === pendingTurnId ||\n        turn.userTurn.id === pendingTurnId ||\n        turn.assistantTurn?.id === pendingTurnId,\n    );\n    if (explicitMatch !== -1) {\n      return explicitMatch;\n    }\n  }\n\n  for (let i = turns.length - 1; i >= 0; i--) {\n    if (turns[i].assistantTurn) {\n      return i;\n    }\n  }\n\n  return turns.length - 1;\n}\n\nexport function applyTurnLifecycleForPendingQuestion(\n  turns: ConversationTurn[],\n  pendingQuestion: PendingQuestion | null,\n): ConversationTurn[] {\n  const pendingIndex = resolvePendingQuestionTurnIndex(turns, pendingQuestion);\n  if (turns.length === 0) {\n    return turns;\n  }\n\n  let changed = false;\n  const nextTurns = turns.map((turn, index) => {\n    const shouldWaitForInput = pendingIndex === index;\n    const desiredLifecycle: AssistantTurnLifecycle = shouldWaitForInput\n      ? shouldPromptForHumanInput(pendingQuestion?.status)\n        ? \"waiting_for_human_input\"\n        : \"complete\"\n      : \"complete\";\n\n    if (!turn.assistantTurn) {\n      if (!shouldWaitForInput || !pendingQuestion) {\n        return turn;\n      }\n      changed = true;\n      return {\n        ...turn,\n        assistantTurn: {\n          id: `${pendingQuestion.id}-assistant`,\n          role: MessageRole.Assistant,\n          content: \"\",\n          citations: [],\n          artifacts: [],\n          codeOutputs: [],\n          lifecycle: desiredLifecycle,\n          createdAt: turn.createdAt,\n        },\n      };\n    }\n\n    if (\n      !shouldWaitForInput &&\n      isPlaceholderWaitingAssistantTurn(turn.assistantTurn)\n    ) {\n      changed = true;\n      return {\n        ...turn,\n        assistantTurn: undefined,\n      };\n    }\n\n    if (turn.assistantTurn.lifecycle === desiredLifecycle) {\n      return turn;\n    }\n\n    changed = true;\n    return {\n      ...turn,\n      assistantTurn: {\n        ...turn.assistantTurn,\n        lifecycle: desiredLifecycle,\n      },\n    };\n  });\n\n  return changed ? nextTurns : turns;\n}\n","/**\n * ChatMachine — framework-agnostic state machine for BiChat.\n *\n * Owns all async logic that was previously in ChatContext.tsx:\n * - Session fetch (with race-condition guards)\n * - Message sending + streaming\n * - Slash commands (/debug, /clear, /compact)\n * - HITL question submission / rejection\n * - Message queue (auto-drain)\n * - Rate limiting\n * - Abort / cancel\n *\n * Zero React dependency. Designed for `useSyncExternalStore`:\n * three subscribe/getSnapshot pairs map to the existing 3-context split.\n */\n\nimport type {\n  ChatDataSource,\n  ConversationTurn,\n  CodeOutput,\n  Attachment,\n  PendingQuestion,\n  QuestionAnswers,\n  SendMessageOptions,\n  SessionDebugUsage,\n  ActivityStep,\n} from \"../types\";\nimport type { RateLimiter } from \"../utils/RateLimiter\";\nimport { normalizeRPCError } from \"../utils/errorDisplay\";\nimport { loadQueue, saveQueue } from \"../utils/queueStorage\";\nimport { loadDebugMode, saveDebugMode } from \"../utils/debugModeStorage\";\nimport {\n  clearReasoningEffort,\n  loadReasoningEffort,\n  saveReasoningEffort,\n} from \"../utils/reasoningEffortStorage\";\nimport { getSessionDebugUsage } from \"../utils/debugTrace\";\nimport {\n  ARTIFACT_TOOL_NAMES,\n  createPendingTurn,\n  createCompactedSystemTurn,\n  parseSlashCommand,\n  readDebugLimitsFromGlobalContext,\n  readReasoningEffortOptionsFromGlobalContext,\n  type ParsedSlashCommand,\n} from \"../context/chatHelpers\";\nimport type {\n  ChatMachineConfig,\n  ChatMachineState,\n  SessionSnapshot,\n  MessagingSnapshot,\n  InputSnapshot,\n  LastSendAttempt,\n} from \"./types\";\nimport {\n  deriveSessionSnapshot,\n  deriveMessagingSnapshot,\n  deriveInputSnapshot,\n  deriveDebugMode,\n} from \"./selectors\";\nimport {\n  applyTurnLifecycleForPendingQuestion,\n  isOpenQuestionStatus,\n  pendingQuestionFromInterrupt,\n} from \"./hitlLifecycle\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Listener = () => void;\n\nconst MAX_QUEUE_SIZE = 5;\nconst RUN_MARKER_PREFIX = \"bichat.run.\";\n/** Interval (ms) for polling stream status when another tab has an active generation. */\nconst PASSIVE_POLL_INTERVAL_MS = 2000;\n\nfunction getRunMarkerKey(sessionId: string): string {\n  return `${RUN_MARKER_PREFIX}${sessionId}`;\n}\n\nfunction setRunMarker(sessionId: string, runId: string): void {\n  if (typeof window === \"undefined\" || !sessionId || sessionId === \"new\") {\n    return;\n  }\n  try {\n    window.sessionStorage.setItem(getRunMarkerKey(sessionId), runId);\n  } catch {\n    // ignore\n  }\n}\n\nfunction getRunMarker(sessionId: string): string | null {\n  if (typeof window === \"undefined\" || !sessionId || sessionId === \"new\") {\n    return null;\n  }\n  try {\n    return window.sessionStorage.getItem(getRunMarkerKey(sessionId));\n  } catch {\n    return null;\n  }\n}\n\nfunction clearRunMarker(sessionId: string): void {\n  if (typeof window === \"undefined\" || !sessionId || sessionId === \"new\") {\n    return;\n  }\n  try {\n    window.sessionStorage.removeItem(getRunMarkerKey(sessionId));\n  } catch {\n    // ignore\n  }\n}\n\n// ---------------------------------------------------------------------------\n// ChatMachine\n// ---------------------------------------------------------------------------\n\nexport class ChatMachine {\n  // ── Config ──────────────────────────────────────────────────────────────\n  private dataSource: ChatDataSource;\n  private rateLimiter: RateLimiter;\n  private onSessionCreated?: (sessionId: string) => void;\n\n  // ── Internal state ──────────────────────────────────────────────────────\n  private state: ChatMachineState;\n\n  // ── Refs (mutable, no subscription) ─────────────────────────────────────\n  private abortController: AbortController | null = null;\n  private lastSendAttempt: LastSendAttempt | null = null;\n  /** Prevents fetchSession effect from clobbering state while stream is active. */\n  private sendingSessionId: string | null = null;\n  /**\n   * Monotonic counter bumped on every real session switch. An async op (send\n   * stream, post-stream sync, queue drain, resume, HITL) captures it at start\n   * and re-checks before writing to the single shared `state.messaging`; a stale\n   * epoch means the user navigated to a different session, so the write is\n   * dropped instead of bleeding into / clobbering the now-visible session.\n   */\n  private viewEpoch = 0;\n  private fetchCancelled = false;\n  private disposed = false;\n  private reasoningEffortOptions: string[] | null = null;\n  private reasoningEffortOptionSet: Set<string> | null = null;\n  /** Memoized sessionDebugUsage — avoids unnecessary session re-renders during streaming. */\n  private lastSessionDebugUsage: SessionDebugUsage | null = null;\n  /** Interval handle for passive polling when another tab has an active stream. */\n  private passivePollingId: ReturnType<typeof setInterval> | null = null;\n\n  // ── Listeners ───────────────────────────────────────────────────────────\n  private sessionListeners = new Set<Listener>();\n  private messagingListeners = new Set<Listener>();\n  private inputListeners = new Set<Listener>();\n\n  // ── Snapshot caches (for useSyncExternalStore identity stability) ───────\n  private cachedSessionSnapshot: SessionSnapshot | null = null;\n  private cachedMessagingSnapshot: MessagingSnapshot | null = null;\n  private cachedInputSnapshot: InputSnapshot | null = null;\n  private sessionSnapshotVersion = 0;\n  private messagingSnapshotVersion = 0;\n  private inputSnapshotVersion = 0;\n  private lastSessionSnapshotVersion = -1;\n  private lastMessagingSnapshotVersion = -1;\n  private lastInputSnapshotVersion = -1;\n\n  // ── Bound method references (stable identity) ──────────────────────────\n  readonly setError: (error: string | null) => void;\n  readonly retryFetchSession: () => void;\n  readonly sendMessage: (\n    content: string,\n    attachments?: Attachment[],\n  ) => Promise<void>;\n  readonly handleRegenerate: (turnId: string, model?: string) => Promise<void>;\n  readonly handleEdit: (turnId: string, newContent: string) => Promise<void>;\n  readonly handleCopy: (text: string) => Promise<void>;\n  readonly handleSubmitQuestionAnswers: (answers: QuestionAnswers) => void;\n  readonly handleRejectPendingQuestion: () => Promise<void>;\n  readonly retryLastMessage: () => Promise<void>;\n  readonly clearStreamError: () => void;\n  readonly cancel: () => void;\n  readonly setCodeOutputs: (outputs: CodeOutput[]) => void;\n  readonly setMessage: (message: string) => void;\n  readonly setInputError: (error: string | null) => void;\n  readonly handleSubmit: (\n    e: { preventDefault: () => void },\n    attachments?: Attachment[],\n  ) => void;\n  readonly handleUnqueue: () => {\n    content: string;\n    attachments: Attachment[];\n  } | null;\n  readonly enqueueMessage: (\n    content: string,\n    attachments: Attachment[],\n  ) => boolean;\n  readonly removeQueueItem: (index: number) => void;\n  readonly updateQueueItem: (index: number, content: string) => void;\n  readonly setReasoningEffort: (effort: string) => void;\n  readonly setModel: (model: string | undefined) => void;\n\n  constructor(config: ChatMachineConfig) {\n    this.dataSource = config.dataSource;\n    this.rateLimiter = config.rateLimiter;\n    this.onSessionCreated = config.onSessionCreated;\n    this.reasoningEffortOptions = this.buildReasoningEffortOptions();\n    this.reasoningEffortOptionSet = this.reasoningEffortOptions\n      ? new Set(this.reasoningEffortOptions)\n      : null;\n    const initialReasoningEffort = this.sanitizeReasoningEffort(\n      loadReasoningEffort() || undefined,\n    );\n    if (!initialReasoningEffort) {\n      clearReasoningEffort();\n    }\n\n    this.state = {\n      session: {\n        currentSessionId: undefined,\n        session: null,\n        fetching: false,\n        error: null,\n        errorRetryable: false,\n        debugModeBySession: {},\n        debugLimits: readDebugLimitsFromGlobalContext(),\n        reasoningEffort: initialReasoningEffort,\n        reasoningEffortOptions: this.reasoningEffortOptions ?? undefined,\n        model: undefined,\n      },\n      messaging: {\n        turns: [],\n        streamingContent: \"\",\n        isStreaming: false,\n        streamError: null,\n        streamErrorRetryable: false,\n        loading: false,\n        pendingQuestion: null,\n        codeOutputs: [],\n        isCompacting: false,\n        artifactsInvalidationTrigger: 0,\n        thinkingContent: \"\",\n        activeSteps: [],\n        generationInProgress: false,\n      },\n      input: {\n        message: \"\",\n        inputError: null,\n        messageQueue: [],\n      },\n    };\n\n    // Bind all public methods once (stable references)\n    this.setError = this._setError.bind(this);\n    this.retryFetchSession = this._retryFetchSession.bind(this);\n    this.sendMessage = this._sendMessage.bind(this);\n    this.handleRegenerate = this._handleRegenerate.bind(this);\n    this.handleEdit = this._handleEdit.bind(this);\n    this.handleCopy = this._handleCopy.bind(this);\n    this.handleSubmitQuestionAnswers =\n      this._handleSubmitQuestionAnswers.bind(this);\n    this.handleRejectPendingQuestion =\n      this._handleRejectPendingQuestion.bind(this);\n    this.retryLastMessage = this._retryLastMessage.bind(this);\n    this.clearStreamError = this._clearStreamError.bind(this);\n    this.cancel = this._cancel.bind(this);\n    this.setCodeOutputs = this._setCodeOutputs.bind(this);\n    this.setMessage = this._setMessage.bind(this);\n    this.setInputError = this._setInputError.bind(this);\n    this.handleSubmit = this._handleSubmit.bind(this);\n    this.handleUnqueue = this._handleUnqueue.bind(this);\n    this.enqueueMessage = this._enqueueMessage.bind(this);\n    this.removeQueueItem = this._removeQueueItem.bind(this);\n    this.updateQueueItem = this._updateQueueItem.bind(this);\n    this.setReasoningEffort = this._setReasoningEffort.bind(this);\n    this.setModel = this._setModel.bind(this);\n  }\n\n  private buildReasoningEffortOptions(): string[] | null {\n    const options = readReasoningEffortOptionsFromGlobalContext();\n    if (!options || options.length === 0) {\n      return null;\n    }\n    return options;\n  }\n\n  // Keep outbound payloads constrained to server-declared options.\n  private sanitizeReasoningEffort(\n    effort: string | undefined,\n  ): string | undefined {\n    if (\n      !effort ||\n      !this.reasoningEffortOptionSet ||\n      this.reasoningEffortOptionSet.size === 0\n    ) {\n      return undefined;\n    }\n    return this.reasoningEffortOptionSet.has(effort) ? effort : undefined;\n  }\n\n  // =====================================================================\n  // Lifecycle\n  // =====================================================================\n\n  /**\n   * Set the active session ID. Triggers fetch when transitioning to a real\n   * session, or resets state for 'new'/undefined.\n   */\n  setSessionId(id: string | undefined): void {\n    if (this.disposed) {\n      return;\n    }\n    const prev = this.state.session.currentSessionId;\n    if (id === prev) {\n      return;\n    }\n\n    // A different session is being shown. Invalidate any in-flight send/stream\n    // for the previous session so its chunks, post-stream sync, and queue drain\n    // can't write into this new view, and cancel the network stream + old poll.\n    this.viewEpoch++;\n    this.abortController?.abort();\n    this.sendingSessionId = null;\n    this._stopPassivePolling();\n\n    // Clear the previous session's transient streaming state so it doesn't bleed\n    // into the new view. Persisted turns/pendingQuestion are loaded by the fetch\n    // below; a background run for the new session is re-detected by its status\n    // check and re-sets these as needed.\n    this._updateMessaging({\n      streamingContent: \"\",\n      thinkingContent: \"\",\n      activeSteps: [],\n      isStreaming: false,\n      loading: false,\n      generationInProgress: false,\n      streamError: null,\n      streamErrorRetryable: false,\n    });\n\n    this.state.session.currentSessionId = id;\n    this._hydrateDebugModeForSession(id);\n    this._notifySession();\n\n    // Reset queue for new session\n    if (!id || id === \"new\") {\n      this._updateInput({ messageQueue: [] });\n    } else {\n      this._updateInput({ messageQueue: loadQueue(id) });\n    }\n\n    this._fetchSessionIfNeeded();\n  }\n\n  /**\n   * Update mutable config that may change across parent re-renders.\n   * Called from the React provider's useEffect to keep the machine in sync.\n   */\n  updateConfig(\n    config: Pick<ChatMachineConfig, \"dataSource\" | \"onSessionCreated\">,\n  ): void {\n    this.dataSource = config.dataSource;\n    this.onSessionCreated = config.onSessionCreated;\n  }\n\n  dispose(): void {\n    this.disposed = true;\n    this.fetchCancelled = true;\n    this._stopPassivePolling();\n    this.abortController?.abort();\n    this.sessionListeners.clear();\n    this.messagingListeners.clear();\n    this.inputListeners.clear();\n  }\n\n  // =====================================================================\n  // Subscribe / getSnapshot (for useSyncExternalStore)\n  // =====================================================================\n\n  subscribeSession = (listener: Listener): (() => void) => {\n    this.sessionListeners.add(listener);\n    return () => {\n      this.sessionListeners.delete(listener);\n    };\n  };\n\n  getSessionSnapshot = (): SessionSnapshot => {\n    if (this.lastSessionSnapshotVersion !== this.sessionSnapshotVersion) {\n      this.cachedSessionSnapshot = deriveSessionSnapshot(this.state, {\n        setError: this.setError,\n        retryFetchSession: this.retryFetchSession,\n        setReasoningEffort: this.setReasoningEffort,\n        setModel: this.setModel,\n      });\n      this.lastSessionSnapshotVersion = this.sessionSnapshotVersion;\n    }\n    return this.cachedSessionSnapshot!;\n  };\n\n  subscribeMessaging = (listener: Listener): (() => void) => {\n    this.messagingListeners.add(listener);\n    return () => {\n      this.messagingListeners.delete(listener);\n    };\n  };\n\n  getMessagingSnapshot = (): MessagingSnapshot => {\n    if (this.lastMessagingSnapshotVersion !== this.messagingSnapshotVersion) {\n      this.cachedMessagingSnapshot = deriveMessagingSnapshot(this.state, {\n        sendMessage: this.sendMessage,\n        handleRegenerate: this.handleRegenerate,\n        handleEdit: this.handleEdit,\n        handleCopy: this.handleCopy,\n        handleSubmitQuestionAnswers: this.handleSubmitQuestionAnswers,\n        handleRejectPendingQuestion: this.handleRejectPendingQuestion,\n        retryLastMessage: this.retryLastMessage,\n        clearStreamError: this.clearStreamError,\n        cancel: this.cancel,\n        setCodeOutputs: this.setCodeOutputs,\n      });\n      this.lastMessagingSnapshotVersion = this.messagingSnapshotVersion;\n    }\n    return this.cachedMessagingSnapshot!;\n  };\n\n  subscribeInput = (listener: Listener): (() => void) => {\n    this.inputListeners.add(listener);\n    return () => {\n      this.inputListeners.delete(listener);\n    };\n  };\n\n  getInputSnapshot = (): InputSnapshot => {\n    if (this.lastInputSnapshotVersion !== this.inputSnapshotVersion) {\n      this.cachedInputSnapshot = deriveInputSnapshot(this.state, {\n        setMessage: this.setMessage,\n        setInputError: this.setInputError,\n        handleSubmit: this.handleSubmit,\n        handleUnqueue: this.handleUnqueue,\n        enqueueMessage: this.enqueueMessage,\n        removeQueueItem: this.removeQueueItem,\n        updateQueueItem: this.updateQueueItem,\n      });\n      this.lastInputSnapshotVersion = this.inputSnapshotVersion;\n    }\n    return this.cachedInputSnapshot!;\n  };\n\n  // =====================================================================\n  // Private — state updates + notification\n  // =====================================================================\n\n  private _updateSession(patch: Partial<typeof this.state.session>): void {\n    Object.assign(this.state.session, patch);\n    this._notifySession();\n  }\n\n  private _notifySession(): void {\n    this.sessionSnapshotVersion++;\n    for (const fn of this.sessionListeners) {\n      fn();\n    }\n  }\n\n  private _updateMessaging(patch: Partial<typeof this.state.messaging>): void {\n    Object.assign(this.state.messaging, patch);\n    this._notifyMessaging();\n    // sessionDebugUsage is derived from turns — only notify session listeners\n    // when the derived usage actually changes (avoids re-renders during streaming).\n    if (\"turns\" in patch) {\n      const newUsage = getSessionDebugUsage(this.state.messaging.turns);\n      if (!sessionDebugUsageEqual(this.lastSessionDebugUsage, newUsage)) {\n        this.lastSessionDebugUsage = newUsage;\n        this._notifySession();\n      }\n    }\n  }\n\n  private _notifyMessaging(): void {\n    this.messagingSnapshotVersion++;\n    for (const fn of this.messagingListeners) {\n      fn();\n    }\n  }\n\n  private _updateInput(patch: Partial<typeof this.state.input>): void {\n    Object.assign(this.state.input, patch);\n    // Only persist queue to sessionStorage when it actually changed\n    if (\"messageQueue\" in patch) {\n      this._persistQueue();\n    }\n    this._notifyInput();\n  }\n\n  private _notifyInput(): void {\n    this.inputSnapshotVersion++;\n    for (const fn of this.inputListeners) {\n      fn();\n    }\n  }\n\n  private _persistQueue(): void {\n    const sid = this.state.session.currentSessionId;\n    if (!sid || sid === \"new\") {\n      return;\n    }\n    saveQueue(sid, this.state.input.messageQueue);\n  }\n\n  /**\n   * True while `epoch` is still the active view — i.e. the machine has not been\n   * disposed and no session switch has happened since `epoch` was captured.\n   * Async ops gate their writes to the shared messaging state on this.\n   */\n  private _isCurrentEpoch(epoch: number): boolean {\n    return !this.disposed && this.viewEpoch === epoch;\n  }\n\n  /** A send can't start while generating, mid-resume, or with an open question. */\n  private _isBlockedForSend(): boolean {\n    return (\n      this.state.messaging.loading ||\n      this.state.messaging.generationInProgress ||\n      isOpenQuestionStatus(this.state.messaging.pendingQuestion?.status)\n    );\n  }\n\n  /**\n   * Send the next queued message, but only if we still own the view (`epoch`)\n   * and nothing is blocking (an in-flight generation or an open question). The\n   * item is dequeued optimistically and restored to the front if it turns out we\n   * can't send when the deferred tick fires — so a queued message is never\n   * silently dropped.\n   */\n  private _drainQueueIfReady(epoch: number): void {\n    if (!this._isCurrentEpoch(epoch)) {\n      return;\n    }\n    const queue = this.state.input.messageQueue;\n    if (queue.length === 0 || this._isBlockedForSend()) {\n      return;\n    }\n    const next = queue[0];\n    this._updateInput({ messageQueue: queue.slice(1) });\n    // Defer to avoid a reentrant send within the current call stack.\n    setTimeout(() => {\n      if (!this._isCurrentEpoch(epoch)) {\n        return;\n      }\n      if (this._isBlockedForSend()) {\n        // Became blocked between dequeue and now — put it back, don't drop it.\n        this._updateInput({\n          messageQueue: [next, ...this.state.input.messageQueue],\n        });\n        return;\n      }\n      this._sendMessageCore(next.content, next.attachments);\n    }, 0);\n  }\n\n  private _setDebugModeForSession(sessionId: string, enabled: boolean): void {\n    const nextDebugModeBySession = { ...this.state.session.debugModeBySession };\n    if (enabled) {\n      nextDebugModeBySession[sessionId] = true;\n    } else {\n      delete nextDebugModeBySession[sessionId];\n    }\n\n    this._updateSession({ debugModeBySession: nextDebugModeBySession });\n    saveDebugMode(sessionId, enabled);\n  }\n\n  private _hydrateDebugModeForSession(sessionId: string | undefined): void {\n    if (!sessionId || sessionId === \"new\") {\n      return;\n    }\n    if (this.state.session.debugModeBySession[sessionId] === true) {\n      return;\n    }\n    if (!loadDebugMode(sessionId)) {\n      return;\n    }\n\n    this._updateSession({\n      debugModeBySession: {\n        ...this.state.session.debugModeBySession,\n        [sessionId]: true,\n      },\n    });\n  }\n\n  private _setReasoningEffort(effort: string): void {\n    const next = this.sanitizeReasoningEffort(effort);\n    this._updateSession({ reasoningEffort: next });\n    if (next) {\n      saveReasoningEffort(next);\n      return;\n    }\n    clearReasoningEffort();\n  }\n\n  private _setModel(model: string | undefined): void {\n    this._updateSession({ model });\n  }\n\n  // =====================================================================\n  // Private — session fetch\n  // =====================================================================\n\n  private _fetchSessionIfNeeded(): void {\n    const id = this.state.session.currentSessionId;\n    if (!id || id === \"new\") {\n      this._updateSession({\n        session: null,\n        fetching: false,\n        error: null,\n        errorRetryable: false,\n      });\n      this._updateMessaging({\n        turns: [],\n        pendingQuestion: null,\n      });\n      this._updateInput({ inputError: null });\n      return;\n    }\n\n    // Skip while stream is managing this session\n    if (this.sendingSessionId === id) {\n      return;\n    }\n\n    this.fetchCancelled = false;\n    this._updateSession({ fetching: true, error: null, errorRetryable: false });\n    this._updateInput({ inputError: null });\n\n    const fetchId = id;\n    this.dataSource\n      .fetchSession(fetchId)\n      .then((result) => {\n        if (this.fetchCancelled || this.disposed) {\n          return;\n        }\n        if (this.state.session.currentSessionId !== fetchId) {\n          return;\n        }\n        if (this.sendingSessionId === fetchId) {\n          return;\n        }\n\n        if (result) {\n          this._updateSession({ session: result.session, fetching: false });\n          this._setTurnsFromFetch(result.turns, result.pendingQuestion || null);\n          this._checkStreamStatusAndResumeOrPoll(fetchId);\n        } else {\n          this._updateSession({ error: \"Session not found\", fetching: false });\n        }\n      })\n      .catch((err) => {\n        if (this.fetchCancelled || this.disposed) {\n          return;\n        }\n        if (this.state.session.currentSessionId !== fetchId) {\n          return;\n        }\n        if (this.sendingSessionId === fetchId) {\n          return;\n        }\n        const normalized = normalizeRPCError(err, \"Failed to load session\");\n        this._updateSession({\n          error: normalized.userMessage,\n          errorRetryable: normalized.retryable,\n          fetching: false,\n        });\n      });\n  }\n\n  /**\n   * Sets turns from fetch, preserving pending user-only turns if server hasn't caught up.\n   * Applies `turns` + optional `pendingQuestion` in a single messaging update to avoid\n   * transient intermediate UI states between separate notifications.\n   */\n  private _setTurnsFromFetch(\n    fetchedTurns: ConversationTurn[],\n    pendingQuestion?: PendingQuestion | null,\n  ): void {\n    if (!Array.isArray(fetchedTurns)) {\n      console.warn(\n        \"[ChatMachine] Ignoring malformed turns payload from fetchSession\",\n      );\n      return;\n    }\n    const prev = this.state.messaging.turns;\n    const hasPendingUserOnly =\n      prev.length > 0 && !prev[prev.length - 1].assistantTurn;\n    const patch: Partial<typeof this.state.messaging> = {};\n    const effectivePendingQuestion =\n      pendingQuestion === undefined\n        ? this.state.messaging.pendingQuestion\n        : pendingQuestion;\n\n    if (pendingQuestion !== undefined) {\n      patch.pendingQuestion = pendingQuestion;\n    }\n\n    if (hasPendingUserOnly && (!fetchedTurns || fetchedTurns.length === 0)) {\n      const lifecycleTurns = applyTurnLifecycleForPendingQuestion(\n        prev,\n        effectivePendingQuestion,\n      );\n      if (lifecycleTurns !== prev) {\n        patch.turns = lifecycleTurns;\n      }\n      if (Object.keys(patch).length > 0) {\n        this._updateMessaging(patch);\n      }\n      return; // keep optimistic turn\n    }\n\n    patch.turns = applyTurnLifecycleForPendingQuestion(\n      fetchedTurns ?? prev,\n      effectivePendingQuestion,\n    );\n    this._updateMessaging(patch);\n  }\n\n  /**\n   * After fetch: if backend has an active stream, either resume (same-browser) or poll (passive).\n   */\n  private _checkStreamStatusAndResumeOrPoll(sessionId: string): void {\n    if (!this.dataSource.getStreamStatus || !this.dataSource.resumeStream) {\n      return;\n    }\n    this.dataSource\n      .getStreamStatus(sessionId)\n      .then((status) => {\n        if (this.fetchCancelled || this.disposed) {\n          return;\n        }\n        if (this.state.session.currentSessionId !== sessionId) {\n          return;\n        }\n        if (this.sendingSessionId === sessionId) {\n          return;\n        }\n        if (!status?.active || !status.runId) {\n          this._updateMessaging({ generationInProgress: false });\n          return;\n        }\n        const storedRunId = getRunMarker(sessionId);\n        if (storedRunId === status.runId) {\n          this._runResumeStream(sessionId, status.runId).catch(() => {\n            clearRunMarker(sessionId);\n            this._updateMessaging({ generationInProgress: false });\n          });\n        } else {\n          this._updateMessaging({ generationInProgress: true });\n          this._startPassivePolling(sessionId);\n        }\n      })\n      .catch(() => {\n        this._updateMessaging({ generationInProgress: false });\n      });\n  }\n\n  private _stopPassivePolling(): void {\n    if (this.passivePollingId) {\n      clearInterval(this.passivePollingId);\n      this.passivePollingId = null;\n    }\n  }\n\n  private _startPassivePolling(sessionId: string): void {\n    this._stopPassivePolling();\n    this.passivePollingId = setInterval(() => {\n      if (this.disposed || this.state.session.currentSessionId !== sessionId) {\n        this._stopPassivePolling();\n        return;\n      }\n      this.dataSource\n        .getStreamStatus?.(sessionId)\n        .then((status) => {\n          if (!status?.active) {\n            this._stopPassivePolling();\n            this._updateMessaging({ generationInProgress: false });\n            this.dataSource\n              .fetchSession(sessionId)\n              .then((result) => {\n                if (\n                  this.state.session.currentSessionId === sessionId &&\n                  result\n                ) {\n                  this._setTurnsFromFetch(\n                    result.turns,\n                    result.pendingQuestion ?? null,\n                  );\n                }\n              })\n              .catch((err) => {\n                console.error(\n                  \"[ChatMachine] fetchSession after stream inactive:\",\n                  err,\n                );\n              });\n          }\n        })\n        .catch((err) => {\n          console.error(\"[ChatMachine] getStreamStatus:\", err);\n        });\n    }, PASSIVE_POLL_INTERVAL_MS);\n  }\n\n  private async _runResumeStream(\n    sessionId: string,\n    runId: string,\n  ): Promise<void> {\n    if (this.sendingSessionId !== null) {\n      return;\n    }\n    this.sendingSessionId = sessionId;\n    const controller = new AbortController();\n    this.abortController = controller;\n    const epoch = this.viewEpoch;\n    this._updateMessaging({ isStreaming: true });\n\n    try {\n      let accumulatedContent = \"\";\n      await this.dataSource.resumeStream!(\n        sessionId,\n        runId,\n        (chunk) => {\n          // Stop writing resumed chunks into the view if the user navigated away.\n          if (!this._isCurrentEpoch(epoch)) {\n            return;\n          }\n          if (\n            chunk.type === \"snapshot\" &&\n            chunk.snapshot?.partialContent !== undefined\n          ) {\n            accumulatedContent = chunk.snapshot.partialContent;\n            this._updateMessaging({ streamingContent: accumulatedContent });\n          } else if (\n            (chunk.type === \"content\" || chunk.type === \"chunk\") &&\n            chunk.content\n          ) {\n            accumulatedContent += chunk.content;\n            this._updateMessaging({ streamingContent: accumulatedContent });\n          } else if (chunk.type === \"thinking\" && chunk.content) {\n            this._handleThinkingChunk(chunk.content);\n          } else if (chunk.type === \"tool_start\" && chunk.tool) {\n            this._handleToolStart(chunk.tool);\n          } else if (chunk.type === \"tool_end\" && chunk.tool) {\n            this._handleToolEnd(chunk.tool);\n          } else if (chunk.type === \"done\" || chunk.type === \"error\") {\n            // will sync below\n          }\n        },\n        controller.signal,\n      );\n      clearRunMarker(sessionId);\n      await this._syncSessionFromServer(sessionId, true, epoch);\n    } finally {\n      if (this.abortController === controller) {\n        this.abortController = null;\n      }\n      if (this._isCurrentEpoch(epoch)) {\n        this.sendingSessionId = null;\n        this._updateMessaging({\n          isStreaming: false,\n          loading: false,\n          streamingContent: \"\",\n          thinkingContent: \"\",\n          activeSteps: [],\n          generationInProgress: false,\n        });\n      }\n    }\n  }\n\n  private async _resumeAcceptedRunOrPoll(\n    sessionId: string,\n    runId: string,\n  ): Promise<void> {\n    setRunMarker(sessionId, runId);\n    try {\n      await this._runResumeStream(sessionId, runId);\n    } catch (err) {\n      if (this.disposed) {\n        return;\n      }\n      console.warn(\n        \"[ChatMachine] resumeStream failed, switching to status polling fallback:\",\n        err,\n      );\n\n      const getStreamStatus = this.dataSource.getStreamStatus;\n      const status = getStreamStatus\n        ? await getStreamStatus(sessionId).catch(() => null)\n        : null;\n      if (!status?.active) {\n        clearRunMarker(sessionId);\n        await this._syncSessionFromServer(sessionId, true).catch(() => {});\n        this._updateMessaging({ generationInProgress: false });\n        return;\n      }\n\n      setRunMarker(sessionId, status.runId ?? runId);\n      this._updateMessaging({\n        isStreaming: false,\n        loading: false,\n        generationInProgress: true,\n      });\n      this._startPassivePolling(sessionId);\n    }\n  }\n\n  // =====================================================================\n  // Private — actions\n  // =====================================================================\n\n  private _setError(error: string | null): void {\n    this._updateSession({\n      error,\n      errorRetryable: false,\n    });\n  }\n\n  private _retryFetchSession(): void {\n    this._fetchSessionIfNeeded();\n  }\n\n  private _clearStreamError(): void {\n    this._updateMessaging({\n      streamError: null,\n      streamErrorRetryable: false,\n    });\n  }\n\n  private _notifySessionsUpdated(reason: string, sessionId?: string): void {\n    if (typeof window === \"undefined\") {\n      return;\n    }\n    window.dispatchEvent(\n      new CustomEvent(\"bichat:sessions-updated\", {\n        detail: { reason, sessionId },\n      }),\n    );\n  }\n\n  private _cancel(): void {\n    if (this.abortController) {\n      const sessionId =\n        this.sendingSessionId ?? this.state.session.currentSessionId;\n      if (sessionId && sessionId !== \"new\") {\n        clearRunMarker(sessionId);\n        if (this.dataSource.stopGeneration) {\n          this.dataSource.stopGeneration(sessionId).catch(() => {\n            // Non-fatal; local abort still stops the stream\n          });\n        }\n      }\n      this.abortController.abort();\n      this.abortController = null;\n      this._updateMessaging({\n        isStreaming: false,\n        loading: false,\n        streamingContent: \"\",\n        thinkingContent: \"\",\n        activeSteps: [],\n      });\n    }\n  }\n\n  private _setCodeOutputs(outputs: CodeOutput[]): void {\n    this._updateMessaging({ codeOutputs: outputs });\n  }\n\n  private _setMessage(message: string): void {\n    this._updateInput({ message });\n  }\n\n  private _setInputError(error: string | null): void {\n    this._updateInput({ inputError: error });\n  }\n\n  // ── Slash commands ──────────────────────────────────────────────────────\n\n  private async _executeSlashCommand(\n    command: ParsedSlashCommand,\n  ): Promise<boolean> {\n    if (command.hasArgs) {\n      this._updateInput({ inputError: \"BiChat.Slash.ErrorNoArguments\" });\n      return true;\n    }\n\n    this._updateSession({ error: null, errorRetryable: false });\n    this._updateInput({ inputError: null });\n    this._clearStreamError();\n\n    if (command.name === \"/debug\") {\n      const debugMode = deriveDebugMode(this.state);\n      const key = this.state.session.currentSessionId || \"new\";\n      const nextDebugMode = !debugMode;\n      this._setDebugModeForSession(key, nextDebugMode);\n\n      if (\n        nextDebugMode &&\n        this.state.session.currentSessionId &&\n        this.state.session.currentSessionId !== \"new\"\n      ) {\n        try {\n          const result = await this.dataSource.fetchSession(\n            this.state.session.currentSessionId,\n          );\n          if (result) {\n            this._updateSession({ session: result.session });\n            this._setTurnsFromFetch(\n              result.turns,\n              result.pendingQuestion || null,\n            );\n          }\n        } catch (err) {\n          console.error(\"Failed to refresh session for debug mode:\", err);\n        }\n      }\n\n      this._updateInput({ message: \"\" });\n      return true;\n    }\n\n    const curSessionId = this.state.session.currentSessionId;\n    if (!curSessionId || curSessionId === \"new\") {\n      this._updateInput({ inputError: \"BiChat.Slash.ErrorSessionRequired\" });\n      return true;\n    }\n\n    if (command.name === \"/clear\") {\n      this._updateInput({ message: \"\" });\n      this._updateMessaging({ loading: true, streamingContent: \"\" });\n\n      try {\n        await this.dataSource.clearSessionHistory(curSessionId);\n        const result = await this.dataSource.fetchSession(curSessionId);\n        if (result) {\n          this._updateSession({ session: result.session });\n          this._setTurnsFromFetch(result.turns, result.pendingQuestion || null);\n        } else {\n          this._setTurnsFromFetch([], null);\n        }\n        this._updateMessaging({ codeOutputs: [] });\n      } catch (err) {\n        const normalized = normalizeRPCError(\n          err,\n          \"Failed to clear session history\",\n        );\n        this._updateInput({ inputError: normalized.userMessage });\n      } finally {\n        this._updateMessaging({ loading: false, isStreaming: false });\n      }\n      return true;\n    }\n\n    if (command.name === \"/compact\") {\n      this._updateInput({ message: \"\" });\n      this._updateMessaging({\n        loading: true,\n        isCompacting: true,\n        streamingContent: \"\",\n      });\n\n      try {\n        const accepted =\n          await this.dataSource.compactSessionHistory(curSessionId);\n        if (!accepted.runId) {\n          throw new Error(\"Async compaction run metadata is missing\");\n        }\n        this._updateMessaging({\n          turns: applyTurnLifecycleForPendingQuestion(\n            [\n              createCompactedSystemTurn(\n                curSessionId,\n                \"Compacting conversation history...\",\n              ),\n            ],\n            null,\n          ),\n          pendingQuestion: null,\n        });\n        await this._resumeAcceptedRunOrPoll(curSessionId, accepted.runId);\n        if (!this.state.messaging.generationInProgress) {\n          const result = await this.dataSource.fetchSession(curSessionId);\n          if (result) {\n            this._updateSession({ session: result.session });\n            this._setTurnsFromFetch(\n              result.turns,\n              result.pendingQuestion || null,\n            );\n          } else {\n            this._setTurnsFromFetch([], null);\n          }\n          this._updateMessaging({ codeOutputs: [] });\n        }\n      } catch (err) {\n        const normalized = normalizeRPCError(\n          err,\n          \"Failed to compact session history\",\n        );\n        this._updateInput({ inputError: normalized.userMessage });\n      } finally {\n        this._updateMessaging({\n          isCompacting: false,\n          loading: false,\n          isStreaming: false,\n        });\n      }\n      return true;\n    }\n\n    this._updateInput({ inputError: \"BiChat.Slash.ErrorUnknownCommand\" });\n    return true;\n  }\n\n  private _insertOptimisticTurn(\n    prevTurns: ConversationTurn[],\n    tempTurn: ConversationTurn,\n    replaceFromMessageID?: string,\n  ): void {\n    if (!replaceFromMessageID) {\n      this._updateMessaging({ turns: [...prevTurns, tempTurn] });\n      return;\n    }\n\n    const idx = prevTurns.findIndex(\n      (turn) => turn.userTurn.id === replaceFromMessageID,\n    );\n    if (idx === -1) {\n      console.warn(\n        `[ChatMachine] replaceFromMessageID \"${replaceFromMessageID}\" not found; appending as new turn`,\n      );\n      this._updateMessaging({ turns: [...prevTurns, tempTurn] });\n      return;\n    }\n\n    this._updateMessaging({ turns: [...prevTurns.slice(0, idx), tempTurn] });\n  }\n\n  private async _resolveSendSession(\n    currentSessionId: string | undefined,\n    debugMode: boolean,\n  ): Promise<{\n    activeSessionId: string | undefined;\n    shouldNavigateAfter: boolean;\n  }> {\n    let activeSessionId = currentSessionId;\n    let shouldNavigateAfter = false;\n\n    if (!activeSessionId || activeSessionId === \"new\") {\n      const result = await this.dataSource.createSession();\n      if (result) {\n        const createdSessionID = result.id;\n        activeSessionId = createdSessionID;\n        this._updateSession({ currentSessionId: createdSessionID });\n        if (debugMode) {\n          this._setDebugModeForSession(createdSessionID, true);\n        }\n        shouldNavigateAfter = true;\n      }\n    }\n\n    return { activeSessionId, shouldNavigateAfter };\n  }\n\n  private async _syncSessionFromServer(\n    sessionId: string,\n    allowEmptyTurns = false,\n    epoch?: number,\n  ): Promise<void> {\n    const fetchResult = await this.dataSource.fetchSession(sessionId);\n    if (!fetchResult) {\n      return;\n    }\n    // The user may have switched sessions while the fetch was in flight; don't\n    // overwrite the now-visible session with this one's data.\n    if (epoch !== undefined && !this._isCurrentEpoch(epoch)) {\n      return;\n    }\n\n    this._updateSession({ session: fetchResult.session });\n    this._setTurnsFromFetch(\n      allowEmptyTurns ? fetchResult.turns ?? [] : fetchResult.turns,\n      fetchResult.pendingQuestion || null,\n    );\n  }\n\n  private async _runSendStream(params: {\n    activeSessionId: string | undefined;\n    content: string;\n    attachments: Attachment[];\n    debugMode: boolean;\n    replaceFromMessageID?: string;\n    reasoningEffort?: string;\n    model?: string;\n    tempTurnId: string;\n    controller: AbortController;\n    epoch: number;\n  }): Promise<{\n    createdSessionId?: string;\n    sessionFetched: boolean;\n    stopped?: boolean;\n  }> {\n    const {\n      activeSessionId,\n      content,\n      attachments,\n      debugMode,\n      replaceFromMessageID,\n      reasoningEffort,\n      model,\n      tempTurnId,\n      controller,\n      epoch,\n    } = params;\n\n    let accumulatedContent = \"\";\n    let createdSessionId: string | undefined;\n    let sessionFetched = false;\n    let currentRunId: string | undefined;\n    this._updateMessaging({ isStreaming: true });\n\n    for await (const chunk of this.dataSource.sendMessage(\n      activeSessionId || \"new\",\n      content,\n      attachments,\n      controller.signal,\n      {\n        debugMode,\n        replaceFromMessageID,\n        reasoningEffort,\n        model,\n      },\n    )) {\n      // Stop if the send was cancelled or the user navigated to another session.\n      if (controller.signal.aborted || !this._isCurrentEpoch(epoch)) {\n        break;\n      }\n\n      if (chunk.type === \"stream_started\" && chunk.runId) {\n        currentRunId = chunk.runId;\n        if (activeSessionId && activeSessionId !== \"new\") {\n          setRunMarker(activeSessionId, chunk.runId);\n        }\n      }\n\n      if (\n        (chunk.type === \"chunk\" || chunk.type === \"content\") &&\n        chunk.content\n      ) {\n        accumulatedContent += chunk.content;\n        this._updateMessaging({ streamingContent: accumulatedContent });\n      } else if (chunk.type === \"thinking\" && chunk.content) {\n        this._handleThinkingChunk(chunk.content);\n      } else if (chunk.type === \"tool_start\" && chunk.tool) {\n        this._handleToolStart(chunk.tool);\n      } else if (chunk.type === \"tool_end\" && chunk.tool) {\n        this._handleToolEnd(chunk.tool);\n      } else if (chunk.type === \"error\") {\n        throw new Error(chunk.error || \"Stream error\");\n      } else if (chunk.type === \"interrupt\") {\n        if (chunk.sessionId) {\n          createdSessionId = chunk.sessionId;\n        }\n\n        const pendingFromInterrupt = pendingQuestionFromInterrupt(\n          chunk.interrupt,\n          tempTurnId,\n        );\n        if (pendingFromInterrupt) {\n          this._updateMessaging({\n            pendingQuestion: pendingFromInterrupt,\n            turns: applyTurnLifecycleForPendingQuestion(\n              this.state.messaging.turns,\n              pendingFromInterrupt,\n            ),\n          });\n        }\n\n        if (!sessionFetched) {\n          sessionFetched = true;\n          const finalSessionId = createdSessionId || activeSessionId;\n          if (finalSessionId && finalSessionId !== \"new\") {\n            await this._syncSessionFromServer(finalSessionId, false, epoch);\n          }\n        }\n      } else if (chunk.type === \"done\") {\n        if (chunk.sessionId) {\n          createdSessionId = chunk.sessionId;\n        }\n        if (!sessionFetched) {\n          sessionFetched = true;\n          const finalSessionId = createdSessionId || activeSessionId;\n          if (finalSessionId && finalSessionId !== \"new\") {\n            await this._syncSessionFromServer(finalSessionId, false, epoch);\n          }\n        }\n      } else if (chunk.type === \"user_message\" && chunk.sessionId) {\n        createdSessionId = chunk.sessionId;\n        if (currentRunId && createdSessionId) {\n          setRunMarker(createdSessionId, currentRunId);\n        }\n      }\n    }\n\n    const finalSessionId = createdSessionId || activeSessionId;\n    if (finalSessionId && finalSessionId !== \"new\") {\n      clearRunMarker(finalSessionId);\n    }\n\n    const stopped = controller.signal.aborted;\n    return { createdSessionId, sessionFetched, stopped };\n  }\n\n  private async _ensureSessionSyncAfterStream(\n    activeSessionId: string | undefined,\n    createdSessionId: string | undefined,\n    sessionFetched: boolean,\n    epoch: number,\n  ): Promise<void> {\n    if (sessionFetched) {\n      return;\n    }\n\n    const finalSessionId = createdSessionId || activeSessionId;\n    if (!finalSessionId || finalSessionId === \"new\") {\n      return;\n    }\n\n    try {\n      await this._syncSessionFromServer(finalSessionId, true, epoch);\n    } catch (fetchErr) {\n      console.error(\"Failed to fetch session after stream:\", fetchErr);\n    }\n  }\n\n  private _finalizeSuccessfulSend(\n    targetSessionId: string | undefined,\n    shouldNavigateAfter: boolean,\n  ): void {\n    if (targetSessionId && targetSessionId !== \"new\") {\n      this._notifySessionsUpdated(\"message_sent\", targetSessionId);\n    }\n    if (shouldNavigateAfter && targetSessionId && targetSessionId !== \"new\") {\n      this._notifySessionsUpdated(\"session_created\", targetSessionId);\n      if (this.onSessionCreated) {\n        this.onSessionCreated(targetSessionId);\n      }\n    }\n    this._clearStreamError();\n    this.lastSendAttempt = null;\n  }\n\n  private _handleSendError(\n    err: unknown,\n    content: string,\n    tempTurn: ConversationTurn,\n    epoch: number,\n  ): boolean {\n    // The user navigated to a different session while this send was failing —\n    // none of the recovery writes (input restore, turn keep, error banner)\n    // belong to the now-visible session, so drop them.\n    if (!this._isCurrentEpoch(epoch)) {\n      return false;\n    }\n\n    if (err instanceof Error && err.name === \"AbortError\") {\n      // Soft-cancel (user stop / unmount): drop the optimistic turn and return\n      // the prompt to the input so they can edit and resend.\n      this._updateInput({ message: content });\n      this._clearStreamError();\n      this._updateMessaging({\n        turns: this.state.messaging.turns.filter(\n          (turn) => turn.id !== tempTurn.id,\n        ),\n      });\n      const sessionId =\n        this.sendingSessionId ?? this.state.session.currentSessionId;\n      if (sessionId && sessionId !== \"new\") {\n        this._syncSessionFromServer(sessionId, true, epoch).catch(() => {});\n      }\n      return false;\n    }\n\n    const normalized = normalizeRPCError(err, \"Failed to send message\");\n    // Genuine error: KEEP the optimistic user turn in history. Removing it would\n    // collapse a brand-new chat back to the welcome screen (showWelcome is gated\n    // on `!session && turns.length === 0`) and silently drop the message the user\n    // just sent. Instead the turn stays, the error banner + Retry let them\n    // re-send, and Retry replaces this turn (via replaceFromMessageID) rather\n    // than appending a duplicate. The prompt lives in the turn, so the input is\n    // cleared.\n    if (this.lastSendAttempt) {\n      this.lastSendAttempt = {\n        ...this.lastSendAttempt,\n        options: {\n          ...this.lastSendAttempt.options,\n          replaceFromMessageID: tempTurn.userTurn.id,\n        },\n      };\n    }\n    this._updateInput({ message: \"\", inputError: null });\n    this._updateMessaging({\n      streamError: normalized.userMessage,\n      streamErrorRetryable: normalized.retryable,\n    });\n    console.error(\"Send message error:\", err);\n    return false;\n  }\n\n  // ── Send message ────────────────────────────────────────────────────────\n\n  /**\n   * Public entry point (no options). Calls _sendMessageCore internally.\n   */\n  private async _sendMessage(\n    content: string,\n    attachments: Attachment[] = [],\n  ): Promise<void> {\n    return this._sendMessageCore(content, attachments);\n  }\n\n  /**\n   * Internal entry point with options (for regenerate/edit).\n   */\n  private async _sendMessageDirect(\n    content: string,\n    attachments: Attachment[],\n    options?: SendMessageOptions,\n  ): Promise<void> {\n    return this._sendMessageCore(content, attachments, options);\n  }\n\n  /**\n   * Core send-message logic. Handles slash commands, rate limiting, streaming,\n   * session creation, optimistic turns, and auto-queue-drain.\n   */\n  private async _sendMessageCore(\n    content: string,\n    attachments: Attachment[] = [],\n    options?: SendMessageOptions,\n  ): Promise<void> {\n    if (this.disposed) {\n      return;\n    }\n    if (\n      !content.trim() ||\n      this.state.messaging.loading ||\n      isOpenQuestionStatus(this.state.messaging.pendingQuestion?.status)\n    ) {\n      return;\n    }\n\n    const trimmedContent = content.trim();\n    if (trimmedContent.startsWith(\"/\")) {\n      const maybeCommand = parseSlashCommand(content);\n      if (!maybeCommand) {\n        this._updateInput({ inputError: \"BiChat.Slash.ErrorUnknownCommand\" });\n        return;\n      }\n      if (attachments.length > 0) {\n        this._updateInput({ inputError: \"BiChat.Slash.ErrorNoAttachments\" });\n        return;\n      }\n      await this._executeSlashCommand(maybeCommand);\n      return;\n    }\n\n    if (!this.rateLimiter.canMakeRequest()) {\n      const timeUntilNext = this.rateLimiter.getTimeUntilNextRequest();\n      const seconds = Math.ceil(timeUntilNext / 1000);\n      this._updateInput({\n        inputError: `Rate limit exceeded. Please wait ${seconds} seconds before sending another message.`,\n      });\n      return;\n    }\n\n    this._updateInput({ message: \"\", inputError: null });\n    this._updateSession({ error: null, errorRetryable: false });\n    this._clearStreamError();\n    this._updateMessaging({\n      loading: true,\n      streamingContent: \"\",\n    });\n\n    const controller = new AbortController();\n    this.abortController = controller;\n    const epoch = this.viewEpoch;\n\n    const curSessionId = this.state.session.currentSessionId;\n    const curDebugMode = deriveDebugMode(this.state);\n    const replaceFromMessageID = options?.replaceFromMessageID;\n    const tempTurn = createPendingTurn(\n      curSessionId || \"new\",\n      content,\n      attachments,\n    );\n    this.lastSendAttempt = { content, attachments, options };\n\n    const prevTurns = this.state.messaging.turns;\n    this._insertOptimisticTurn(prevTurns, tempTurn, replaceFromMessageID);\n\n    let shouldDrainQueue = true;\n\n    try {\n      const { activeSessionId, shouldNavigateAfter } =\n        await this._resolveSendSession(curSessionId, curDebugMode);\n\n      // Lock: prevent fetch-session from clobbering state\n      this.sendingSessionId = activeSessionId || null;\n\n      const { createdSessionId, sessionFetched, stopped } =\n        await this._runSendStream({\n          activeSessionId,\n          content,\n          attachments,\n          debugMode: curDebugMode,\n          replaceFromMessageID,\n          reasoningEffort: this.sanitizeReasoningEffort(\n            this.state.session.reasoningEffort,\n          ),\n          model: this.state.session.model,\n          tempTurnId: tempTurn.id,\n          controller,\n          epoch,\n        });\n\n      // If the user switched sessions mid-stream, every write below would land\n      // in the now-visible session — skip them all (the stream is already\n      // aborted; server state is intact and reloads when they return).\n      if (!this._isCurrentEpoch(epoch)) {\n        // nothing to do\n      } else if (stopped) {\n        this._updateMessaging({\n          turns: this.state.messaging.turns.filter(\n            (turn) => turn.id !== tempTurn.id,\n          ),\n        });\n        this._updateInput({ message: content });\n        this._clearStreamError();\n        const syncId = createdSessionId || activeSessionId;\n        if (syncId && syncId !== \"new\") {\n          await this._syncSessionFromServer(syncId, true, epoch).catch(() => {});\n        }\n      } else {\n        await this._ensureSessionSyncAfterStream(\n          activeSessionId,\n          createdSessionId,\n          sessionFetched,\n          epoch,\n        );\n        const targetSessionId = createdSessionId || activeSessionId;\n        this._finalizeSuccessfulSend(targetSessionId, shouldNavigateAfter);\n      }\n    } catch (err) {\n      shouldDrainQueue = this._handleSendError(err, content, tempTurn, epoch);\n    } finally {\n      // Only reset the shared streaming state if we still own the view; a\n      // session switch (or a newer send) must not have its state clobbered.\n      if (this._isCurrentEpoch(epoch)) {\n        this._updateMessaging({\n          loading: false,\n          streamingContent: \"\",\n          isStreaming: false,\n          thinkingContent: \"\",\n          activeSteps: [],\n        });\n        this.sendingSessionId = null;\n      }\n      // Don't null a newer send's controller.\n      if (this.abortController === controller) {\n        this.abortController = null;\n      }\n\n      // Auto-drain the queue — only into the same session/view this send\n      // belonged to, and only when nothing is blocking.\n      if (shouldDrainQueue) {\n        this._drainQueueIfReady(epoch);\n      }\n    }\n  }\n\n  // ── Ephemeral activity trace helpers ─────────────────────────────────\n\n  private _handleThinkingChunk(content: string): void {\n    const THINKING_BUFFER_LIMIT = 500;\n    const prev = this.state.messaging.thinkingContent;\n    let updated = prev + content;\n    if (updated.length > THINKING_BUFFER_LIMIT) {\n      updated = updated.slice(-THINKING_BUFFER_LIMIT);\n    }\n    this._updateMessaging({ thinkingContent: updated });\n\n    // Upsert a \"thinking\" step if not already active\n    const steps = this.state.messaging.activeSteps;\n    const existing = steps.find(\n      (s) => s.type === \"thinking\" && s.status === \"active\",\n    );\n    if (!existing) {\n      const step: ActivityStep = {\n        id: `thinking-${Date.now()}`,\n        type: \"thinking\",\n        toolName: \"thinking\",\n        status: \"active\",\n        startedAt: Date.now(),\n      };\n      this._updateMessaging({ activeSteps: [...steps, step] });\n    }\n  }\n\n  private _handleToolStart(tool: {\n    callId?: string;\n    name: string;\n    arguments?: string;\n    agentName?: string;\n  }): void {\n    // Mark any active thinking step as completed (model moved to tool execution)\n    let steps = this.state.messaging.activeSteps.map((s) =>\n      s.type === \"thinking\" && s.status === \"active\"\n        ? { ...s, status: \"completed\" as const, completedAt: Date.now() }\n        : s,\n    );\n\n    const isAgentDelegation = tool.name === \"task\";\n    const step: ActivityStep = {\n      id:\n        tool.callId ||\n        `tool-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n      type: isAgentDelegation ? \"agent_delegation\" : \"tool\",\n      toolName: tool.name,\n      arguments: tool.arguments,\n      agentName: tool.agentName,\n      status: \"active\",\n      startedAt: Date.now(),\n    };\n\n    steps = [...steps, step];\n    this._updateMessaging({ activeSteps: steps });\n  }\n\n  private _handleToolEnd(tool: {\n    callId?: string;\n    name: string;\n    durationMs?: number;\n    agentName?: string;\n  }): void {\n    const steps = [...this.state.messaging.activeSteps];\n    const idx = steps.findIndex(\n      (s) => s.status === \"active\" && this._matchStep(s, tool),\n    );\n    if (idx !== -1) {\n      steps[idx] = {\n        ...steps[idx],\n        status: \"completed\" as const,\n        completedAt: Date.now(),\n        durationMs: tool.durationMs,\n      };\n    }\n    this._updateMessaging({ activeSteps: steps });\n\n    // Artifact invalidation\n    if (tool.name && ARTIFACT_TOOL_NAMES.has(tool.name)) {\n      this._updateMessaging({\n        artifactsInvalidationTrigger:\n          this.state.messaging.artifactsInvalidationTrigger + 1,\n      });\n    }\n  }\n\n  /** Match a step to a tool_end event. Use callId when present; fall back to name + agentName. */\n  private _matchStep(\n    step: ActivityStep,\n    tool: { callId?: string; name: string; agentName?: string },\n  ): boolean {\n    // When the backend provides a callId, use it exclusively — no fallback.\n    if (tool.callId) {\n      return step.id === tool.callId;\n    }\n    return step.toolName === tool.name && step.agentName === tool.agentName;\n  }\n\n  // ── Retry ───────────────────────────────────────────────────────────────\n\n  private async _retryLastMessage(): Promise<void> {\n    const lastAttempt = this.lastSendAttempt;\n    if (!lastAttempt || this.state.messaging.loading) {\n      return;\n    }\n    this._clearStreamError();\n    this._updateInput({ inputError: null });\n    await this._sendMessageDirect(\n      lastAttempt.content,\n      lastAttempt.attachments,\n      lastAttempt.options,\n    );\n  }\n\n  // ── Regenerate / Edit ───────────────────────────────────────────────────\n\n  private async _handleRegenerate(\n    turnId: string,\n    model?: string,\n  ): Promise<void> {\n    const curSessionId = this.state.session.currentSessionId;\n    if (!curSessionId || curSessionId === \"new\") {\n      return;\n    }\n\n    const turn = this.state.messaging.turns.find((t) => t.id === turnId);\n    if (!turn) {\n      return;\n    }\n\n    if (model && model !== this.state.session.model) {\n      this._setModel(model);\n    }\n\n    this._updateSession({ error: null, errorRetryable: false });\n    // _sendMessageDirect delegates to _sendMessageCore which handles all errors internally\n    await this._sendMessageDirect(\n      turn.userTurn.content,\n      turn.userTurn.attachments,\n      {\n        replaceFromMessageID: turn.userTurn.id,\n      },\n    );\n  }\n\n  private async _handleEdit(turnId: string, newContent: string): Promise<void> {\n    const curSessionId = this.state.session.currentSessionId;\n    if (!curSessionId || curSessionId === \"new\") {\n      this._updateInput({ message: newContent });\n      this._updateMessaging({\n        turns: this.state.messaging.turns.filter((t) => t.id !== turnId),\n      });\n      return;\n    }\n\n    const turn = this.state.messaging.turns.find((t) => t.id === turnId);\n    if (!turn) {\n      this._updateSession({\n        error: \"Failed to edit message\",\n        errorRetryable: false,\n      });\n      return;\n    }\n\n    this._updateSession({ error: null, errorRetryable: false });\n    // _sendMessageDirect delegates to _sendMessageCore which handles all errors internally\n    await this._sendMessageDirect(newContent, turn.userTurn.attachments, {\n      replaceFromMessageID: turn.userTurn.id,\n    });\n  }\n\n  private async _handleCopy(text: string): Promise<void> {\n    if (typeof navigator === \"undefined\" || !navigator.clipboard) {\n      return;\n    }\n    try {\n      await navigator.clipboard.writeText(text);\n    } catch {\n      // Clipboard write can fail if page doesn't have focus (Permissions Policy)\n    }\n  }\n\n  // ── HITL ────────────────────────────────────────────────────────────────\n\n  private async _handleSubmitQuestionAnswers(\n    answers: QuestionAnswers,\n  ): Promise<void> {\n    const curSessionId = this.state.session.currentSessionId;\n    const curPendingQuestion = this.state.messaging.pendingQuestion;\n    if (!curSessionId || !curPendingQuestion) {\n      return;\n    }\n\n    const epoch = this.viewEpoch;\n    this._updateMessaging({ loading: true });\n    this._updateSession({ error: null, errorRetryable: false });\n    const previousPendingQuestion = curPendingQuestion;\n\n    try {\n      const result = await this.dataSource.submitQuestionAnswers(\n        curSessionId,\n        previousPendingQuestion.id,\n        answers,\n      );\n      // Bail on dispose or a session switch — writes below belong to this session.\n      if (!this._isCurrentEpoch(epoch)) {\n        return;\n      }\n\n      if (result.success) {\n        this._updateMessaging({\n          pendingQuestion: {\n            ...previousPendingQuestion,\n            status: \"ANSWER_SUBMITTED\",\n          },\n          turns: applyTurnLifecycleForPendingQuestion(\n            this.state.messaging.turns,\n            {\n              ...previousPendingQuestion,\n              status: \"ANSWER_SUBMITTED\",\n            },\n          ),\n        });\n        if (result.data) {\n          await this._resumeAcceptedRunOrPoll(curSessionId, result.data.runId);\n          if (!this.state.messaging.generationInProgress) {\n            const fetchResult =\n              await this.dataSource.fetchSession(curSessionId);\n            if (!this._isCurrentEpoch(epoch)) {\n              return;\n            }\n            if (fetchResult) {\n              this._updateSession({ session: fetchResult.session });\n              this._setTurnsFromFetch(\n                fetchResult.turns,\n                fetchResult.pendingQuestion || null,\n              );\n            } else {\n              this._updateSession({\n                error: \"Failed to load updated session\",\n                errorRetryable: true,\n              });\n            }\n          }\n        } else if (curSessionId !== \"new\") {\n          const fetchResult = await this.dataSource.fetchSession(curSessionId);\n          if (!this._isCurrentEpoch(epoch)) {\n            return;\n          }\n          if (fetchResult) {\n            this._updateSession({ session: fetchResult.session });\n            this._setTurnsFromFetch(\n              fetchResult.turns,\n              fetchResult.pendingQuestion || null,\n            );\n          } else {\n            this._updateSession({\n              error: \"Failed to load updated session\",\n              errorRetryable: true,\n            });\n          }\n        }\n      } else {\n        this._updateSession({\n          error: result.error || \"Failed to submit answers\",\n          errorRetryable: false,\n        });\n      }\n    } catch (err) {\n      if (!this._isCurrentEpoch(epoch)) {\n        return;\n      }\n      const normalized = normalizeRPCError(err, \"Failed to submit answers\");\n      this._updateSession({\n        error: normalized.userMessage,\n        errorRetryable: normalized.retryable,\n      });\n    } finally {\n      if (this._isCurrentEpoch(epoch)) {\n        this._updateMessaging({ loading: false });\n        // The question is resolved and generation finished — resume any queued\n        // messages that were stranded while the question was open.\n        if (!this.state.session.error) {\n          this._drainQueueIfReady(epoch);\n        }\n      }\n    }\n  }\n\n  private async _handleRejectPendingQuestion(): Promise<void> {\n    const curSessionId = this.state.session.currentSessionId;\n    const curPendingQuestion = this.state.messaging.pendingQuestion;\n    if (!curSessionId || !curPendingQuestion) {\n      return;\n    }\n\n    const epoch = this.viewEpoch;\n    try {\n      const result = await this.dataSource.rejectPendingQuestion(curSessionId);\n      if (!this._isCurrentEpoch(epoch)) {\n        return;\n      }\n      if (result.success) {\n        const submittedQuestion = {\n          ...curPendingQuestion,\n          status: \"REJECT_SUBMITTED\" as const,\n        };\n        this._updateMessaging({\n          pendingQuestion: submittedQuestion,\n          turns: applyTurnLifecycleForPendingQuestion(\n            this.state.messaging.turns,\n            submittedQuestion,\n          ),\n        });\n        if (result.data) {\n          await this._resumeAcceptedRunOrPoll(curSessionId, result.data.runId);\n          if (\n            !this.state.messaging.generationInProgress &&\n            curSessionId !== \"new\"\n          ) {\n            const fetchResult =\n              await this.dataSource.fetchSession(curSessionId);\n            if (!this._isCurrentEpoch(epoch)) {\n              return;\n            }\n            if (fetchResult) {\n              this._updateSession({ session: fetchResult.session });\n              this._setTurnsFromFetch(\n                fetchResult.turns,\n                fetchResult.pendingQuestion || null,\n              );\n            } else {\n              this._updateSession({\n                error: \"Failed to load updated session\",\n                errorRetryable: true,\n              });\n            }\n          }\n        } else if (curSessionId !== \"new\") {\n          const fetchResult = await this.dataSource.fetchSession(curSessionId);\n          if (!this._isCurrentEpoch(epoch)) {\n            return;\n          }\n          if (fetchResult) {\n            this._updateSession({ session: fetchResult.session });\n            this._setTurnsFromFetch(\n              fetchResult.turns,\n              fetchResult.pendingQuestion || null,\n            );\n          }\n        }\n      } else {\n        this._updateSession({\n          error: result.error || \"Failed to reject question\",\n          errorRetryable: false,\n        });\n      }\n    } catch (err) {\n      if (!this._isCurrentEpoch(epoch)) {\n        return;\n      }\n      const normalized = normalizeRPCError(err, \"Failed to reject question\");\n      this._updateSession({\n        error: normalized.userMessage,\n        errorRetryable: normalized.retryable,\n      });\n    } finally {\n      // Question resolved — resume any messages queued while it was open.\n      if (this._isCurrentEpoch(epoch) && !this.state.session.error) {\n        this._drainQueueIfReady(epoch);\n      }\n    }\n  }\n\n  // ── Input / queue ───────────────────────────────────────────────────────\n\n  private _handleSubmit(\n    e: { preventDefault: () => void },\n    attachments: Attachment[] = [],\n  ): void {\n    e.preventDefault();\n    const msg = this.state.input.message;\n    if (!msg.trim() && attachments.length === 0) {\n      return;\n    }\n    this._updateInput({ inputError: null });\n    this._clearStreamError();\n\n    const convertedAttachments: Attachment[] = attachments.map((att) => ({\n      clientKey: att.clientKey || crypto.randomUUID(),\n      id: att.id,\n      uploadId: att.uploadId,\n      filename: att.filename,\n      mimeType: att.mimeType,\n      sizeBytes: att.sizeBytes,\n      base64Data: att.base64Data,\n      url: att.url,\n      preview: att.preview,\n    }));\n\n    // Queue if currently generating\n    if (this.state.messaging.loading) {\n      const ok = this._enqueueMessage(msg.trim(), convertedAttachments);\n      if (ok) {\n        this._updateInput({ message: \"\" });\n      }\n      return;\n    }\n\n    this._sendMessage(msg.trim(), convertedAttachments);\n  }\n\n  private _handleUnqueue(): {\n    content: string;\n    attachments: Attachment[];\n  } | null {\n    const queue = this.state.input.messageQueue;\n    if (queue.length === 0) {\n      return null;\n    }\n\n    const last = queue[queue.length - 1];\n    this._updateInput({ messageQueue: queue.slice(0, -1) });\n    return { content: last.content, attachments: last.attachments };\n  }\n\n  private _enqueueMessage(content: string, attachments: Attachment[]): boolean {\n    if (this.state.input.messageQueue.length >= MAX_QUEUE_SIZE) {\n      this._updateInput({ inputError: \"BiChat.Input.QueueFull\" });\n      return false;\n    }\n    this._updateInput({\n      messageQueue: [\n        ...this.state.input.messageQueue,\n        { content, attachments },\n      ],\n    });\n    return true;\n  }\n\n  private _removeQueueItem(index: number): void {\n    this._updateInput({\n      messageQueue: this.state.input.messageQueue.filter((_, i) => i !== index),\n    });\n  }\n\n  private _updateQueueItem(index: number, content: string): void {\n    this._updateInput({\n      messageQueue: this.state.input.messageQueue.map((item, i) =>\n        i === index ? { ...item, content } : item,\n      ),\n    });\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction sessionDebugUsageEqual(\n  a: SessionDebugUsage | null,\n  b: SessionDebugUsage,\n): boolean {\n  if (!a) {\n    return false;\n  }\n  return (\n    a.promptTokens === b.promptTokens &&\n    a.completionTokens === b.completionTokens &&\n    a.totalTokens === b.totalTokens &&\n    a.turnsWithUsage === b.turnsWithUsage &&\n    a.latestPromptTokens === b.latestPromptTokens &&\n    a.latestCompletionTokens === b.latestCompletionTokens &&\n    a.latestTotalTokens === b.latestTotalTokens\n  );\n}\n","/**\n * Chat session context provider and hooks.\n *\n * Thin React wrapper around ChatMachine. All async logic (session fetch,\n * streaming, HITL, slash commands, queue, rate limiting) lives in the\n * framework-agnostic ChatMachine class.\n *\n * Split into 3 focused contexts to minimize re-renders:\n * - ChatSessionContext: session lifecycle (session, fetching, error, debug)\n * - ChatMessagingContext: turns + streaming + tool interactions\n * - ChatInputContext: input form state (message, inputError, queue)\n */\n\nimport {\n  createContext,\n  useContext,\n  useEffect,\n  useRef,\n  useSyncExternalStore,\n  type ReactNode,\n} from 'react';\nimport type {\n  ChatDataSource,\n  ChatSessionStateValue,\n  ChatMessagingStateValue,\n  ChatInputStateValue,\n} from '../types';\nimport { RateLimiter, type RateLimiterConfig } from '../utils/RateLimiter';\nimport { ChatMachine } from '../machine/ChatMachine';\n\n// ---------------------------------------------------------------------------\n// Internal context — holds the machine instance\n// ---------------------------------------------------------------------------\n\nconst MachineCtx = createContext<ChatMachine | null>(null);\n\n// ---------------------------------------------------------------------------\n// Provider props\n// ---------------------------------------------------------------------------\n\nexport interface ChatSessionProviderProps {\n  dataSource: ChatDataSource\n  sessionId?: string\n  /**\n   * External rate limiter instance. Captured once at mount — changing this prop\n   * after initial render has no effect. For most cases, use `rateLimitConfig`\n   * instead and let the provider create the limiter internally.\n   */\n  rateLimiter?: RateLimiter\n  /**\n   * Configuration for the built-in rate limiter (ignored when `rateLimiter` is\n   * provided). Captured once at mount — changing after initial render has no effect.\n   */\n  rateLimitConfig?: RateLimiterConfig\n  /**\n   * Called when the machine creates a new session (e.g. on first message in a\n   * \"new chat\"). Use this to navigate your SPA router to the new session URL.\n   */\n  onSessionCreated?: (sessionId: string) => void\n  children: ReactNode\n}\n\nconst DEFAULT_RATE_LIMIT_CONFIG: RateLimiterConfig = {\n  maxRequests: 20,\n  windowMs: 60000,\n};\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport function ChatSessionProvider({\n  dataSource,\n  sessionId,\n  rateLimiter: externalRateLimiter,\n  rateLimitConfig,\n  onSessionCreated,\n  children,\n}: ChatSessionProviderProps) {\n  // Create machine once (stable across re-renders)\n  const machineRef = useRef<ChatMachine | null>(null);\n  if (!machineRef.current) {\n    machineRef.current = new ChatMachine({\n      dataSource,\n      rateLimiter:\n        externalRateLimiter ||\n        new RateLimiter(rateLimitConfig || DEFAULT_RATE_LIMIT_CONFIG),\n      onSessionCreated,\n    });\n  }\n  const machine = machineRef.current;\n\n  // Sync mutable config (dataSource, onSessionCreated) on every render\n  useEffect(() => {\n    machine.updateConfig({ dataSource, onSessionCreated });\n  }, [machine, dataSource, onSessionCreated]);\n\n  // Sync sessionId prop → machine\n  useEffect(() => {\n    machine.setSessionId(sessionId);\n  }, [machine, sessionId]);\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => {\n      machine.dispose();\n    };\n  }, [machine]);\n\n  return (\n    <MachineCtx.Provider value={machine}>\n      {children}\n    </MachineCtx.Provider>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Private helper\n// ---------------------------------------------------------------------------\n\nfunction useMachine(): ChatMachine {\n  const machine = useContext(MachineCtx);\n  if (!machine) {\n    throw new Error('Chat hooks must be used within ChatSessionProvider');\n  }\n  return machine;\n}\n\n// ---------------------------------------------------------------------------\n// Public hooks (same signatures as before)\n// ---------------------------------------------------------------------------\n\nexport function useChatSession(): ChatSessionStateValue {\n  const machine = useMachine();\n  return useSyncExternalStore(\n    machine.subscribeSession,\n    machine.getSessionSnapshot,\n    machine.getSessionSnapshot, // SSR fallback\n  );\n}\n\nexport function useChatMessaging(): ChatMessagingStateValue {\n  const machine = useMachine();\n  return useSyncExternalStore(\n    machine.subscribeMessaging,\n    machine.getMessagingSnapshot,\n    machine.getMessagingSnapshot,\n  );\n}\n\n/** Returns messaging context or null when outside ChatSessionProvider. */\nexport function useOptionalChatMessaging(): ChatMessagingStateValue | null {\n  const machine = useContext(MachineCtx);\n  // Can't call useSyncExternalStore conditionally, so guard with machine presence\n  const snapshot = useSyncExternalStore(\n    machine ? machine.subscribeMessaging : noopSubscribe,\n    machine ? machine.getMessagingSnapshot : nullSnapshot,\n    machine ? machine.getMessagingSnapshot : nullSnapshot,\n  );\n  return machine ? snapshot : null;\n}\n\nexport function useChatInput(): ChatInputStateValue {\n  const machine = useMachine();\n  return useSyncExternalStore(\n    machine.subscribeInput,\n    machine.getInputSnapshot,\n    machine.getInputSnapshot,\n  );\n}\n\n// Helpers for useOptionalChatMessaging (must call hooks unconditionally)\nfunction noopSubscribe(): () => void { return () => {}; }\nfunction nullSnapshot(): null { return null; }\n","/**\n * Chat header component\n * Displays session title, controls, and group chat indicators.\n *\n * Supports customization via:\n * - logoSlot: Custom logo component\n * - actionsSlot: Custom action buttons\n * - members / onMembersClick: Avatar stack for group chats\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';\nimport { AvatarStack } from './AvatarStack';\n\ninterface ChatHeaderProps {\n  session: Session | null\n  onBack?: () => void\n  readOnly?: boolean\n  /** Custom logo component to display */\n  logoSlot?: ReactNode\n  /** Custom action buttons */\n  actionsSlot?: ReactNode\n  /** Members to display in avatar stack for group chats */\n  members?: Array<{ firstName: string; lastName: string; initials?: string }>\n  /** Callback when avatar stack is clicked (to open members modal) */\n  onMembersClick?: () => void\n}\n\nexport function ChatHeader({ session, onBack, readOnly, logoSlot, actionsSlot, members, onMembersClick }: ChatHeaderProps) {\n  const { t } = useTranslation();\n  const branding = useBranding();\n\n  const BackButton = onBack ? (\n    <button\n      type=\"button\"\n      onClick={onBack}\n      className=\"cursor-pointer p-2 hover:bg-gray-100 dark:hover:bg-gray-700 active:bg-gray-200 dark:active:bg-gray-600 rounded-lg transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n      aria-label={t('BiChat.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-gray-200 dark:border-gray-700 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('BiChat.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  const resolvedSessionTitle = session.title?.trim() || t('BiChat.Chat.NewChat');\n  const isGroupSession = Boolean(session.isGroup || (session.memberCount && session.memberCount > 1));\n  const memberCount = session.memberCount ?? 0;\n\n  // Avatar stack: use provided members or empty array\n  const stackUsers = members && members.length > 0 ? members : [];\n\n  return (\n    <header className=\"bichat-header border-b border-gray-200 dark:border-gray-700 px-4 py-3\">\n      <div className=\"flex items-center justify-between\">\n        <div className=\"flex items-center gap-3 min-w-0\">\n          {BackButton}\n          {Logo}\n          <div className=\"min-w-0\">\n            <div className=\"flex items-center gap-2.5\">\n              <h1 className=\"text-lg font-semibold text-[var(--bichat-text)] truncate\">{resolvedSessionTitle}</h1>\n              {session.pinned && (\n                <svg\n                  className=\"w-4 h-4 text-[var(--bichat-primary)] flex-shrink-0\"\n                  fill=\"currentColor\"\n                  viewBox=\"0 0 20 20\"\n                  role=\"img\"\n                  aria-label={t('BiChat.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              {isGroupSession && stackUsers.length > 0 && (\n                <AvatarStack\n                  users={stackUsers}\n                  max={3}\n                  size=\"xs\"\n                  onClick={onMembersClick}\n                  className=\"flex-shrink-0\"\n                />\n              )}\n            </div>\n            {isGroupSession && memberCount > 0 && (\n              <p className=\"text-xs text-gray-600 dark:text-gray-400 mt-0.5\">\n                {memberCount === 1\n                  ? t('BiChat.Chat.OneMember')\n                  : t('BiChat.Chat.MemberCount').replace('{{count}}', String(memberCount))}\n              </p>\n            )}\n          </div>\n        </div>\n        <div className=\"flex items-center gap-2 flex-shrink-0\">\n          {readOnly && (\n            <span className=\"px-2 py-1 text-xs bg-amber-100 dark:bg-amber-900/30 text-amber-800 dark:text-amber-200 rounded\">\n              {t('BiChat.Chat.ReadOnly')}\n            </span>\n          )}\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('BiChat.Chat.Archived')}\n            </span>\n          )}\n          {actionsSlot}\n        </div>\n      </div>\n    </header>\n  );\n}\n","/**\n * Branding hook for UI customization.\n *\n * Provides access to branding configuration injected from the backend\n * via window.__APPLET_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('BiChat.Welcome.Title'),\n        description: customBranding.welcome?.description || t('BiChat.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 * UserAvatar Component\n * Displays user initials with deterministic color from a color palette\n */\n\nimport { memo } from 'react';\n\nexport interface UserAvatarProps {\n  /** User's first name */\n  firstName: string\n  /** User's last name */\n  lastName: string\n  /** Override initials (defaults to first letters of first and last name) */\n  initials?: string\n  /** Avatar size */\n  size?: 'xs' | 'sm' | 'md' | 'lg'\n  /** Additional CSS classes */\n  className?: string\n}\n\n/**\n * Generate a consistent color index from a string\n * Uses simple hash function for deterministic color selection\n */\nfunction hashString(str: string): number {\n  let hash = 0;\n  for (let i = 0; i < str.length; i++) {\n    const char = str.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash; // Convert to 32bit integer\n  }\n  return Math.abs(hash);\n}\n\n/**\n * Color palette using hex values for inline styles.\n * Inline styles ensure colors render correctly in portaled content\n * (e.g. Headless UI dropdowns) outside the shadow DOM.\n */\nconst colorPalette = [\n  { bg: '#3b82f6', text: '#ffffff' }, // blue-500\n  { bg: '#22c55e', text: '#111827' }, // green-500 (light bg)\n  { bg: '#a855f7', text: '#ffffff' }, // purple-500\n  { bg: '#ec4899', text: '#ffffff' }, // pink-500\n  { bg: '#6366f1', text: '#ffffff' }, // indigo-500\n  { bg: '#14b8a6', text: '#111827' }, // teal-500 (light bg)\n  { bg: '#f97316', text: '#ffffff' }, // orange-500\n  { bg: '#06b6d4', text: '#111827' }, // cyan-500 (light bg)\n  { bg: '#f59e0b', text: '#111827' }, // amber-500 (light bg)\n  { bg: '#84cc16', text: '#111827' }, // lime-500 (light bg)\n];\n\n/**\n * Size configurations\n */\nconst sizeClasses = {\n  xs: 'w-6 h-6 text-[10px]',\n  sm: 'w-8 h-8 text-xs',\n  md: 'w-10 h-10 text-sm',\n  lg: 'w-12 h-12 text-base',\n};\n\nfunction UserAvatar({\n  firstName,\n  lastName,\n  initials: providedInitials,\n  size = 'md',\n  className = '',\n}: UserAvatarProps) {\n  // Generate initials if not provided\n  const derivedInitials = (() => {\n    const firstChar = firstName?.trim()?.charAt(0) || '';\n    const lastChar = lastName?.trim()?.charAt(0) || '';\n    const combined = `${firstChar}${lastChar}`.trim();\n    return combined || 'U';\n  })();\n\n  const initials = (providedInitials?.trim() || derivedInitials).toUpperCase();\n\n  // Select color based on full name hash (deterministic)\n  const fullName = `${firstName}${lastName}`;\n  const colorIndex = hashString(fullName) % colorPalette.length;\n  const colors = colorPalette[colorIndex];\n\n  return (\n    <div\n      className={`\n        ${sizeClasses[size]}\n        ${className}\n        rounded-full\n        flex\n        items-center\n        justify-center\n        font-semibold\n        flex-shrink-0\n        select-none\n      `}\n      style={{ backgroundColor: colors.bg, color: colors.text }}\n      aria-label={`${firstName} ${lastName}`}\n      title={`${firstName} ${lastName}`}\n    >\n      {initials}\n    </div>\n  );\n}\n\nconst MemoizedUserAvatar = memo(UserAvatar);\nMemoizedUserAvatar.displayName = 'UserAvatar';\n\nexport { MemoizedUserAvatar as UserAvatar };\nexport default MemoizedUserAvatar;\n","/**\n * AvatarStack Component\n * Displays overlapping user avatars with an overflow \"+N\" indicator.\n * Used in ChatHeader and SessionItem for group chat visualization.\n */\n\nimport { memo } from 'react';\nimport { UserAvatar } from './UserAvatar';\n\nexport interface AvatarStackProps {\n  /** List of users to display */\n  users: Array<{ firstName: string; lastName: string; initials?: string }>\n  /** Maximum avatars to show before \"+N\" (default: 3) */\n  max?: number\n  /** Avatar size */\n  size?: 'xs' | 'sm'\n  /** Click handler — makes the stack interactive */\n  onClick?: () => void\n  /** Additional CSS classes */\n  className?: string\n}\n\nconst overlapClasses = {\n  xs: '-ml-1.5',\n  sm: '-ml-2',\n} as const;\n\nconst badgeSizeClasses = {\n  xs: 'w-6 h-6 text-[10px]',\n  sm: 'w-8 h-8 text-xs',\n} as const;\n\nfunction AvatarStackInner({\n  users,\n  max = 3,\n  size = 'sm',\n  onClick,\n  className = '',\n}: AvatarStackProps) {\n  const visible = users.slice(0, max);\n  const overflow = users.length - max;\n\n  const interactive = typeof onClick === 'function';\n  const overlap = overlapClasses[size];\n  const badgeSize = badgeSizeClasses[size];\n\n  const handleKeyDown = (e: React.KeyboardEvent) => {\n    if (interactive && (e.key === 'Enter' || e.key === ' ')) {\n      e.preventDefault();\n      onClick!();\n    }\n  };\n\n  return (\n    <div\n      className={`inline-flex items-center ${interactive ? 'cursor-pointer transition-opacity hover:opacity-80' : ''} ${className}`}\n      onClick={interactive ? onClick : undefined}\n      onKeyDown={interactive ? handleKeyDown : undefined}\n      role={interactive ? 'button' : undefined}\n      tabIndex={interactive ? 0 : undefined}\n      aria-label={interactive ? `${users.length} members` : undefined}\n    >\n      {visible.map((user, i) => (\n        <div\n          key={`${user.firstName}-${user.lastName}-${i}`}\n          className={`${i > 0 ? overlap : ''} ring-2 ring-white dark:ring-gray-900 rounded-full`}\n          style={{ zIndex: visible.length - i }}\n        >\n          <UserAvatar\n            firstName={user.firstName}\n            lastName={user.lastName}\n            initials={user.initials}\n            size={size}\n          />\n        </div>\n      ))}\n      {overflow > 0 && (\n        <div\n          className={`${overlap} ${badgeSize} rounded-full bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-300 font-medium flex items-center justify-center flex-shrink-0 ring-2 ring-white dark:ring-gray-900`}\n          style={{ zIndex: 0 }}\n        >\n          +{overflow}\n        </div>\n      )}\n    </div>\n  );\n}\n\nconst AvatarStack = memo(AvatarStackInner);\nAvatarStack.displayName = 'AvatarStack';\n\nexport { AvatarStack };\nexport default AvatarStack;\n","/**\n * Date formatting utilities using date-fns\n */\n\nimport { differenceInMinutes, differenceInHours, differenceInDays, format } from 'date-fns';\n\n/**\n * Format a date as relative time (e.g., \"5m ago\", \"2h ago\")\n * Falls back to HH:mm format for dates older than 24 hours\n *\n * Accepts an optional `t` function for i18n. Translation keys used:\n * - BiChat.RelativeTime.JustNow\n * - BiChat.RelativeTime.MinutesAgo (receives `{count}`)\n * - BiChat.RelativeTime.HoursAgo   (receives `{count}`)\n * - BiChat.RelativeTime.DaysAgo    (receives `{count}`)\n *\n * If no `t` function is provided, falls back to English defaults.\n */\nexport function formatRelativeTime(\n  date: string | Date,\n  t?: (key: string, params?: Record<string, string | number>) => string\n): string {\n  const messageDate = new Date(date);\n  const now = new Date();\n\n  const diffMins = differenceInMinutes(now, messageDate);\n  const diffHours = differenceInHours(now, messageDate);\n  const diffDays = differenceInDays(now, messageDate);\n\n  if (diffMins < 1) {\n    return t ? t('BiChat.RelativeTime.JustNow') : 'Just now';\n  }\n  if (diffMins < 60) {\n    return t ? t('BiChat.RelativeTime.MinutesAgo', { count: diffMins }) : `${diffMins}m ago`;\n  }\n  if (diffHours < 24) {\n    return t ? t('BiChat.RelativeTime.HoursAgo', { count: diffHours }) : `${diffHours}h ago`;\n  }\n  if (diffDays <= 7) {\n    return t ? t('BiChat.RelativeTime.DaysAgo', { count: diffDays }) : `${diffDays}d ago`;\n  }\n\n  return format(messageDate, 'HH:mm');\n}\n","/**\n * File Utilities\n * Validation, conversion, and formatting for file attachments\n */\n\nconst MAX_FILE_SIZE_BYTES = 20 * 1024 * 1024; // 20MB\n\nconst ALLOWED_MIME_TYPES = new Set<string>([\n  'image/jpeg',\n  'image/jpg',\n  'image/png',\n  'image/gif',\n  'image/webp',\n  'application/pdf',\n  'application/msword',\n  'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n  'application/vnd.ms-excel',\n  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n  'text/csv',\n  'text/tab-separated-values',\n  'text/plain',\n  'text/markdown',\n  'application/json',\n  'application/xml',\n  'text/xml',\n  'application/yaml',\n  'text/yaml',\n  'application/x-yaml',\n  'text/x-yaml',\n  'text/log',\n]);\n\nconst ALLOWED_EXTENSIONS = new Set<string>([\n  '.png',\n  '.jpg',\n  '.jpeg',\n  '.gif',\n  '.webp',\n  '.pdf',\n  '.doc',\n  '.docx',\n  '.xls',\n  '.xlsx',\n  '.csv',\n  '.tsv',\n  '.txt',\n  '.md',\n  '.json',\n  '.xml',\n  '.yaml',\n  '.yml',\n  '.log',\n]);\n\nexport const ATTACHMENT_ACCEPT_ATTRIBUTE = Array.from(ALLOWED_EXTENSIONS).join(',');\n\nexport function isImageMimeType(mimeType: string): boolean {\n  return mimeType.toLowerCase().startsWith('image/');\n}\n\n/**\n * Validates a file against size and type constraints\n * @throws Error if validation fails\n */\nexport function validateAttachmentFile(file: File, maxSizeBytes: number = MAX_FILE_SIZE_BYTES): void {\n  const mimeType = file.type.toLowerCase();\n  const fileName = file.name || 'file';\n  const extensionMatch = /\\.(\\w+)$/.exec(fileName.toLowerCase());\n  const extension = extensionMatch ? `.${extensionMatch[1]}` : '';\n\n  const mimeAllowed = mimeType !== '' && ALLOWED_MIME_TYPES.has(mimeType);\n  const extensionAllowed = extension !== '' && ALLOWED_EXTENSIONS.has(extension);\n\n  if (!mimeAllowed && !extensionAllowed) {\n    throw new Error(`Invalid file type: ${mimeType || extension || 'unknown'}`);\n  }\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 * Backward-compatible image validator used by older components/stories.\n */\nexport function validateImageFile(file: File, maxSizeBytes: number = MAX_FILE_SIZE_BYTES): void {\n  validateAttachmentFile(file, maxSizeBytes);\n  if (!isImageMimeType(file.type)) {\n    throw new Error(`Invalid file type: ${file.type}. Only image files are allowed.`);\n  }\n}\n\n/**\n * Encode an ArrayBuffer to a base64 string.\n */\nfunction encodeArrayBuffer(buffer: ArrayBuffer): string {\n  const bytes = new Uint8Array(buffer);\n  const chunkSize = 0x8000;\n  let binary = '';\n  for (let i = 0; i < bytes.length; i += chunkSize) {\n    const chunk = bytes.subarray(i, i + chunkSize);\n    binary += String.fromCharCode(...chunk);\n  }\n  return btoa(binary);\n}\n\nfunction readWithFileReaderArrayBuffer(file: File): Promise<ArrayBuffer> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      if (reader.result instanceof ArrayBuffer) {\n        resolve(reader.result);\n        return;\n      }\n      reject(new Error('Unexpected reader result'));\n    };\n    reader.onerror = () => reject(reader.error ?? new Error('FileReader failed'));\n    reader.onabort = () => reject(new Error('File read was aborted'));\n    reader.readAsArrayBuffer(file);\n  });\n}\n\nfunction readWithFileReaderDataUrl(file: File): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      if (typeof reader.result === 'string') {\n        resolve(reader.result);\n        return;\n      }\n      reject(new Error('Unexpected reader result'));\n    };\n    reader.onerror = () => reject(reader.error ?? new Error('FileReader failed'));\n    reader.onabort = () => reject(new Error('File read was aborted'));\n    reader.readAsDataURL(file);\n  });\n}\n\nasync function readFileBuffer(file: File): Promise<ArrayBuffer> {\n  try {\n    return await new Response(file).arrayBuffer();\n  } catch {\n    // Fall through to native/file-reader strategies for drag/drop edge cases.\n  }\n\n  try {\n    return await file.arrayBuffer();\n  } catch {\n    return readWithFileReaderArrayBuffer(file);\n  }\n}\n\nfunction extractBase64FromDataUrl(dataUrl: string): string {\n  const commaIndex = dataUrl.indexOf(',');\n  if (commaIndex < 0 || commaIndex === dataUrl.length - 1) {\n    throw new Error('Invalid data URL');\n  }\n  return dataUrl.slice(commaIndex + 1);\n}\n\n/**\n * Converts a file to base64 string (without data URL prefix).\n * Prefers FileReader data URLs, then falls back to buffer-based encoding.\n */\nexport async function convertToBase64(file: File): Promise<string> {\n  try {\n    const dataUrl = await readWithFileReaderDataUrl(file);\n    return extractBase64FromDataUrl(dataUrl);\n  } catch {\n    try {\n      const buffer = await readFileBuffer(file);\n      return encodeArrayBuffer(buffer);\n    } catch (err) {\n      const details = err instanceof Error ? ` (${err.message})` : '';\n      throw new Error(`Failed to read file: ${file.name}${details}`);\n    }\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// ─── Shared file visual metadata ──────────────────────────────────────────────\n\nimport {\n  File,\n  FileCode,\n  FileCsv,\n  FileDoc,\n  FilePdf,\n  FileText,\n  FileXls,\n  Image as ImageIcon,\n  ChartBar,\n} from '@phosphor-icons/react';\n\nexport interface FileVisual {\n  /** Phosphor icon component */\n  icon: typeof File\n  /** Tailwind text-color classes for the icon (light + dark) */\n  iconColor: string\n  /** Tailwind background classes for the icon container (light + dark) */\n  bgColor: string\n  /** Short label (PDF, CSV, XLS, etc.) */\n  label: string\n}\n\n/**\n * Resolves visual metadata (icon, colors, label) for a file based on\n * its MIME type and/or filename. Single source of truth used by\n * AttachmentGrid, SessionArtifactList, DownloadCard, etc.\n */\nexport function getFileVisual(mimeType?: string, filename?: string): FileVisual {\n  const mime = (mimeType || '').toLowerCase();\n  const name = (filename || '').toLowerCase();\n\n  // Images\n  if (mime.startsWith('image/') || /\\.(png|jpe?g|gif|webp|svg|bmp)$/.test(name)) {\n    return {\n      icon: ImageIcon,\n      iconColor: 'text-violet-600 dark:text-violet-400',\n      bgColor: 'bg-violet-100 dark:bg-violet-900/40',\n      label: 'IMG',\n    };\n  }\n\n  // PDF\n  if (mime.includes('pdf') || name.endsWith('.pdf')) {\n    return {\n      icon: FilePdf,\n      iconColor: 'text-red-500 dark:text-red-400',\n      bgColor: 'bg-red-100 dark:bg-red-900/40',\n      label: 'PDF',\n    };\n  }\n\n  // Excel / spreadsheet\n  if (\n    mime === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||\n    mime.includes('excel') ||\n    mime.includes('spreadsheet') ||\n    /\\.xlsx?$/.test(name)\n  ) {\n    return {\n      icon: FileXls,\n      iconColor: 'text-emerald-600 dark:text-emerald-400',\n      bgColor: 'bg-emerald-100 dark:bg-emerald-900/40',\n      label: 'XLS',\n    };\n  }\n\n  // CSV / TSV\n  if (mime.includes('csv') || mime.includes('tab-separated') || /\\.(csv|tsv)$/.test(name)) {\n    return {\n      icon: FileCsv,\n      iconColor: 'text-emerald-600 dark:text-emerald-400',\n      bgColor: 'bg-emerald-100 dark:bg-emerald-900/40',\n      label: 'CSV',\n    };\n  }\n\n  // Word documents\n  if (mime.includes('wordprocessingml') || mime.includes('msword') || /\\.docx?$/.test(name)) {\n    return {\n      icon: FileDoc,\n      iconColor: 'text-blue-600 dark:text-blue-400',\n      bgColor: 'bg-blue-100 dark:bg-blue-900/40',\n      label: 'DOC',\n    };\n  }\n\n  // Code / structured data (JSON, XML, YAML, etc.)\n  if (\n    mime.includes('json') || mime.includes('xml') || mime.includes('yaml') ||\n    mime.includes('javascript') || mime.includes('typescript') ||\n    /\\.(json|xml|ya?ml|js|ts)$/.test(name)\n  ) {\n    const l = mime.includes('json') || name.endsWith('.json') ? 'JSON'\n      : mime.includes('xml') || name.endsWith('.xml') ? 'XML'\n      : mime.includes('yaml') || /\\.ya?ml$/.test(name) ? 'YAML'\n      : 'CODE';\n    return {\n      icon: FileCode,\n      iconColor: 'text-violet-500 dark:text-violet-400',\n      bgColor: 'bg-violet-100 dark:bg-violet-900/40',\n      label: l,\n    };\n  }\n\n  // Plain text / markdown / log\n  if (mime.startsWith('text/') || /\\.(txt|md|log)$/.test(name)) {\n    return {\n      icon: FileText,\n      iconColor: 'text-gray-500 dark:text-gray-400',\n      bgColor: 'bg-gray-100 dark:bg-gray-800',\n      label: 'TEXT',\n    };\n  }\n\n  // Fallback\n  return {\n    icon: File,\n    iconColor: 'text-gray-400 dark:text-gray-500',\n    bgColor: 'bg-gray-100 dark:bg-gray-800',\n    label: (mime.split('/')[1] || 'FILE').toUpperCase().slice(0, 4),\n  };\n}\n\n/** Chart-specific visual (not mime-based, used for artifact type = 'chart') */\nexport const CHART_VISUAL: FileVisual = {\n  icon: ChartBar,\n  iconColor: 'text-indigo-600 dark:text-indigo-400',\n  bgColor: 'bg-indigo-100 dark:bg-indigo-900/40',\n  label: 'CHART',\n};\n","/**\n * AttachmentGrid Component\n * Displays image and non-image attachments as compact horizontal cards.\n */\n\nimport React, { useMemo, useState } from 'react';\nimport { X, Image as ImageIcon } from '@phosphor-icons/react';\nimport { formatFileSize, getFileVisual } from '../utils/fileUtils';\nimport type { Attachment } from '../types';\n\ninterface AttachmentGridProps {\n  attachments: Attachment[]\n  onRemove?: (index: number) => void\n  onView?: (index: number) => void\n  className?: string\n  readonly?: boolean\n  maxDisplay?: number\n  maxCapacity?: number\n  emptyMessage?: string\n  showCount?: boolean\n  /** Number of files currently being processed (shows shimmer placeholders) */\n  pendingCount?: number\n}\n\nfunction isImageAttachment(attachment: Attachment): boolean {\n  return attachment.mimeType.toLowerCase().startsWith('image/');\n}\n\nfunction resolveImagePreview(attachment: Attachment): string {\n  if (attachment.preview) {\n    return attachment.preview;\n  }\n  if (!isImageAttachment(attachment)) {\n    return '';\n  }\n  if (attachment.base64Data) {\n    if (attachment.base64Data.startsWith('data:')) {\n      return attachment.base64Data;\n    }\n    return `data:${attachment.mimeType};base64,${attachment.base64Data}`;\n  }\n  return attachment.url || '';\n}\n\n/* ── Shared card styles ─────────────────────────────── */\n\nconst CARD_CLS = [\n  'group relative flex items-center gap-2.5 rounded-xl',\n  'border border-gray-200/80 dark:border-gray-700/60',\n  'bg-white dark:bg-gray-800/60',\n  'px-2.5 py-2',\n  'transition-all duration-150',\n].join(' ');\n\nfunction RemoveButton({ index, onRemove, filename }: { index: number; onRemove: (i: number) => void; filename: string }) {\n  return (\n    <button\n      type=\"button\"\n      onClick={(e) => { e.stopPropagation(); onRemove(index); }}\n      className=\"flex-shrink-0 p-1 text-gray-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-md opacity-0 group-hover:opacity-100 transition-all duration-150 cursor-pointer focus-visible:outline-none focus-visible:opacity-100\"\n      aria-label={`Remove ${filename}`}\n    >\n      <X size={14} weight=\"bold\" />\n    </button>\n  );\n}\n\n/* ── Shimmer placeholder ───────────────────────────── */\n\nfunction ShimmerCard() {\n  const shimmerStyle = {\n    background: 'linear-gradient(110deg, transparent 30%, rgba(255,255,255,0.4) 50%, transparent 70%)',\n    backgroundSize: '250% 100%',\n    animation: 'attachmentShimmer 1.5s ease-in-out infinite',\n  };\n\n  return (\n    <div className={CARD_CLS} style={{ pointerEvents: 'none' }}>\n      <div className=\"flex-shrink-0 w-10 h-10 rounded-lg bg-gray-100 dark:bg-gray-700 overflow-hidden\">\n        <div className=\"w-full h-full\" style={shimmerStyle} />\n      </div>\n      <div className=\"flex-1 space-y-1.5\">\n        <div className=\"h-3.5 w-28 rounded bg-gray-100 dark:bg-gray-700 overflow-hidden\">\n          <div className=\"w-full h-full\" style={shimmerStyle} />\n        </div>\n        <div className=\"h-3 w-16 rounded bg-gray-100 dark:bg-gray-700 overflow-hidden\">\n          <div className=\"w-full h-full\" style={shimmerStyle} />\n        </div>\n      </div>\n      <style>{`\n        @keyframes attachmentShimmer {\n          0% { background-position: 200% 0; }\n          100% { background-position: -60% 0; }\n        }\n      `}</style>\n    </div>\n  );\n}\n\n/* ── Image card ──────────────────────────────────────── */\n\ninterface ImageItemProps {\n  attachment: Attachment\n  index: number\n  onRemove?: (index: number) => void\n  onView?: (index: number) => void\n}\n\nfunction ImageItem({ attachment, index, onRemove, onView }: ImageItemProps) {\n  const previewSrc = resolveImagePreview(attachment);\n  const hasPreview = previewSrc !== '';\n  const [imgFailed, setImgFailed] = useState(false);\n\n  const thumbnail =\n    hasPreview && !imgFailed ? (\n      <img\n        src={previewSrc}\n        alt={attachment.filename}\n        onError={() => setImgFailed(true)}\n        className=\"w-10 h-10 rounded-lg object-cover bg-gray-100 dark:bg-gray-700\"\n      />\n    ) : (\n      <div className=\"flex items-center justify-center w-10 h-10 rounded-lg bg-violet-100 dark:bg-violet-900/40\">\n        <ImageIcon size={20} weight=\"duotone\" className=\"text-violet-600 dark:text-violet-400\" />\n      </div>\n    );\n\n  return (\n    <div className={CARD_CLS}>\n      {hasPreview && !imgFailed && onView ? (\n        <button\n          type=\"button\"\n          onClick={() => onView(index)}\n          className=\"flex-shrink-0 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 rounded-lg hover:opacity-80 transition-opacity\"\n          aria-label={`View ${attachment.filename}`}\n        >\n          {thumbnail}\n        </button>\n      ) : (\n        <div className=\"flex-shrink-0\">{thumbnail}</div>\n      )}\n\n      <div className=\"flex-1 min-w-0\">\n        <span className=\"block text-[13px] font-medium text-gray-900 dark:text-gray-100 truncate\">\n          {attachment.filename}\n        </span>\n        <span className=\"text-[11px] text-gray-400 dark:text-gray-500\">\n          {formatFileSize(attachment.sizeBytes)}\n        </span>\n      </div>\n\n      {onRemove && <RemoveButton index={index} onRemove={onRemove} filename={attachment.filename} />}\n    </div>\n  );\n}\n\n/* ── File card (non-image) ──────────────────────────── */\n\ninterface FileCardProps {\n  attachment: Attachment\n  index: number\n  onRemove?: (index: number) => void\n}\n\nfunction FileCard({ attachment, index, onRemove }: FileCardProps) {\n  const visual = getFileVisual(attachment.mimeType, attachment.filename);\n  const Icon = visual.icon;\n\n  return (\n    <div className={CARD_CLS}>\n      <div className={`flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-lg ${visual.bgColor}`}>\n        <Icon size={20} weight=\"duotone\" className={visual.iconColor} />\n      </div>\n\n      <div className=\"flex-1 min-w-0\">\n        <span className=\"block text-[13px] font-medium text-gray-900 dark:text-gray-100 truncate\">\n          {attachment.filename}\n        </span>\n        <span className=\"text-[11px] text-gray-400 dark:text-gray-500\">\n          {formatFileSize(attachment.sizeBytes)}\n        </span>\n      </div>\n\n      {onRemove && <RemoveButton index={index} onRemove={onRemove} filename={attachment.filename} />}\n    </div>\n  );\n}\n\n/* ── Memoization ───────────────────────────────────── */\n\nconst attachmentEq = (a: Attachment, b: Attachment) =>\n  a.clientKey === b.clientKey &&\n  a.id === b.id &&\n  a.filename === b.filename &&\n  a.preview === b.preview &&\n  a.base64Data === b.base64Data &&\n  a.url === b.url;\n\nconst MemoizedImageItem = React.memo(ImageItem, (prev, next) =>\n  attachmentEq(prev.attachment, next.attachment) &&\n  prev.index === next.index &&\n  prev.onRemove === next.onRemove &&\n  prev.onView === next.onView\n);\n\nconst MemoizedFileCard = React.memo(FileCard, (prev, next) =>\n  attachmentEq(prev.attachment, next.attachment) &&\n  prev.index === next.index &&\n  prev.onRemove === next.onRemove\n);\n\n/* ── Grid ──────────────────────────────────────────── */\n\nfunction AttachmentGrid({\n  attachments,\n  onRemove,\n  onView,\n  className = '',\n  readonly = false,\n  maxDisplay,\n  maxCapacity = 10,\n  emptyMessage = 'No files attached',\n  showCount = false,\n  pendingCount = 0,\n}: AttachmentGridProps) {\n  const displayedAttachments = useMemo(\n    () =>\n      maxDisplay && attachments.length > maxDisplay\n        ? attachments.slice(0, maxDisplay)\n        : attachments,\n    [attachments, maxDisplay]\n  );\n\n  const isAtMaxCapacity = attachments.length >= maxCapacity;\n  const hasContent = displayedAttachments.length > 0 || pendingCount > 0;\n\n  if (!hasContent) {\n    if (!showCount) {return null;}\n    return (\n      <div className=\"text-center text-gray-500 dark:text-gray-400 py-4\">{emptyMessage}</div>\n    );\n  }\n\n  const isEditable = !readonly && !!onRemove;\n\n  return (\n    <div className={`space-y-2 ${className}`}>\n      {showCount && (\n        <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n          {displayedAttachments.length} file{displayedAttachments.length !== 1 ? 's' : ''} attached\n        </div>\n      )}\n\n      <div className=\"grid gap-2\">\n        {displayedAttachments.map((attachment, index) => {\n          const isImage = isImageAttachment(attachment) && resolveImagePreview(attachment);\n          return isImage ? (\n            <MemoizedImageItem\n              key={attachment.clientKey}\n              attachment={attachment}\n              index={index}\n              onRemove={isEditable ? onRemove : undefined}\n              onView={onView}\n            />\n          ) : (\n            <MemoizedFileCard\n              key={attachment.clientKey}\n              attachment={attachment}\n              index={index}\n              onRemove={isEditable ? onRemove : undefined}\n            />\n          );\n        })}\n\n        {/* Shimmer placeholders for files being processed */}\n        {Array.from({ length: pendingCount }).map((_, i) => (\n          <ShimmerCard key={`pending-${i}`} />\n        ))}\n      </div>\n\n      {maxDisplay && attachments.length > maxDisplay && (\n        <div className=\"text-xs text-gray-500 dark:text-gray-400\">\n          +{attachments.length - maxDisplay} more\n        </div>\n      )}\n\n      {isAtMaxCapacity && isEditable && (\n        <div className=\"text-xs text-amber-600 dark:text-amber-400\">\n          Maximum {maxCapacity} files\n        </div>\n      )}\n    </div>\n  );\n}\n\nconst MemoizedAttachmentGrid = React.memo(AttachmentGrid);\nMemoizedAttachmentGrid.displayName = 'AttachmentGrid';\n\nexport { MemoizedAttachmentGrid as AttachmentGrid };\nexport default MemoizedAttachmentGrid;\n","import { useEffect, RefObject } from 'react';\n\n/**\n * Resolve the element that actually holds focus, piercing shadow boundaries.\n *\n * Inside a shadow tree `document.activeElement` collapses to the shadow *host*\n * (the custom element), so it never equals an inner control. Reading\n * `activeElement` from the container's own root — and then descending through\n * any nested shadow roots — yields the real focused element. Without this the\n * Tab wrap-around comparisons below never match when BiChat is embedded in its\n * shadow-DOM host, silently disabling the trap.\n */\nfunction deepActiveElement(root: DocumentOrShadowRoot): HTMLElement | null {\n  let active = root.activeElement;\n  while (active?.shadowRoot?.activeElement) {\n    active = active.shadowRoot.activeElement;\n  }\n  return active instanceof HTMLElement ? active : null;\n}\n\n/**\n * Hook to trap focus within a container (for modals, sidebars)\n * Ensures Tab and Shift+Tab cycle through focusable elements only\n *\n * @param containerRef - React ref to the container element\n * @param isActive - Whether the focus trap is currently active\n * @param restoreFocusOnDeactivate - Element to restore focus to when deactivated\n *\n * @example\n * const modalRef = useRef<HTMLDivElement>(null)\n * useFocusTrap(modalRef, isOpen)\n */\nexport function useFocusTrap(\n  containerRef: RefObject<HTMLElement | null>,\n  isActive: boolean,\n  restoreFocusOnDeactivate?: HTMLElement | null\n) {\n  useEffect(() => {\n    if (!isActive || !containerRef.current) {return;}\n\n    const container = containerRef.current;\n    const root = container.getRootNode() as unknown as DocumentOrShadowRoot;\n    const previouslyFocused = deepActiveElement(root);\n\n    // Get all focusable elements\n    const getFocusableElements = (): HTMLElement[] => {\n      const selector = [\n        'button:not([disabled])',\n        '[href]',\n        'input:not([disabled])',\n        'select:not([disabled])',\n        'textarea:not([disabled])',\n        '[tabindex]:not([tabindex=\"-1\"])',\n      ].join(', ');\n\n      return Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n    };\n\n    // Move focus inside on activation. Honour an explicit [data-autofocus]\n    // target (e.g. a confirm/cancel button) and otherwise fall back to the\n    // first focusable. Captured previouslyFocused above first, so focus can be\n    // restored to the trigger on deactivate.\n    const focusableElements = getFocusableElements();\n    const initialTarget =\n      container.querySelector<HTMLElement>('[data-autofocus]') ??\n      focusableElements[0];\n    initialTarget?.focus();\n\n    // Handle Tab key to cycle focus\n    const handleTabKey = (e: KeyboardEvent) => {\n      if (e.key !== 'Tab') {return;}\n\n      const focusableElements = getFocusableElements();\n      if (focusableElements.length === 0) {return;}\n\n      const firstElement = focusableElements[0];\n      const lastElement = focusableElements[focusableElements.length - 1];\n      const active = deepActiveElement(root);\n\n      if (e.shiftKey) {\n        // Shift+Tab: cycle backwards\n        if (active === firstElement) {\n          e.preventDefault();\n          lastElement.focus();\n        }\n      } else {\n        // Tab: cycle forwards\n        if (active === lastElement) {\n          e.preventDefault();\n          firstElement.focus();\n        }\n      }\n    };\n\n    container.addEventListener('keydown', handleTabKey);\n\n    // Cleanup and restore focus\n    return () => {\n      container.removeEventListener('keydown', handleTabKey);\n\n      // Restore focus to previously focused element or custom element\n      if (restoreFocusOnDeactivate) {\n        restoreFocusOnDeactivate.focus();\n      } else if (previouslyFocused) {\n        previouslyFocused.focus();\n      }\n    };\n  }, [containerRef, isActive, restoreFocusOnDeactivate]);\n}\n","import { useEffect } from 'react';\n\n/**\n * Hook to prevent background page scroll while a modal/overlay is open.\n *\n * Locks `document.body` overflow and compensates for the removed scrollbar so\n * the page behind the modal doesn't shift sideways. A module-level reference\n * count keeps the lock stable when several modals overlap (only the first lock\n * stores/applies styles; only the last release restores them) — closing one\n * dialog while another is still open never unlocks prematurely.\n *\n * @param isOpen - Whether the modal is currently open\n *\n * @example\n * useModalLock(isOpen)\n */\n\n// Shared across all hook instances so overlapping locks ref-count correctly.\nlet lockCount = 0;\nlet restorePreviousStyles: (() => void) | null = null;\n\nfunction applyBodyLock(): void {\n  const body = document.body;\n  const previousOverflow = body.style.overflow;\n  const previousPaddingRight = body.style.paddingRight;\n\n  // The scrollbar disappears once overflow is hidden; pad by its width so the\n  // layout stays put. Zero when the page has no vertical scrollbar.\n  const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n  body.style.overflow = 'hidden';\n  if (scrollbarWidth > 0) {\n    const currentPadding =\n      parseFloat(window.getComputedStyle(body).paddingRight) || 0;\n    body.style.paddingRight = `${currentPadding + scrollbarWidth}px`;\n  }\n\n  restorePreviousStyles = () => {\n    body.style.overflow = previousOverflow;\n    body.style.paddingRight = previousPaddingRight;\n  };\n}\n\nexport function useModalLock(isOpen: boolean) {\n  useEffect(() => {\n    if (!isOpen) {\n      return;\n    }\n\n    if (lockCount === 0) {\n      applyBodyLock();\n    }\n    lockCount += 1;\n\n    return () => {\n      lockCount -= 1;\n      if (lockCount === 0 && restorePreviousStyles) {\n        restorePreviousStyles();\n        restorePreviousStyles = null;\n      }\n    };\n  }, [isOpen]);\n}\n","/**\n * InlineDialog — portal-free dialog components for Shadow DOM environments.\n *\n * Headless UI Dialog forcibly portals to document.body, escaping Shadow DOM\n * and losing all scoped styles. These components render inline so they stay\n * inside the shadow root and inherit its CSS.\n *\n * API mirrors Headless UI Dialog for minimal migration effort.\n */\n\nimport {\n  createContext,\n  useEffect,\n  useRef,\n  type HTMLAttributes,\n  type ReactNode,\n} from 'react';\nimport { useFocusTrap } from '../hooks/useFocusTrap';\nimport { useModalLock } from '../hooks/useModalLock';\n\n// ---------------------------------------------------------------------------\n// Context — passes onClose from InlineDialog to descendants\n// ---------------------------------------------------------------------------\n\nconst DialogContext = createContext<(() => void) | null>(null);\n\n// ---------------------------------------------------------------------------\n// InlineDialog\n// ---------------------------------------------------------------------------\n\ninterface InlineDialogProps {\n  open: boolean\n  onClose: () => void\n  className?: string\n  children: ReactNode\n}\n\nexport function InlineDialog({ open, onClose, className, children }: InlineDialogProps) {\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  // Lock background scroll + trap/restore focus. useFocusTrap resolves the\n  // focused element across the shadow boundary (document.activeElement collapses\n  // to the host here), so the trap actually holds inside BiChat's shadow DOM.\n  useModalLock(open);\n  useFocusTrap(containerRef, open);\n\n  // Escape closes the dialog. Listening on the container keeps it scoped to this\n  // dialog (focus is trapped inside) and avoids global key collisions.\n  useEffect(() => {\n    if (!open) {\n      return;\n    }\n    const container = containerRef.current;\n    if (!container) {\n      return;\n    }\n    const handler = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') {\n        onClose();\n      }\n    };\n    container.addEventListener('keydown', handler as EventListener);\n    return () => container.removeEventListener('keydown', handler as EventListener);\n  }, [open, onClose]);\n\n  if (!open) {\n    return null;\n  }\n\n  return (\n    <DialogContext.Provider value={onClose}>\n      {/* onClick closes dialog when clicking outside the Panel (Panel stops propagation) */}\n      <div\n        ref={containerRef}\n        className={className}\n        onClick={onClose}\n        tabIndex={-1}\n      >\n        {children}\n      </div>\n    </DialogContext.Provider>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// InlineDialogBackdrop — purely visual overlay\n// ---------------------------------------------------------------------------\n\nexport function InlineDialogBackdrop(props: HTMLAttributes<HTMLDivElement>) {\n  return <div aria-hidden=\"true\" {...props} />;\n}\n\n// ---------------------------------------------------------------------------\n// InlineDialogPanel — auto-focus + stops click propagation\n// ---------------------------------------------------------------------------\n\nexport function InlineDialogPanel({\n  children,\n  onClick,\n  ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n  // Initial focus (including [data-autofocus]) is owned by InlineDialog's\n  // useFocusTrap, so the panel no longer self-focuses — that previously stole\n  // focus before the trap could record the trigger to restore to on close.\n  return (\n    <div\n      role=\"dialog\"\n      aria-modal=\"true\"\n      onClick={(e) => {\n        e.stopPropagation();\n        onClick?.(e);\n      }}\n      {...rest}\n    >\n      {children}\n    </div>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// InlineDialogTitle / InlineDialogDescription — semantic wrappers\n// ---------------------------------------------------------------------------\n\nexport function InlineDialogTitle(props: HTMLAttributes<HTMLHeadingElement>) {\n  return <h2 {...props} />;\n}\n\nexport function InlineDialogDescription(props: HTMLAttributes<HTMLParagraphElement>) {\n  return <p {...props} />;\n}\n","/**\n * ImageModal Component\n * Full-screen image viewer with gallery navigation, zoom, and pan.\n * Uses the shadow-DOM-safe InlineDialog (NOT Headless UI Dialog, which portals\n * to document.body, escapes the shadow root, and loses all scoped Tailwind).\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { InlineDialog, InlineDialogBackdrop, InlineDialogPanel } from './InlineDialog';\nimport {\n  X,\n  CaretLeft,\n  CaretRight,\n  ArrowClockwise,\n  ArrowCounterClockwise,\n  ImageBroken,\n  MagnifyingGlassPlus,\n  MagnifyingGlassMinus,\n  ArrowsIn,\n} from '@phosphor-icons/react';\nimport type { ImageAttachment } from '../types';\nimport { createDataUrl, formatFileSize } from '../utils/fileUtils';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ImageModalProps {\n  isOpen: boolean\n  onClose: () => void\n  attachment: ImageAttachment\n  allAttachments?: ImageAttachment[]\n  currentIndex?: number\n  onNavigate?: (direction: 'prev' | 'next') => void\n}\n\nfunction ToolbarButton({\n  onClick,\n  disabled,\n  'aria-label': ariaLabel,\n  children,\n}: {\n  onClick: () => void\n  disabled?: boolean\n  'aria-label': string\n  children: React.ReactNode\n}) {\n  return (\n    <button\n      type=\"button\"\n      onClick={onClick}\n      disabled={disabled}\n      className=\"cursor-pointer flex items-center justify-center w-8 h-8 rounded-full text-white/70 hover:text-white hover:bg-white/10 transition-colors disabled:text-white/20 disabled:cursor-not-allowed disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\"\n      aria-label={ariaLabel}\n    >\n      {children}\n    </button>\n  );\n}\n\ninterface ViewerToolbarProps {\n  scale: number\n  zoomPercent: number\n  isTransformed: boolean\n  onZoomIn: () => void\n  onZoomOut: () => void\n  onRotateLeft: () => void\n  onRotateRight: () => void\n  onReset: () => void\n  t: (key: string) => string\n}\n\nfunction ViewerToolbar({\n  scale,\n  zoomPercent,\n  isTransformed,\n  onZoomIn,\n  onZoomOut,\n  onRotateLeft,\n  onRotateRight,\n  onReset,\n  t,\n}: ViewerToolbarProps) {\n  return (\n    <div className=\"absolute bottom-6 left-1/2 -translate-x-1/2 z-20 flex items-center gap-0.5 bg-black/50 backdrop-blur-xl rounded-full px-1.5 py-1.5 border border-white/10 shadow-2xl\">\n      <ToolbarButton onClick={onZoomOut} disabled={scale <= MIN_SCALE} aria-label={t('BiChat.Image.ZoomOut')}>\n        <MagnifyingGlassMinus size={16} weight=\"bold\" />\n      </ToolbarButton>\n\n      <span className=\"text-xs text-white/60 tabular-nums font-medium min-w-[3.5rem] text-center select-none\">\n        {zoomPercent}%\n      </span>\n\n      <ToolbarButton onClick={onZoomIn} disabled={scale >= MAX_SCALE} aria-label={t('BiChat.Image.ZoomIn')}>\n        <MagnifyingGlassPlus size={16} weight=\"bold\" />\n      </ToolbarButton>\n\n      <div className=\"w-px h-4 bg-white/15 mx-1\" />\n\n      <ToolbarButton onClick={onRotateLeft} aria-label={t('BiChat.Image.RotateLeft')}>\n        <ArrowCounterClockwise size={16} weight=\"bold\" />\n      </ToolbarButton>\n\n      <ToolbarButton onClick={onRotateRight} aria-label={t('BiChat.Image.RotateRight')}>\n        <ArrowClockwise size={16} weight=\"bold\" />\n      </ToolbarButton>\n\n      {isTransformed && (\n        <>\n          <div className=\"w-px h-4 bg-white/15 mx-1\" />\n          <ToolbarButton onClick={onReset} aria-label={t('BiChat.Image.ResetZoom')}>\n            <ArrowsIn size={16} weight=\"bold\" />\n          </ToolbarButton>\n        </>\n      )}\n    </div>\n  );\n}\n\nconst MIN_SCALE = 0.25;\nconst MAX_SCALE = 5;\nconst ZOOM_STEP = 0.25;\n\nfunction ImageModal({\n  isOpen,\n  onClose,\n  attachment,\n  allAttachments,\n  currentIndex = 0,\n  onNavigate,\n}: ImageModalProps) {\n  const { t } = useTranslation();\n  const [isImageLoaded, setIsImageLoaded] = useState(false);\n  const [imageError, setImageError] = useState(false);\n  const [retryKey, setRetryKey] = useState(0);\n\n  // Zoom, pan & rotation state\n  const [scale, setScale] = useState(1);\n  const [position, setPosition] = useState({ x: 0, y: 0 });\n  const [rotation, setRotation] = useState(0);\n  const [isDragging, setIsDragging] = useState(false);\n  const dragStartRef = useRef({ x: 0, y: 0 });\n  const positionRef = useRef({ x: 0, y: 0 });\n  const scaleRef = useRef(1);\n  const imageAreaRef = useRef<HTMLDivElement>(null);\n\n  const hasMultipleImages = allAttachments && allAttachments.length > 1;\n  const canNavigatePrev = hasMultipleImages && currentIndex > 0;\n  const canNavigateNext =\n    hasMultipleImages && currentIndex < (allAttachments?.length || 1) - 1;\n  const isZoomed = scale > 1;\n  const isTransformed = isZoomed || rotation !== 0;\n\n  // Keep refs in sync for event handlers\n  useEffect(() => { scaleRef.current = scale; }, [scale]);\n  useEffect(() => { positionRef.current = position; }, [position]);\n\n  const rotateLeft = useCallback(() => {\n    setRotation((r) => ((r - 90) % 360 + 360) % 360);\n  }, []);\n  const rotateRight = useCallback(() => {\n    setRotation((r) => (r + 90) % 360);\n  }, []);\n\n  // Keyboard navigation + zoom shortcuts\n  useEffect(() => {\n    if (!isOpen) {return;}\n\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'ArrowLeft' && onNavigate && canNavigatePrev) {\n        onNavigate('prev');\n      } else if (e.key === 'ArrowRight' && onNavigate && canNavigateNext) {\n        onNavigate('next');\n      } else if (e.key === '+' || e.key === '=') {\n        setScale(s => Math.min(s + ZOOM_STEP, MAX_SCALE));\n      } else if (e.key === '-') {\n        setScale(s => Math.max(s - ZOOM_STEP, MIN_SCALE));\n        if (scaleRef.current - ZOOM_STEP <= 1) {setPosition({ x: 0, y: 0 });}\n      } else if (e.key === '0') {\n        setScale(1);\n        setPosition({ x: 0, y: 0 });\n        setRotation(0);\n      } else if (e.key === 'r' && !e.shiftKey) {\n        rotateRight();\n      } else if (e.key === 'R' || (e.key === 'r' && e.shiftKey)) {\n        rotateLeft();\n      }\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    return () => document.removeEventListener('keydown', handleKeyDown);\n  }, [isOpen, onNavigate, canNavigatePrev, canNavigateNext, rotateLeft, rotateRight]);\n\n  // Reset state on attachment change\n  useEffect(() => {\n    setIsImageLoaded(false);\n    setImageError(false);\n    setScale(1);\n    setPosition({ x: 0, y: 0 });\n    setRotation(0);\n  }, [attachment]);\n\n  // Mouse wheel zoom (needs native listener for preventDefault on passive)\n  useEffect(() => {\n    const el = imageAreaRef.current;\n    if (!el || !isOpen) {return;}\n\n    const handler = (e: WheelEvent) => {\n      const delta = e.deltaY > 0 ? -ZOOM_STEP : ZOOM_STEP;\n      const current = scaleRef.current;\n      const newScale = Math.min(Math.max(current + delta, MIN_SCALE), MAX_SCALE);\n      if (newScale === current) {return;}\n      e.preventDefault();\n      setScale(newScale);\n      if (newScale <= 1) {setPosition({ x: 0, y: 0 });}\n    };\n\n    el.addEventListener('wheel', handler, { passive: false });\n    return () => el.removeEventListener('wheel', handler);\n  }, [isOpen]);\n\n  const handleRetry = useCallback(() => {\n    setImageError(false);\n    setIsImageLoaded(false);\n    setRetryKey((k) => k + 1);\n  }, []);\n\n  // Zoom controls\n  const zoomIn = useCallback(() => {\n    setScale(s => Math.min(s + ZOOM_STEP, MAX_SCALE));\n  }, []);\n\n  const zoomOut = useCallback(() => {\n    setScale(s => Math.max(s - ZOOM_STEP, MIN_SCALE));\n    if (scaleRef.current - ZOOM_STEP <= 1) {setPosition({ x: 0, y: 0 });}\n  }, []);\n\n  const resetZoom = useCallback(() => {\n    setScale(1);\n    setPosition({ x: 0, y: 0 });\n    setRotation(0);\n  }, []);\n\n  // Double-click to toggle between fit and 2x zoom (reset rotation when returning to 1x for consistency with resetZoom and '0' key)\n  const handleDoubleClick = useCallback(() => {\n    const current = scaleRef.current;\n    if (current !== 1) {\n      setScale(1);\n      setPosition({ x: 0, y: 0 });\n      setRotation(0);\n    } else {\n      setScale(2);\n    }\n  }, []);\n\n  // Drag to pan (when zoomed)\n  const handleMouseDown = useCallback((e: React.MouseEvent) => {\n    if (scaleRef.current <= 1) {return;}\n    e.preventDefault();\n    setIsDragging(true);\n    dragStartRef.current = {\n      x: e.clientX - positionRef.current.x,\n      y: e.clientY - positionRef.current.y,\n    };\n  }, []);\n\n  const handleMouseMove = useCallback((e: React.MouseEvent) => {\n    if (!isDragging) {return;}\n    setPosition({\n      x: e.clientX - dragStartRef.current.x,\n      y: e.clientY - dragStartRef.current.y,\n    });\n  }, [isDragging]);\n\n  const handleMouseUp = useCallback(() => {\n    setIsDragging(false);\n  }, []);\n\n  // Click background to close (only when not zoomed; rotation alone does not block close)\n  const handleBackdropClick = useCallback((e: React.MouseEvent) => {\n    if (e.target === e.currentTarget && !isZoomed) {\n      onClose();\n    }\n  }, [isZoomed, onClose]);\n\n  const previewUrl =\n    attachment.preview || createDataUrl(attachment.base64Data, attachment.mimeType);\n\n  const zoomPercent = Math.round(scale * 100);\n\n  return (\n    <InlineDialog open={isOpen} onClose={onClose} className=\"relative z-[99999]\">\n      <InlineDialogBackdrop\n        className=\"fixed inset-0 bg-black/90 backdrop-blur-sm\"\n        style={{ zIndex: 99999 }}\n      />\n\n      <InlineDialogPanel\n        className=\"fixed inset-0 flex flex-col\"\n        style={{ zIndex: 100000 }}\n        onMouseMove={handleMouseMove}\n        onMouseUp={handleMouseUp}\n        onMouseLeave={handleMouseUp}\n      >\n        {/* ── Header ── */}\n        <div className=\"flex items-center px-5 py-3 shrink-0\">\n          <div className=\"flex items-center gap-3 min-w-0\">\n            {hasMultipleImages && (\n              <span className=\"text-xs text-white/50 tabular-nums whitespace-nowrap font-medium\">\n                {currentIndex + 1} / {allAttachments?.length}\n              </span>\n            )}\n            <span className=\"text-sm text-white/90 truncate font-medium\">{attachment.filename}</span>\n            <span className=\"text-xs text-white/40 whitespace-nowrap\">\n              {formatFileSize(attachment.sizeBytes)}\n            </span>\n          </div>\n        </div>\n\n        {/* ── Image area ── */}\n        <div\n          ref={imageAreaRef}\n          className=\"relative flex-1 flex items-center justify-center min-h-0 px-4 pb-4\"\n          onClick={handleBackdropClick}\n          style={{ cursor: isZoomed ? (isDragging ? 'grabbing' : 'grab') : 'default' }}\n        >\n          {/* ── Floating close button ── */}\n          <button\n            onClick={onClose}\n            className=\"absolute top-3 right-5 z-30 cursor-pointer flex items-center justify-center w-10 h-10 rounded-full bg-black/50 hover:bg-black/70 backdrop-blur-md text-white/80 hover:text-white border border-white/10 transition-all duration-200 shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\"\n            aria-label={t('BiChat.Image.Close')}\n            type=\"button\"\n          >\n            <X size={20} weight=\"bold\" />\n          </button>\n\n          {/* Loading spinner */}\n          {!isImageLoaded && !imageError && (\n            <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n              <div className=\"flex flex-col items-center gap-3\">\n                <div className=\"w-8 h-8 border-2 border-white/20 border-t-white/60 rounded-full animate-spin\" />\n                <span className=\"text-xs text-white/40\">{t('BiChat.Loading')}</span>\n              </div>\n            </div>\n          )}\n\n          {/* Error state */}\n          {imageError && (\n            <div role=\"alert\" className=\"flex flex-col items-center justify-center text-center max-w-xs\">\n              <div className=\"flex items-center justify-center w-16 h-16 rounded-2xl bg-white/5 border border-white/10 mb-5\">\n                <ImageBroken size={28} className=\"text-white/30\" weight=\"duotone\" />\n              </div>\n              <p className=\"text-sm font-medium text-white/70 mb-1\">{t('BiChat.Image.FailedToLoad')}</p>\n              <p className=\"text-xs text-white/30 mb-5 truncate max-w-full\">{attachment.filename}</p>\n              <button\n                type=\"button\"\n                onClick={handleRetry}\n                className=\"cursor-pointer inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white/80 bg-white/10 hover:bg-white/15 border border-white/10 rounded-lg transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\"\n                aria-label={t('BiChat.Image.Retry')}\n              >\n                <ArrowClockwise size={16} weight=\"bold\" />\n                {t('BiChat.Retry.Label')}\n              </button>\n            </div>\n          )}\n\n          {/* Image */}\n          <img\n            key={retryKey}\n            src={previewUrl}\n            alt={attachment.filename}\n            className={[\n              'relative z-0 max-w-[85vw] max-h-[calc(100vh-160px)] object-contain select-none rounded-lg',\n              'transition-opacity duration-300 ease-out',\n              isImageLoaded ? 'opacity-100' : 'opacity-0',\n            ].join(' ')}\n            style={{\n              transform: `translate(${position.x}px, ${position.y}px) scale(${scale}) rotate(${rotation}deg)`,\n              transformOrigin: 'center center',\n              transition: isDragging\n                ? 'opacity 0.3s ease-out'\n                : 'transform 0.2s ease-out, opacity 0.3s ease-out',\n            }}\n            onLoad={() => setIsImageLoaded(true)}\n            onError={() => setImageError(true)}\n            onMouseDown={handleMouseDown}\n            onDoubleClick={handleDoubleClick}\n            loading=\"lazy\"\n            draggable={false}\n          />\n\n          {/* ── Navigation arrows ── */}\n          {hasMultipleImages && (\n            <>\n              <button\n                onClick={() => onNavigate?.('prev')}\n                disabled={!canNavigatePrev || !isImageLoaded || imageError}\n                className={[\n                  'absolute left-4 top-1/2 -translate-y-1/2 z-20',\n                  'flex items-center justify-center w-11 h-11 rounded-full',\n                  'transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30',\n                  canNavigatePrev && isImageLoaded && !imageError\n                    ? 'cursor-pointer bg-black/40 hover:bg-black/60 backdrop-blur-md text-white/80 hover:text-white shadow-lg border border-white/10'\n                    : 'bg-black/20 text-white/20 cursor-not-allowed',\n                ].join(' ')}\n                aria-label={t('BiChat.Image.Previous')}\n                type=\"button\"\n              >\n                <CaretLeft size={20} weight=\"bold\" />\n              </button>\n\n              <button\n                onClick={() => onNavigate?.('next')}\n                disabled={!canNavigateNext || !isImageLoaded || imageError}\n                className={[\n                  'absolute right-4 top-1/2 -translate-y-1/2 z-20',\n                  'flex items-center justify-center w-11 h-11 rounded-full',\n                  'transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30',\n                  canNavigateNext && isImageLoaded && !imageError\n                    ? 'cursor-pointer bg-black/40 hover:bg-black/60 backdrop-blur-md text-white/80 hover:text-white shadow-lg border border-white/10'\n                    : 'bg-black/20 text-white/20 cursor-not-allowed',\n                ].join(' ')}\n                aria-label={t('BiChat.Image.Next')}\n                type=\"button\"\n              >\n                <CaretRight size={20} weight=\"bold\" />\n              </button>\n            </>\n          )}\n\n          {/* ── Zoom toolbar ── */}\n          {isImageLoaded && !imageError && (\n            <ViewerToolbar\n              scale={scale}\n              zoomPercent={zoomPercent}\n              isTransformed={isTransformed}\n              onZoomIn={zoomIn}\n              onZoomOut={zoomOut}\n              onRotateLeft={rotateLeft}\n              onRotateRight={rotateRight}\n              onReset={resetZoom}\n              t={t}\n            />\n          )}\n        </div>\n      </InlineDialogPanel>\n    </InlineDialog>\n  );\n}\n\nexport { ImageModal };\nexport default ImageModal;\n","/**\n * UserMessage Component (Layer 3 Composite)\n * Styled component with slot-based customization for user messages\n */\n\nimport { useState, useCallback, useRef, useEffect, useMemo, type ReactNode } from 'react';\nimport { Check, Copy, PencilSimple } from '@phosphor-icons/react';\nimport { formatRelativeTime } from '../utils/dateFormatting';\nimport AttachmentGrid from './AttachmentGrid';\nimport ImageModal from './ImageModal';\nimport type { Attachment, ImageAttachment, UserTurn } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\n/* -------------------------------------------------------------------------------------------------\n * Slot Props Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UserMessageAvatarSlotProps {\n  /** Default initials */\n  initials: string\n}\n\nexport interface UserMessageContentSlotProps {\n  /** Message content text */\n  content: string\n}\n\nexport interface UserMessageAttachmentsSlotProps {\n  /** Message attachments */\n  attachments: Attachment[]\n  /** Handler to open image viewer */\n  onView: (index: number) => void\n}\n\nexport interface UserMessageActionsSlotProps {\n  /** Copy content to clipboard */\n  onCopy: () => void\n  /** Edit message (if available) */\n  onEdit?: () => void\n  /** Formatted timestamp */\n  timestamp: string\n  /** Whether copy action is available */\n  canCopy: boolean\n  /** Whether edit action is available */\n  canEdit: boolean\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UserMessageSlots {\n  /** Custom avatar renderer */\n  avatar?: ReactNode | ((props: UserMessageAvatarSlotProps) => ReactNode)\n  /** Custom content renderer */\n  content?: ReactNode | ((props: UserMessageContentSlotProps) => ReactNode)\n  /** Custom attachments renderer */\n  attachments?: ReactNode | ((props: UserMessageAttachmentsSlotProps) => ReactNode)\n  /** Custom actions renderer */\n  actions?: ReactNode | ((props: UserMessageActionsSlotProps) => ReactNode)\n}\n\nexport interface UserMessageClassNames {\n  /** Root container */\n  root?: string\n  /** Inner content wrapper */\n  wrapper?: string\n  /** Avatar container */\n  avatar?: string\n  /** Message bubble */\n  bubble?: string\n  /** Content text */\n  content?: string\n  /** Attachments container */\n  attachments?: string\n  /** Actions container */\n  actions?: string\n  /** Action button */\n  actionButton?: string\n  /** Timestamp */\n  timestamp?: string\n}\n\nexport interface UserMessageProps {\n  /** User turn data */\n  turn: UserTurn\n  /** Turn ID for edit operations */\n  turnId?: string\n  /** User initials for avatar */\n  initials?: string\n  /** Optional sender name for shared/group chats */\n  authorName?: string\n  /** Slot overrides */\n  slots?: UserMessageSlots\n  /** Class name overrides */\n  classNames?: UserMessageClassNames\n  /** Copy handler */\n  onCopy?: (content: string) => Promise<void> | void\n  /** Edit handler */\n  onEdit?: (turnId: string, newContent: string) => void\n  /** Hide avatar */\n  hideAvatar?: boolean\n  /** Hide actions */\n  hideActions?: boolean\n  /** Hide timestamp */\n  hideTimestamp?: boolean\n  /** Whether edit action should be available */\n  allowEdit?: boolean\n}\n\nconst COPY_FEEDBACK_MS = 2000;\n\n/* -------------------------------------------------------------------------------------------------\n * Default Styles\n * -----------------------------------------------------------------------------------------------*/\n\nconst defaultClassNames: Required<UserMessageClassNames> = {\n  root: 'flex gap-3 justify-end group',\n  wrapper: 'flex-1 min-w-0 flex flex-col items-end max-w-[var(--bichat-bubble-max-width)]',\n  avatar: 'flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-sm',\n  bubble: 'bg-primary-600 text-white rounded-2xl rounded-br-sm px-4 py-3 shadow-sm',\n  content: 'text-sm whitespace-pre-wrap break-words leading-relaxed',\n  attachments: 'mb-2 w-full',\n  actions: 'flex items-center gap-1 mt-2',\n  actionButton: 'cursor-pointer p-2 min-h-[44px] min-w-[44px] flex items-center justify-center text-gray-500 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 active:bg-gray-200 dark:active:bg-gray-700 rounded-md transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50',\n  timestamp: 'text-xs text-gray-400 dark:text-gray-500 mr-1',\n};\n\nfunction mergeClassNames(\n  defaults: Required<UserMessageClassNames>,\n  overrides?: UserMessageClassNames\n): Required<UserMessageClassNames> {\n  if (!overrides) {return defaults;}\n  return {\n    root: overrides.root ?? defaults.root,\n    wrapper: overrides.wrapper ?? defaults.wrapper,\n    avatar: overrides.avatar ?? defaults.avatar,\n    bubble: overrides.bubble ?? defaults.bubble,\n    content: overrides.content ?? defaults.content,\n    attachments: overrides.attachments ?? defaults.attachments,\n    actions: overrides.actions ?? defaults.actions,\n    actionButton: overrides.actionButton ?? defaults.actionButton,\n    timestamp: overrides.timestamp ?? defaults.timestamp,\n  };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * EditForm Sub-component\n * -----------------------------------------------------------------------------------------------*/\n\ninterface EditFormProps {\n  draftContent: string\n  onDraftChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void\n  onSave: () => void\n  onCancel: () => void\n  onKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void\n  textareaRef: React.Ref<HTMLTextAreaElement>\n  disabled: boolean\n  originalContent: string\n  t: (key: string) => string\n}\n\nfunction EditForm({ draftContent, onDraftChange, onSave, onCancel, onKeyDown, textareaRef, disabled, originalContent, t }: EditFormProps) {\n  return (\n    <div className=\"space-y-3\">\n      <textarea\n        ref={textareaRef}\n        value={draftContent}\n        onChange={onDraftChange}\n        onKeyDown={onKeyDown}\n        className=\"w-full min-h-[60px] max-h-[300px] resize-none rounded-xl border border-white/20 bg-white/[0.08] px-3.5 py-2.5 text-sm text-white leading-relaxed outline-none focus:bg-white/[0.12] focus:border-white/30 focus:ring-1 focus:ring-white/20 transition-all duration-200\"\n        aria-label={t('BiChat.Message.EditMessage')}\n        rows={1}\n      />\n      <div className=\"flex items-center justify-between gap-3\">\n        <span className=\"text-[11px] text-white/30 select-none hidden sm:inline\">\n          Esc · {typeof navigator !== 'undefined' && /mac|iphone|ipad/i.test(\n            (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData?.platform\n              ?? navigator?.platform\n              ?? ''\n          ) ? '⌘' : 'Ctrl'}+Enter\n        </span>\n        <div className=\"flex items-center gap-2 ml-auto\">\n          <button\n            type=\"button\"\n            onClick={onCancel}\n            className=\"cursor-pointer px-3 py-1.5 rounded-lg text-white/60 hover:text-white hover:bg-white/10 transition-colors text-sm\"\n          >\n            {t('BiChat.Message.Cancel')}\n          </button>\n          <button\n            type=\"button\"\n            onClick={onSave}\n            className=\"cursor-pointer px-4 py-1.5 rounded-lg bg-white text-primary-700 font-medium text-sm hover:bg-white/90 transition-all shadow-sm disabled:opacity-40 disabled:cursor-not-allowed disabled:shadow-none\"\n            disabled={disabled || !draftContent.trim() || draftContent === originalContent}\n          >\n            {t('BiChat.Message.Save')}\n          </button>\n        </div>\n      </div>\n    </div>\n  );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component\n * -----------------------------------------------------------------------------------------------*/\n\nexport function UserMessage({\n  turn,\n  turnId,\n  initials = 'U',\n  authorName,\n  slots,\n  classNames: classNameOverrides,\n  onCopy,\n  onEdit,\n  hideAvatar = false,\n  hideActions = false,\n  hideTimestamp = false,\n  allowEdit = true,\n}: UserMessageProps) {\n  const { t } = useTranslation();\n  const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>(null);\n  const [isEditing, setIsEditing] = useState(false);\n  const [draftContent, setDraftContent] = useState('');\n  const [isCopied, setIsCopied] = useState(false);\n  const copyFeedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const editTextareaRef = useRef<HTMLTextAreaElement>(null);\n  const bubbleRef = useRef<HTMLDivElement>(null);\n  const classes = mergeClassNames(defaultClassNames, classNameOverrides);\n\n  useEffect(() => {\n    return () => {\n      if (copyFeedbackTimeoutRef.current) {\n        clearTimeout(copyFeedbackTimeoutRef.current);\n        copyFeedbackTimeoutRef.current = null;\n      }\n    };\n  }, []);\n\n  // Reset edit state when the turn changes\n  useEffect(() => {\n    setIsEditing(false);\n    setDraftContent('');\n  }, [turnId]);\n\n  // Auto-focus textarea when entering edit mode\n  useEffect(() => {\n    if (isEditing && editTextareaRef.current) {\n      const textarea = editTextareaRef.current;\n      textarea.focus();\n      textarea.selectionStart = textarea.value.length;\n      textarea.selectionEnd = textarea.value.length;\n      textarea.style.height = 'auto';\n      textarea.style.height = `${Math.min(textarea.scrollHeight, 300)}px`;\n    }\n  }, [isEditing]);\n\n  // Click-outside to cancel edit\n  useEffect(() => {\n    if (!isEditing) {return;}\n\n    const handleMouseDown = (e: MouseEvent) => {\n      if (bubbleRef.current && !bubbleRef.current.contains(e.target as Node)) {\n        setIsEditing(false);\n        setDraftContent('');\n      }\n    };\n\n    document.addEventListener('mousedown', handleMouseDown);\n    return () => document.removeEventListener('mousedown', handleMouseDown);\n  }, [isEditing]);\n\n  const normalizedAttachments: Attachment[] = useMemo(\n    () =>\n      turn.attachments.map((attachment) => {\n        if (!attachment.mimeType.startsWith('image/')) {\n          return attachment;\n        }\n\n        if (attachment.preview) {\n          return attachment;\n        }\n        if (attachment.base64Data) {\n          if (attachment.base64Data.startsWith('data:')) {\n            return {\n              ...attachment,\n              preview: attachment.base64Data,\n            };\n          }\n          return {\n            ...attachment,\n            preview: `data:${attachment.mimeType};base64,${attachment.base64Data}`,\n          };\n        }\n        if (attachment.url) {\n          return {\n            ...attachment,\n            preview: attachment.url,\n          };\n        }\n        return attachment;\n      }),\n    [turn.attachments],\n  );\n\n  const { imageAttachments, imageIndexByAttachmentIndex } = useMemo(() => {\n    const images: ImageAttachment[] = [];\n    const indexMap = new Map<number, number>();\n    normalizedAttachments.forEach((attachment, index) => {\n      if (!attachment.mimeType.startsWith('image/')) {\n        return;\n      }\n      if (!attachment.preview && !attachment.url) {\n        return;\n      }\n      indexMap.set(index, images.length);\n      images.push({\n        ...attachment,\n        base64Data: attachment.base64Data || '',\n        preview: attachment.preview || attachment.url || '',\n      });\n    });\n    return { imageAttachments: images, imageIndexByAttachmentIndex: indexMap };\n  }, [normalizedAttachments]);\n\n  const handleCopyClick = useCallback(async () => {\n    try {\n      if (onCopy) {\n        await onCopy(turn.content);\n      } else {\n        await navigator.clipboard.writeText(turn.content);\n      }\n\n      setIsCopied(true);\n      if (copyFeedbackTimeoutRef.current) {\n        clearTimeout(copyFeedbackTimeoutRef.current);\n      }\n      copyFeedbackTimeoutRef.current = setTimeout(() => {\n        setIsCopied(false);\n        copyFeedbackTimeoutRef.current = null;\n      }, COPY_FEEDBACK_MS);\n    } catch (err) {\n      setIsCopied(false);\n      console.error('Failed to copy:', err);\n    }\n  }, [onCopy, turn.content]);\n\n  const handleEditClick = useCallback(() => {\n    if (onEdit && turnId) {\n      setDraftContent(turn.content);\n      setIsEditing(true);\n    }\n  }, [onEdit, turnId, turn.content]);\n\n  const handleEditCancel = useCallback(() => {\n    setIsEditing(false);\n    setDraftContent('');\n  }, []);\n\n  const handleEditSave = useCallback(() => {\n    if (!onEdit || !turnId) {return;}\n    const newContent = draftContent;\n    if (!newContent.trim()) {return;}\n    if (newContent === turn.content) {\n      setIsEditing(false);\n      return;\n    }\n    onEdit(turnId, newContent);\n    setIsEditing(false);\n  }, [onEdit, turnId, draftContent, turn.content]);\n\n  const handleEditKeyDown = useCallback((e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n    if (e.key === 'Escape') {\n      e.preventDefault();\n      handleEditCancel();\n    } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n      e.preventDefault();\n      handleEditSave();\n    }\n  }, [handleEditCancel, handleEditSave]);\n\n  const handleDraftChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n    setDraftContent(e.target.value);\n    const el = e.target;\n    el.style.height = 'auto';\n    el.style.height = `${Math.min(el.scrollHeight, 300)}px`;\n  }, []);\n\n  const handleNavigate = useCallback(\n    (direction: 'prev' | 'next') => {\n      if (selectedImageIndex === null) {return;}\n\n      if (direction === 'prev' && selectedImageIndex > 0) {\n        setSelectedImageIndex(selectedImageIndex - 1);\n      } else if (direction === 'next' && selectedImageIndex < imageAttachments.length - 1) {\n        setSelectedImageIndex(selectedImageIndex + 1);\n      }\n    },\n    [selectedImageIndex, imageAttachments.length]\n  );\n\n  const currentAttachment =\n    selectedImageIndex !== null ? imageAttachments[selectedImageIndex] : null;\n\n  const timestamp = formatRelativeTime(turn.createdAt, t);\n\n  // Slot props\n  const avatarSlotProps: UserMessageAvatarSlotProps = { initials };\n  const contentSlotProps: UserMessageContentSlotProps = { content: turn.content };\n  const attachmentsSlotProps: UserMessageAttachmentsSlotProps = {\n    attachments: normalizedAttachments,\n    onView: (index) => {\n      const imageIndex = imageIndexByAttachmentIndex.get(index);\n      if (imageIndex === undefined) {\n        return;\n      }\n      setSelectedImageIndex(imageIndex);\n    },\n  };\n  const actionsSlotProps: UserMessageActionsSlotProps = {\n    onCopy: handleCopyClick,\n    onEdit: onEdit && turnId && allowEdit ? handleEditClick : undefined,\n    timestamp,\n    canCopy: true,\n    canEdit: !!onEdit && !!turnId && allowEdit,\n  };\n\n  // Render helpers\n  const renderSlot = <T,>(\n    slot: ReactNode | ((props: T) => ReactNode) | undefined,\n    props: T,\n    defaultContent: ReactNode\n  ): ReactNode => {\n    if (slot === undefined) {return defaultContent;}\n    if (typeof slot === 'function') {return slot(props);}\n    return slot;\n  };\n\n  return (\n    <div className={classes.root}>\n      <div className={classes.wrapper}>\n        {authorName && (\n          <span\n            id={`${turn.id}-author`}\n            role=\"note\"\n            aria-label={authorName}\n            className=\"mb-1 px-1 text-[11px] text-right text-gray-500 dark:text-gray-400\"\n          >\n            {authorName}\n          </span>\n        )}\n        {/* Attachments */}\n        {normalizedAttachments.length > 0 && (\n          <div className={classes.attachments}>\n            {renderSlot(\n              slots?.attachments,\n              attachmentsSlotProps,\n              <AttachmentGrid\n                attachments={normalizedAttachments}\n                onView={attachmentsSlotProps.onView}\n              />\n            )}\n          </div>\n        )}\n\n        {/* Message bubble */}\n        {turn.content && (\n          <div\n            ref={bubbleRef}\n            className={classes.bubble}\n            aria-describedby={authorName ? `${turn.id}-author` : undefined}\n          >\n            <div className={classes.content}>\n              {isEditing ? (\n                <EditForm\n                  draftContent={draftContent}\n                  onDraftChange={handleDraftChange}\n                  onSave={handleEditSave}\n                  onCancel={handleEditCancel}\n                  onKeyDown={handleEditKeyDown}\n                  textareaRef={editTextareaRef}\n                  disabled={false}\n                  originalContent={turn.content}\n                  t={t}\n                />\n              ) : (\n                renderSlot(slots?.content, contentSlotProps, turn.content)\n              )}\n            </div>\n          </div>\n        )}\n\n        {/* Actions */}\n        {!hideActions && (\n          <div className={`${classes.actions} ${isCopied ? 'opacity-100' : ''}`}>\n            {renderSlot(\n              slots?.actions,\n              actionsSlotProps,\n              <>\n                {!hideTimestamp && <span className={classes.timestamp}>{timestamp}</span>}\n\n                <button\n                  onClick={handleCopyClick}\n                  className={`cursor-pointer ${classes.actionButton} ${isCopied ? 'text-green-600 dark:text-green-400' : ''}`}\n                  aria-label={t('BiChat.Message.CopyMessage')}\n                  title={isCopied ? t('BiChat.Message.Copied') : t('BiChat.Message.Copy')}\n                  data-copied={isCopied ? 'true' : undefined}\n                >\n                  {isCopied ? <Check size={14} weight=\"bold\" /> : <Copy size={14} weight=\"regular\" />}\n                </button>\n\n                {onEdit && turnId && allowEdit && (\n                  <button\n                    onClick={handleEditClick}\n                    className={`cursor-pointer ${classes.actionButton}`}\n                    aria-label={t('BiChat.Message.EditMessage')}\n                    title={t('BiChat.Message.EditMessage')}\n                    disabled={isEditing}\n                  >\n                    <PencilSimple size={14} weight=\"regular\" />\n                  </button>\n                )}\n              </>\n            )}\n          </div>\n        )}\n      </div>\n\n      {/* Avatar */}\n      {!hideAvatar && (\n        <div className={classes.avatar}>\n          {renderSlot(slots?.avatar, avatarSlotProps, initials)}\n        </div>\n      )}\n\n      {/* Image modal */}\n      {currentAttachment && (\n        <ImageModal\n          isOpen={selectedImageIndex !== null}\n          onClose={() => setSelectedImageIndex(null)}\n          attachment={currentAttachment}\n          allAttachments={imageAttachments}\n          currentIndex={selectedImageIndex ?? 0}\n          onNavigate={handleNavigate}\n        />\n      )}\n    </div>\n  );\n}\n\nexport default UserMessage;\n","/**\n * UserTurnView Component (Layer 4 - Backward Compatible)\n * Displays user messages with attachments, image modal, and actions\n *\n * Uses turn-based architecture - receives a ConversationTurn and displays\n * the userTurn content.\n *\n * For more customization, use the UserMessage component directly with slots.\n */\n\nimport { useChatMessaging } from '../context/ChatContext';\nimport { UserMessage, type UserMessageSlots, type UserMessageClassNames } from './UserMessage';\nimport type { ConversationTurn } from '../types';\n\nexport interface UserTurnViewProps {\n  /** The conversation turn containing the user message */\n  turn: ConversationTurn\n  /** Slot overrides for customization */\n  slots?: UserMessageSlots\n  /** Class name overrides */\n  classNames?: UserMessageClassNames\n  /** User initials for avatar */\n  initials?: string\n  /** Hide avatar */\n  hideAvatar?: boolean\n  /** Hide actions */\n  hideActions?: boolean\n  /** Hide timestamp */\n  hideTimestamp?: boolean\n  /** Whether edit action should be available */\n  allowEdit?: boolean\n  /** Show sender identity label above the message bubble */\n  showAuthorName?: boolean\n}\n\nexport function UserTurnView({\n  turn,\n  slots,\n  classNames,\n  initials,\n  hideAvatar,\n  hideActions,\n  hideTimestamp,\n  allowEdit,\n  showAuthorName = false,\n}: UserTurnViewProps) {\n  const { handleEdit, handleCopy } = useChatMessaging();\n  const author = turn.userTurn.author;\n  const fullName = [author?.firstName || '', author?.lastName || ''].join(' ').trim();\n  const authorName = showAuthorName && fullName.length > 0 ? fullName : undefined;\n  const resolvedInitials = initials ?? author?.initials ?? 'U';\n\n  return (\n    <UserMessage\n      turn={turn.userTurn}\n      turnId={turn.id}\n      initials={resolvedInitials}\n      authorName={authorName}\n      slots={slots}\n      classNames={classNames}\n      onCopy={handleCopy}\n      onEdit={handleEdit}\n      hideAvatar={hideAvatar}\n      hideActions={hideActions}\n      hideTimestamp={hideTimestamp}\n      allowEdit={allowEdit}\n    />\n  );\n}\n\nexport default UserTurnView;\n","/**\n * AssistantTurnView Component (Layer 4 - Backward Compatible)\n * Displays assistant messages with markdown, charts, sources, downloads, code outputs, and streaming cursor\n *\n * Uses turn-based architecture - receives a ConversationTurn and displays\n * the assistantTurn content.\n *\n * For more customization, use the AssistantMessage component directly with slots.\n */\n\nimport { useMemo } from 'react';\nimport { useChatSession, useChatMessaging } from '../context/ChatContext';\nimport { useIotaContext } from '../context/IotaContext';\nimport {\n  AssistantMessage,\n  type AssistantMessageSlots,\n  type AssistantMessageClassNames,\n  type RegenerateModelOption,\n} from './AssistantMessage';\nimport { SystemMessage } from './SystemMessage';\nimport type { ConversationTurn } from '../types';\n\nexport interface AssistantTurnViewProps {\n  /** The conversation turn containing the assistant response */\n  turn: ConversationTurn\n  /** When true, this is the last turn in the list (Regenerate button shown only on last assistant message) */\n  isLastTurn?: boolean\n  /** Whether the response is currently being streamed */\n  isStreaming?: boolean\n  /** Slot overrides for customization */\n  slots?: AssistantMessageSlots\n  /** Class name overrides */\n  classNames?: AssistantMessageClassNames\n  /** Hide avatar */\n  hideAvatar?: boolean\n  /** Hide actions */\n  hideActions?: boolean\n  /** Hide timestamp */\n  hideTimestamp?: boolean\n  /** Whether regenerate action should be available */\n  allowRegenerate?: boolean\n}\n\nexport function AssistantTurnView({\n  turn,\n  isLastTurn = false,\n  isStreaming = false,\n  slots,\n  classNames,\n  hideAvatar,\n  hideActions,\n  hideTimestamp,\n  allowRegenerate = true,\n}: AssistantTurnViewProps) {\n  const { debugMode } = useChatSession();\n  const { handleCopy, handleRegenerate, pendingQuestion, sendMessage, loading } = useChatMessaging();\n  const iotaContext = useIotaContext();\n  const regenerateModels = useMemo<RegenerateModelOption[] | undefined>(() => {\n    const models = iotaContext.extensions?.llm?.models;\n    if (!models || models.length < 2) {return undefined;}\n    return models.map((m) => ({ id: m.id, label: m.label }));\n  }, [iotaContext.extensions?.llm?.models]);\n\n  const assistantTurn = turn.assistantTurn;\n  if (!assistantTurn) {return null;}\n\n  if (assistantTurn.role === 'system') {\n    return (\n      <SystemMessage\n        content={assistantTurn.content}\n        createdAt={assistantTurn.createdAt}\n        onCopy={handleCopy}\n        hideActions={hideActions}\n        hideTimestamp={hideTimestamp}\n      />\n    );\n  }\n\n  return (\n    <AssistantMessage\n      turn={assistantTurn}\n      turnId={turn.id}\n      isLastTurn={isLastTurn}\n      isStreaming={isStreaming}\n      pendingQuestion={pendingQuestion}\n      slots={slots}\n      classNames={classNames}\n      onCopy={handleCopy}\n      onRegenerate={allowRegenerate ? handleRegenerate : undefined}\n      regenerateModels={allowRegenerate ? regenerateModels : undefined}\n      onSendMessage={sendMessage}\n      sendDisabled={loading || isStreaming}\n      hideAvatar={hideAvatar}\n      hideActions={hideActions}\n      hideTimestamp={hideTimestamp}\n      showDebug={debugMode}\n    />\n  );\n}\n\nexport default AssistantTurnView;\n","/**\n * CodeOutputsPanel Component\n * Displays code interpreter outputs (images, text, errors)\n *\n * Output types:\n * - image: Base64-encoded image data (content is base64 string, mimeType specifies format)\n * - text: Plain text output from code execution\n * - error: Error messages from failed code execution\n */\n\nimport { Download } from '@phosphor-icons/react';\nimport type { CodeOutput } from '../types';\nimport { formatFileSize } from '../utils/fileUtils';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface CodeOutputsPanelProps {\n  outputs: CodeOutput[]\n}\n\nfunction toBase64(str: string): string {\n  // btoa() only supports Latin1; this converts UTF-8 bytes to a binary string first.\n  const bytes = new TextEncoder().encode(str);\n  let binary = '';\n  for (let i = 0; i < bytes.length; i++) {\n    binary += String.fromCharCode(bytes[i]);\n  }\n  return btoa(binary);\n}\n\nfunction CodeOutputsPanel({ outputs }: CodeOutputsPanelProps) {\n  const { t } = useTranslation();\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        {t('BiChat.CodeOutput.Title')}\n      </div>\n      <div className=\"space-y-2\">\n        {outputs.map((output, index) => (\n          <div key={index}>\n            {output.type === 'image' && (\n              <div className=\"relative group\">\n                <img\n                  src={\n                    output.content.startsWith('data:')\n                      ? output.content\n                      : `data:${output.mimeType || 'image/png'};base64,${output.content}`\n                  }\n                  alt={output.filename || t('BiChat.CodeOutput.CodeOutput')}\n                  className=\"max-w-full rounded border border-gray-300 dark:border-gray-600\"\n                />\n                {/* File info overlay */}\n                {output.filename && (\n                  <div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/60 to-transparent p-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n                    <div className=\"flex items-center justify-between text-white text-xs\">\n                      <span className=\"truncate\">{output.filename}</span>\n                      {output.sizeBytes && (\n                        <span className=\"text-gray-300\">{formatFileSize(output.sizeBytes)}</span>\n                      )}\n                    </div>\n                  </div>\n                )}\n              </div>\n            )}\n            {output.type === 'text' && (\n              <div>\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\">{output.content}</code>\n                </pre>\n                {/* File download link */}\n                {output.filename && (\n                  <div className=\"flex items-center gap-2 mt-1 text-xs\">\n                    <a\n                      href={`data:${output.mimeType || 'text/plain'};base64,${toBase64(output.content)}`}\n                      download={output.filename}\n                      className=\"flex items-center gap-1 text-blue-600 dark:text-blue-400 hover:underline\"\n                    >\n                      <Download size={12} weight=\"bold\" />\n                      {output.filename}\n                    </a>\n                    {output.sizeBytes && (\n                      <span className=\"text-gray-500 dark:text-gray-400\">\n                        ({formatFileSize(output.sizeBytes)})\n                      </span>\n                    )}\n                  </div>\n                )}\n              </div>\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                <div className=\"font-semibold mb-1\">{t('BiChat.Error.Label')}</div>\n                <pre className=\"whitespace-pre-wrap\">{output.content}</pre>\n              </div>\n            )}\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n}\n\nexport { CodeOutputsPanel };\nexport default CodeOutputsPanel;\n","/**\n * StreamingCursor Component\n * Animated cursor shown during AI response streaming\n */\n\nimport { useTranslation } from '../hooks/useTranslation';\n\nfunction StreamingCursor() {\n  const { t } = useTranslation();\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={t('BiChat.Common.AITyping')}\n    />\n  );\n}\n\nexport { StreamingCursor };\nexport default StreamingCursor;\n","/**\n * AssistantMessage Component (Layer 3 Composite)\n * Styled component with slot-based customization for assistant messages\n */\n\nimport {\n  useState,\n  useCallback,\n  lazy,\n  Suspense,\n  useRef,\n  useEffect,\n  type ReactNode,\n} from \"react\";\nimport { AnimatePresence } from \"framer-motion\";\nimport {\n  Check,\n  Copy,\n  ArrowsClockwise,\n  CaretRight,\n  Lightning,\n  Brain,\n} from \"@phosphor-icons/react\";\nimport { formatRelativeTime } from \"../utils/dateFormatting\";\nimport CodeOutputsPanel from \"./CodeOutputsPanel\";\nimport StreamingCursor from \"./StreamingCursor\";\nimport { ChartCard } from \"./ChartCard\";\nimport { InteractiveTableCard } from \"./InteractiveTableCard\";\nimport { TabbedTableGroup } from \"./TabbedTableGroup\";\nimport { TabbedChartGroup } from \"./TabbedChartGroup\";\nimport { SourcesPanel } from \"./SourcesPanel\";\nimport { DownloadCard } from \"./DownloadCard\";\nimport { InlineQuestionForm } from \"./InlineQuestionForm\";\nimport { RetryActionArea } from \"./RetryActionArea\";\nimport type {\n  AssistantTurn,\n  Citation,\n  ChartData,\n  Artifact,\n  CodeOutput,\n  PendingQuestion,\n  RenderTableData,\n} from \"../types\";\nimport { DebugPanel } from \"./DebugPanel\";\nimport { useTranslation } from \"../hooks/useTranslation\";\nimport { shouldRenderInlineRetry } from \"../utils/assistantTurnState\";\n\nconst MarkdownRenderer = lazy(() =>\n  import(\"./MarkdownRenderer\").then((module) => ({\n    default: module.MarkdownRenderer,\n  })),\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Slot Props Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AssistantMessageAvatarSlotProps {\n  /** Default text */\n  text: string;\n}\n\nexport interface AssistantMessageContentSlotProps {\n  /** Message content (markdown) */\n  content: string;\n  /** Citations */\n  citations?: Citation[];\n  /** Whether streaming is active */\n  isStreaming: boolean;\n}\n\nexport interface AssistantMessageSourcesSlotProps {\n  /** Citations to display */\n  citations: Citation[];\n}\n\nexport interface AssistantMessageChartsSlotProps {\n  /** Chart data array */\n  charts: ChartData[];\n}\n\nexport interface AssistantMessageCodeOutputsSlotProps {\n  /** Code execution outputs */\n  outputs: CodeOutput[];\n}\n\nexport interface AssistantMessageTablesSlotProps {\n  /** Interactive table payloads */\n  tables: RenderTableData[];\n}\n\nexport interface AssistantMessageArtifactsSlotProps {\n  /** Downloadable artifacts */\n  artifacts: Artifact[];\n}\n\nexport interface AssistantMessageActionsSlotProps {\n  /** Copy content to clipboard */\n  onCopy: () => void;\n  /** Regenerate response, optionally with a specific model id */\n  onRegenerate?: (model?: string) => void;\n  /** Available models that can be picked for regenerate */\n  regenerateModels?: RegenerateModelOption[];\n  /** Formatted timestamp */\n  timestamp: string;\n  /** Whether copy action is available */\n  canCopy: boolean;\n  /** Whether regenerate action is available */\n  canRegenerate: boolean;\n}\n\nexport interface RegenerateModelOption {\n  /** Model id passed to onRegenerate */\n  id: string;\n  /** Translation key (or label) shown in the picker */\n  label: string;\n}\n\nexport interface AssistantMessageExplanationSlotProps {\n  /** Explanation content (markdown) */\n  explanation: string;\n  /** Whether expanded */\n  isExpanded: boolean;\n  /** Toggle expansion */\n  onToggle: () => void;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AssistantMessageSlots {\n  /** Custom avatar renderer */\n  avatar?: ReactNode | ((props: AssistantMessageAvatarSlotProps) => ReactNode);\n  /** Custom content renderer */\n  content?:\n    | ReactNode\n    | ((props: AssistantMessageContentSlotProps) => ReactNode);\n  /** Custom sources renderer */\n  sources?:\n    | ReactNode\n    | ((props: AssistantMessageSourcesSlotProps) => ReactNode);\n  /** Custom charts renderer */\n  charts?: ReactNode | ((props: AssistantMessageChartsSlotProps) => ReactNode);\n  /** Custom code outputs renderer */\n  codeOutputs?:\n    | ReactNode\n    | ((props: AssistantMessageCodeOutputsSlotProps) => ReactNode);\n  /** Custom table renderer */\n  tables?: ReactNode | ((props: AssistantMessageTablesSlotProps) => ReactNode);\n  /** Custom artifacts renderer */\n  artifacts?:\n    | ReactNode\n    | ((props: AssistantMessageArtifactsSlotProps) => ReactNode);\n  /** Custom actions renderer */\n  actions?:\n    | ReactNode\n    | ((props: AssistantMessageActionsSlotProps) => ReactNode);\n  /** Custom explanation renderer */\n  explanation?:\n    | ReactNode\n    | ((props: AssistantMessageExplanationSlotProps) => ReactNode);\n}\n\nexport interface AssistantMessageClassNames {\n  /** Root container */\n  root?: string;\n  /** Inner content wrapper */\n  wrapper?: string;\n  /** Avatar container */\n  avatar?: string;\n  /** Message bubble */\n  bubble?: string;\n  /** Code outputs container */\n  codeOutputs?: string;\n  /** Charts container */\n  charts?: string;\n  /** Tables container */\n  tables?: string;\n  /** Artifacts container */\n  artifacts?: string;\n  /** Sources container */\n  sources?: string;\n  /** Explanation container */\n  explanation?: string;\n  /** Actions container */\n  actions?: string;\n  /** Action button */\n  actionButton?: string;\n  /** Timestamp */\n  timestamp?: string;\n}\n\nexport interface AssistantMessageProps {\n  /** Assistant turn data */\n  turn: AssistantTurn;\n  /** Turn ID for regenerate operations */\n  turnId?: string;\n  /** When true, this is the last turn (Regenerate button shown only on last assistant message) */\n  isLastTurn?: boolean;\n  /** Whether response is being streamed */\n  isStreaming?: boolean;\n  /** Pending question for HITL */\n  pendingQuestion?: PendingQuestion | null;\n  /** Slot overrides */\n  slots?: AssistantMessageSlots;\n  /** Class name overrides */\n  classNames?: AssistantMessageClassNames;\n  /** Copy handler */\n  onCopy?: (content: string) => Promise<void> | void;\n  /** Regenerate handler. The optional `model` argument is the id chosen from the\n   *  Fast/Deep picker; when omitted the current session model is used. */\n  onRegenerate?: (turnId: string, model?: string) => Promise<void> | void;\n  /** Models offered when the user clicks the regenerate button. When two or more\n   *  options are provided a Fast/Deep picker is shown; otherwise regenerate is\n   *  triggered immediately with the active model. */\n  regenerateModels?: RegenerateModelOption[];\n  /** Send message handler (for markdown links) */\n  onSendMessage?: (content: string) => void;\n  /** Whether sending is disabled */\n  sendDisabled?: boolean;\n  /** Hide avatar */\n  hideAvatar?: boolean;\n  /** Hide actions */\n  hideActions?: boolean;\n  /** Hide timestamp */\n  hideTimestamp?: boolean;\n  /** Show debug panel */\n  showDebug?: boolean;\n}\n\ntype AssistantRenderMode =\n  | \"content\"\n  | \"hitl_form\"\n  | \"hitl_resuming\"\n  | \"hitl_waiting\"\n  | \"retry\"\n  | \"empty\";\n\nconst COPY_FEEDBACK_MS = 2000;\n\n/* -------------------------------------------------------------------------------------------------\n * Default Styles\n * -----------------------------------------------------------------------------------------------*/\n\nconst defaultClassNames: Required<AssistantMessageClassNames> = {\n  root: \"flex min-w-0 gap-3 group\",\n  wrapper:\n    \"flex-1 w-full min-w-0 flex flex-col gap-3 max-w-[var(--bichat-bubble-assistant-max-width,85%)]\",\n  avatar:\n    \"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-xs\",\n  bubble:\n    \"bg-white dark:bg-gray-800 rounded-2xl rounded-bl-sm px-4 py-3 shadow-sm\",\n  codeOutputs: \"\",\n  charts: \"mb-1 w-full\",\n  tables: \"mb-1 flex flex-col gap-3 min-w-0\",\n  artifacts: \"mb-1 flex flex-wrap gap-2\",\n  sources: \"\",\n  explanation: \"mt-4 border-t border-gray-100 dark:border-gray-700 pt-4\",\n  actions: \"flex items-center gap-1\",\n  actionButton:\n    \"cursor-pointer p-2 min-h-[44px] min-w-[44px] flex items-center justify-center text-gray-500 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 active:bg-gray-200 dark:active:bg-gray-700 rounded-md transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\",\n  timestamp: \"text-xs text-gray-400 dark:text-gray-500 mr-1\",\n};\n\nfunction mergeClassNames(\n  defaults: Required<AssistantMessageClassNames>,\n  overrides?: AssistantMessageClassNames,\n): Required<AssistantMessageClassNames> {\n  if (!overrides) {\n    return defaults;\n  }\n  return {\n    root: overrides.root ?? defaults.root,\n    wrapper: overrides.wrapper ?? defaults.wrapper,\n    avatar: overrides.avatar ?? defaults.avatar,\n    bubble: overrides.bubble ?? defaults.bubble,\n    codeOutputs: overrides.codeOutputs ?? defaults.codeOutputs,\n    charts: overrides.charts ?? defaults.charts,\n    tables: overrides.tables ?? defaults.tables,\n    artifacts: overrides.artifacts ?? defaults.artifacts,\n    sources: overrides.sources ?? defaults.sources,\n    explanation: overrides.explanation ?? defaults.explanation,\n    actions: overrides.actions ?? defaults.actions,\n    actionButton: overrides.actionButton ?? defaults.actionButton,\n    timestamp: overrides.timestamp ?? defaults.timestamp,\n  };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component\n * -----------------------------------------------------------------------------------------------*/\n\nexport function AssistantMessage({\n  turn,\n  turnId,\n  isLastTurn = false,\n  isStreaming = false,\n  pendingQuestion,\n  slots,\n  classNames: classNameOverrides,\n  onCopy,\n  onRegenerate,\n  regenerateModels,\n  onSendMessage,\n  sendDisabled = false,\n  hideAvatar = false,\n  hideActions = false,\n  hideTimestamp = false,\n  showDebug = false,\n}: AssistantMessageProps) {\n  const { t } = useTranslation();\n  const [explanationExpanded, setExplanationExpanded] = useState(false);\n  const [isCopied, setIsCopied] = useState(false);\n  const [showRegenPicker, setShowRegenPicker] = useState(false);\n  const regenPickerRef = useRef<HTMLDivElement | null>(null);\n  const copyFeedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n    null,\n  );\n  const classes = mergeClassNames(defaultClassNames, classNameOverrides);\n  const isSystemMessage = turn.role === \"system\";\n  const avatarClassName = isSystemMessage\n    ? \"flex-shrink-0 w-8 h-8 rounded-full bg-gray-500 dark:bg-gray-600 flex items-center justify-center text-white font-medium text-xs\"\n    : classes.avatar;\n  const bubbleClassName = isSystemMessage\n    ? \"bg-gray-50 dark:bg-gray-900/40 rounded-2xl px-4 py-3 shadow-sm\"\n    : classes.bubble;\n\n  useEffect(() => {\n    return () => {\n      if (copyFeedbackTimeoutRef.current) {\n        clearTimeout(copyFeedbackTimeoutRef.current);\n        copyFeedbackTimeoutRef.current = null;\n      }\n    };\n  }, []);\n\n  const hasContent = turn.content?.trim().length > 0;\n  const hasExplanation = !!turn.explanation?.trim();\n  const isAwaitingHumanInput = turn.lifecycle === \"waiting_for_human_input\";\n  const pendingQuestionStatus = pendingQuestion?.status;\n  const pendingQuestionMatchesTurn =\n    !!pendingQuestion &&\n    (pendingQuestionStatus === \"PENDING\" ||\n      pendingQuestionStatus === \"ANSWER_SUBMITTED\" ||\n      pendingQuestionStatus === \"REJECT_SUBMITTED\" ||\n      pendingQuestionStatus === \"ANSWER_RESUME_FAILED\" ||\n      pendingQuestionStatus === \"REJECT_RESUME_FAILED\") &&\n    (pendingQuestion.turnId === turnId ||\n      pendingQuestion.turnId === turn.id ||\n      (!pendingQuestion.turnId && isLastTurn));\n  const hasPendingQuestion = pendingQuestionMatchesTurn && !!pendingQuestion;\n  const showQuestionForm =\n    hasPendingQuestion &&\n    (pendingQuestionStatus === \"PENDING\" ||\n      pendingQuestionStatus === \"ANSWER_RESUME_FAILED\" ||\n      pendingQuestionStatus === \"REJECT_RESUME_FAILED\");\n  const showResumeState =\n    hasPendingQuestion &&\n    (pendingQuestionStatus === \"ANSWER_SUBMITTED\" ||\n      pendingQuestionStatus === \"REJECT_SUBMITTED\");\n  const hasCodeOutputs = !!turn.codeOutputs?.length;\n  const hasChart = !!turn.charts?.length;\n  const hasTables = !!turn.renderTables?.length;\n  const hasArtifacts = !!turn.artifacts?.length;\n  const hasDebug = showDebug && !!turn.debug;\n  const hasAnyRenderedContent =\n    hasContent ||\n    hasExplanation ||\n    hasCodeOutputs ||\n    hasChart ||\n    hasTables ||\n    hasArtifacts ||\n    hasDebug;\n  const canRegenerate =\n    !!onRegenerate && !!turnId && !isSystemMessage && isLastTurn;\n  const showInlineRetry =\n    shouldRenderInlineRetry(turn, canRegenerate) && !hasAnyRenderedContent;\n  const renderMode: AssistantRenderMode = showQuestionForm\n    ? \"hitl_form\"\n    : showResumeState\n      ? \"hitl_resuming\"\n      : isAwaitingHumanInput\n        ? \"hitl_waiting\"\n        : hasAnyRenderedContent\n          ? \"content\"\n          : showInlineRetry\n            ? \"retry\"\n            : \"empty\";\n\n  const handleCopyClick = useCallback(async () => {\n    try {\n      if (onCopy) {\n        await onCopy(turn.content);\n      } else {\n        await navigator.clipboard.writeText(turn.content);\n      }\n\n      setIsCopied(true);\n      if (copyFeedbackTimeoutRef.current) {\n        clearTimeout(copyFeedbackTimeoutRef.current);\n      }\n      copyFeedbackTimeoutRef.current = setTimeout(() => {\n        setIsCopied(false);\n        copyFeedbackTimeoutRef.current = null;\n      }, COPY_FEEDBACK_MS);\n    } catch (err) {\n      setIsCopied(false);\n      console.error(\"Failed to copy:\", err);\n    }\n  }, [onCopy, turn.content]);\n\n  const hasRegenChoices = (regenerateModels?.length ?? 0) >= 2;\n\n  const handleRegenerateClick = useCallback(async () => {\n    if (!onRegenerate || !turnId) {\n      return;\n    }\n    if (hasRegenChoices) {\n      setShowRegenPicker((prev) => !prev);\n      return;\n    }\n    await onRegenerate(turnId);\n  }, [onRegenerate, turnId, hasRegenChoices]);\n\n  const handleRegenerateWithModel = useCallback(\n    async (modelId: string) => {\n      setShowRegenPicker(false);\n      if (onRegenerate && turnId) {\n        await onRegenerate(turnId, modelId);\n      }\n    },\n    [onRegenerate, turnId],\n  );\n\n  // Close picker on outside click / Escape.\n  useEffect(() => {\n    if (!showRegenPicker) {\n      return;\n    }\n    const handlePointer = (e: MouseEvent | TouchEvent) => {\n      const root = regenPickerRef.current;\n      if (!root) {return;}\n      // Use composedPath so the check works across shadow DOM boundaries\n      // (BiChat is hosted inside a shadow root; e.target gets retargeted to\n      // the shadow host and `root.contains(target)` is always false).\n      const path =\n        typeof e.composedPath === \"function\" ? e.composedPath() : [];\n      const insideViaPath = path.includes(root);\n      const insideViaContains = root.contains(e.target as Node);\n      if (!insideViaPath && !insideViaContains) {\n        setShowRegenPicker(false);\n      }\n    };\n    const handleKey = (e: KeyboardEvent) => {\n      if (e.key === \"Escape\") {\n        setShowRegenPicker(false);\n      }\n    };\n    document.addEventListener(\"mousedown\", handlePointer);\n    document.addEventListener(\"touchstart\", handlePointer);\n    document.addEventListener(\"keydown\", handleKey);\n    return () => {\n      document.removeEventListener(\"mousedown\", handlePointer);\n      document.removeEventListener(\"touchstart\", handlePointer);\n      document.removeEventListener(\"keydown\", handleKey);\n    };\n  }, [showRegenPicker]);\n\n  const timestamp = formatRelativeTime(turn.createdAt, t);\n\n  // Slot props\n  const avatarSlotProps: AssistantMessageAvatarSlotProps = {\n    text: isSystemMessage ? \"SYS\" : \"AI\",\n  };\n  const contentSlotProps: AssistantMessageContentSlotProps = {\n    content: turn.content,\n    citations: turn.citations,\n    isStreaming,\n  };\n  const sourcesSlotProps: AssistantMessageSourcesSlotProps = {\n    citations: turn.citations || [],\n  };\n  const chartsSlotProps: AssistantMessageChartsSlotProps = {\n    charts: turn.charts || [],\n  };\n  const codeOutputsSlotProps: AssistantMessageCodeOutputsSlotProps = {\n    outputs: turn.codeOutputs || [],\n  };\n  const tablesSlotProps: AssistantMessageTablesSlotProps = {\n    tables: turn.renderTables || [],\n  };\n  const artifactsSlotProps: AssistantMessageArtifactsSlotProps = {\n    artifacts: turn.artifacts || [],\n  };\n  const actionsSlotProps: AssistantMessageActionsSlotProps = {\n    onCopy: handleCopyClick,\n    onRegenerate: canRegenerate\n      ? (model) => {\n          if (!onRegenerate || !turnId) {\n            return;\n          }\n          if (model) {\n            void handleRegenerateWithModel(model);\n          } else {\n            void handleRegenerateClick();\n          }\n        }\n      : undefined,\n    regenerateModels,\n    timestamp,\n    canCopy: hasContent,\n    canRegenerate,\n  };\n  const explanationSlotProps: AssistantMessageExplanationSlotProps = {\n    explanation: turn.explanation || \"\",\n    isExpanded: explanationExpanded,\n    onToggle: () => setExplanationExpanded(!explanationExpanded),\n  };\n\n  // Render helpers\n  const renderSlot = <T,>(\n    slot: ReactNode | ((props: T) => ReactNode) | undefined,\n    props: T,\n    defaultContent: ReactNode,\n  ): ReactNode => {\n    if (slot === undefined) {\n      return defaultContent;\n    }\n    if (typeof slot === \"function\") {\n      return slot(props);\n    }\n    return slot;\n  };\n\n  return (\n    <div className={classes.root}>\n      {/* Avatar */}\n      {!hideAvatar && (\n        <div className={avatarClassName}>\n          {renderSlot(\n            slots?.avatar,\n            avatarSlotProps,\n            isSystemMessage ? \"SYS\" : \"AI\",\n          )}\n        </div>\n      )}\n\n      <div className={classes.wrapper}>\n        {/* Inline recovery for empty assistant responses */}\n        <AnimatePresence>\n          {showInlineRetry && (\n            <RetryActionArea\n              key=\"inline-retry\"\n              onRetry={() => {\n                void handleRegenerateClick();\n              }}\n            />\n          )}\n        </AnimatePresence>\n\n        {/* Code outputs */}\n        {turn.codeOutputs && turn.codeOutputs.length > 0 && (\n          <div className={classes.codeOutputs}>\n            {renderSlot(\n              slots?.codeOutputs,\n              codeOutputsSlotProps,\n              <CodeOutputsPanel outputs={turn.codeOutputs} />,\n            )}\n          </div>\n        )}\n\n        {/* Charts */}\n        {turn.charts && turn.charts.length > 0 && (\n          <div className={classes.charts}>\n            {renderSlot(\n              slots?.charts,\n              chartsSlotProps,\n              turn.charts.length === 1 ? (\n                <ChartCard chartData={turn.charts[0]} />\n              ) : (\n                <TabbedChartGroup charts={turn.charts} />\n              ),\n            )}\n          </div>\n        )}\n\n        {/* Interactive tables */}\n        {turn.renderTables && turn.renderTables.length > 0 && (\n          <div className={classes.tables}>\n            {renderSlot(\n              slots?.tables,\n              tablesSlotProps,\n              turn.renderTables.length === 1 ? (\n                <InteractiveTableCard\n                  table={turn.renderTables[0]}\n                  onSendMessage={onSendMessage}\n                  sendDisabled={sendDisabled || isStreaming}\n                />\n              ) : (\n                <TabbedTableGroup\n                  tables={turn.renderTables}\n                  onSendMessage={onSendMessage}\n                  sendDisabled={sendDisabled || isStreaming}\n                />\n              ),\n            )}\n          </div>\n        )}\n\n        {/* Message bubble */}\n        {hasContent && (\n          <div className={bubbleClassName}>\n            {renderSlot(\n              slots?.content,\n              contentSlotProps,\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                    {t(\"BiChat.Common.Loading\")}\n                  </div>\n                }\n              >\n                <MarkdownRenderer\n                  content={turn.content}\n                  citations={turn.citations}\n                  sendMessage={onSendMessage}\n                  sendDisabled={sendDisabled || isStreaming}\n                />\n              </Suspense>,\n            )}\n\n            {/* Streaming cursor */}\n            {isStreaming && <StreamingCursor />}\n\n            {/* Sources panel */}\n            {turn.citations && turn.citations.length > 0 && (\n              <div className={classes.sources}>\n                {renderSlot(\n                  slots?.sources,\n                  sourcesSlotProps,\n                  <SourcesPanel citations={turn.citations} />,\n                )}\n              </div>\n            )}\n\n            {/* Explanation section */}\n            {hasExplanation && (\n              <div className={classes.explanation}>\n                {renderSlot(\n                  slots?.explanation,\n                  explanationSlotProps,\n                  <>\n                    <button\n                      type=\"button\"\n                      onClick={() =>\n                        setExplanationExpanded(!explanationExpanded)\n                      }\n                      className=\"cursor-pointer 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 duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 rounded-md p-1 -m-1\"\n                      aria-expanded={explanationExpanded}\n                    >\n                      <CaretRight\n                        size={16}\n                        weight=\"bold\"\n                        className={`transition-transform duration-150 ${\n                          explanationExpanded ? \"rotate-90\" : \"\"\n                        }`}\n                      />\n                      <span className=\"font-medium\">\n                        {t(\"BiChat.Assistant.Explanation\")}\n                      </span>\n                    </button>\n                    {explanationExpanded && (\n                      <div className=\"pt-3 text-sm text-gray-600 dark:text-gray-400\">\n                        <Suspense\n                          fallback={<div>{t(\"BiChat.Common.Loading\")}</div>}\n                        >\n                          <MarkdownRenderer content={turn.explanation!} />\n                        </Suspense>\n                      </div>\n                    )}\n                  </>,\n                )}\n              </div>\n            )}\n\n            {showDebug && <DebugPanel trace={turn.debug} />}\n          </div>\n        )}\n\n        {/* Artifacts */}\n        {turn.artifacts && turn.artifacts.length > 0 && (\n          <div className={classes.artifacts}>\n            {renderSlot(\n              slots?.artifacts,\n              artifactsSlotProps,\n              turn.artifacts.map((artifact, index) => (\n                <DownloadCard\n                  key={`${artifact.filename}-${index}`}\n                  artifact={artifact}\n                />\n              )),\n            )}\n          </div>\n        )}\n\n        {/* HITL waiting state */}\n        {renderMode === \"hitl_waiting\" && (\n          <div className=\"animate-slide-up rounded-2xl border border-primary-200 dark:border-primary-700/40 bg-gradient-to-b from-primary-50/70 to-white dark:from-primary-900/20 dark:to-gray-900/80 shadow-sm p-4\">\n            <p className=\"text-sm font-medium text-primary-700 dark:text-primary-300\">\n              {t(\"BiChat.InlineQuestion.InputNeeded\")}\n            </p>\n            <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n              {t(\"BiChat.InlineQuestion.WaitingForDetails\")}\n            </p>\n          </div>\n        )}\n\n        {renderMode === \"hitl_resuming\" && (\n          <div\n            role=\"status\"\n            aria-live=\"polite\"\n            className=\"animate-slide-up flex items-center gap-2 rounded-xl border border-emerald-100/80 bg-emerald-50/60 px-3 py-2 text-xs text-emerald-800 dark:border-emerald-900/60 dark:bg-emerald-950/20 dark:text-emerald-200\"\n          >\n            <span\n              className=\"inline-flex h-2 w-2 flex-shrink-0 rounded-full bg-emerald-500 animate-pulse\"\n              aria-hidden=\"true\"\n            />\n            <span className=\"font-medium\">\n              {pendingQuestion?.status === \"REJECT_SUBMITTED\"\n                ? t(\"BiChat.InlineQuestion.DismissalSubmitted\")\n                : t(\"BiChat.InlineQuestion.AnswerSubmitted\")}\n            </span>\n            <span\n              className=\"text-emerald-400/80 dark:text-emerald-500/80\"\n              aria-hidden=\"true\"\n            >\n              •\n            </span>\n            <span className=\"text-emerald-700/80 dark:text-emerald-300/80\">\n              {t(\"BiChat.InlineQuestion.ResumeInProgress\")}\n            </span>\n          </div>\n        )}\n\n        {/* HITL question form */}\n        {renderMode === \"hitl_form\" && pendingQuestion && (\n          <InlineQuestionForm pendingQuestion={pendingQuestion} />\n        )}\n\n        {/* Actions */}\n        {hasContent && !hideActions && (\n          <div\n            className={`${classes.actions} ${isCopied ? \"opacity-100\" : \"\"}`}\n          >\n            {renderSlot(\n              slots?.actions,\n              actionsSlotProps,\n              <>\n                {!hideTimestamp && (\n                  <span className={classes.timestamp}>{timestamp}</span>\n                )}\n\n                {showDebug && turn.debug?.attempts?.[0]?.model && (\n                  <span className=\"inline-flex items-center gap-0.5 rounded px-1 py-0.5 text-[10px] font-medium leading-none text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800\">\n                    {turn.debug.attempts[0].model}\n                  </span>\n                )}\n\n                <button\n                  onClick={handleCopyClick}\n                  className={`cursor-pointer ${classes.actionButton} ${\n                    isCopied ? \"text-green-600 dark:text-green-400\" : \"\"\n                  }`}\n                  aria-label={t(\"BiChat.Message.CopyMessage\")}\n                  title={\n                    isCopied\n                      ? t(\"BiChat.Message.Copied\")\n                      : t(\"BiChat.Message.Copy\")\n                  }\n                >\n                  {isCopied ? (\n                    <Check size={14} weight=\"bold\" />\n                  ) : (\n                    <Copy size={14} weight=\"regular\" />\n                  )}\n                </button>\n\n                {canRegenerate && (\n                  <div ref={regenPickerRef} className=\"relative inline-flex\">\n                    <button\n                      onClick={handleRegenerateClick}\n                      className={`cursor-pointer ${classes.actionButton} ${\n                        showRegenPicker\n                          ? \"bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-200\"\n                          : \"\"\n                      }`}\n                      aria-label={t(\"BiChat.Message.Regenerate\")}\n                      title={t(\"BiChat.Message.Regenerate\")}\n                      aria-haspopup={hasRegenChoices ? \"menu\" : undefined}\n                      aria-expanded={\n                        hasRegenChoices ? showRegenPicker : undefined\n                      }\n                    >\n                      <ArrowsClockwise size={14} weight=\"regular\" />\n                    </button>\n                    {hasRegenChoices && showRegenPicker && (\n                      <div\n                        role=\"menu\"\n                        aria-label={t(\"BiChat.Message.Regenerate\")}\n                        className=\"animate-slide-up absolute left-0 top-full z-20 mt-1 flex flex-col gap-0.5 rounded-lg border border-gray-200 bg-white p-1 shadow-lg dark:border-gray-700 dark:bg-gray-800\"\n                      >\n                        {regenerateModels!.map((m, i) => {\n                          const isFast = i === 0;\n                          const Icon = isFast ? Lightning : Brain;\n                          const accent = isFast\n                            ? \"text-amber-600 dark:text-amber-400\"\n                            : \"text-blue-600 dark:text-blue-400\";\n                          return (\n                            <button\n                              key={m.id}\n                              role=\"menuitem\"\n                              type=\"button\"\n                              onClick={() => {\n                                void handleRegenerateWithModel(m.id);\n                              }}\n                              className=\"flex items-center gap-2 whitespace-nowrap rounded-md px-2.5 py-1.5 text-xs font-medium text-gray-700 transition-colors duration-150 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700\"\n                            >\n                              <Icon\n                                size={14}\n                                weight=\"fill\"\n                                className={accent}\n                              />\n                              <span>{t(m.label)}</span>\n                            </button>\n                          );\n                        })}\n                      </div>\n                    )}\n                  </div>\n                )}\n              </>,\n            )}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n\nexport default AssistantMessage;\n","import { memo, useCallback, useState } from 'react';\nimport { MagnifyingGlass } from '@phosphor-icons/react';\nimport type { RenderTableData } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useDataTable, type DataTableOptions } from '../hooks/useDataTable';\nimport { TableExportButton } from './TableExportButton';\nimport { DataTableHeader } from './DataTableHeader';\nimport { DataTableCell } from './DataTableCell';\nimport { DataTableToolbar } from './DataTableToolbar';\nimport { DataTableFooter } from './DataTableFooter';\nimport { FullscreenOverlay } from './FullscreenOverlay';\n\nconst FULL_WIDTH_CLASS = 'w-full min-w-0 max-w-full';\n\nfunction getPageNumbers(current: number, total: number): (number | 'ellipsis')[] {\n  if (total <= 7) {return Array.from({ length: total }, (_, i) => i + 1);}\n  const pages: (number | 'ellipsis')[] = [1];\n  const left = Math.max(2, current - 1);\n  const right = Math.min(total - 1, current + 1);\n  if (left > 2) {pages.push('ellipsis');}\n  for (let i = left; i <= right; i++) {pages.push(i);}\n  if (right < total - 1) {pages.push('ellipsis');}\n  pages.push(total);\n  return pages;\n}\n\nfunction PaginationButton({\n  onClick,\n  disabled,\n  active,\n  children,\n  ...rest\n}: {\n  onClick: () => void\n  disabled?: boolean\n  active?: boolean\n  children: React.ReactNode\n  'aria-label'?: string\n  'aria-current'?: 'page'\n}) {\n  return (\n    <button\n      type=\"button\"\n      onClick={onClick}\n      disabled={disabled}\n      className={`min-w-[1.5rem] cursor-pointer rounded px-1.5 py-0.5 text-xs font-medium transition-colors ${\n        active\n          ? 'bg-blue-600 text-white'\n          : 'text-gray-600 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700'\n      } disabled:cursor-not-allowed disabled:opacity-40`}\n      {...rest}\n    >\n      {children}\n    </button>\n  );\n}\n\n/** External container control. When provided, the card runs in embedded mode. */\nexport interface TableCardHost {\n  onToggleFullscreen: () => void\n  isFullscreen: boolean\n}\n\ninterface InteractiveTableCardProps {\n  table: RenderTableData\n  onSendMessage?: (content: string) => void\n  sendDisabled?: boolean\n  options?: DataTableOptions\n  /** When provided, the card runs in embedded mode — strips outer chrome, hides header, delegates fullscreen to the host. */\n  host?: TableCardHost\n}\n\nexport const InteractiveTableCard = memo(function InteractiveTableCard({\n  table,\n  onSendMessage,\n  sendDisabled = false,\n  options,\n  host,\n}: InteractiveTableCardProps) {\n  const { t } = useTranslation();\n  const dt = useDataTable(table, options);\n\n  const canExportViaPrompt = !!onSendMessage && !!table.exportPrompt;\n  const exportDisabled = sendDisabled || (!table.export?.url && !canExportViaPrompt);\n\n  const handleExport = useCallback(() => {\n    if (table.export?.url) {\n      try {\n        const parsed = new URL(table.export.url, window.location.origin);\n        if (!['http:', 'https:', 'blob:'].includes(parsed.protocol)) {\n          console.warn('[InteractiveTableCard] Blocked export URL with unsafe protocol:', parsed.protocol);\n          return;\n        }\n      } catch {\n        console.warn('[InteractiveTableCard] Blocked malformed export URL');\n        return;\n      }\n      const link = document.createElement('a');\n      link.href = table.export.url;\n      link.download = table.export.filename || 'table_export.xlsx';\n      link.rel = 'noopener noreferrer';\n      document.body.appendChild(link);\n      link.click();\n      document.body.removeChild(link);\n      return;\n    }\n\n    if (canExportViaPrompt && table.exportPrompt) {\n      onSendMessage?.(table.exportPrompt);\n    }\n  }, [canExportViaPrompt, onSendMessage, table.export, table.exportPrompt]);\n\n  const handleCellCopy = useCallback(\n    (text: string) => {\n      navigator.clipboard.writeText(text).catch(() => {\n        /* clipboard API unavailable */\n      });\n    },\n    [],\n  );\n\n  const handleCopyTable = useCallback(() => {\n    const tsv = dt.getTableAsTSV();\n    navigator.clipboard.writeText(tsv).catch(() => {\n      /* clipboard API unavailable */\n    });\n  }, [dt]);\n\n  const [internalFullscreen, setInternalFullscreen] = useState(false);\n  const isFullscreen = host ? host.isFullscreen : internalFullscreen;\n  const toggleFullscreen = host ? host.onToggleFullscreen : () => setInternalFullscreen((v) => !v);\n\n  const [hoveredRow, setHoveredRow] = useState<number | null>(null);\n\n  const rowBg = (rowIndex: number): string =>\n    hoveredRow === rowIndex\n      ? 'bg-gray-100 dark:bg-gray-800/40'\n      : rowIndex % 2 === 1 ? 'bg-gray-50 dark:bg-gray-900' : 'bg-white dark:bg-gray-900';\n\n  const hasHiddenColumns = dt.columns.some((c) => !c.visible);\n  const from = dt.totalFilteredRows === 0 ? 0 : (dt.page - 1) * dt.pageSize + 1;\n  const to = Math.min(dt.page * dt.pageSize, dt.totalFilteredRows);\n  const loadedRowsCount = table.rows.length;\n  const reportedRowsCount = Math.max(table.totalRows || 0, loadedRowsCount);\n\n  const renderToolbar = () => (\n    <DataTableToolbar\n      columns={dt.columns}\n      searchQuery={dt.searchQuery}\n      onSearchChange={dt.setSearchQuery}\n      onToggleColumnVisibility={dt.toggleColumnVisibility}\n      onResetColumnVisibility={dt.resetColumnVisibility}\n      hasHiddenColumns={hasHiddenColumns}\n      sort={dt.sort}\n      onClearSort={dt.clearSort}\n      onCopyTable={handleCopyTable}\n      isFullscreen={isFullscreen}\n      onToggleFullscreen={toggleFullscreen}\n    />\n  );\n\n  const renderHeader = () => (\n    <header className=\"flex flex-wrap items-center justify-between gap-2 border-b border-gray-200 px-3 py-2 dark:border-gray-700\">\n      <div className=\"min-w-0\">\n        <h4 className=\"truncate text-sm font-semibold text-gray-900 dark:text-gray-100\">\n          {table.title || t('BiChat.Table.QueryResults')}\n        </h4>\n        <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n          {dt.totalFilteredRows === loadedRowsCount\n            ? loadedRowsCount === reportedRowsCount\n              ? loadedRowsCount === 1\n                ? t('BiChat.Table.OneRowLoaded')\n                : t('BiChat.Table.RowsLoaded', { count: String(loadedRowsCount) })\n              : t('BiChat.DataTable.FilteredRows', {\n                  filtered: String(loadedRowsCount),\n                  total: String(reportedRowsCount),\n                })\n            : t('BiChat.DataTable.FilteredRows', {\n                filtered: String(dt.totalFilteredRows),\n                total: String(loadedRowsCount),\n              })}\n          {table.truncated ? ` ${t('BiChat.Table.TruncatedSuffix')}` : ''}\n        </p>\n      </div>\n\n      <TableExportButton\n        onClick={handleExport}\n        disabled={exportDisabled}\n        label={t('BiChat.Table.ExportToExcel')}\n        disabledTooltip={sendDisabled ? t('BiChat.Table.PleaseWait') : t('BiChat.Table.ExportUnavailable')}\n      />\n    </header>\n  );\n\n  const renderTable = (scrollClass: string) => (\n    <div className={`${FULL_WIDTH_CLASS} ${scrollClass}`}>\n      <table className=\"min-w-full border-collapse text-sm\">\n        <DataTableHeader\n          tableId={table.id}\n          columns={dt.visibleColumns}\n          sort={dt.sort}\n          onToggleSort={dt.toggleSort}\n          onColumnResize={dt.setColumnWidth}\n          onToggleVisibility={dt.toggleColumnVisibility}\n          onSendMessage={onSendMessage}\n          sendDisabled={sendDisabled}\n          showRowNumbers\n        />\n        <tbody>\n          {dt.pageRows.map((row, rowIndex) => (\n            <tr\n              key={`${table.id}-row-${rowIndex}`}\n              className={`border-b border-gray-100 dark:border-gray-800 ${rowBg(rowIndex)}`}\n              onMouseEnter={() => setHoveredRow(rowIndex)}\n              onMouseLeave={() => setHoveredRow(null)}\n            >\n              <td className={`sticky left-0 z-[2] w-10 px-2 py-2 text-right text-xs tabular-nums text-gray-400 dark:text-gray-500 select-none ${rowBg(rowIndex)}`}>\n                {(dt.page - 1) * dt.pageSize + rowIndex + 1}\n              </td>\n              {dt.visibleColumns.map((col, colIdx) => (\n                <DataTableCell\n                  key={`${table.id}-cell-${rowIndex}-${col.index}`}\n                  formatted={dt.formatCell(row[col.index], col.index)}\n                  alignment={dt.getCellAlignment(col.index)}\n                  onCopy={handleCellCopy}\n                  isSticky={colIdx === 0}\n                  stickyClassName={`sticky left-[2.5rem] z-[1] ${rowBg(rowIndex)}`}\n                />\n              ))}\n            </tr>\n          ))}\n          {dt.pageRows.length === 0 && (\n            <tr>\n              <td\n                colSpan={dt.visibleColumns.length + 1}\n                className=\"px-3 py-10 text-center\"\n              >\n                {dt.searchQuery ? (\n                  <div className=\"flex flex-col items-center gap-2\">\n                    <MagnifyingGlass size={32} className=\"text-gray-300 dark:text-gray-600\" weight=\"duotone\" />\n                    <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\n                      {t('BiChat.DataTable.NoMatchingRows')}\n                    </p>\n                    <button\n                      type=\"button\"\n                      onClick={() => dt.setSearchQuery('')}\n                      className=\"cursor-pointer text-xs font-medium text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300\"\n                    >\n                      {t('BiChat.DataTable.ClearSearchAction')}\n                    </button>\n                  </div>\n                ) : (\n                  <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n                    {t('BiChat.Table.NoRows')}\n                  </span>\n                )}\n              </td>\n            </tr>\n          )}\n        </tbody>\n        <DataTableFooter\n          visibleColumns={dt.visibleColumns}\n          stats={dt.columnStats}\n          showRowNumbers\n        />\n      </table>\n    </div>\n  );\n\n  const renderPagination = (idPrefix: string) => (\n    <footer className=\"flex flex-wrap items-center justify-between gap-2 border-t border-gray-200 px-3 py-2 dark:border-gray-700\">\n      <div className=\"flex items-center gap-2\">\n        <div className=\"text-xs text-gray-500 dark:text-gray-400\">\n          {t('BiChat.Table.Showing', {\n            from: String(from),\n            to: String(to),\n            total: String(dt.totalFilteredRows),\n          })}\n        </div>\n        <label className=\"text-xs text-gray-500 dark:text-gray-400\" htmlFor={`${idPrefix}-page-size`}>\n          {t('BiChat.Table.RowsLabel')}\n        </label>\n        <select\n          id={`${idPrefix}-page-size`}\n          value={dt.pageSize}\n          onChange={(event) => dt.setPageSize(Number(event.target.value))}\n          className=\"rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-700 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200\"\n        >\n          {dt.pageSizeOptions.map((option) => (\n            <option key={`${idPrefix}-size-${option}`} value={option}>\n              {option}\n            </option>\n          ))}\n        </select>\n      </div>\n\n      <nav className=\"flex items-center gap-1\" aria-label=\"Pagination\">\n        <PaginationButton\n          onClick={() => dt.setPage(1)}\n          disabled={dt.page <= 1}\n          aria-label={t('BiChat.DataTable.FirstPage')}\n        >\n          &laquo;\n        </PaginationButton>\n        <PaginationButton\n          onClick={() => dt.setPage(Math.max(1, dt.page - 1))}\n          disabled={dt.page <= 1}\n          aria-label={t('BiChat.Table.Prev')}\n        >\n          &lsaquo;\n        </PaginationButton>\n        {getPageNumbers(dt.page, dt.totalPages).map((item, i) =>\n          item === 'ellipsis' ? (\n            <span key={`ellipsis-${i}`} className=\"px-1 text-xs text-gray-400\" aria-hidden>\n              &hellip;\n            </span>\n          ) : (\n            <PaginationButton\n              key={item}\n              onClick={() => dt.setPage(item)}\n              active={item === dt.page}\n              aria-current={item === dt.page ? 'page' : undefined}\n            >\n              {item}\n            </PaginationButton>\n          ),\n        )}\n        <PaginationButton\n          onClick={() => dt.setPage(Math.min(dt.totalPages, dt.page + 1))}\n          disabled={dt.page >= dt.totalPages}\n          aria-label={t('BiChat.Table.Next')}\n        >\n          &rsaquo;\n        </PaginationButton>\n        <PaginationButton\n          onClick={() => dt.setPage(dt.totalPages)}\n          disabled={dt.page >= dt.totalPages}\n          aria-label={t('BiChat.DataTable.LastPage')}\n        >\n          &raquo;\n        </PaginationButton>\n      </nav>\n    </footer>\n  );\n\n  const renderTruncationNotice = () =>\n    table.truncated ? (\n      <p className=\"border-t border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-700 dark:border-amber-700/60 dark:bg-amber-900/20 dark:text-amber-300\">\n        {t('BiChat.Table.TruncatedNotice')}\n      </p>\n    ) : null;\n\n  const fillHeight = host?.isFullscreen ?? false;\n\n  const sectionClassName = host\n    ? `${FULL_WIDTH_CLASS} overflow-hidden${fillHeight ? ' flex flex-col flex-1' : ''}`\n    : `${FULL_WIDTH_CLASS} rounded-xl border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900/40 overflow-hidden`;\n\n  return (\n    <>\n      <section className={sectionClassName}>\n        {renderToolbar()}\n        {!host && renderHeader()}\n        {renderTable(fillHeight ? 'flex-1 overflow-auto' : 'max-h-[420px] overflow-auto')}\n        {renderPagination(table.id)}\n        {renderTruncationNotice()}\n      </section>\n\n      {/* Standalone fullscreen — only when not hosted */}\n      {!host && isFullscreen && (\n        <FullscreenOverlay\n          title={table.title || t('BiChat.Table.QueryResults')}\n          onClose={() => setInternalFullscreen(false)}\n          closeLabel={t('BiChat.DataTable.Collapse')}\n        >\n          {renderToolbar()}\n          {renderHeader()}\n          {renderTable('flex-1 overflow-auto')}\n          {renderPagination(`${table.id}-fs`)}\n          {renderTruncationNotice()}\n        </FullscreenOverlay>\n      )}\n    </>\n  );\n});\n","export type ColumnType = 'string' | 'number' | 'boolean' | 'date' | 'url' | 'null'\n\nexport interface FormattedCell {\n  display: string\n  raw: unknown\n  type: ColumnType\n  isNull: boolean\n}\n\nconst URL_PATTERN = /^https?:\\/\\//i;\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:?\\d{2})?)?)?$/;\nconst MAX_SAMPLE = 20;\n\n// Long integers (phone numbers, IDs) lose meaning when formatted with thousand\n// separators and may exceed the safe integer range.\nfunction isLongInteger(v: unknown): boolean {\n  if (typeof v === 'number') {return Number.isInteger(v) && Math.abs(v) >= 1e9;}\n  if (typeof v === 'string') {return /^\\d{10,}$/.test(v.trim());}\n  return false;\n}\n\nexport function inferColumnType(values: unknown[], backendHint?: string): ColumnType {\n  const nonNull = values.filter((v) => v !== null && v !== undefined);\n  const sample = nonNull.slice(0, MAX_SAMPLE);\n\n  // Override backend 'number' hint when all values look like identifiers (phone numbers, IDs).\n  if (backendHint === 'number' && sample.length > 0 && sample.every(isLongInteger)) {\n    return 'string';\n  }\n\n  if (backendHint) {\n    switch (backendHint) {\n      case 'number':\n        return 'number';\n      case 'boolean':\n        return 'boolean';\n      case 'date':\n        return 'date';\n      default:\n        return 'string';\n    }\n  }\n\n  if (nonNull.length === 0) {return 'null';}\n\n  if (sample.every((v) => typeof v === 'number' || (typeof v === 'string' && v.trim() !== '' && !isNaN(Number(v))))) {\n    if (sample.every(isLongInteger)) {\n      return 'string';\n    }\n    return 'number';\n  }\n\n  if (sample.every((v) => typeof v === 'boolean' || v === 'true' || v === 'false')) {\n    return 'boolean';\n  }\n\n  if (sample.every((v) => typeof v === 'string' && ISO_DATE_PATTERN.test(v))) {\n    return 'date';\n  }\n\n  if (sample.length > 0 && sample.every((v) => typeof v === 'string' && URL_PATTERN.test(v))) {\n    return 'url';\n  }\n\n  return 'string';\n}\n\nexport function formatCellValue(value: unknown, type: ColumnType): FormattedCell {\n  if (value === null || value === undefined) {\n    return { display: 'NULL', raw: value, type, isNull: true };\n  }\n\n  switch (type) {\n    case 'number': {\n      const num = typeof value === 'number' ? value : Number(value);\n      if (!isFinite(num)) {\n        return { display: String(value), raw: value, type, isNull: false };\n      }\n      // Large integers (≥10 digits) are typically identifiers (phone numbers, IDs)\n      // — display without thousand separators to preserve readability.\n      if (Number.isInteger(num) && Math.abs(num) >= 1e9) {\n        return { display: String(num), raw: value, type, isNull: false };\n      }\n      const display = new Intl.NumberFormat(undefined, {\n        maximumFractionDigits: 6,\n      }).format(num);\n      return { display, raw: value, type, isNull: false };\n    }\n\n    case 'boolean': {\n      const bool = typeof value === 'boolean' ? value : String(value).toLowerCase() === 'true';\n      return { display: bool ? 'true' : 'false', raw: value, type, isNull: false };\n    }\n\n    case 'date': {\n      const str = String(value);\n      const date = new Date(str);\n      if (isNaN(date.getTime())) {\n        return { display: str, raw: value, type, isNull: false };\n      }\n      const now = new Date();\n      const sameCalendarDay = date.toDateString() === now.toDateString();\n      let display: string;\n      if (sameCalendarDay) {\n        display = date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n      } else {\n        const diffDays = Math.abs(now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24);\n        if (diffDays < 365) {\n          display = date.toLocaleDateString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' });\n        } else {\n          display = date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n        }\n      }\n      return { display, raw: value, type, isNull: false };\n    }\n\n    case 'url': {\n      return { display: String(value), raw: value, type, isNull: false };\n    }\n\n    default: {\n      const str = typeof value === 'object'\n        ? JSON.stringify(value)\n        : String(value);\n      return { display: str, raw: value, type, isNull: false };\n    }\n  }\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { RenderTableData } from '../types';\nimport { type ColumnType, type FormattedCell, inferColumnType, formatCellValue } from '../utils/columnTypes';\n\nexport interface ColumnMeta {\n  index: number\n  name: string\n  header: string\n  type: ColumnType\n  width: number | null\n  visible: boolean\n}\n\nexport interface SortState {\n  columnIndex: number\n  direction: 'asc' | 'desc'\n}\n\nexport interface ColumnStats {\n  sum: number\n  avg: number\n  min: number\n  max: number\n  count: number\n  nullCount: number\n}\n\nexport interface DataTableOptions {\n  defaultPageSize?: number\n  enableSearch?: boolean\n  enableSort?: boolean\n  enableResize?: boolean\n  enableColumnVisibility?: boolean\n}\n\nconst PAGE_SIZE_OPTIONS = [10, 25, 50, 100, 200];\n\nexport interface UseDataTableReturn {\n  columns: ColumnMeta[]\n  visibleColumns: ColumnMeta[]\n\n  page: number\n  pageSize: number\n  totalPages: number\n  totalFilteredRows: number\n  pageSizeOptions: number[]\n  pageRows: unknown[][]\n  setPage: (page: number) => void\n  setPageSize: (size: number) => void\n\n  sort: SortState | null\n  toggleSort: (columnIndex: number) => void\n  clearSort: () => void\n\n  searchQuery: string\n  setSearchQuery: (query: string) => void\n\n  columnStats: Map<number, ColumnStats>\n\n  toggleColumnVisibility: (columnIndex: number) => void\n  resetColumnVisibility: () => void\n\n  setColumnWidth: (columnIndex: number, width: number) => void\n\n  formatCell: (value: unknown, columnIndex: number) => FormattedCell\n  getCellAlignment: (columnIndex: number) => 'left' | 'right'\n\n  getTableAsTSV: () => string\n}\n\nexport function useDataTable(\n  table: RenderTableData,\n  options?: DataTableOptions,\n): UseDataTableReturn {\n  const defaultPageSize = Math.min(Math.max(table.pageSize || options?.defaultPageSize || 25, 1), 200);\n  const [page, setPage] = useState(1);\n  const [pageSize, setPageSize] = useState(defaultPageSize);\n  const [sort, setSort] = useState<SortState | null>(null);\n  const [searchQuery, setSearchQuery] = useState('');\n  const [columnVisibility, setColumnVisibility] = useState<Map<number, boolean>>(new Map());\n  const [columnWidths, setColumnWidths] = useState<Map<number, number>>(new Map());\n\n  // Reset state when table identity changes\n  useEffect(() => {\n    setPage(1);\n    setPageSize(Math.min(Math.max(table.pageSize || options?.defaultPageSize || 25, 1), 200));\n    setSort(null);\n    setSearchQuery('');\n    setColumnVisibility(new Map());\n    setColumnWidths(new Map());\n  }, [table.id]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  // Type inference depends only on table data\n  const columnTypes = useMemo(() => {\n    return table.columns.map((_, index) => {\n      const backendHint = table.columnTypes?.[index];\n      const columnValues = table.rows.map((row) => row[index]);\n      return inferColumnType(columnValues, backendHint);\n    });\n  }, [table.columns, table.rows, table.columnTypes]);\n\n  // Column metadata: types + width/visibility\n  const columns: ColumnMeta[] = useMemo(() => {\n    return table.columns.map((name, index) => ({\n      index,\n      name,\n      header: table.headers[index] || name,\n      type: columnTypes[index],\n      width: columnWidths.get(index) ?? null,\n      visible: columnVisibility.get(index) ?? true,\n    }));\n  }, [table.columns, table.headers, columnTypes, columnWidths, columnVisibility]);\n\n  const visibleColumns = useMemo(() => columns.filter((c) => c.visible), [columns]);\n\n  // Apply search filter\n  const searchFilteredRows = useMemo(() => {\n    if (!searchQuery.trim()) {return table.rows;}\n    const query = searchQuery.toLowerCase();\n    const visibleIndices = new Set(visibleColumns.map((c) => c.index));\n    return table.rows.filter((row) =>\n      row.some((cell, i) => {\n        if (!visibleIndices.has(i)) {return false;}\n        if (cell === null || cell === undefined) {return false;}\n        return String(cell).toLowerCase().includes(query);\n      }),\n    );\n  }, [table.rows, searchQuery, visibleColumns]);\n\n  // Apply sort\n  const sortedRows = useMemo(() => {\n    if (!sort) {return searchFilteredRows;}\n\n    const col = columns[sort.columnIndex];\n    if (!col) {return searchFilteredRows;}\n\n    const sorted = [...searchFilteredRows];\n    const colIdx = sort.columnIndex;\n    const dir = sort.direction === 'asc' ? 1 : -1;\n\n    sorted.sort((a, b) => {\n      const aVal = a[colIdx];\n      const bVal = b[colIdx];\n\n      // Nulls always last\n      const aNull = aVal === null || aVal === undefined;\n      const bNull = bVal === null || bVal === undefined;\n      if (aNull && bNull) {return 0;}\n      if (aNull) {return 1;}\n      if (bNull) {return -1;}\n\n      switch (col.type) {\n        case 'number': {\n          const aNum = typeof aVal === 'number' ? aVal : Number(aVal);\n          const bNum = typeof bVal === 'number' ? bVal : Number(bVal);\n          if (isNaN(aNum) && isNaN(bNum)) {return 0;}\n          if (isNaN(aNum)) {return 1;}\n          if (isNaN(bNum)) {return -1;}\n          return (aNum - bNum) * dir;\n        }\n        case 'date': {\n          const aTime = new Date(String(aVal)).getTime();\n          const bTime = new Date(String(bVal)).getTime();\n          if (isNaN(aTime) && isNaN(bTime)) {return 0;}\n          if (isNaN(aTime)) {return 1;}\n          if (isNaN(bTime)) {return -1;}\n          return (aTime - bTime) * dir;\n        }\n        case 'boolean': {\n          const aBool = aVal === true || aVal === 'true' ? 1 : 0;\n          const bBool = bVal === true || bVal === 'true' ? 1 : 0;\n          return (aBool - bBool) * dir;\n        }\n        default: {\n          return String(aVal).localeCompare(String(bVal)) * dir;\n        }\n      }\n    });\n\n    return sorted;\n  }, [searchFilteredRows, sort, columns]);\n\n  const totalFilteredRows = sortedRows.length;\n\n  // Compute stats on filtered numeric columns (visible columns only)\n  const columnStats = useMemo<Map<number, ColumnStats>>(() => {\n    const stats = new Map<number, ColumnStats>();\n    for (const col of visibleColumns) {\n      if (col.type !== 'number') {continue;}\n      let sum = 0;\n      let min = Infinity;\n      let max = -Infinity;\n      let count = 0;\n      let nullCount = 0;\n\n      for (const row of sortedRows) {\n        const val = row[col.index];\n        if (val === null || val === undefined) {\n          nullCount++;\n          continue;\n        }\n        const num = typeof val === 'number' ? val : Number(val);\n        if (isNaN(num)) {continue;}\n        sum += num;\n        min = Math.min(min, num);\n        max = Math.max(max, num);\n        count++;\n      }\n\n      if (count > 0) {\n        stats.set(col.index, {\n          sum,\n          avg: sum / count,\n          min,\n          max,\n          count,\n          nullCount,\n        });\n      }\n    }\n    return stats;\n  }, [visibleColumns, sortedRows]);\n\n  // Pagination\n  const totalPages = Math.max(1, Math.ceil(totalFilteredRows / pageSize));\n\n  useEffect(() => {\n    setPage((prev) => Math.min(prev, totalPages));\n  }, [totalPages]);\n\n  const pageRows = useMemo(() => {\n    const start = (page - 1) * pageSize;\n    return sortedRows.slice(start, start + pageSize);\n  }, [page, pageSize, sortedRows]);\n\n  const pageSizeOptions = useMemo(() => {\n    const set = new Set([...PAGE_SIZE_OPTIONS, defaultPageSize]);\n    return [...set].sort((a, b) => a - b);\n  }, [defaultPageSize]);\n\n  // Reset page on search/sort change\n  useEffect(() => {\n    setPage(1);\n  }, [searchQuery, sort]);\n\n  // Actions\n  const toggleSort = useCallback(\n    (columnIndex: number) => {\n      if (options?.enableSort === false) {return;}\n      setSort((prev) => {\n        if (!prev || prev.columnIndex !== columnIndex) {\n          return { columnIndex, direction: 'asc' };\n        }\n        if (prev.direction === 'asc') {\n          return { columnIndex, direction: 'desc' };\n        }\n        return null;\n      });\n    },\n    [options?.enableSort],\n  );\n\n  const handleSetSearchQuery = useCallback(\n    (query: string) => {\n      if (options?.enableSearch === false) {return;}\n      setSearchQuery(query);\n    },\n    [options?.enableSearch],\n  );\n\n  const toggleColumnVisibility = useCallback(\n    (columnIndex: number) => {\n      if (options?.enableColumnVisibility === false) {return;}\n      const numColumns = table.columns.length;\n      setColumnVisibility((prev) => {\n        const next = new Map(prev);\n        const currentlyVisible = prev.get(columnIndex) ?? true;\n        if (currentlyVisible) {\n          let visibleCount = 0;\n          for (let i = 0; i < numColumns; i++) {\n            if (prev.get(i) ?? true) {visibleCount++;}\n          }\n          if (visibleCount <= 1) {return prev;}\n        }\n        next.set(columnIndex, !currentlyVisible);\n        return next;\n      });\n    },\n    [options?.enableColumnVisibility, table.columns.length],\n  );\n\n  const resetColumnVisibility = useCallback(() => {\n    setColumnVisibility(new Map());\n  }, []);\n\n  const setColumnWidthCb = useCallback(\n    (columnIndex: number, width: number) => {\n      if (options?.enableResize === false) {return;}\n      setColumnWidths((prev) => {\n        const next = new Map(prev);\n        next.set(columnIndex, Math.max(60, width));\n        return next;\n      });\n    },\n    [options?.enableResize],\n  );\n\n  const formatCell = useCallback(\n    (value: unknown, columnIndex: number): FormattedCell => {\n      const type = columnTypes[columnIndex] ?? 'string';\n      return formatCellValue(value, type);\n    },\n    [columnTypes],\n  );\n\n  const getCellAlignment = useCallback(\n    (columnIndex: number): 'left' | 'right' => {\n      return columnTypes[columnIndex] === 'number' ? 'right' : 'left';\n    },\n    [columnTypes],\n  );\n\n  const clearSort = useCallback(() => setSort(null), []);\n\n  const handleSetPageSize = useCallback(\n    (size: number) => {\n      setPageSize(size);\n      setPage(1);\n    },\n    [],\n  );\n\n  const getTableAsTSV = useCallback((): string => {\n    const escape = (v: string) => v.replace(/[\\t\\r\\n]/g, ' ');\n    const visCols = columns.filter((c) => c.visible);\n    const headerRow = visCols.map((c) => escape(c.header)).join('\\t');\n    const dataRows = sortedRows.map((row) =>\n      visCols.map((c) => {\n        const val = row[c.index];\n        if (val === null || val === undefined) {return '';}\n        return escape(String(val));\n      }).join('\\t'),\n    );\n    return [headerRow, ...dataRows].join('\\n');\n  }, [columns, sortedRows]);\n\n  return {\n    columns,\n    visibleColumns,\n\n    page,\n    pageSize,\n    totalPages,\n    totalFilteredRows,\n    pageSizeOptions,\n    pageRows,\n    setPage,\n    setPageSize: handleSetPageSize,\n\n    sort,\n    toggleSort,\n    clearSort,\n\n    searchQuery,\n    setSearchQuery: handleSetSearchQuery,\n\n    columnStats,\n\n    toggleColumnVisibility,\n    resetColumnVisibility,\n\n    setColumnWidth: setColumnWidthCb,\n\n    formatCell,\n    getCellAlignment,\n\n    getTableAsTSV,\n  };\n}\n","import { memo, useCallback, useEffect, useRef } from 'react';\nimport { CaretUp, CaretDown, DotsThreeVertical } from '@phosphor-icons/react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport type { ColumnMeta, SortState } from '../hooks/useDataTable';\nimport { useTranslation } from '../hooks/useTranslation';\n\nconst MIN_COLUMN_WIDTH = 40;\n\ninterface DataTableHeaderProps {\n  tableId: string\n  columns: ColumnMeta[]\n  sort: SortState | null\n  onToggleSort: (columnIndex: number) => void\n  onColumnResize: (columnIndex: number, width: number) => void\n  onToggleVisibility: (columnIndex: number) => void\n  onSendMessage?: (content: string) => void\n  sendDisabled?: boolean\n  showRowNumbers?: boolean\n}\n\nexport const DataTableHeader = memo(function DataTableHeader({\n  tableId,\n  columns,\n  sort,\n  onToggleSort,\n  onColumnResize,\n  onToggleVisibility,\n  onSendMessage,\n  sendDisabled,\n  showRowNumbers,\n}: DataTableHeaderProps) {\n  return (\n    <thead className=\"sticky top-0 z-10 bg-gray-100 dark:bg-gray-800\">\n      <tr className=\"border-b border-gray-200 dark:border-gray-700\">\n        {showRowNumbers && (\n          <th scope=\"col\" className=\"sticky left-0 z-20 w-10 bg-gray-100 px-2 py-2 text-right text-xs font-medium text-gray-400 dark:bg-gray-800 dark:text-gray-500 select-none\">\n            #\n          </th>\n        )}\n        {columns.map((col, colIdx) => (\n          <HeaderCell\n            key={`${tableId}-header-${col.index}`}\n            column={col}\n            sort={sort}\n            onToggleSort={onToggleSort}\n            onColumnResize={onColumnResize}\n            onToggleVisibility={onToggleVisibility}\n            onSendMessage={onSendMessage}\n            sendDisabled={sendDisabled}\n            isFirstColumn={colIdx === 0 && !!showRowNumbers}\n          />\n        ))}\n      </tr>\n    </thead>\n  );\n});\n\ninterface HeaderCellProps {\n  column: ColumnMeta\n  sort: SortState | null\n  onToggleSort: (columnIndex: number) => void\n  onColumnResize: (columnIndex: number, width: number) => void\n  onToggleVisibility: (columnIndex: number) => void\n  onSendMessage?: (content: string) => void\n  sendDisabled?: boolean\n  isFirstColumn?: boolean\n}\n\nconst HeaderCell = memo(function HeaderCell({\n  column,\n  sort,\n  onToggleSort,\n  onColumnResize,\n  onToggleVisibility,\n  onSendMessage,\n  sendDisabled,\n  isFirstColumn,\n}: HeaderCellProps) {\n  const { t } = useTranslation();\n  const thRef = useRef<HTMLTableCellElement>(null);\n  const resizeTeardownRef = useRef<(() => void) | null>(null);\n  const isActive = sort?.columnIndex === column.index;\n  const direction = isActive ? sort.direction : null;\n\n  useEffect(() => {\n    return () => {\n      resizeTeardownRef.current?.();\n      resizeTeardownRef.current = null;\n    };\n  }, []);\n\n  const handleResizeStart = useCallback(\n    (e: React.PointerEvent) => {\n      e.preventDefault();\n      e.stopPropagation();\n      const th = thRef.current;\n      if (!th) {return;}\n\n      const startX = e.clientX;\n      const startWidth = th.offsetWidth;\n      const pointerId = e.pointerId;\n      const target = e.currentTarget as Element;\n\n      const onMove = (moveEvent: PointerEvent) => {\n        const delta = moveEvent.clientX - startX;\n        const newWidth = Math.max(MIN_COLUMN_WIDTH, startWidth + delta);\n        onColumnResize(column.index, newWidth);\n      };\n\n      const teardown = () => {\n        document.removeEventListener('pointermove', onMove);\n        document.removeEventListener('pointerup', onUp);\n        document.removeEventListener('pointercancel', onUp);\n        resizeTeardownRef.current = null;\n        try {\n          target.releasePointerCapture(pointerId);\n        } catch {\n          // ignore\n        }\n      };\n\n      const onUp = () => teardown();\n\n      resizeTeardownRef.current = teardown;\n      document.addEventListener('pointermove', onMove);\n      document.addEventListener('pointerup', onUp);\n      document.addEventListener('pointercancel', onUp);\n      try {\n        target.setPointerCapture(pointerId);\n      } catch {\n        // ignore\n      }\n    },\n    [column.index, onColumnResize],\n  );\n\n  return (\n    <th\n      ref={thRef}\n      scope=\"col\"\n      aria-sort={direction === 'asc' ? 'ascending' : direction === 'desc' ? 'descending' : 'none'}\n      className={`group relative select-none whitespace-nowrap border-r border-transparent px-3 py-2 text-left font-semibold text-gray-700 dark:text-gray-200 ${\n        isFirstColumn ? 'sticky left-[2.5rem] z-20 bg-gray-100 dark:bg-gray-800' : ''\n      }`}\n      style={column.width ? { width: column.width, minWidth: column.width } : undefined}\n    >\n      <div className=\"flex items-center gap-1\">\n        <button\n          type=\"button\"\n          className=\"flex cursor-pointer items-center gap-1 hover:text-gray-900 dark:hover:text-white\"\n          onClick={() => onToggleSort(column.index)}\n          aria-label={t('BiChat.DataTable.SortBy', { column: column.header })}\n        >\n          <span>{column.header}</span>\n          {direction === 'asc' && <CaretUp size={12} weight=\"bold\" />}\n          {direction === 'desc' && <CaretDown size={12} weight=\"bold\" />}\n          {!direction && (\n            <span className=\"w-3 opacity-0 transition-opacity group-hover:opacity-40\">\n              <CaretUp size={12} />\n            </span>\n          )}\n        </button>\n\n        {onSendMessage && (\n          <Menu>\n            <MenuButton\n              className=\"ml-auto rounded p-0.5 opacity-0 transition-opacity hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-700\"\n              aria-label={t('BiChat.DataTable.ColumnActions')}\n            >\n              <DotsThreeVertical size={14} />\n            </MenuButton>\n            <MenuItems\n              anchor=\"bottom end\"\n              className=\"z-50 min-w-[180px] rounded-lg border border-gray-200 bg-white py-1 text-sm shadow-lg dark:border-gray-700 dark:bg-gray-800 [--anchor-gap:4px]\"\n            >\n              <MenuItem>\n                {({ focus }) => (\n                  <button\n                    type=\"button\"\n                    className={`w-full px-3 py-1.5 text-left ${focus ? 'bg-gray-100 dark:bg-gray-700' : ''} text-gray-700 dark:text-gray-200`}\n                    disabled={sendDisabled}\n                    onClick={() => onSendMessage(t('BiChat.DataTable.Prompt.SummarizeColumn', { column: column.header }))}\n                  >\n                    {t('BiChat.DataTable.SummarizeColumn')}\n                  </button>\n                )}\n              </MenuItem>\n              <MenuItem>\n                {({ focus }) => (\n                  <button\n                    type=\"button\"\n                    className={`w-full px-3 py-1.5 text-left ${focus ? 'bg-gray-100 dark:bg-gray-700' : ''} text-gray-700 dark:text-gray-200`}\n                    disabled={sendDisabled}\n                    onClick={() =>\n                      onSendMessage(t('BiChat.DataTable.Prompt.UniqueValues', { column: column.header }))\n                    }\n                  >\n                    {t('BiChat.DataTable.UniqueValues')}\n                  </button>\n                )}\n              </MenuItem>\n              <div className=\"my-1 border-t border-gray-200 dark:border-gray-700\" />\n              <MenuItem>\n                {({ focus }) => (\n                  <button\n                    type=\"button\"\n                    className={`w-full px-3 py-1.5 text-left ${focus ? 'bg-gray-100 dark:bg-gray-700' : ''} text-gray-700 dark:text-gray-200`}\n                    onClick={() => onToggleVisibility(column.index)}\n                  >\n                    {t('BiChat.DataTable.HideColumn')}\n                  </button>\n                )}\n              </MenuItem>\n            </MenuItems>\n          </Menu>\n        )}\n      </div>\n\n      {/* Resize handle */}\n      <div\n        role=\"separator\"\n        aria-orientation=\"vertical\"\n        aria-label={t('BiChat.DataTable.ResizeColumn')}\n        className=\"absolute right-0 top-0 h-full w-1 cursor-col-resize opacity-0 transition-opacity hover:bg-blue-400 hover:opacity-100 group-hover:opacity-40\"\n        onPointerDown={handleResizeStart}\n      />\n    </th>\n  );\n});\n","import { memo, useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Copy, Check } from '@phosphor-icons/react';\nimport type { FormattedCell } from '../utils/columnTypes';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface DataTableCellProps {\n  formatted: FormattedCell\n  alignment: 'left' | 'right'\n  onCopy?: (value: string) => void\n  isSticky?: boolean\n  stickyClassName?: string\n}\n\ntype CellRenderer = (props: {\n  formatted: FormattedCell\n  tooltipRef: React.Ref<HTMLSpanElement>\n  onMouseEnter: () => void\n  onMouseLeave: () => void\n}) => ReactNode\n\nconst SAFE_URL_PROTOCOLS = ['http:', 'https:', 'mailto:'];\n\nfunction safeHref(input: string): string {\n  if (!input || typeof input !== 'string') {return '#';}\n  try {\n    const url = new URL(input, 'https://example.com');\n    return SAFE_URL_PROTOCOLS.includes(url.protocol) ? url.href : '#';\n  } catch {\n    return '#';\n  }\n}\n\nconst cellRenderers: Record<string, CellRenderer> = {\n  boolean: ({ formatted }) => (\n    <span\n      className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${\n        formatted.raw === true\n          ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'\n          : 'bg-red-100 text-red-600 dark:bg-red-900/30 dark:text-red-400'\n      }`}\n    >\n      {formatted.display}\n    </span>\n  ),\n  url: ({ formatted, tooltipRef, onMouseEnter, onMouseLeave }) => {\n    const href = safeHref(formatted.display);\n    if (href === '#') {\n      return (\n        <span\n          ref={tooltipRef}\n          className=\"block max-w-[420px] truncate text-gray-700 dark:text-gray-300\"\n          onMouseEnter={onMouseEnter}\n          onMouseLeave={onMouseLeave}\n        >\n          {formatted.display}\n        </span>\n      );\n    }\n    return (\n      <a\n        href={href}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        className=\"text-blue-600 underline hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300\"\n        onClick={(e) => e.stopPropagation()}\n      >\n        <span\n          ref={tooltipRef}\n          className=\"block max-w-[420px] truncate\"\n          onMouseEnter={onMouseEnter}\n          onMouseLeave={onMouseLeave}\n        >\n          {formatted.display}\n        </span>\n      </a>\n    );\n  },\n  number: ({ formatted, tooltipRef, onMouseEnter, onMouseLeave }) => (\n    <span\n      ref={tooltipRef}\n      className=\"block font-mono text-gray-700 dark:text-gray-300 tabular-nums\"\n      onMouseEnter={onMouseEnter}\n      onMouseLeave={onMouseLeave}\n    >\n      {formatted.display}\n    </span>\n  ),\n  date: ({ formatted, tooltipRef, onMouseEnter, onMouseLeave }) => (\n    <span\n      ref={tooltipRef}\n      className=\"block text-gray-700 dark:text-gray-300\"\n      onMouseEnter={onMouseEnter}\n      onMouseLeave={onMouseLeave}\n    >\n      {formatted.display}\n    </span>\n  ),\n};\n\nconst defaultRenderer: CellRenderer = ({ formatted, tooltipRef, onMouseEnter, onMouseLeave }) => (\n  <span\n    ref={tooltipRef}\n    className=\"block max-w-[420px] truncate text-gray-700 dark:text-gray-300\"\n    onMouseEnter={onMouseEnter}\n    onMouseLeave={onMouseLeave}\n  >\n    {formatted.display}\n  </span>\n);\n\nexport const DataTableCell = memo(function DataTableCell({\n  formatted,\n  alignment,\n  onCopy,\n  isSticky,\n  stickyClassName,\n}: DataTableCellProps) {\n  const { t } = useTranslation();\n  const [copied, setCopied] = useState(false);\n  const copyTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n  const handleCopy = useCallback((e: React.MouseEvent) => {\n    e.stopPropagation();\n    if (!onCopy) {return;}\n    const text = formatted.isNull ? '' : String(formatted.raw ?? formatted.display);\n    onCopy(text);\n    clearTimeout(copyTimerRef.current);\n    setCopied(true);\n    copyTimerRef.current = setTimeout(() => setCopied(false), 2000);\n  }, [onCopy, formatted]);\n\n  const [hovered, setHovered] = useState(false);\n\n  const tooltipRef = useRef<HTMLSpanElement>(null);\n  const [tooltip, setTooltip] = useState<{ x: number; y: number } | null>(null);\n  const tooltipTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n  const handleMouseEnter = useCallback(() => {\n    const el = tooltipRef.current;\n    if (!el || el.scrollWidth <= el.clientWidth) {return;}\n    tooltipTimerRef.current = setTimeout(() => {\n      const rect = el.getBoundingClientRect();\n      setTooltip({\n        x: rect.left + rect.width / 2,\n        y: rect.bottom + 4,\n      });\n    }, 300);\n  }, []);\n\n  const handleMouseLeave = useCallback(() => {\n    clearTimeout(tooltipTimerRef.current);\n    setTooltip(null);\n  }, []);\n\n  useEffect(() => {\n    return () => {\n      clearTimeout(tooltipTimerRef.current);\n      clearTimeout(copyTimerRef.current);\n    };\n  }, []);\n\n  const hasOverflow = formatted.type === 'string' || formatted.type === 'url' || formatted.type === 'date' || formatted.type === 'number';\n  const tooltipContent = formatted.isNull ? null : (formatted.type === 'number' || formatted.type === 'date') ? String(formatted.raw) : formatted.display;\n\n  const rendererProps = { formatted, tooltipRef, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave };\n\n  const showCopyButton = onCopy && (hovered || copied) && !formatted.isNull;\n\n  return (\n    <td\n      className={`relative px-3 py-2 align-top ${alignment === 'right' ? 'text-right' : 'text-left'} ${isSticky ? stickyClassName ?? '' : ''}`}\n      onMouseEnter={() => setHovered(true)}\n      onMouseLeave={() => setHovered(false)}\n    >\n      {formatted.isNull ? (\n        <span className=\"text-xs text-gray-400 dark:text-gray-500\">&mdash;</span>\n      ) : (\n        (cellRenderers[formatted.type] ?? defaultRenderer)(rendererProps)\n      )}\n      {showCopyButton && (\n        <button\n          type=\"button\"\n          onClick={handleCopy}\n          className={`absolute top-1 right-1 cursor-pointer rounded p-0.5 transition-colors ${\n            copied\n              ? 'text-green-600 dark:text-green-400'\n              : 'text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300'\n          }`}\n          aria-label={copied ? t('BiChat.Message.Copied') : t('BiChat.DataTable.Copy')}\n        >\n          {copied ? <Check size={14} weight=\"bold\" /> : <Copy size={14} />}\n        </button>\n      )}\n      {tooltip && hasOverflow && tooltipContent && createPortal(\n        <div\n          className=\"pointer-events-none fixed max-w-[400px] rounded-lg bg-gray-900 px-3 py-2 text-xs text-white shadow-lg break-words dark:bg-gray-700\"\n          style={{\n            zIndex: 100001,\n            left: Math.min(tooltip.x, window.innerWidth - 420),\n            top: tooltip.y,\n            transform: 'translateX(-50%)',\n          }}\n        >\n          {tooltipContent}\n        </div>,\n        document.body,\n      )}\n    </td>\n  );\n});\n","import { memo, useCallback, useEffect, useState, useRef } from 'react';\nimport { ArrowsIn, ArrowsOut, CaretUp, CaretDown, Columns, Copy, X, Check } from '@phosphor-icons/react';\nimport { Popover, PopoverButton, PopoverPanel } from '@headlessui/react';\nimport type { ColumnMeta, SortState } from '../hooks/useDataTable';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface DataTableToolbarProps {\n  columns: ColumnMeta[]\n  searchQuery: string\n  onSearchChange: (query: string) => void\n  onToggleColumnVisibility: (columnIndex: number) => void\n  onResetColumnVisibility: () => void\n  hasHiddenColumns: boolean\n  sort?: SortState | null\n  onClearSort?: () => void\n  onCopyTable?: () => void\n  isFullscreen?: boolean\n  onToggleFullscreen?: () => void\n}\n\nexport const DataTableToolbar = memo(function DataTableToolbar({\n  columns,\n  searchQuery,\n  onSearchChange,\n  onToggleColumnVisibility,\n  onResetColumnVisibility,\n  hasHiddenColumns,\n  sort,\n  onClearSort,\n  onCopyTable,\n  isFullscreen,\n  onToggleFullscreen,\n}: DataTableToolbarProps) {\n  const { t } = useTranslation();\n  const [searchFocused, setSearchFocused] = useState(false);\n  const [copied, setCopied] = useState(false);\n  const copyTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n  useEffect(() => {\n    return () => {\n      if (copyTimerRef.current !== undefined) {\n        clearTimeout(copyTimerRef.current);\n        copyTimerRef.current = undefined;\n      }\n    };\n  }, []);\n\n  const handleSearchClear = useCallback(() => {\n    onSearchChange('');\n  }, [onSearchChange]);\n\n  const handleCopy = useCallback(() => {\n    onCopyTable?.();\n    clearTimeout(copyTimerRef.current);\n    setCopied(true);\n    copyTimerRef.current = setTimeout(() => setCopied(false), 2000);\n  }, [onCopyTable]);\n\n  const hasSearch = searchQuery.length > 0;\n\n  return (\n    <div className=\"flex flex-wrap items-center gap-2 border-b border-gray-200 px-3 py-2 dark:border-gray-700\">\n      {/* Search */}\n      <div className={`relative flex items-center transition-all ${searchFocused || hasSearch ? 'w-48' : 'w-32'}`}>\n        <input\n          type=\"text\"\n          value={searchQuery}\n          onChange={(e) => onSearchChange(e.target.value)}\n          onFocus={() => setSearchFocused(true)}\n          onBlur={() => setSearchFocused(false)}\n          placeholder={t('BiChat.DataTable.Search')}\n          className=\"w-full rounded-md border border-gray-300 bg-white py-1 pl-2 pr-7 text-xs text-gray-700 placeholder-gray-400 focus:border-blue-400 focus:outline-none dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:placeholder-gray-500\"\n          aria-label={t('BiChat.DataTable.SearchRows')}\n        />\n        {hasSearch && (\n          <button\n            type=\"button\"\n            onClick={handleSearchClear}\n            className=\"absolute right-1.5 cursor-pointer text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\n            aria-label={t('BiChat.DataTable.ClearSearch')}\n          >\n            <X size={12} />\n          </button>\n        )}\n      </div>\n\n      {/* Column visibility */}\n      <Popover className=\"relative\">\n        <PopoverButton\n          className={`flex cursor-pointer items-center gap-1 rounded-md border px-2 py-1 text-xs transition-colors ${\n            hasHiddenColumns\n              ? 'border-blue-300 bg-blue-50 text-blue-700 dark:border-blue-600 dark:bg-blue-900/20 dark:text-blue-400'\n              : 'border-gray-300 text-gray-600 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-800'\n          }`}\n          aria-label={t('BiChat.DataTable.ToggleColumns')}\n        >\n          <Columns size={14} />\n          <span>{t('BiChat.DataTable.Columns')}</span>\n        </PopoverButton>\n        <PopoverPanel\n          anchor=\"bottom start\"\n          className=\"z-50 mt-1 max-h-72 min-w-[200px] overflow-auto rounded-lg border border-gray-200 bg-white py-1.5 shadow-lg dark:border-gray-700 dark:bg-gray-800\"\n        >\n          {hasHiddenColumns && (\n            <>\n              <button\n                type=\"button\"\n                className=\"w-full px-3 py-1.5 text-left text-xs font-medium text-blue-600 hover:bg-gray-50 dark:text-blue-400 dark:hover:bg-gray-700\"\n                onClick={onResetColumnVisibility}\n              >\n                {t('BiChat.DataTable.ShowAllColumns')}\n              </button>\n              <div className=\"my-1 border-t border-gray-200 dark:border-gray-700\" />\n            </>\n          )}\n          {columns.map((col) => (\n            <button\n              key={col.index}\n              type=\"button\"\n              role=\"checkbox\"\n              aria-checked={col.visible}\n              className=\"flex w-full cursor-pointer items-center gap-2.5 px-3 py-1.5 text-left text-xs text-gray-700 hover:bg-gray-50 dark:text-gray-200 dark:hover:bg-gray-700/60\"\n              onClick={() => onToggleColumnVisibility(col.index)}\n            >\n              <span\n                aria-hidden=\"true\"\n                className={`flex h-4 w-4 shrink-0 items-center justify-center rounded transition-colors ${\n                  col.visible\n                    ? 'bg-blue-600 text-white'\n                    : 'border border-gray-300 bg-white dark:border-gray-500 dark:bg-gray-700'\n                }`}\n              >\n                {col.visible && <Check size={11} weight=\"bold\" />}\n              </span>\n              <span className=\"truncate\">{col.header}</span>\n            </button>\n          ))}\n        </PopoverPanel>\n      </Popover>\n\n      {/* Copy table */}\n      {onCopyTable && (\n        <button\n          type=\"button\"\n          onClick={handleCopy}\n          className={`flex cursor-pointer items-center gap-1 rounded-md border px-2 py-1 text-xs transition-colors ${\n            copied\n              ? 'border-green-300 bg-green-50 text-green-700 dark:border-green-600 dark:bg-green-900/20 dark:text-green-400'\n              : 'border-gray-300 text-gray-600 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-800'\n          }`}\n          aria-label={t('BiChat.DataTable.CopyTable')}\n        >\n          {copied ? <Check size={14} weight=\"bold\" /> : <Copy size={14} />}\n          <span>{copied ? t('BiChat.Message.Copied') : t('BiChat.DataTable.Copy')}</span>\n        </button>\n      )}\n\n      {/* Expand/collapse */}\n      {onToggleFullscreen && (\n        <button\n          type=\"button\"\n          onClick={onToggleFullscreen}\n          className=\"flex cursor-pointer items-center gap-1 rounded-md border border-gray-300 px-2 py-1 text-xs text-gray-600 transition-colors hover:bg-gray-50 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-800\"\n          aria-label={isFullscreen ? t('BiChat.DataTable.Collapse') : t('BiChat.DataTable.Expand')}\n        >\n          {isFullscreen ? <ArrowsIn size={14} /> : <ArrowsOut size={14} />}\n          <span>{isFullscreen ? t('BiChat.DataTable.Collapse') : t('BiChat.DataTable.Expand')}</span>\n        </button>\n      )}\n\n      {/* Sort indicator pill */}\n      {sort && onClearSort && (\n        <span className=\"inline-flex items-center gap-1 rounded-full border border-blue-200 bg-blue-50 px-2 py-0.5 text-xs text-blue-700 dark:border-blue-700 dark:bg-blue-900/20 dark:text-blue-400\">\n          <span>{t('BiChat.DataTable.SortedBy', { column: columns.find((c) => c.index === sort.columnIndex)?.header ?? '' })}</span>\n          {sort.direction === 'asc' ? <CaretUp size={10} weight=\"bold\" /> : <CaretDown size={10} weight=\"bold\" />}\n          <button\n            type=\"button\"\n            onClick={onClearSort}\n            className=\"ml-0.5 cursor-pointer rounded-full p-0.5 hover:bg-blue-200 dark:hover:bg-blue-800\"\n            aria-label={t('BiChat.DataTable.ClearSort')}\n          >\n            <X size={10} />\n          </button>\n        </span>\n      )}\n    </div>\n  );\n});\n","import { memo } from 'react';\nimport type { ColumnMeta, ColumnStats } from '../hooks/useDataTable';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface DataTableFooterProps {\n  visibleColumns: ColumnMeta[]\n  stats: Map<number, ColumnStats>\n  showRowNumbers?: boolean\n}\n\nfunction formatStat(value: number): string {\n  return new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 }).format(value);\n}\n\ninterface StatRowProps {\n  label: string\n  visibleColumns: ColumnMeta[]\n  stats: Map<number, ColumnStats>\n  getValue: (s: ColumnStats) => number\n  showRowNumbers?: boolean\n  odd?: boolean\n}\n\nconst StatRow = memo(function StatRow({\n  label,\n  visibleColumns,\n  stats,\n  getValue,\n  showRowNumbers,\n  odd,\n}: StatRowProps) {\n  const zebra = odd ? 'bg-gray-100 dark:bg-gray-800' : 'bg-gray-50 dark:bg-gray-900';\n  return (\n    <tr className={zebra}>\n      <td\n        colSpan={showRowNumbers ? 2 : 1}\n        className={`sticky left-0 z-20 px-3 py-1.5 text-left text-xs font-medium text-gray-500 dark:text-gray-400 select-none ${zebra}`}\n      >\n        {label}\n      </td>\n      {visibleColumns.map((col, colIdx) => {\n        if (colIdx === 0 && showRowNumbers) {return null;}\n        const s = stats.get(col.index);\n        return (\n          <td\n            key={col.index}\n            className={`px-3 py-1.5 text-xs ${\n              col.type === 'number' ? 'text-right' : 'text-left'\n            } text-gray-600 dark:text-gray-300`}\n          >\n            {s ? (\n              <span className=\"font-mono tabular-nums font-medium\">\n                {formatStat(getValue(s))}\n              </span>\n            ) : null}\n          </td>\n        );\n      })}\n    </tr>\n  );\n});\n\nexport const DataTableFooter = memo(function DataTableFooter({\n  visibleColumns,\n  stats,\n  showRowNumbers,\n}: DataTableFooterProps) {\n  const { t } = useTranslation();\n\n  if (stats.size === 0) {return null;}\n\n  return (\n    <tfoot className=\"sticky bottom-0 z-10 border-t-2 border-gray-300 dark:border-gray-600\">\n      <StatRow\n        label={t('BiChat.DataTable.StatsSum')}\n        visibleColumns={visibleColumns}\n        stats={stats}\n        getValue={(s) => s.sum}\n        showRowNumbers={showRowNumbers}\n      />\n      <StatRow\n        label={t('BiChat.DataTable.StatsAvg')}\n        visibleColumns={visibleColumns}\n        stats={stats}\n        getValue={(s) => s.avg}\n        showRowNumbers={showRowNumbers}\n        odd\n      />\n      <StatRow\n        label={t('BiChat.DataTable.StatsMin')}\n        visibleColumns={visibleColumns}\n        stats={stats}\n        getValue={(s) => s.min}\n        showRowNumbers={showRowNumbers}\n      />\n      <StatRow\n        label={t('BiChat.DataTable.StatsMax')}\n        visibleColumns={visibleColumns}\n        stats={stats}\n        getValue={(s) => s.max}\n        showRowNumbers={showRowNumbers}\n        odd\n      />\n    </tfoot>\n  );\n});\n","/**\n * Shadow-DOM-safe fullscreen overlay.\n *\n * Headless UI Dialog portals to document.body which escapes the shadow DOM\n * boundary and loses Tailwind styles. This component stays inline within\n * the shadow tree.\n */\n\nimport { useEffect, useRef } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport { useFocusTrap } from '../hooks/useFocusTrap';\nimport { useModalLock } from '../hooks/useModalLock';\n\ninterface FullscreenOverlayProps {\n  title: string\n  onClose: () => void\n  closeLabel: string\n  children: React.ReactNode\n}\n\nexport function FullscreenOverlay({ title, onClose, closeLabel, children }: FullscreenOverlayProps) {\n  const panelRef = useRef<HTMLDivElement>(null);\n  const onCloseRef = useRef(onClose);\n  onCloseRef.current = onClose;\n\n  // Lock background scroll + trap focus inside the panel (and restore it to the\n  // trigger on close). Mounted == open for this overlay, so both stay active.\n  useModalLock(true);\n  useFocusTrap(panelRef, true);\n\n  useEffect(() => {\n    const onKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') {\n        e.stopPropagation();\n        onCloseRef.current();\n      }\n    };\n    document.addEventListener('keydown', onKeyDown);\n    return () => document.removeEventListener('keydown', onKeyDown);\n  }, []);\n\n  return (\n    <div className=\"fixed inset-0\" style={{ zIndex: 99999 }}>\n      {/* Backdrop */}\n      <div\n        className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\"\n        onClick={onClose}\n        aria-hidden\n      />\n      {/* Panel */}\n      <div\n        ref={panelRef}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-label={title}\n        tabIndex={-1}\n        className=\"absolute inset-4 flex flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-2xl outline-none dark:border-gray-700 dark:bg-gray-900\"\n      >\n        <button\n          type=\"button\"\n          onClick={onClose}\n          className=\"absolute right-3 top-3 z-10 cursor-pointer rounded-lg p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n          aria-label={closeLabel}\n        >\n          <X size={18} weight=\"bold\" />\n        </button>\n        {children}\n      </div>\n    </div>\n  );\n}\n","/**\n * TabbedTableGroup — wraps multiple InteractiveTableCards behind a tab bar.\n *\n * When an assistant turn produces 2+ tables, this component replaces the\n * default vertical stack with a compact tabbed card that occupies 1x space.\n *\n * Tables are rendered once and never remount — the wrapper toggles between\n * inline and fullscreen CSS so useDataTable state (search, sort, page) is\n * preserved across all transitions.\n */\n\nimport { useState, useMemo, useCallback, useEffect, useRef, memo } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport type { RenderTableData } from '../types';\nimport type { TableCardHost } from './InteractiveTableCard';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { TabBar } from './TabBar';\nimport { InteractiveTableCard } from './InteractiveTableCard';\n\nexport interface TabbedTableGroupProps {\n  tables: RenderTableData[]\n  onSendMessage?: (content: string) => void\n  sendDisabled?: boolean\n}\n\nconst INLINE_CLASS = 'w-full min-w-0 rounded-xl border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900/40 overflow-hidden';\nconst FULLSCREEN_CLASS = 'fixed inset-4 flex flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-2xl dark:border-gray-700 dark:bg-gray-900';\n\nexport const TabbedTableGroup = memo(function TabbedTableGroup({\n  tables,\n  onSendMessage,\n  sendDisabled = false,\n}: TabbedTableGroupProps) {\n  const { t } = useTranslation();\n  const [activeTabId, setActiveTabId] = useState(tables[0]?.id ?? '');\n  const [isFullscreen, setIsFullscreen] = useState(false);\n  const containerRef = useRef<HTMLElement>(null);\n\n  const toggleFullscreen = useCallback(() => setIsFullscreen((v) => !v), []);\n\n  // Escape key + focus management for fullscreen\n  useEffect(() => {\n    if (!isFullscreen) {return;}\n    containerRef.current?.focus();\n    const onKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') {\n        e.stopPropagation();\n        setIsFullscreen(false);\n      }\n    };\n    document.addEventListener('keydown', onKeyDown);\n    return () => document.removeEventListener('keydown', onKeyDown);\n  }, [isFullscreen]);\n\n  const tabs = useMemo(\n    () =>\n      tables.map((table, i) => ({\n        id: table.id,\n        label: `${table.title || `${t('BiChat.Table.QueryResults')} ${i + 1}`} (${Math.max(table.totalRows || 0, table.rows.length)})`,\n      })),\n    [tables, t],\n  );\n\n  const host = useMemo<TableCardHost>(\n    () => ({ onToggleFullscreen: toggleFullscreen, isFullscreen }),\n    [toggleFullscreen, isFullscreen],\n  );\n\n  // Guard against empty or stale activeTabId\n  const resolvedActiveId = tabs.some((tab) => tab.id === activeTabId)\n    ? activeTabId\n    : tabs[0]?.id ?? '';\n\n  if (tables.length === 0) {return null;}\n\n  return (\n    <>\n      {/* Backdrop — only when fullscreen */}\n      {isFullscreen && (\n        <div\n          className=\"fixed inset-0 bg-black/60 backdrop-blur-sm\"\n          style={{ zIndex: 99998 }}\n          onClick={toggleFullscreen}\n          aria-hidden\n        />\n      )}\n\n      <section\n        ref={containerRef}\n        tabIndex={isFullscreen ? -1 : undefined}\n        className={isFullscreen ? FULLSCREEN_CLASS : INLINE_CLASS}\n        style={isFullscreen ? { zIndex: 99999 } : undefined}\n      >\n        {/* Close button — fullscreen only */}\n        {isFullscreen && (\n          <button\n            type=\"button\"\n            onClick={toggleFullscreen}\n            className=\"absolute right-3 top-3 z-10 cursor-pointer rounded-lg p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n            aria-label={t('BiChat.DataTable.Collapse')}\n          >\n            <X size={18} weight=\"bold\" />\n          </button>\n        )}\n\n        <TabBar\n          tabs={tabs}\n          activeTab={resolvedActiveId}\n          onTabChange={setActiveTabId}\n          compact={isFullscreen}\n        />\n\n        {tables.map((table) => {\n          const isActive = table.id === resolvedActiveId;\n          return (\n          <div\n            key={table.id}\n            id={`${table.id}-panel`}\n            role=\"tabpanel\"\n            aria-labelledby={table.id}\n            hidden={!isActive}\n            className={isActive && isFullscreen ? 'flex-1 flex flex-col min-h-0' : isActive ? undefined : 'hidden'}\n          >\n            <InteractiveTableCard\n              table={table}\n              onSendMessage={onSendMessage}\n              sendDisabled={sendDisabled}\n              host={host}\n            />\n          </div>\n          );\n        })}\n      </section>\n    </>\n  );\n});\n","/**\n * TabBar Component\n * Horizontal tabs with animated indicator for switching between views\n * Generic: accepts any set of tabs via props\n */\n\nimport { memo, useId, useRef, useCallback } from 'react';\nimport { motion } from 'framer-motion';\n\ninterface TabBarProps {\n  tabs: Array<{ id: string; label: string }>\n  activeTab: string\n  onTabChange: (tabId: string) => void\n  /** Tighter padding for space-constrained contexts like fullscreen overlays. */\n  compact?: boolean\n}\n\nfunction TabBar({ tabs, activeTab, onTabChange, compact = false }: TabBarProps) {\n  const instanceId = useId();\n  const tablistRef = useRef<HTMLDivElement>(null);\n\n  const handleKeyDown = useCallback(\n    (e: React.KeyboardEvent<HTMLDivElement>) => {\n      const currentIndex = tabs.findIndex((tab) => tab.id === activeTab);\n      if (currentIndex < 0) {return;}\n\n      let nextIndex: number | null = null;\n\n      switch (e.key) {\n        case 'ArrowRight':\n          e.preventDefault();\n          nextIndex = (currentIndex + 1) % tabs.length;\n          break;\n        case 'ArrowLeft':\n          e.preventDefault();\n          nextIndex = (currentIndex - 1 + tabs.length) % tabs.length;\n          break;\n        case 'Home':\n          e.preventDefault();\n          nextIndex = 0;\n          break;\n        case 'End':\n          e.preventDefault();\n          nextIndex = tabs.length - 1;\n          break;\n      }\n\n      if (nextIndex !== null) {\n        onTabChange(tabs[nextIndex].id);\n        // Focus the newly activated tab button\n        const tablist = tablistRef.current;\n        if (tablist) {\n          const buttons = tablist.querySelectorAll<HTMLElement>('[role=\"tab\"]');\n          buttons[nextIndex]?.focus();\n        }\n      }\n    },\n    [tabs, activeTab, onTabChange]\n  );\n\n  if (tabs.length === 0) {\n    return null;\n  }\n\n  return (\n    <div\n      ref={tablistRef}\n      className={`flex justify-center gap-1 border-b border-gray-200 dark:border-gray-700 ${compact ? 'px-3 pt-2 pb-1' : 'px-4 pt-4 pb-2'}`}\n      role=\"tablist\"\n      onKeyDown={handleKeyDown}\n    >\n      {tabs.map((tab) => (\n        <TabButton\n          key={tab.id}\n          id={tab.id}\n          label={tab.label}\n          isActive={activeTab === tab.id}\n          onClick={() => onTabChange(tab.id)}\n          layoutId={instanceId + '-tab'}\n          compact={compact}\n        />\n      ))}\n    </div>\n  );\n}\n\ninterface TabButtonProps {\n  id: string\n  label: string\n  isActive: boolean\n  onClick: () => void\n  layoutId: string\n  compact?: boolean\n}\n\nfunction TabButton({ id, label, isActive, onClick, layoutId, compact }: TabButtonProps) {\n  return (\n    <button\n      id={id}\n      role=\"tab\"\n      aria-selected={isActive}\n      aria-controls={`${id}-panel`}\n      tabIndex={isActive ? 0 : -1}\n      onClick={onClick}\n      className={`\n        cursor-pointer relative rounded-t-lg font-medium transition-smooth focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\n        ${compact ? 'px-3 py-1.5 text-xs' : 'px-4 py-2 text-sm'}\n        ${\n          isActive\n            ? 'text-primary-700 dark:text-primary-400'\n            : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'\n        }\n      `}\n    >\n      {label}\n\n      {/* Active indicator */}\n      {isActive && (\n        <motion.div\n          layoutId={layoutId}\n          className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-primary-600 dark:bg-primary-500\"\n          transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n        />\n      )}\n    </button>\n  );\n}\n\nconst MemoizedTabBar = memo(TabBar);\nMemoizedTabBar.displayName = 'TabBar';\n\nexport { MemoizedTabBar as TabBar };\nexport default MemoizedTabBar;\n","/**\n * TabbedChartGroup — wraps multiple ChartCards behind a tab bar.\n *\n * When an assistant turn produces 2+ charts, this component replaces the\n * default vertical stack with a compact tabbed card that occupies 1x space.\n *\n * Charts are rendered once and never remount — the wrapper toggles between\n * inline and fullscreen CSS so ApexCharts state is preserved across all\n * transitions.\n */\n\nimport { useState, useMemo, useCallback, useEffect, useRef, memo } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport type { ChartData } from '../types';\nimport type { ChartCardHost } from './ChartCard';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { TabBar } from './TabBar';\nimport { ChartCard } from './ChartCard';\n\nexport interface TabbedChartGroupProps {\n  charts: ChartData[]\n}\n\nconst INLINE_CLASS = 'w-full min-w-0 rounded-xl border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900/40 overflow-hidden';\nconst FULLSCREEN_CLASS = 'fixed inset-4 flex flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-2xl dark:border-gray-700 dark:bg-gray-900';\n\nexport const TabbedChartGroup = memo(function TabbedChartGroup({\n  charts,\n}: TabbedChartGroupProps) {\n  const { t } = useTranslation();\n  const [activeTabId, setActiveTabId] = useState('chart-0');\n  const [isFullscreen, setIsFullscreen] = useState(false);\n  const containerRef = useRef<HTMLElement>(null);\n  const fullscreenTriggerRef = useRef<HTMLElement | null>(null);\n\n  const toggleFullscreen = useCallback(() => {\n    setIsFullscreen((v) => {\n      if (!v) {\n        fullscreenTriggerRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n      }\n      return !v;\n    });\n  }, []);\n\n  // Escape key + focus management for fullscreen\n  useEffect(() => {\n    if (!isFullscreen) {return;}\n    containerRef.current?.focus();\n    const onKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') {\n        e.stopPropagation();\n        setIsFullscreen(false);\n      }\n    };\n    document.addEventListener('keydown', onKeyDown);\n    return () => document.removeEventListener('keydown', onKeyDown);\n  }, [isFullscreen]);\n\n  // Restore focus to trigger when exiting fullscreen\n  useEffect(() => {\n    if (!isFullscreen && fullscreenTriggerRef.current) {\n      const el = fullscreenTriggerRef.current;\n      fullscreenTriggerRef.current = null;\n      if (typeof el.focus === 'function') {el.focus();}\n    }\n  }, [isFullscreen]);\n\n  const tabs = useMemo(\n    () =>\n      charts.map((chart, i) => ({\n        id: `chart-${i}`,\n        label: chart.title || `${t('BiChat.Chart.Title')} ${i + 1}`,\n      })),\n    [charts, t],\n  );\n\n  const host = useMemo<ChartCardHost>(\n    () => ({ isFullscreen }),\n    [isFullscreen],\n  );\n\n  // Guard against stale activeTabId\n  const resolvedActiveId = tabs.some((tab) => tab.id === activeTabId)\n    ? activeTabId\n    : tabs[0]?.id ?? '';\n\n  if (charts.length === 0) {return null;}\n\n  return (\n    <>\n      {/* Backdrop — only when fullscreen */}\n      {isFullscreen && (\n        <div\n          className=\"fixed inset-0 bg-black/60 backdrop-blur-sm\"\n          style={{ zIndex: 99998 }}\n          onClick={toggleFullscreen}\n          aria-hidden\n        />\n      )}\n\n      <section\n        ref={containerRef}\n        tabIndex={isFullscreen ? -1 : undefined}\n        className={isFullscreen ? FULLSCREEN_CLASS : INLINE_CLASS}\n        style={isFullscreen ? { zIndex: 99999 } : undefined}\n      >\n        {/* Close button — fullscreen only */}\n        {isFullscreen && (\n          <button\n            type=\"button\"\n            onClick={toggleFullscreen}\n            className=\"absolute right-3 top-3 z-10 cursor-pointer rounded-lg p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n            aria-label={t('BiChat.DataTable.Collapse')}\n          >\n            <X size={18} weight=\"bold\" />\n          </button>\n        )}\n\n        <TabBar\n          tabs={tabs}\n          activeTab={resolvedActiveId}\n          onTabChange={setActiveTabId}\n          compact={isFullscreen}\n        />\n\n        {charts.map((chart, i) => {\n          const tabId = `chart-${i}`;\n          const isActive = tabId === resolvedActiveId;\n          return (\n          <div\n            key={tabId}\n            id={`${tabId}-panel`}\n            role=\"tabpanel\"\n            aria-labelledby={tabId}\n            hidden={!isActive}\n            className={isActive && isFullscreen ? 'flex-1 flex flex-col min-h-0' : isActive ? undefined : 'hidden'}\n          >\n            <ChartCard\n              chartData={chart}\n              host={host}\n            />\n          </div>\n          );\n        })}\n      </section>\n    </>\n  );\n});\n","/**\n * SourcesPanel component\n * Grok-inspired collapsible citations panel.\n * Collapsed: compact pill with overlapping domain circles + count.\n * Expanded: card panel with source titles, excerpts, and domain badges.\n */\n\nimport { useState, useCallback } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport type { Citation } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface SourcesPanelProps {\n  citations: Citation[]\n}\n\n/* ── Helpers ─────────────────────────────────────────────────────────────── */\n\nfunction extractDomain(url: string): string {\n  try {\n    return new URL(url).hostname.replace(/^www\\./, '');\n  } catch {\n    return '';\n  }\n}\n\nconst PALETTE = [\n  '#c0392b', '#d35400', '#f39c12', '#27ae60',\n  '#16a085', '#2980b9', '#8e44ad', '#d63384',\n];\n\nfunction domainColor(domain: string): string {\n  let h = 0;\n  for (let i = 0; i < domain.length; i++) {h = domain.charCodeAt(i) + ((h << 5) - h);}\n  return PALETTE[Math.abs(h) % PALETTE.length];\n}\n\n/* ── Component ───────────────────────────────────────────────────────────── */\n\nexport function SourcesPanel({ citations }: SourcesPanelProps) {\n  const { t } = useTranslation();\n  const [isOpen, setIsOpen] = useState(false);\n  const open = useCallback(() => setIsOpen(true), []);\n  const close = useCallback(() => setIsOpen(false), []);\n\n  if (!citations?.length) {return null;}\n\n  const domains = [...new Set(\n    citations.filter(c => c.url).map(c => extractDomain(c.url)).filter(Boolean),\n  )];\n  const previewDomains = domains.slice(0, 5);\n\n  /* ── Collapsed pill ─────────────────────────────────────────────────── */\n  if (!isOpen) {\n    return (\n      <div className=\"mt-3\">\n        <button\n          type=\"button\"\n          onClick={open}\n          className=\"cursor-pointer inline-flex items-center gap-2 rounded-full px-3 py-1.5\n            bg-gray-50 hover:bg-gray-100 dark:bg-gray-700/50 dark:hover:bg-gray-600/60\n            border border-gray-200/70 dark:border-gray-600/40\n            transition-colors duration-150\n            focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bichat-primary,theme(colors.blue.500))]/40\"\n        >\n          {previewDomains.length > 0 && (\n            <span className=\"flex -space-x-1.5\">\n              {previewDomains.map((domain, i) => (\n                <span\n                  key={domain}\n                  className=\"relative w-5 h-5 rounded-full flex items-center justify-center text-[8px] font-bold text-white\n                    ring-2 ring-white dark:ring-gray-800 select-none\"\n                  style={{ backgroundColor: domainColor(domain), zIndex: previewDomains.length - i }}\n                  aria-hidden=\"true\"\n                >\n                  {domain[0]?.toUpperCase()}\n                </span>\n              ))}\n            </span>\n          )}\n          <span className=\"text-xs font-medium text-gray-600 dark:text-gray-300 tabular-nums\">\n            {citations.length} {t(citations.length === 1 ? 'BiChat.Sources.Source' : 'BiChat.Sources.Sources')}\n          </span>\n        </button>\n      </div>\n    );\n  }\n\n  /* ── Expanded panel ─────────────────────────────────────────────────── */\n  return (\n    <div className=\"mt-3 rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800/90 shadow-sm overflow-hidden\">\n      {/* Header */}\n      <div className=\"flex items-center justify-between px-4 py-3\">\n        <span className=\"text-sm font-semibold text-gray-900 dark:text-gray-100\">\n          {t('BiChat.Sources.Title')}\n        </span>\n        <button\n          type=\"button\"\n          onClick={close}\n          className=\"cursor-pointer flex items-center justify-center w-7 h-7 rounded-full\n            text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300\n            hover:bg-gray-100 dark:hover:bg-gray-700\n            transition-colors duration-150\n            focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bichat-primary)]/40\"\n          aria-label={t('BiChat.Sources.Close')}\n        >\n          <X size={14} weight=\"bold\" />\n        </button>\n      </div>\n\n      {/* Source list */}\n      <div className=\"max-h-80 overflow-y-auto\">\n        {citations.map((citation, index) => {\n          const domain = citation.url ? extractDomain(citation.url) : '';\n\n          const cardContent = (\n            <>\n              <h4 className=\"text-sm font-medium leading-snug text-[var(--bichat-color-accent,theme(colors.blue.600))] dark:text-blue-400\">\n                {citation.title || t('BiChat.Sources.SourceN', { n: String(index + 1) })}\n              </h4>\n              {citation.excerpt && (\n                <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400 line-clamp-2 leading-relaxed\">\n                  {citation.excerpt}\n                </p>\n              )}\n              {domain && (\n                <div className=\"flex items-center gap-1.5 mt-1.5\">\n                  <span\n                    className=\"w-4 h-4 rounded-full flex items-center justify-center text-[7px] font-bold text-white flex-shrink-0 select-none\"\n                    style={{ backgroundColor: domainColor(domain) }}\n                    aria-hidden=\"true\"\n                  >\n                    {domain[0]?.toUpperCase()}\n                  </span>\n                  <span className=\"text-[11px] text-gray-400 dark:text-gray-500 truncate\">\n                    {domain}\n                  </span>\n                </div>\n              )}\n            </>\n          );\n\n          const cardClass = 'block px-4 py-3 border-t border-gray-100 dark:border-gray-700/50';\n\n          if (citation.url) {\n            return (\n              <a\n                key={citation.id}\n                href={citation.url}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                className={`${cardClass} hover:bg-gray-50 dark:hover:bg-gray-700/40 transition-colors duration-100\n                  focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--bichat-primary)]/40`}\n              >\n                {cardContent}\n              </a>\n            );\n          }\n\n          return (\n            <div key={citation.id} className={cardClass}>\n              {cardContent}\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\n","/**\n * DownloadCard component\n * File-download card for artifacts (Excel, PDF)\n * with type-specific icon, metadata, and download action.\n */\n\nimport { DownloadSimple } from '@phosphor-icons/react';\nimport type { Artifact } from '../types';\nimport { getFileVisual } from '../utils/fileUtils';\n\ninterface DownloadCardProps {\n  artifact: Artifact\n}\n\nconst MIME_BY_TYPE: Record<string, string> = {\n  excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n  pdf: 'application/pdf',\n};\n\nexport function DownloadCard({ artifact }: DownloadCardProps) {\n  const { type, filename, url, sizeReadable, rowCount, description } = artifact;\n  const visual = getFileVisual(MIME_BY_TYPE[type], filename);\n  const Icon = visual.icon;\n\n  return (\n    <a\n      href={url}\n      download={filename}\n      className={[\n        'group/dl flex items-center gap-2.5 rounded-xl',\n        'border border-gray-200/80 dark:border-gray-700/60',\n        'bg-white dark:bg-gray-800/60',\n        'px-2.5 py-2',\n        'transition-all duration-150',\n        'hover:border-gray-300 dark:hover:border-gray-600',\n        'hover:shadow-sm',\n        'hover:-translate-y-px active:translate-y-0',\n      ].join(' ')}\n    >\n      {/* File type icon */}\n      <div className={`flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-lg ${visual.bgColor}`}>\n        <Icon size={20} weight=\"duotone\" className={visual.iconColor} />\n      </div>\n\n      {/* Content */}\n      <div className=\"flex-1 min-w-0\">\n        <div className=\"flex items-center gap-1.5 min-w-0\">\n          <span className=\"text-[13px] font-medium text-gray-900 dark:text-gray-100 truncate\">\n            {filename}\n          </span>\n          <span className=\"flex-shrink-0 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider rounded bg-gray-100 dark:bg-gray-700 text-gray-500 dark:text-gray-400\">\n            {visual.label}\n          </span>\n        </div>\n        {(sizeReadable || rowCount !== undefined) && (\n          <div className=\"flex items-center gap-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n            {sizeReadable && <span>{sizeReadable}</span>}\n            {sizeReadable && rowCount !== undefined && (\n              <span className=\"w-0.5 h-0.5 rounded-full bg-gray-300 dark:bg-gray-600\" />\n            )}\n            {rowCount !== undefined && (\n              <span>{rowCount.toLocaleString()} rows</span>\n            )}\n          </div>\n        )}\n        {description && (\n          <p className=\"mt-0.5 text-[11px] text-gray-400 dark:text-gray-500 line-clamp-1\">\n            {description}\n          </p>\n        )}\n      </div>\n\n      {/* Download arrow */}\n      <div className=\"flex-shrink-0 p-1 text-gray-400 dark:text-gray-500 group-hover/dl:text-gray-600 dark:group-hover/dl:text-gray-300 transition-colors duration-150\">\n        <DownloadSimple\n          size={16}\n          weight=\"bold\"\n          className=\"transition-transform duration-200 group-hover/dl:translate-y-0.5\"\n        />\n      </div>\n    </a>\n  );\n}\n","/**\n * InlineQuestionForm component\n * Handles HITL (Human-in-the-Loop) questions from the AI agent\n *\n * Supports multiple questions with multi-step navigation:\n * - SINGLE_CHOICE: Clickable option cards (radio) + always-present \"Other\" text input\n * - MULTIPLE_CHOICE: Clickable option cards (checkbox) + always-present \"Other\" text input\n */\n\nimport { useState, useCallback } from \"react\";\nimport {\n  ArrowLeft,\n  ArrowRight,\n  Check,\n  ChatCircleDots,\n  PencilSimpleLine,\n  PaperPlaneTilt,\n  X,\n} from \"@phosphor-icons/react\";\nimport { PendingQuestion, QuestionAnswers } from \"../types\";\nimport { useChatMessaging } from \"../context/ChatContext\";\nimport { useTranslation } from \"../hooks/useTranslation\";\n\ninterface InlineQuestionFormProps {\n  pendingQuestion: PendingQuestion;\n}\n\nexport function InlineQuestionForm({\n  pendingQuestion,\n}: InlineQuestionFormProps) {\n  const { handleSubmitQuestionAnswers, handleRejectPendingQuestion, loading } =\n    useChatMessaging();\n  const { t } = useTranslation();\n  const [currentStep, setCurrentStep] = useState(0);\n  const [answers, setAnswers] = useState<QuestionAnswers>({});\n  const [otherTexts, setOtherTexts] = useState<Record<string, string>>({});\n\n  const questions = Array.isArray(pendingQuestion.questions)\n    ? pendingQuestion.questions\n    : [];\n  const currentQuestion = questions[currentStep];\n  const isLastStep = currentStep === questions.length - 1;\n  const isFirstStep = currentStep === 0;\n  const totalSteps = questions.length;\n  const isFailedRetry =\n    pendingQuestion.status === \"ANSWER_RESUME_FAILED\" ||\n    pendingQuestion.status === \"REJECT_RESUME_FAILED\";\n\n  // Get current answer for the current question\n  const currentAnswer = answers[currentQuestion?.id];\n  const currentOtherText = otherTexts[currentQuestion?.id] || \"\";\n\n  const handleOptionChange = useCallback(\n    (optionID: string, checked: boolean) => {\n      if (!currentQuestion) {\n        return;\n      }\n      const questionId = currentQuestion.id;\n      const existingAnswer = answers[questionId] || { options: [] };\n      const isOtherOption = optionID === \"__other__\";\n      const isMultiSelect = currentQuestion.type === \"MULTIPLE_CHOICE\";\n\n      // \"Other\" is mutually exclusive with predefined options.\n      if (isOtherOption) {\n        setAnswers({\n          ...answers,\n          [questionId]: {\n            options: [],\n            customText: checked ? currentOtherText : undefined,\n          },\n        });\n        return;\n      }\n\n      let newOptions: string[];\n      if (isMultiSelect) {\n        // Multi-select: toggle option\n        if (!checked) {\n          newOptions = existingAnswer.options.filter((o) => o !== optionID);\n        } else if (existingAnswer.options.includes(optionID)) {\n          newOptions = existingAnswer.options;\n        } else {\n          newOptions = [...existingAnswer.options, optionID];\n        }\n      } else {\n        // Single-select: replace selection (radio)\n        newOptions = checked ? [optionID] : [];\n      }\n\n      setAnswers({\n        ...answers,\n        [questionId]: {\n          options: newOptions,\n          customText: undefined,\n        },\n      });\n    },\n    [currentQuestion, answers, currentOtherText],\n  );\n\n  const handleOtherTextChange = useCallback(\n    (text: string) => {\n      if (!currentQuestion) {\n        return;\n      }\n      const questionId = currentQuestion.id;\n      setOtherTexts({ ...otherTexts, [questionId]: text });\n\n      // Update the answer with custom text (\"Other\" is selected when customText is set)\n      setAnswers({\n        ...answers,\n        [questionId]: {\n          options: [],\n          customText: text,\n        },\n      });\n    },\n    [currentQuestion, answers, otherTexts],\n  );\n\n  const isCurrentAnswerValid = (): boolean => {\n    if (!currentQuestion) {\n      return false;\n    }\n\n    const answer = answers[currentQuestion.id];\n    const required = currentQuestion.required ?? true;\n\n    if (!answer) {\n      return !required;\n    }\n\n    const hasOptionSelection = answer.options.length > 0;\n    const hasOtherSelected = answer.customText !== undefined;\n    const hasOtherText = (answer.customText?.trim().length ?? 0) > 0;\n\n    if (!hasOptionSelection && !hasOtherSelected) {\n      return !required;\n    }\n\n    if (hasOptionSelection) {\n      return true;\n    }\n\n    // \"Other\" selected: require non-empty text if required\n    return !required || hasOtherText;\n  };\n\n  const handleNext = () => {\n    if (!isCurrentAnswerValid()) {\n      return;\n    }\n\n    if (isLastStep) {\n      handleSubmitQuestionAnswers(answers);\n    } else {\n      setCurrentStep(currentStep + 1);\n    }\n  };\n\n  const handleBack = () => {\n    if (!isFirstStep) {\n      setCurrentStep(currentStep - 1);\n    }\n  };\n\n  const handleSubmit = (e: React.FormEvent) => {\n    e.preventDefault();\n    handleNext();\n  };\n\n  if (!currentQuestion) {\n    return (\n      <div className=\"animate-slide-up rounded-2xl border border-amber-200 dark:border-amber-700/50 bg-gradient-to-b from-amber-50/70 to-white dark:from-amber-950/20 dark:to-gray-900/80 shadow-sm overflow-hidden p-4\">\n        <p className=\"text-sm font-medium text-gray-800 dark:text-gray-200\">\n          {t(\"BiChat.Error.SomethingWentWrong\")}\n        </p>\n        <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n          {t(\"BiChat.Error.UnexpectedError\")}\n        </p>\n        <div className=\"mt-3\">\n          <button\n            type=\"button\"\n            onClick={handleRejectPendingQuestion}\n            disabled={loading}\n            className=\"cursor-pointer inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-lg bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 disabled:opacity-40\"\n          >\n            <X size={14} weight=\"bold\" />\n            {t(\"BiChat.InlineQuestion.Dismiss\")}\n          </button>\n        </div>\n      </div>\n    );\n  }\n\n  const isMultiSelect = currentQuestion.type === \"MULTIPLE_CHOICE\";\n  const options = (currentQuestion.options || [])\n    .filter((option) => Boolean(option && typeof option.label === \"string\"))\n    .map((option, index) => ({\n      id: option.id || `${currentQuestion.id}-option-${index}`,\n      label: option.label,\n      value:\n        option.value || option.id || `${currentQuestion.id}-option-${index}`,\n    }));\n  const isOtherSelected = currentAnswer?.customText !== undefined;\n  const canProceed = isCurrentAnswerValid();\n\n  return (\n    <div className=\"animate-slide-up rounded-2xl border border-gray-200 dark:border-gray-700/50 bg-gradient-to-b from-primary-50/80 to-white dark:from-primary-950/30 dark:to-gray-900/80 shadow-sm overflow-hidden\">\n      <form onSubmit={handleSubmit}>\n        {/* Header bar */}\n        <div className=\"flex items-center gap-2.5 px-4 pt-4 pb-3\">\n          <div className=\"flex items-center justify-center w-7 h-7 rounded-lg bg-primary-100 dark:bg-primary-900/40\">\n            <ChatCircleDots\n              className=\"w-4 h-4 text-primary-600 dark:text-primary-400\"\n              weight=\"fill\"\n            />\n          </div>\n          <div className=\"flex-1 min-w-0\">\n            <div className=\"flex items-center gap-2\">\n              <span className=\"text-xs font-semibold uppercase tracking-wide text-primary-600 dark:text-primary-400\">\n                {t(\"BiChat.InlineQuestion.InputNeeded\")}\n              </span>\n              {totalSteps > 1 && (\n                <span className=\"text-[11px] tabular-nums text-gray-400 dark:text-gray-500\">\n                  {currentStep + 1}/{totalSteps}\n                </span>\n              )}\n            </div>\n          </div>\n          <button\n            type=\"button\"\n            onClick={handleRejectPendingQuestion}\n            disabled={loading}\n            className=\"cursor-pointer p-1 rounded-md text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors disabled:opacity-40\"\n            aria-label={t(\"BiChat.InlineQuestion.Dismiss\")}\n          >\n            <X size={16} weight=\"bold\" />\n          </button>\n        </div>\n\n        {isFailedRetry && (\n          <div className=\"mx-4 mb-3 rounded-xl border border-amber-200 dark:border-amber-700/40 bg-amber-50/80 dark:bg-amber-950/20 px-3 py-2\">\n            <p className=\"text-xs font-medium text-amber-800 dark:text-amber-300\">\n              Continuing after your last response failed.\n            </p>\n            <p className=\"mt-1 text-xs text-amber-700/80 dark:text-amber-200/80\">\n              Review the answer and submit again, or dismiss the question if you\n              want to skip it.\n            </p>\n          </div>\n        )}\n\n        {/* Progress dots for multi-step */}\n        {totalSteps > 1 && (\n          <div className=\"flex items-center gap-1.5 px-4 pb-3\">\n            {questions.map((_, index) => {\n              const isCompleted = index < currentStep;\n              const isCurrent = index === currentStep;\n              return (\n                <div\n                  key={index}\n                  className={[\n                    \"h-1 rounded-full transition-all duration-300\",\n                    isCurrent\n                      ? \"flex-[2] bg-primary-500 dark:bg-primary-400\"\n                      : \"flex-1\",\n                    isCompleted\n                      ? \"bg-primary-400 dark:bg-primary-500\"\n                      : !isCurrent\n                        ? \"bg-gray-200 dark:bg-gray-700\"\n                        : \"\",\n                  ].join(\" \")}\n                />\n              );\n            })}\n          </div>\n        )}\n\n        {/* Question text */}\n        <div className=\"px-4 pb-3\">\n          <p className=\"text-[15px] leading-relaxed text-gray-800 dark:text-gray-200\">\n            {currentQuestion.text}\n          </p>\n          {isMultiSelect && (\n            <p className=\"mt-1 text-xs text-gray-400 dark:text-gray-500\">\n              {t(\"BiChat.InlineQuestion.SelectAllThatApply\")}\n            </p>\n          )}\n        </div>\n\n        {/* Options as clickable cards */}\n        <div className=\"px-4 pb-2 space-y-1.5\">\n          {options.map((option) => {\n            const isSelected =\n              currentAnswer?.options.includes(option.id) || false;\n            return (\n              <label\n                key={option.id}\n                className={[\n                  \"group/opt flex items-center gap-3 px-3 py-2.5 rounded-xl cursor-pointer\",\n                  \"border transition-all duration-150\",\n                  isSelected\n                    ? \"border-primary-300 dark:border-primary-600 bg-primary-50 dark:bg-primary-900/30 shadow-sm\"\n                    : \"border-transparent hover:border-gray-200 dark:hover:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-800/50\",\n                ].join(\" \")}\n              >\n                {/* Custom indicator */}\n                <span\n                  className={[\n                    \"flex-shrink-0 flex items-center justify-center w-5 h-5 transition-all duration-150\",\n                    isMultiSelect ? \"rounded-md\" : \"rounded-full\",\n                    isSelected\n                      ? \"bg-primary-600 dark:bg-primary-500 border-primary-600 dark:border-primary-500 text-white shadow-sm\"\n                      : \"border-2 border-gray-300 dark:border-gray-600 group-hover/opt:border-gray-400 dark:group-hover/opt:border-gray-500\",\n                  ].join(\" \")}\n                >\n                  {isSelected && <Check size={12} weight=\"bold\" />}\n                </span>\n                <input\n                  type={isMultiSelect ? \"checkbox\" : \"radio\"}\n                  name={`question-${currentQuestion.id}`}\n                  value={option.value}\n                  checked={isSelected}\n                  onChange={(e) =>\n                    handleOptionChange(option.id, e.target.checked)\n                  }\n                  className=\"sr-only\"\n                />\n                <span\n                  className={[\n                    \"text-sm transition-colors duration-150\",\n                    isSelected\n                      ? \"text-gray-900 dark:text-gray-100 font-medium\"\n                      : \"text-gray-700 dark:text-gray-300\",\n                  ].join(\" \")}\n                >\n                  {option.label}\n                </span>\n              </label>\n            );\n          })}\n\n          {/* \"Other\" option */}\n          <label\n            className={[\n              \"group/opt flex items-center gap-3 px-3 py-2.5 rounded-xl cursor-pointer\",\n              \"border transition-all duration-150\",\n              isOtherSelected\n                ? \"border-primary-300 dark:border-primary-600 bg-primary-50 dark:bg-primary-900/30 shadow-sm\"\n                : \"border-transparent hover:border-gray-200 dark:hover:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-800/50\",\n            ].join(\" \")}\n          >\n            <span\n              className={[\n                \"flex-shrink-0 flex items-center justify-center w-5 h-5 transition-all duration-150\",\n                isMultiSelect ? \"rounded-md\" : \"rounded-full\",\n                isOtherSelected\n                  ? \"bg-primary-600 dark:bg-primary-500 border-primary-600 dark:border-primary-500 text-white shadow-sm\"\n                  : \"border-2 border-gray-300 dark:border-gray-600 group-hover/opt:border-gray-400 dark:group-hover/opt:border-gray-500\",\n              ].join(\" \")}\n            >\n              {isOtherSelected && <PencilSimpleLine size={11} weight=\"bold\" />}\n            </span>\n            <input\n              type={isMultiSelect ? \"checkbox\" : \"radio\"}\n              name={`question-${currentQuestion.id}`}\n              value=\"__other__\"\n              checked={isOtherSelected}\n              onChange={(e) =>\n                handleOptionChange(\"__other__\", e.target.checked)\n              }\n              className=\"sr-only\"\n            />\n            <span\n              className={[\n                \"text-sm transition-colors duration-150\",\n                isOtherSelected\n                  ? \"text-gray-900 dark:text-gray-100 font-medium\"\n                  : \"text-gray-700 dark:text-gray-300\",\n              ].join(\" \")}\n            >\n              {t(\"BiChat.InlineQuestion.OtherOption\")}\n            </span>\n          </label>\n\n          {/* Other text input — always visible, typing auto-selects \"Other\" */}\n          <div className=\"pl-8 pr-1 pb-1\">\n            <input\n              type=\"text\"\n              value={currentOtherText}\n              onChange={(e) => handleOtherTextChange(e.target.value)}\n              placeholder={t(\"BiChat.InlineQuestion.TypeYourAnswer\")}\n              className=\"w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 dark:placeholder:text-gray-500 focus:outline-none focus:ring-2 focus:ring-primary-500/40 focus:border-primary-400 dark:focus:border-primary-600 transition-shadow\"\n            />\n          </div>\n        </div>\n\n        {/* Footer with navigation */}\n        <div className=\"flex items-center justify-between gap-2 px-4 pt-2 pb-4\">\n          <div>\n            {!isFirstStep && (\n              <button\n                type=\"button\"\n                onClick={handleBack}\n                className=\"cursor-pointer flex items-center gap-1 px-2.5 py-1.5 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\n              >\n                <ArrowLeft size={14} weight=\"bold\" />\n                {t(\"BiChat.InlineQuestion.Back\")}\n              </button>\n            )}\n          </div>\n\n          <button\n            type=\"submit\"\n            disabled={loading || !canProceed}\n            className={[\n              \"flex items-center gap-1.5 px-4 py-2 text-sm font-medium rounded-xl transition-all duration-150\",\n              \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2\",\n              canProceed\n                ? \"cursor-pointer bg-primary-600 hover:bg-primary-700 active:bg-primary-800 text-white shadow-sm hover:shadow\"\n                : \"bg-gray-100 dark:bg-gray-800 text-gray-400 dark:text-gray-600 cursor-not-allowed\",\n            ].join(\" \")}\n          >\n            {isLastStep ? (\n              <>\n                {t(\"BiChat.Submit\")}\n                <PaperPlaneTilt size={14} weight=\"fill\" />\n              </>\n            ) : (\n              <>\n                {t(\"BiChat.InlineQuestion.Next\")}\n                <ArrowRight size={14} weight=\"bold\" />\n              </>\n            )}\n          </button>\n        </div>\n      </form>\n    </div>\n  );\n}\n","/**\n * RetryActionArea Component\n * Displays a retry action area inline where the assistant message would appear\n * (typically after an interrupted request or connection loss)\n *\n * Styled to match assistant message positioning (left-aligned) so users see\n * the retry button contextually in the conversation flow.\n */\n\nimport { memo } from 'react';\nimport { motion } from 'framer-motion';\nimport { ArrowClockwise, Warning } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface RetryActionAreaProps {\n  /** Callback when retry button is clicked */\n  onRetry: () => void\n}\n\nexport const RetryActionArea = memo(function RetryActionArea({\n  onRetry,\n}: RetryActionAreaProps) {\n  const { t } = useTranslation();\n\n  return (\n    <motion.div\n      initial={{ opacity: 0, y: 6 }}\n      animate={{ opacity: 1, y: 0 }}\n      exit={{ opacity: 0, y: -6 }}\n      transition={{ duration: 0.15 }}\n      className=\"flex justify-start\"\n    >\n      <div\n        className=\"flex flex-col gap-2.5 px-4 py-3 rounded-xl border border-gray-200 dark:border-gray-700\"\n        role=\"status\"\n        aria-live=\"polite\"\n      >\n        <div className=\"flex items-center gap-2.5\">\n          <Warning\n            className=\"w-4 h-4 text-amber-500 dark:text-amber-400 flex-shrink-0\"\n            weight=\"fill\"\n          />\n          <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n            {t('BiChat.Retry.Subtitle')}\n          </span>\n        </div>\n        <button\n          type=\"button\"\n          onClick={onRetry}\n          className=\"self-start inline-flex items-center gap-1.5 px-2.5 py-1 text-sm font-medium text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n        >\n          <ArrowClockwise size={14} />\n          {t('BiChat.Retry.Button')}\n        </button>\n      </div>\n    </motion.div>\n  );\n});\n\nexport default RetryActionArea;\n","import type { DebugUsage } from '../types';\n\nexport function formatGenerationDuration(generationMs: number): string {\n  return generationMs > 1000 ? `${(generationMs / 1000).toFixed(2)}s` : `${generationMs}ms`;\n}\n\nexport function formatDuration(durationMs: number): string {\n  return durationMs > 1000 ? `${(durationMs / 1000).toFixed(2)}s` : `${durationMs}ms`;\n}\n\nexport function calculateCompletionTokensPerSecond(\n  usage?: DebugUsage,\n  generationMs?: number\n): number | null {\n  if (!usage || !generationMs || generationMs <= 0 || usage.completionTokens <= 0) {\n    return null;\n  }\n\n  return usage.completionTokens / (generationMs / 1000);\n}\n\nexport function calculateContextUsagePercent(\n  promptTokens: number,\n  effectiveMaxTokens?: number\n): number | null {\n  if (!effectiveMaxTokens || effectiveMaxTokens <= 0 || promptTokens <= 0) {\n    return null;\n  }\n\n  return (promptTokens / effectiveMaxTokens) * 100;\n}\n","/**\n * DebugPanel Component\n * Debug trace viewer with metric chips, expandable tool calls,\n * and terminal-inspired code blocks.\n *\n * Debug UI is English-only (developer-facing) — no i18n.\n */\n\nimport { useState, useRef, useEffect, useCallback, type ReactNode } from 'react';\nimport {\n  Bug,\n  Timer,\n  Lightning,\n  Wrench,\n  CaretDown,\n  CheckCircle,\n  XCircle,\n  Copy,\n  Check,\n  CircleNotch,\n  ArrowUp,\n  ArrowDown,\n  Stack,\n  Database,\n  ArrowSquareOut,\n} from '@phosphor-icons/react';\nimport type { DebugTrace, StreamToolPayload } from '../types';\nimport { hasMeaningfulUsage, hasDebugTrace } from '../utils/debugTrace';\nimport {\n  calculateCompletionTokensPerSecond,\n  formatDuration,\n  formatGenerationDuration,\n} from '../utils/debugMetrics';\n\nexport interface DebugPanelProps {\n  trace?: DebugTrace\n}\n\n// ─── CopyPill ───────────────────────────────────────────────\n\ninterface UseCopyFeedbackResult {\n  copied: boolean\n  copy: (text: string) => Promise<void>\n}\n\nfunction useCopyFeedback(): UseCopyFeedbackResult {\n  const [copied, setCopied] = useState(false);\n  const timerRef = useRef<ReturnType<typeof setTimeout> | number | null>(null);\n\n  const copy = useCallback(async (text: string) => {\n    try {\n      await navigator.clipboard.writeText(text);\n      setCopied(true);\n      if (timerRef.current !== null) {window.clearTimeout(timerRef.current);}\n      timerRef.current = window.setTimeout(() => {\n        setCopied(false);\n        timerRef.current = null;\n      }, 2000);\n    } catch (err) {\n      console.error('Copy failed:', err);\n    }\n  }, []);\n\n  useEffect(() => () => {\n    if (timerRef.current !== null) {window.clearTimeout(timerRef.current);}\n  }, []);\n\n  return { copied, copy };\n}\n\nfunction CopyPill({ text }: { text: string }) {\n  const { copied, copy } = useCopyFeedback();\n\n  const handleCopy = async (e: React.MouseEvent) => {\n    e.stopPropagation();\n    await copy(text);\n  };\n\n  return (\n    <button\n      onClick={handleCopy}\n      className={[\n        'flex items-center gap-1 px-2 py-0.5 rounded-md text-[10px] font-medium',\n        'transition-all duration-200',\n        copied\n          ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-600 dark:text-emerald-400'\n          : 'text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700/50',\n      ].join(' ')}\n    >\n      {copied ? <Check size={10} weight=\"bold\" /> : <Copy size={10} />}\n      <span>{copied ? 'Copied!' : 'Copy'}</span>\n    </button>\n  );\n}\n\n// ─── InlineCopyButton ────────────────────────────────────────\n\nfunction InlineCopyButton({ text }: { text: string }) {\n  const { copied, copy } = useCopyFeedback();\n\n  const handleCopy = async (e: React.MouseEvent) => {\n    e.stopPropagation();\n    await copy(text);\n  };\n\n  return (\n    <button\n      onClick={handleCopy}\n      aria-label={copied ? 'Copied' : 'Copy'}\n      className={[\n        'flex-shrink-0 p-1 rounded transition-colors duration-150',\n        copied\n          ? 'text-emerald-500 dark:text-emerald-400'\n          : 'text-gray-300 dark:text-gray-600 hover:text-gray-500 dark:hover:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700/40',\n      ].join(' ')}\n    >\n      {copied ? <Check size={11} weight=\"bold\" /> : <Copy size={11} />}\n    </button>\n  );\n}\n\n// ─── MetricChip ─────────────────────────────────────────────\n\ninterface MetricChipProps {\n  icon: ReactNode\n  value: string\n  label: string\n}\n\nfunction MetricChip({ icon, value, label }: MetricChipProps) {\n  return (\n    <span className=\"inline-flex items-center gap-1.5 px-2 py-1 rounded-md bg-gray-50 dark:bg-gray-800/40 text-[11px] tabular-nums\">\n      {icon}\n      <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{value}</span>\n      <span className=\"text-gray-400 dark:text-gray-500\">{label}</span>\n    </span>\n  );\n}\n\n// ─── ToolCard ───────────────────────────────────────────────\n\nfunction ToolCard({ tool }: { tool: StreamToolPayload }) {\n  const [expanded, setExpanded] = useState(false);\n\n  const hasResult = !!tool.result && !tool.error;\n  const hasError = !!tool.error;\n\n  const status = hasError\n    ? {\n        icon: <XCircle size={12} weight=\"fill\" />,\n        pillBg: 'bg-red-50 dark:bg-red-950/30',\n        pillText: 'text-red-500 dark:text-red-400',\n        borderColor: 'border-l-red-400 dark:border-l-red-500',\n      }\n    : hasResult\n    ? {\n        icon: <CheckCircle size={12} weight=\"fill\" />,\n        pillBg: 'bg-emerald-50 dark:bg-emerald-950/30',\n        pillText: 'text-emerald-500 dark:text-emerald-400',\n        borderColor: 'border-l-emerald-400 dark:border-l-emerald-500',\n      }\n    : {\n        icon: <CircleNotch size={12} weight=\"bold\" className=\"animate-spin\" />,\n        pillBg: 'bg-gray-100 dark:bg-gray-800',\n        pillText: 'text-gray-400 dark:text-gray-500',\n        borderColor: 'border-l-gray-300 dark:border-l-gray-600',\n      };\n\n  return (\n    <div\n      className={[\n        'rounded-lg overflow-hidden',\n        'border border-gray-200/60 dark:border-gray-700/40',\n        'border-l-2', status.borderColor,\n        'bg-white dark:bg-gray-800/50',\n        'transition-all duration-150',\n      ].join(' ')}\n    >\n      {/* Header */}\n      <button\n        onClick={() => setExpanded(!expanded)}\n        aria-expanded={expanded}\n        aria-label={`${tool.name} — ${hasError ? 'error' : hasResult ? 'success' : 'pending'}`}\n        className=\"w-full flex items-center gap-2.5 px-3 py-2.5 hover:bg-gray-50/60 dark:hover:bg-gray-700/20 transition-colors cursor-pointer\"\n      >\n        {/* Status pill */}\n        <span className={`flex items-center justify-center w-5 h-5 rounded-full ${status.pillBg} ${status.pillText}`}>\n          {status.icon}\n        </span>\n\n        {/* Tool name */}\n        <span className=\"flex-1 min-w-0 text-left font-mono text-xs font-medium text-gray-800 dark:text-gray-200 truncate\">\n          {tool.name}\n        </span>\n\n        {/* Duration chip */}\n        {tool.durationMs !== undefined && (\n          <span className=\"flex-shrink-0 px-2 py-0.5 rounded-full bg-gray-100 dark:bg-gray-700/60 text-[10px] font-mono font-medium text-gray-500 dark:text-gray-400 tabular-nums\">\n            {formatDuration(tool.durationMs)}\n          </span>\n        )}\n\n        {/* Chevron */}\n        <CaretDown\n          size={12}\n          weight=\"bold\"\n          className={[\n            'flex-shrink-0 text-gray-300 dark:text-gray-600',\n            'transition-transform duration-200',\n            expanded ? 'rotate-180' : '',\n          ].join(' ')}\n        />\n      </button>\n\n      {/* Expandable content — CSS grid animation for smooth height */}\n      <div\n        className={[\n          'grid transition-[grid-template-rows] duration-200 ease-out',\n          expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n        ].join(' ')}\n      >\n        <div className=\"overflow-hidden min-h-0\">\n          <div className=\"px-3 pb-3 pt-1 space-y-2\">\n            {/* Arguments — terminal-style dark code block */}\n            {tool.arguments && (\n              <div className=\"rounded-lg bg-[#1a1b26] dark:bg-gray-950 overflow-hidden ring-1 ring-gray-800/10 dark:ring-white/5\">\n                <div className=\"flex items-center justify-between px-3 py-1.5 bg-[#1e1f2e] dark:bg-gray-900/80 border-b border-white/5\">\n                  <span className=\"text-[10px] uppercase tracking-wider font-medium text-gray-500\">\n                    Arguments\n                  </span>\n                  <CopyPill text={tool.arguments} />\n                </div>\n                <pre className=\"p-3 text-[11px] font-mono text-gray-300 overflow-x-auto max-h-60 overflow-y-auto whitespace-pre-wrap break-all leading-relaxed\">\n                  {tool.arguments}\n                </pre>\n              </div>\n            )}\n\n            {/* Result — terminal-style dark code block */}\n            {tool.result && (\n              <div className=\"rounded-lg bg-[#1a1b26] dark:bg-gray-950 overflow-hidden ring-1 ring-gray-800/10 dark:ring-white/5\">\n                <div className=\"flex items-center justify-between px-3 py-1.5 bg-[#1e1f2e] dark:bg-gray-900/80 border-b border-white/5\">\n                  <span className=\"text-[10px] uppercase tracking-wider font-medium text-gray-500\">\n                    Result\n                  </span>\n                  <CopyPill text={tool.result} />\n                </div>\n                <pre className=\"p-3 text-[11px] font-mono text-gray-300 overflow-x-auto max-h-60 overflow-y-auto whitespace-pre-wrap break-all leading-relaxed\">\n                  {tool.result}\n                </pre>\n              </div>\n            )}\n\n            {/* Error — red-tinted dark block */}\n            {tool.error && (\n              <div className=\"rounded-lg bg-red-950/80 dark:bg-red-950/40 overflow-hidden ring-1 ring-red-800/20\">\n                <div className=\"px-3 py-1.5 border-b border-red-800/20\">\n                  <span className=\"text-[10px] uppercase tracking-wider font-medium text-red-400\">\n                    Error\n                  </span>\n                </div>\n                <pre className=\"p-3 text-[11px] font-mono text-red-300 overflow-x-auto whitespace-pre-wrap break-all leading-relaxed\">\n                  {tool.error}\n                </pre>\n              </div>\n            )}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\n// ─── DebugPanel ─────────────────────────────────────────────\n\nexport function DebugPanel({ trace }: DebugPanelProps) {\n  const hasData = !!trace && hasDebugTrace(trace);\n  const traceID = trace?.traceId?.trim() || '';\n  const traceURL = trace?.traceUrl?.trim() || '';\n  const safeTraceURL = (() => {\n    if (!traceURL) {return '';}\n    try {\n      const parsed = new URL(traceURL);\n      if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {return '';}\n      return parsed.toString();\n    } catch {\n      return '';\n    }\n  })();\n\n  const tokensPerSecond = calculateCompletionTokensPerSecond(trace?.usage, trace?.generationMs);\n\n  // Build metric list from available data\n  const metrics: MetricChipProps[] = [];\n\n  if (hasData && trace) {\n    if (trace.generationMs !== undefined) {\n      metrics.push({\n        icon: <Timer size={12} weight=\"duotone\" className=\"text-amber-500 dark:text-amber-400\" />,\n        value: formatGenerationDuration(trace.generationMs),\n        label: 'generation',\n      });\n    }\n    if (tokensPerSecond !== null) {\n      metrics.push({\n        icon: <Lightning size={12} weight=\"fill\" className=\"text-orange-500 dark:text-orange-400\" />,\n        value: `${tokensPerSecond.toFixed(1)}/s`,\n        label: 'tok/s',\n      });\n    }\n    if (hasMeaningfulUsage(trace.usage) && trace.usage) {\n      metrics.push(\n        {\n          icon: <Stack size={12} weight=\"duotone\" className=\"text-violet-500 dark:text-violet-400\" />,\n          value: trace.usage.totalTokens.toLocaleString(),\n          label: 'total',\n        },\n        {\n          icon: <ArrowUp size={12} weight=\"bold\" className=\"text-blue-500 dark:text-blue-400\" />,\n          value: trace.usage.promptTokens.toLocaleString(),\n          label: 'prompt',\n        },\n        {\n          icon: <ArrowDown size={12} weight=\"bold\" className=\"text-indigo-500 dark:text-indigo-400\" />,\n          value: trace.usage.completionTokens.toLocaleString(),\n          label: 'completion',\n        },\n      );\n      if (trace.usage.cachedTokens !== undefined && trace.usage.cachedTokens > 0) {\n        metrics.push({\n          icon: <Database size={12} weight=\"duotone\" className=\"text-pink-500 dark:text-pink-400\" />,\n          value: trace.usage.cachedTokens.toLocaleString(),\n          label: 'cached',\n        });\n      }\n    }\n  }\n\n  return (\n    <div className=\"mt-4 pt-4 border-t border-gray-100 dark:border-gray-700/50\">\n      {/* Header */}\n      <div className=\"flex items-center justify-between mb-4\">\n        <div className=\"flex items-center gap-2.5\">\n          <div className=\"flex items-center justify-center w-6 h-6 rounded-lg bg-gray-100 dark:bg-gray-800\">\n            <Bug size={14} weight=\"duotone\" className=\"text-gray-500 dark:text-gray-400\" />\n          </div>\n          <h3 className=\"text-[11px] uppercase tracking-widest font-semibold text-gray-400 dark:text-gray-500\">\n            Debug\n          </h3>\n        </div>\n        {hasData && trace && (\n          <CopyPill text={JSON.stringify(trace, null, 2)} />\n        )}\n      </div>\n\n      {hasData && trace ? (\n        <div className=\"space-y-4\">\n          {(traceID || trace.sessionId) && (\n            <div className=\"rounded-lg border border-gray-200/60 dark:border-gray-700/40 bg-gray-50/50 dark:bg-gray-800/40 px-3 py-2 space-y-1.5\">\n              {traceID && (\n                <div className=\"flex items-center gap-2 min-w-0\">\n                  <span className=\"flex-shrink-0 text-[10px] uppercase tracking-wider text-gray-400 dark:text-gray-500 w-14\">Trace</span>\n                  <span className=\"flex-1 min-w-0 font-mono text-[11px] text-gray-700 dark:text-gray-300 truncate\" title={traceID}>{traceID}</span>\n                  <InlineCopyButton text={traceID} />\n                </div>\n              )}\n              {trace.sessionId && (\n                <div className=\"flex items-center gap-2 min-w-0\">\n                  <span className=\"flex-shrink-0 text-[10px] uppercase tracking-wider text-gray-400 dark:text-gray-500 w-14\">Session</span>\n                  <span className=\"flex-1 min-w-0 font-mono text-[11px] text-gray-700 dark:text-gray-300 truncate\" title={trace.sessionId}>{trace.sessionId}</span>\n                  <InlineCopyButton text={trace.sessionId} />\n                </div>\n              )}\n              {safeTraceURL && (\n                <div className=\"flex items-center gap-2 min-w-0 pt-0.5\">\n                  <span className=\"flex-shrink-0 w-14\" />\n                  <a\n                    href={safeTraceURL}\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                    aria-label=\"Open in Langfuse\"\n                    className=\"inline-flex items-center gap-1.5 text-[11px] font-medium text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300 transition-colors duration-150\"\n                  >\n                    <ArrowSquareOut size={11} weight=\"bold\" />\n                    <span>Open in Langfuse</span>\n                  </a>\n                </div>\n              )}\n            </div>\n          )}\n\n          {(trace.thinking || trace.observationReason) && (\n            <div className=\"rounded-lg border border-gray-200/60 dark:border-gray-700/40 bg-gray-50/50 dark:bg-gray-800/40 p-3 space-y-2\">\n              {trace.observationReason && (\n                <div className=\"text-[11px] text-amber-700 dark:text-amber-300\">\n                  Observation: <span className=\"font-mono\">{trace.observationReason}</span>\n                </div>\n              )}\n              {trace.thinking && (\n                <div>\n                  <div className=\"text-[10px] uppercase tracking-wider text-gray-500 dark:text-gray-400 mb-1\">Reasoning</div>\n                  <pre className=\"p-2 rounded bg-gray-100 dark:bg-gray-900 text-[11px] whitespace-pre-wrap break-words text-gray-700 dark:text-gray-200\">\n                    {trace.thinking}\n                  </pre>\n                </div>\n              )}\n            </div>\n          )}\n\n          {((trace.attempts && trace.attempts.length > 0) ||\n            (trace.spans && trace.spans.length > 0) ||\n            (trace.events && trace.events.length > 0)) && (\n            <div className=\"rounded-lg border border-gray-200/60 dark:border-gray-700/40 bg-gray-50/50 dark:bg-gray-800/40 p-3 space-y-2\">\n              <div className=\"text-[10px] uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n                Trace Graph\n              </div>\n              <div className=\"flex flex-wrap gap-1.5\">\n                {!!trace.attempts?.length && (\n                  <span className=\"px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-900 text-[10px] text-gray-700 dark:text-gray-300\">\n                    attempts: {trace.attempts.length}\n                  </span>\n                )}\n                {!!trace.spans?.length && (\n                  <span className=\"px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-900 text-[10px] text-gray-700 dark:text-gray-300\">\n                    spans: {trace.spans.length}\n                  </span>\n                )}\n                {!!trace.events?.length && (\n                  <span className=\"px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-900 text-[10px] text-gray-700 dark:text-gray-300\">\n                    events: {trace.events.length}\n                  </span>\n                )}\n              </div>\n              {trace.attempts?.[trace.attempts.length - 1] && (\n                <div className=\"text-[11px] text-gray-700 dark:text-gray-300\">\n                  {[\n                    trace.attempts[trace.attempts.length - 1].model,\n                    trace.attempts[trace.attempts.length - 1].provider,\n                    trace.attempts[trace.attempts.length - 1].finishReason,\n                  ]\n                    .filter(Boolean)\n                    .join(' • ')}\n                </div>\n              )}\n            </div>\n          )}\n\n          {/* Metric chips */}\n          {metrics.length > 0 && (\n            <div className=\"flex flex-wrap gap-1.5\">\n              {metrics.map((m, i) => (\n                <MetricChip key={i} {...m} />\n              ))}\n            </div>\n          )}\n\n          {/* Tool calls */}\n          {trace.tools.length > 0 && (\n            <div>\n              <div className=\"flex items-center gap-2 mb-2.5\">\n                <Wrench size={13} weight=\"duotone\" className=\"text-gray-400 dark:text-gray-500\" />\n                <span className=\"text-[11px] font-medium text-gray-500 dark:text-gray-400\">\n                  Tool Calls\n                </span>\n                <span className=\"px-1.5 py-0.5 rounded-full bg-gray-100 dark:bg-gray-800 text-[10px] font-mono font-medium text-gray-500 dark:text-gray-400 tabular-nums\">\n                  {trace.tools.length}\n                </span>\n              </div>\n              <div className=\"space-y-1.5\">\n                {trace.tools.map((tool, idx) => (\n                  <ToolCard key={`${tool.callId || tool.name}-${idx}`} tool={tool} />\n                ))}\n              </div>\n            </div>\n          )}\n\n        </div>\n      ) : (\n        <p className=\"text-xs text-gray-400 dark:text-gray-500 italic\">\n          Debug info unavailable\n        </p>\n      )}\n    </div>\n  );\n}\n\nexport default DebugPanel;\n","import { useCallback, useEffect, useRef, useState, lazy, Suspense } from 'react';\nimport { CaretDown, Check, Copy, ClockCounterClockwise } from '@phosphor-icons/react';\nimport { formatRelativeTime } from '../utils/dateFormatting';\nimport { useTranslation } from '../hooks/useTranslation';\n\nconst MarkdownRenderer = lazy(() =>\n  import('./MarkdownRenderer').then((module) => ({ default: module.MarkdownRenderer }))\n);\n\nconst COPY_FEEDBACK_MS = 2000;\nconst COLLAPSED_HEIGHT = 160;\n\ninterface SystemMessageProps {\n  content: string\n  createdAt: string\n  onCopy?: (content: string) => Promise<void> | void\n  hideActions?: boolean\n  hideTimestamp?: boolean\n}\n\nexport function SystemMessage({\n  content,\n  createdAt,\n  onCopy,\n  hideActions = false,\n  hideTimestamp = false,\n}: SystemMessageProps) {\n  const { t } = useTranslation();\n  const [isCopied, setIsCopied] = useState(false);\n  const [isExpanded, setIsExpanded] = useState(false);\n  const [isExpandable, setIsExpandable] = useState(false);\n  const [contentHeight, setContentHeight] = useState<number | undefined>(undefined);\n  const copyFeedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const contentRef = useRef<HTMLDivElement | null>(null);\n\n  useEffect(() => {\n    return () => {\n      if (copyFeedbackTimeoutRef.current) {\n        clearTimeout(copyFeedbackTimeoutRef.current);\n        copyFeedbackTimeoutRef.current = null;\n      }\n    };\n  }, []);\n\n  useEffect(() => {\n    const node = contentRef.current;\n    if (!node) {return;}\n\n    const measure = () => {\n      const scrollH = node.scrollHeight;\n      setContentHeight(scrollH);\n      if (!isExpanded) {\n        setIsExpandable(scrollH > COLLAPSED_HEIGHT + 1);\n      }\n    };\n\n    measure();\n\n    if (typeof ResizeObserver !== 'undefined') {\n      const observer = new ResizeObserver(measure);\n      observer.observe(node);\n      return () => observer.disconnect();\n    }\n\n    window.addEventListener('resize', measure);\n    return () => window.removeEventListener('resize', measure);\n  }, [content, isExpanded]);\n\n  const handleCopyClick = useCallback(async () => {\n    try {\n      if (onCopy) {\n        await onCopy(content);\n      } else {\n        await navigator.clipboard.writeText(content);\n      }\n\n      setIsCopied(true);\n      if (copyFeedbackTimeoutRef.current) {\n        clearTimeout(copyFeedbackTimeoutRef.current);\n      }\n      copyFeedbackTimeoutRef.current = setTimeout(() => {\n        setIsCopied(false);\n        copyFeedbackTimeoutRef.current = null;\n      }, COPY_FEEDBACK_MS);\n    } catch {\n      setIsCopied(false);\n    }\n  }, [content, onCopy]);\n\n  const timestamp = formatRelativeTime(createdAt, t);\n\n  const resolvedHeight = isExpanded ? contentHeight : COLLAPSED_HEIGHT;\n\n  return (\n    <div className=\"flex justify-center\">\n      <div className=\"w-full max-w-3xl px-2 sm:px-4\">\n        <div className=\"relative overflow-hidden rounded-xl border border-gray-200/80 dark:border-gray-700/60 bg-gradient-to-b from-gray-50/80 to-gray-100/40 dark:from-gray-800/40 dark:to-gray-900/30 shadow-[0_1px_3px_rgba(0,0,0,0.04)] dark:shadow-[0_1px_3px_rgba(0,0,0,0.2)]\">\n          {/* Top accent line */}\n          <div className=\"absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-gray-300/40 dark:via-gray-600/20 to-transparent\" />\n\n          {/* Header */}\n          <div className=\"flex items-center gap-2 px-4 pt-3 pb-2\">\n            <div className=\"flex items-center gap-1.5 text-gray-400 dark:text-gray-500\">\n              <ClockCounterClockwise size={13} weight=\"bold\" />\n              <span className=\"text-[11px] font-semibold uppercase tracking-wider\">\n                {t('BiChat.System.ConversationSummary')}\n              </span>\n            </div>\n\n            <div className=\"flex-1\" />\n\n            {!hideActions && !hideTimestamp && (\n              <span className=\"text-[11px] text-gray-400 dark:text-gray-500 tabular-nums\">\n                {timestamp}\n              </span>\n            )}\n\n            {!hideActions && (\n              <button\n                onClick={handleCopyClick}\n                className={`\n                  cursor-pointer -mr-1 p-1 rounded-md transition-all duration-150\n                  focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\n                  ${isCopied\n                    ? 'text-green-600 dark:text-green-400'\n                    : 'text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-200/50 dark:hover:bg-gray-700/40'\n                  }\n                `}\n                aria-label={t('BiChat.Message.CopyMessage')}\n                title={isCopied ? t('BiChat.Message.Copied') : t('BiChat.Message.Copy')}\n              >\n                {isCopied ? <Check size={13} weight=\"bold\" /> : <Copy size={13} weight=\"regular\" />}\n              </button>\n            )}\n          </div>\n\n          {/* Divider */}\n          <div className=\"mx-4 border-t border-gray-200/60 dark:border-gray-700/40\" />\n\n          {/* Content area */}\n          <div className=\"relative\">\n            <div\n              ref={contentRef}\n              className=\"px-4 pt-3 text-[13px] leading-relaxed text-gray-600 dark:text-gray-400 overflow-hidden transition-[max-height] duration-300 ease-in-out\"\n              style={{ maxHeight: resolvedHeight ? `${resolvedHeight}px` : undefined }}\n            >\n              <Suspense\n                fallback={\n                  <div className=\"flex items-center gap-2 text-sm text-gray-400 dark:text-gray-500 py-2\">\n                    <div className=\"w-3.5 h-3.5 border-[1.5px] border-gray-300 dark:border-gray-600 border-t-transparent rounded-full animate-spin\" />\n                    <span className=\"text-xs\">{t('BiChat.System.LoadingSummary')}</span>\n                  </div>\n                }\n              >\n                <MarkdownRenderer content={content} sendDisabled />\n              </Suspense>\n            </div>\n\n            {/* Fade overlay when collapsed */}\n            {isExpandable && !isExpanded && (\n              <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-20 bg-gradient-to-t from-gray-100/95 via-gray-100/60 to-transparent dark:from-gray-900/95 dark:via-gray-900/50\" />\n            )}\n          </div>\n\n          {/* Expand/collapse toggle */}\n          {isExpandable && (\n            <div className=\"relative px-4 pb-3 pt-1 flex justify-center\">\n              <button\n                type=\"button\"\n                onClick={() => setIsExpanded((prev) => !prev)}\n                aria-expanded={isExpanded}\n                className=\"cursor-pointer group/toggle inline-flex items-center gap-1 px-3 py-1 rounded-full text-[11px] font-medium text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-200/60 dark:hover:bg-gray-700/50 transition-colors duration-150\"\n              >\n                <span>{isExpanded ? t('BiChat.System.ShowLess') : t('BiChat.System.ShowMore')}</span>\n                <CaretDown\n                  size={11}\n                  weight=\"bold\"\n                  className={`transition-transform duration-300 ${isExpanded ? 'rotate-180' : ''}`}\n                />\n              </button>\n            </div>\n          )}\n\n          {/* Bottom spacing when not expandable */}\n          {!isExpandable && <div className=\"pb-3\" />}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default SystemMessage;\n","/**\n * TurnBubble component (Layer 4 - Backward Compatible)\n * Container for a conversation turn (user message + assistant response)\n *\n * Renders both the user's message and the assistant's response in a single\n * visual grouping. If the assistant hasn't responded yet, only shows user message.\n *\n * For primitive-level control, use Turn from '@iota-uz/sdk/bichat/primitives'\n */\n\nimport { type ReactNode } from 'react';\nimport type { ConversationTurn } from '../types';\nimport { UserTurnView, type UserTurnViewProps } from './UserTurnView';\nimport { AssistantTurnView, type AssistantTurnViewProps } from './AssistantTurnView';\nimport type { UserMessageSlots, UserMessageClassNames } from './UserMessage';\nimport type { AssistantMessageSlots, AssistantMessageClassNames } from './AssistantMessage';\n\nexport interface TurnBubbleClassNames {\n  /** Root container */\n  root?: string\n  /** User turn wrapper */\n  userTurn?: string\n  /** Assistant turn wrapper */\n  assistantTurn?: string\n}\n\nexport interface TurnBubbleProps {\n  /** The conversation turn containing user and optional assistant content */\n  turn: ConversationTurn\n  /** When true, this turn is the last in the list (e.g. Regenerate shows only on last assistant message) */\n  isLastTurn?: boolean\n  /** Custom render function for user turn (full control) */\n  renderUserTurn?: (turn: ConversationTurn) => ReactNode\n  /** Custom render function for assistant turn (full control) */\n  renderAssistantTurn?: (turn: ConversationTurn) => ReactNode\n  /** Props passed to UserTurnView (when not using custom renderer) */\n  userTurnProps?: Omit<UserTurnViewProps, 'turn'>\n  /** Props passed to AssistantTurnView (when not using custom renderer) */\n  assistantTurnProps?: Omit<AssistantTurnViewProps, 'turn'>\n  /** Slots for user message customization */\n  userMessageSlots?: UserMessageSlots\n  /** Slots for assistant message customization */\n  assistantMessageSlots?: AssistantMessageSlots\n  /** Class names for user message */\n  userMessageClassNames?: UserMessageClassNames\n  /** Class names for assistant message */\n  assistantMessageClassNames?: AssistantMessageClassNames\n  /** Class names for turn bubble container */\n  classNames?: TurnBubbleClassNames\n  /** Whether assistant response is streaming */\n  isStreaming?: boolean\n}\n\nconst defaultClassNames: Required<TurnBubbleClassNames> = {\n  root: 'space-y-4 min-w-0',\n  userTurn: '',\n  assistantTurn: '',\n};\n\nexport function TurnBubble({\n  turn,\n  isLastTurn = false,\n  renderUserTurn,\n  renderAssistantTurn,\n  userTurnProps,\n  assistantTurnProps,\n  userMessageSlots,\n  assistantMessageSlots,\n  userMessageClassNames,\n  assistantMessageClassNames,\n  classNames,\n  isStreaming = false,\n}: TurnBubbleProps) {\n  const classes = {\n    root: classNames?.root ?? defaultClassNames.root,\n    userTurn: classNames?.userTurn ?? defaultClassNames.userTurn,\n    assistantTurn: classNames?.assistantTurn ?? defaultClassNames.assistantTurn,\n  };\n  const userContent = typeof turn.userTurn?.content === 'string' ? turn.userTurn.content : '';\n  const isSystemSummaryTurn =\n    userContent.trim() === '' && turn.assistantTurn?.role === 'system';\n\n  return (\n    <div className={classes.root} data-turn-id={turn.id}>\n      {/* User message */}\n      {!isSystemSummaryTurn && (\n        <div className={classes.userTurn}>\n          {renderUserTurn ? (\n            renderUserTurn(turn)\n          ) : (\n            <UserTurnView\n              turn={turn}\n              slots={userMessageSlots}\n              classNames={userMessageClassNames}\n              {...userTurnProps}\n            />\n          )}\n        </div>\n      )}\n\n      {/* Assistant response (if available) */}\n      {turn.assistantTurn && (\n        <div className={classes.assistantTurn}>\n          {renderAssistantTurn ? (\n            renderAssistantTurn(turn)\n          ) : (\n            <AssistantTurnView\n              turn={turn}\n              isLastTurn={isLastTurn}\n              isStreaming={isStreaming}\n              slots={assistantMessageSlots}\n              classNames={assistantMessageClassNames}\n              {...assistantTurnProps}\n            />\n          )}\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport default TurnBubble;\n","/**\n * Framer Motion animation variants for BiChat UI\n * Subtle, professional animations for enterprise applications\n *\n * Reduced-motion handling: Framer Motion's built-in `<MotionConfig reducedMotion=\"user\">`\n * or the `useReducedMotion()` hook handle OS-level accessibility preferences reactively.\n * Variant objects declare their intended durations; Framer suppresses them automatically.\n */\n\n/**\n * Fade in animation\n */\nexport const fadeInVariants = {\n  initial: { opacity: 0 },\n  animate: {\n    opacity: 1,\n    transition: { duration: 0.2 },\n  },\n  exit: {\n    opacity: 0,\n    transition: { duration: 0.15 },\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: 0.2,\n      ease: [0.4, 0, 0.2, 1],\n    },\n  },\n  exit: {\n    opacity: 0,\n    y: 8,\n    transition: { duration: 0.15 },\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: { duration: 0.15 },\n  },\n  exit: {\n    opacity: 0,\n    scale: 0.98,\n    transition: { duration: 0.1 },\n  },\n};\n\n/**\n * Modal backdrop\n */\nexport const backdropVariants = {\n  initial: { opacity: 0 },\n  animate: {\n    opacity: 1,\n    transition: { duration: 0.15 },\n  },\n  exit: {\n    opacity: 0,\n    transition: { duration: 0.15 },\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: 0.2,\n      ease: [0.4, 0, 0.2, 1],\n    },\n  },\n  exit: {\n    opacity: 0,\n    transition: { duration: 0.15 },\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: 1,\n      repeat: Infinity,\n      ease: 'easeInOut',\n    },\n  },\n};\n\n/**\n * Verb transition for typing indicator\n * Smooth slide-up animation for rotating text\n */\nexport const verbTransitionVariants = {\n  initial: {\n    y: 16,\n    opacity: 0,\n  },\n  animate: {\n    y: 0,\n    opacity: 1,\n    transition: {\n      duration: 0.2,\n      ease: 'easeOut',\n    },\n  },\n  exit: {\n    y: -16,\n    opacity: 0,\n    transition: { duration: 0.15 },\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: { duration: 0.2 },\n  },\n  exit: {\n    opacity: 0,\n    scale: 0.9,\n    transition: { duration: 0.15 },\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: 0.15 },\n  },\n  exit: {\n    opacity: 0,\n    y: -4,\n    transition: { duration: 0.1 },\n  },\n};\n\n/**\n * Session item with subtle slide-right on hover\n */\nexport const sessionItemVariants = {\n  initial: { opacity: 0, x: -20 },\n  animate: {\n    opacity: 1,\n    x: 0,\n    transition: { duration: 0.3 },\n  },\n  hover: {\n    x: 4,\n    transition: { duration: 0.2 },\n  },\n  exit: {\n    opacity: 0,\n    x: -20,\n    transition: { duration: 0.2 },\n  },\n};\n\n/**\n * Error/alert message slide-in\n */\nexport const errorMessageVariants = {\n  initial: { opacity: 0, y: -10, height: 0 },\n  animate: {\n    opacity: 1,\n    y: 0,\n    height: 'auto',\n    transition: {\n      duration: 0.3,\n      ease: [0.4, 0, 0.2, 1],\n    },\n  },\n  exit: {\n    opacity: 0,\n    y: -10,\n    height: 0,\n    transition: { duration: 0.2 },\n  },\n};\n","/**\n * TypingIndicator Component\n * Displays rotating verbs with shimmer animation to show AI is thinking/processing.\n * Verbs are configurable via props. When not provided, defaults are pulled from translations.\n */\n\nimport { useState, useEffect, useMemo, memo } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { verbTransitionVariants } from '../animations/variants';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface TypingIndicatorProps {\n  /** Custom thinking verbs to rotate through */\n  verbs?: string[]\n  /** Verb rotation interval in ms (defaults to 3000) */\n  rotationInterval?: number\n  /** Additional CSS classes */\n  className?: string\n}\n\n// Translation keys for default thinking verbs\nconst THINKING_KEYS = [\n  'BiChat.Thinking.Thinking',\n  'BiChat.Thinking.Processing',\n  'BiChat.Thinking.Analyzing',\n  'BiChat.Thinking.Synthesizing',\n  'BiChat.Thinking.Computing',\n  'BiChat.Thinking.WorkingOnIt',\n];\n\n// Check if user prefers reduced motion\nconst prefersReducedMotion = () => {\n  if (typeof window === 'undefined') {return false;}\n  return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n};\n\n// Random selector without immediate repeat\nconst getRandomVerb = (verbs: string[], current: string): string => {\n  const available = verbs.filter((v) => v !== current);\n  if (available.length === 0) {\n    return current || verbs[0] || '';\n  }\n  return available[Math.floor(Math.random() * available.length)];\n};\n\nfunction TypingIndicator({\n  verbs: verbsProp,\n  rotationInterval = 3000,\n  className = '',\n}: TypingIndicatorProps) {\n  const { t } = useTranslation();\n\n  const verbs = useMemo(() => {\n    if (verbsProp) {return verbsProp;}\n    return THINKING_KEYS.map((key) => t(key));\n  }, [verbsProp, t]);\n\n  const [verb, setVerb] = useState(() => verbs[Math.floor(Math.random() * verbs.length)]);\n\n  useEffect(() => {\n    if (prefersReducedMotion()) {return;}\n\n    const interval = setInterval(() => {\n      setVerb((prev) => getRandomVerb(verbs, prev));\n    }, rotationInterval);\n\n    return () => clearInterval(interval);\n  }, [verbs, rotationInterval]);\n\n  return (\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      className={`flex items-center gap-2.5 text-gray-500 dark:text-gray-400 ${className}`}\n    >\n      <div className=\"flex items-center gap-1\" aria-hidden=\"true\">\n        <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:0ms]\" />\n        <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:150ms]\" />\n        <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:300ms]\" />\n      </div>\n      <div className=\"overflow-hidden h-6 relative\">\n        <AnimatePresence mode=\"wait\">\n          <motion.span\n            key={verb}\n            variants={verbTransitionVariants}\n            initial=\"initial\"\n            animate=\"animate\"\n            exit=\"exit\"\n            className=\"text-sm bichat-thinking-shimmer block\"\n            aria-label={t('BiChat.Thinking.AriaLabel', { verb })}\n          >\n            {verb}...\n          </motion.span>\n        </AnimatePresence>\n      </div>\n    </div>\n  );\n}\n\nconst MemoizedTypingIndicator = memo(TypingIndicator);\nMemoizedTypingIndicator.displayName = 'TypingIndicator';\n\nexport { MemoizedTypingIndicator as TypingIndicator };\nexport default MemoizedTypingIndicator;\n","/**\n * ActivityTrace — ephemeral activity indicator during AI streaming.\n *\n * Replaces the generic TypingIndicator with a rich, animated trace showing:\n * - Thinking/reasoning content from the model\n * - Tool execution steps with localized labels\n * - Sub-agent delegation with nested child steps\n *\n * All content is ephemeral — it disappears when the final answer arrives.\n */\n\nimport { memo, useMemo, useState } from 'react';\nimport { motion, AnimatePresence, MotionConfig } from 'framer-motion';\nimport { CaretRight, XCircle } from '@phosphor-icons/react';\nimport type { ActivityStep } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { getToolLabel } from '../utils/toolLabels';\nimport { groupSteps } from '../utils/activitySteps';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDuration(ms: number): string {\n  return ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(1)}s`;\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface ActivityTraceProps {\n  thinkingContent: string\n  activeSteps: ActivityStep[]\n  /** Consumer tool label prefix (e.g. 'Ali.Tools') for custom tool translations. */\n  toolLabelPrefix?: string\n  className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Main Component\n// ---------------------------------------------------------------------------\n\nfunction ActivityTraceInner({\n  thinkingContent,\n  activeSteps,\n  toolLabelPrefix,\n  className = '',\n}: ActivityTraceProps) {\n  const { t } = useTranslation();\n\n  // Hooks must be called unconditionally (React rules of hooks)\n  const { topLevel, agentGroups } = useMemo(() => groupSteps(activeSteps), [activeSteps]);\n\n  const hasContent = thinkingContent || activeSteps.length > 0;\n  if (!hasContent) {return null;}\n\n  const hasActiveSteps = activeSteps.some((s) => s.status === 'active');\n\n  return (\n    <MotionConfig reducedMotion=\"user\">\n      <div\n        role=\"status\"\n        aria-live=\"polite\"\n        className={`flex gap-3 ${className}`}\n      >\n        {/* AI avatar */}\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        {/* Trace content */}\n        <div className=\"flex-1 max-w-[85%] space-y-2\">\n          {/* Thinking bubble */}\n          <AnimatePresence>\n            {thinkingContent && (\n              <motion.div\n                key=\"thinking-bubble\"\n                initial={{ opacity: 0, height: 0 }}\n                animate={{ opacity: 1, height: 'auto' }}\n                exit={{ opacity: 0, height: 0 }}\n                transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n                className=\"overflow-hidden\"\n              >\n                <ThinkingBubble content={thinkingContent} />\n              </motion.div>\n            )}\n          </AnimatePresence>\n\n          {/* Activity steps */}\n          <div className=\"space-y-1\">\n            <AnimatePresence initial={false}>\n              {topLevel.map((step) => (\n                <StepItem\n                  key={step.id}\n                  step={step}\n                  t={t}\n                  toolLabelPrefix={toolLabelPrefix}\n                />\n              ))}\n            </AnimatePresence>\n\n            {/* Agent groups (sub-agent tool calls) */}\n            <AnimatePresence initial={false}>\n              {agentGroups.map(([agentName, steps]) => (\n                <AgentGroup\n                  key={agentName}\n                  agentName={agentName}\n                  steps={steps}\n                  t={t}\n                  toolLabelPrefix={toolLabelPrefix}\n                />\n              ))}\n            </AnimatePresence>\n\n            {/* Typing shimmer while tools are running */}\n            {hasActiveSteps && !thinkingContent && (\n              <div className=\"flex items-center gap-1.5 pt-0.5\" aria-hidden=\"true\">\n                <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:0ms]\" />\n                <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:150ms]\" />\n                <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:300ms]\" />\n              </div>\n            )}\n          </div>\n        </div>\n      </div>\n    </MotionConfig>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// ThinkingBubble\n// ---------------------------------------------------------------------------\n\nfunction ThinkingBubble({ content }: { content: string }) {\n  // Show last 2 lines of thinking, truncated\n  const truncated = useMemo(() => {\n    const lines = content.trim().split('\\n');\n    const last = lines.slice(-2).join('\\n');\n    return last.length > 200 ? '…' + last.slice(-200) : last;\n  }, [content]);\n\n  return (\n    <div className=\"flex items-start gap-2 text-sm text-gray-500 dark:text-gray-400\">\n      <span className=\"inline-block w-2 h-2 mt-1.5 rounded-full bg-primary-400 animate-pulse shrink-0\" />\n      <div className=\"min-w-0 overflow-hidden\">\n        <span className=\"font-medium bichat-thinking-shimmer\">\n          {truncated}\n        </span>\n      </div>\n    </div>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// StepItem\n// ---------------------------------------------------------------------------\n\ninterface StepItemProps {\n  step: ActivityStep\n  t: (key: string, params?: Record<string, string | number | boolean>) => string\n  toolLabelPrefix?: string\n}\n\nfunction StepItem({ step, t, toolLabelPrefix }: StepItemProps) {\n  const label = useMemo(\n    () =>\n      step.type === 'thinking'\n        ? t('BiChat.Thinking.Thinking')\n        : getToolLabel(t, step.toolName, step.arguments, toolLabelPrefix),\n    [step.type, step.toolName, step.arguments, t, toolLabelPrefix]\n  );\n\n  const isCompleted = step.status === 'completed';\n  const isFailed = step.status === 'failed';\n  const duration = step.durationMs != null ? formatDuration(step.durationMs) : null;\n\n  return (\n    <motion.div\n      layout\n      initial={{ opacity: 0, x: -8 }}\n      animate={{ opacity: 1, x: 0 }}\n      exit={{ opacity: 0, x: -8 }}\n      transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n      className={`flex items-center gap-2 text-sm transition-colors duration-200 ${\n        isFailed\n          ? 'text-red-500 dark:text-red-400'\n          : isCompleted\n            ? 'text-gray-400 dark:text-gray-500'\n            : 'text-gray-600 dark:text-gray-300'\n      }`}\n      aria-label={`${label}, ${isFailed ? 'failed' : isCompleted ? 'completed' : 'in progress'}`}\n    >\n      <StatusIndicator status={step.status} />\n      <span className={isCompleted || isFailed ? '' : 'font-medium'}>{label}</span>\n      {step.error && (\n        <span\n          className=\"text-xs text-red-400 truncate max-w-[200px]\"\n          title={step.error}\n        >\n          {step.error}\n        </span>\n      )}\n      {duration && (\n        <motion.span\n          initial={{ opacity: 0 }}\n          animate={{ opacity: 1 }}\n          className=\"text-xs text-gray-400 dark:text-gray-500 tabular-nums\"\n        >\n          {duration}\n        </motion.span>\n      )}\n    </motion.div>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// AgentGroup\n// ---------------------------------------------------------------------------\n\ninterface AgentGroupProps {\n  agentName: string\n  steps: ActivityStep[]\n  t: (key: string, params?: Record<string, string | number | boolean>) => string\n  toolLabelPrefix?: string\n}\n\nfunction AgentGroup({ agentName, steps, t, toolLabelPrefix }: AgentGroupProps) {\n  const [collapsed, setCollapsed] = useState(false);\n  const completedCount = steps.filter((s) => s.status === 'completed').length;\n\n  return (\n    <motion.div\n      layout\n      initial={{ opacity: 0, y: 4 }}\n      animate={{ opacity: 1, y: 0 }}\n      exit={{ opacity: 0, y: -4 }}\n      transition={{ duration: 0.2 }}\n      className=\"ml-4 pl-3 border-l-2 border-primary-200 dark:border-primary-800 space-y-1\"\n    >\n      <button\n        type=\"button\"\n        onClick={() => setCollapsed((c) => !c)}\n        className=\"flex items-center gap-1 text-xs font-medium text-primary-600 dark:text-primary-400 cursor-pointer hover:text-primary-700 dark:hover:text-primary-300 transition-colors\"\n        aria-expanded={!collapsed}\n      >\n        <CaretRight\n          size={12}\n          weight=\"bold\"\n          className={`shrink-0 transition-transform duration-150 ${collapsed ? '' : 'rotate-90'}`}\n        />\n        <span>\n          {agentName}\n          {collapsed && (\n            <span className=\"ml-1 text-gray-400 dark:text-gray-500\">\n              ({completedCount}/{steps.length})\n            </span>\n          )}\n        </span>\n      </button>\n      {!collapsed && (\n        <AnimatePresence initial={false}>\n          {steps.map((step) => (\n            <StepItem key={step.id} step={step} t={t} toolLabelPrefix={toolLabelPrefix} />\n          ))}\n        </AnimatePresence>\n      )}\n    </motion.div>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// StatusIndicator\n// ---------------------------------------------------------------------------\n\nfunction StatusIndicator({ status }: { status: ActivityStep['status'] }) {\n  if (status === 'failed') {\n    return (\n      <motion.div\n        initial={{ scale: 0.5, opacity: 0 }}\n        animate={{ scale: 1, opacity: 1 }}\n        transition={{ type: 'spring', stiffness: 400, damping: 20 }}\n        className=\"shrink-0\"\n      >\n        <XCircle size={14} weight=\"fill\" className=\"text-red-500 dark:text-red-400\" />\n      </motion.div>\n    );\n  }\n\n  if (status === 'completed') {\n    return (\n      <motion.svg\n        initial={{ scale: 0.5, opacity: 0 }}\n        animate={{ scale: 1, opacity: 1 }}\n        transition={{ type: 'spring', stiffness: 400, damping: 20 }}\n        className=\"w-3.5 h-3.5 text-green-500 dark:text-green-400 shrink-0\"\n        viewBox=\"0 0 16 16\"\n        fill=\"none\"\n      >\n        <path\n          d=\"M3 8.5L6.5 12L13 4\"\n          stroke=\"currentColor\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        />\n      </motion.svg>\n    );\n  }\n\n  return (\n    <span className=\"relative flex h-3.5 w-3.5 shrink-0 items-center justify-center\">\n      <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-primary-400 opacity-50 motion-reduce:animate-none\" />\n      <span className=\"relative inline-flex h-2 w-2 rounded-full bg-primary-500\" />\n    </span>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Export\n// ---------------------------------------------------------------------------\n\nexport const ActivityTrace = memo(ActivityTraceInner);\nActivityTrace.displayName = 'ActivityTrace';\n","/**\n * Tool label resolution for the Activity Trace.\n *\n * Convention: `BiChat.Tools.{toolName}` for SDK-provided tools.\n * Upstream consumers can extend with their own prefix (e.g., `Ali.Tools.{customTool}`).\n */\n\ntype TranslateFn = (key: string, params?: Record<string, string | number | boolean>) => string\n\nconst ACRONYMS = new Set(['sql', 'kb', 'pdf', 'api', 'csv', 'http', 'url', 'id']);\n\nfunction humanizeToolName(name: string): string {\n  return name\n    .split('_')\n    .map((word) => (ACRONYMS.has(word) ? word.toUpperCase() : word.charAt(0).toUpperCase() + word.slice(1)))\n    .join(' ');\n}\n\n/**\n * Resolve a human-readable label for a tool invocation.\n *\n * Lookup order:\n * 1. Consumer prefix (if provided), e.g. `Ali.Tools.custom_tool`\n * 2. SDK default prefix `BiChat.Tools.{name}`\n * 3. Fallback: humanise the raw tool name\n */\nexport function getToolLabel(\n  t: TranslateFn,\n  name: string,\n  args?: string,\n  prefix?: string\n): string {\n  // 1. Consumer prefix\n  if (prefix) {\n    const key = `${prefix}.${name}`;\n    const label = t(key, parseToolParams(name, args));\n    if (label !== key) {return label;}\n  }\n\n  // 2. SDK default\n  const sdkKey = `BiChat.Tools.${name}`;\n  const sdkLabel = t(sdkKey, parseToolParams(name, args));\n  if (sdkLabel !== sdkKey) {return sdkLabel;}\n\n  // 3. Humanise fallback\n  return humanizeToolName(name);\n}\n\n/**\n * Extract interpolation params from tool arguments for specific tools.\n */\nfunction parseToolParams(\n  name: string,\n  args?: string\n): Record<string, string> | undefined {\n  if (name === 'task' && args) {\n    try {\n      const parsed = JSON.parse(args) as Record<string, unknown>;\n      return { agent: String(parsed.description ?? parsed.subagent_type ?? 'specialist') };\n    } catch {\n      return { agent: 'specialist' };\n    }\n  }\n  return undefined;\n}\n","/**\n * Utility functions for activity step processing.\n */\n\nimport type { ActivityStep } from '../types';\n\n/**\n * Group activity steps by agent — top-level steps (no agentName) and\n * agent groups (keyed by agentName).\n */\nexport function groupSteps(steps: ActivityStep[]): {\n  topLevel: ActivityStep[]\n  agentGroups: [string, ActivityStep[]][]\n} {\n  const topLevel: ActivityStep[] = [];\n  const agentMap = new Map<string, ActivityStep[]>();\n\n  for (const step of steps) {\n    if (step.agentName) {\n      const group = agentMap.get(step.agentName) || [];\n      group.push(step);\n      agentMap.set(step.agentName, group);\n    } else {\n      topLevel.push(step);\n    }\n  }\n\n  const agentGroups = Array.from(agentMap.entries());\n  return { topLevel, agentGroups };\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';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ScrollToBottomButtonProps {\n  show: boolean\n  onClick: () => void\n  unreadCount?: number\n  disabled?: boolean\n  /** When set, renders a pill-style button with this label (e.g. \"New messages\") */\n  label?: string\n}\n\nfunction ScrollToBottomButton({\n  show,\n  onClick,\n  unreadCount = 0,\n  disabled = false,\n  label,\n}: ScrollToBottomButtonProps) {\n  const { t } = useTranslation();\n  return (\n    <AnimatePresence>\n      {show && (\n        <div\n          className=\"absolute bottom-8 z-10 pointer-events-none\"\n          style={{ left: '50%', transform: 'translateX(-50%)' }}\n        >\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={disabled ? undefined : onClick}\n            disabled={disabled}\n            className={`pointer-events-auto cursor-pointer shadow-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 active:bg-gray-100 dark:active:bg-gray-600 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900 disabled:opacity-40 disabled:cursor-not-allowed ${\n              label\n                ? 'flex items-center gap-1.5 px-4 py-2 rounded-full bg-primary-600 dark:bg-primary-500 border-primary-600 dark:border-primary-500 hover:bg-primary-700 dark:hover:bg-primary-600 active:bg-primary-800 dark:active:bg-primary-700'\n                : 'p-2.5 rounded-full bg-white dark:bg-gray-800'\n            }`}\n            aria-label={label || t('BiChat.Common.ScrollToBottom')}\n          >\n            {label ? (\n              <>\n                <span className=\"text-sm font-medium text-white\">{label}</span>\n                <ArrowDown size={16} weight=\"bold\" className=\"text-white\" />\n              </>\n            ) : (\n              <div className=\"relative\">\n                <ArrowDown size={18} weight=\"bold\" className=\"text-gray-700 dark:text-gray-300\" />\n\n                {/* Unread count badge */}\n                {unreadCount > 0 && (\n                  <span\n                    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                    aria-live=\"polite\"\n                    aria-atomic=\"true\"\n                  >\n                    {unreadCount > 99 ? '99+' : unreadCount}\n                  </span>\n                )}\n              </div>\n            )}\n          </motion.button>\n        </div>\n      )}\n    </AnimatePresence>\n  );\n}\n\nexport { ScrollToBottomButton };\nexport default ScrollToBottomButton;\n","/**\n * DateSeparator Component\n * Renders a centered date label with horizontal divider lines.\n * Shows \"Today\", \"Yesterday\", or a formatted date for older messages.\n */\n\nimport { useMemo } from 'react';\nimport { isToday, isYesterday, format } from 'date-fns';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface DateSeparatorProps {\n  date: Date\n}\n\nexport function DateSeparator({ date }: DateSeparatorProps) {\n  const { t } = useTranslation();\n\n  const label = useMemo(() => {\n    if (isToday(date)) {return t('BiChat.DateGroup.Today');}\n    if (isYesterday(date)) {return t('BiChat.DateGroup.Yesterday');}\n    return format(date, 'MMM d');\n  }, [date, t]);\n\n  return (\n    <div className=\"flex items-center gap-3 py-2 select-none\" aria-label={label}>\n      <div className=\"h-px flex-1 bg-gray-200 dark:bg-gray-700\" />\n      <span className=\"text-[11px] font-medium text-gray-400 dark:text-gray-500 uppercase tracking-wide\">\n        {label}\n      </span>\n      <div className=\"h-px flex-1 bg-gray-200 dark:bg-gray-700\" />\n    </div>\n  );\n}\n\nexport default DateSeparator;\n","/**\n * Normalizes partially-streamed markdown so that react-markdown\n * can render it without layout artifacts (e.g. an unclosed code fence\n * turning the rest of the message into a code block).\n *\n * Called on every streaming content update — kept intentionally cheap (O(lines)).\n */\nexport function normalizeStreamingMarkdown(text: string): string {\n  // Track unclosed code fences.\n  // A code fence opens with ≥3 backticks at line start and closes with\n  // the same (or more) backticks on its own line.\n  const lines = text.split('\\n');\n  let inCodeBlock = false;\n  let fenceTicks = '';\n\n  for (const line of lines) {\n    const trimmed = line.trimStart();\n    const fenceMatch = trimmed.match(/^(`{3,})/);\n    if (fenceMatch) {\n      if (!inCodeBlock) {\n        inCodeBlock = true;\n        fenceTicks = fenceMatch[1];\n      } else if (trimmed.startsWith(fenceTicks) && trimmed.slice(fenceTicks.length).trim() === '') {\n        inCodeBlock = false;\n        fenceTicks = '';\n      }\n    }\n  }\n\n  if (inCodeBlock) {\n    text += '\\n' + fenceTicks;\n  }\n\n  return text;\n}\n","import { useEffect } from 'react';\n\nexport interface ShortcutConfig {\n  key: string\n  ctrl?: boolean\n  shift?: boolean\n  alt?: boolean\n  meta?: boolean\n  callback: () => void\n  preventDefault?: boolean\n  description?: string\n}\n\n/**\n * Hook for managing global keyboard shortcuts\n * Automatically handles modifier keys and input field exclusion\n *\n * @param shortcuts - Array of keyboard shortcut configurations\n *\n * @example\n * useKeyboardShortcuts([\n *   { key: 'k', ctrl: true, callback: () => focusSearch(), description: 'Focus search' },\n *   { key: '?', callback: () => setShowHelp(true), description: 'Show keyboard shortcuts' },\n * ])\n */\nexport function useKeyboardShortcuts(shortcuts: ShortcutConfig[]) {\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent) => {\n      // Ignore if user is typing in input/textarea/contenteditable\n      const target = e.target as HTMLElement;\n      if (\n        target instanceof HTMLInputElement ||\n        target instanceof HTMLTextAreaElement ||\n        target.isContentEditable\n      ) {\n        // Allow some shortcuts even in inputs (like Escape)\n        const allowInInput = shortcuts.find(s =>\n          s.key.toLowerCase() === e.key.toLowerCase() &&\n          s.key.toLowerCase() === 'escape'\n        );\n        if (!allowInInput) {\n          return;\n        }\n      }\n\n      // Find matching shortcut\n      const matchingShortcut = shortcuts.find((s) => {\n        const keyMatches = e.key.toLowerCase() === s.key.toLowerCase();\n        const modMatches = s.meta\n          ? e.metaKey && !e.ctrlKey\n          : s.ctrl\n            ? e.ctrlKey || e.metaKey\n            : !e.ctrlKey && !e.metaKey;\n        const shiftMatches = s.shift ? e.shiftKey : !e.shiftKey;\n        const altMatches = s.alt ? e.altKey : !e.altKey;\n\n        return keyMatches && modMatches && shiftMatches && altMatches;\n      });\n\n      if (matchingShortcut) {\n        if (matchingShortcut.preventDefault !== false) {\n          e.preventDefault();\n        }\n        matchingShortcut.callback();\n      }\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    return () => document.removeEventListener('keydown', handleKeyDown);\n  }, [shortcuts]);\n}\n","/**\n * useMessageListScroll — scroll management for the MessageList.\n *\n * Owns: auto-scroll, initial-session scroll, scroll-to-bottom button,\n * unread-count tracking, and the End-key shortcut.\n */\n\nimport { useRef, useState, useCallback, useEffect, useMemo } from 'react';\nimport { useKeyboardShortcuts, type ShortcutConfig } from './useKeyboardShortcuts';\n\nconst NEAR_BOTTOM_PX = 150;\n\nexport interface MessageListScrollOptions {\n  /** Current session id — triggers initial scroll on change. */\n  currentSessionId: string | undefined\n  /** True while session data is loading. */\n  fetching: boolean\n  /** Number of conversation turns (triggers auto-scroll). */\n  turnsLength: number\n  /** Current streaming content (controls instant vs smooth scroll). */\n  streamingContent: string\n}\n\nexport interface MessageListScrollReturn {\n  containerRef: React.RefObject<HTMLDivElement>\n  messagesEndRef: React.RefObject<HTMLDivElement>\n  showScrollButton: boolean\n  unreadCount: number\n  handleScrollToBottom: () => void\n}\n\nexport function useMessageListScroll({\n  currentSessionId,\n  fetching,\n  turnsLength,\n  streamingContent,\n}: MessageListScrollOptions): MessageListScrollReturn {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const messagesEndRef = useRef<HTMLDivElement>(null);\n  const initialScrollSessionRef = useRef<string | undefined>(undefined);\n  const prevTurnsLengthRef = useRef(turnsLength);\n  const isAutoScrollRef = useRef(true);\n\n  const [showScrollButton, setShowScrollButton] = useState(false);\n  const [unreadCount, setUnreadCount] = useState(0);\n\n  // -- Core scroll helper ---------------------------------------------------\n\n  const scrollToBottom = useCallback((behavior: ScrollBehavior = 'smooth') => {\n    const container = containerRef.current;\n    if (container) {\n      container.scrollTo({ top: container.scrollHeight, behavior });\n      return;\n    }\n    messagesEndRef.current?.scrollIntoView({ behavior });\n  }, []);\n\n  // -- Auto-scroll on new turns / streaming ---------------------------------\n\n  useEffect(() => {\n    if (!isAutoScrollRef.current) {return;}\n    scrollToBottom(streamingContent ? 'auto' : 'smooth');\n  }, [turnsLength, streamingContent, scrollToBottom]);\n\n  // -- Initial scroll when opening a session --------------------------------\n\n  useEffect(() => {\n    if (fetching || !currentSessionId || currentSessionId === 'new') {return;}\n    if (initialScrollSessionRef.current === currentSessionId) {return;}\n\n    const runInitialScroll = () => {\n      scrollToBottom('auto');\n      setShowScrollButton(false);\n      isAutoScrollRef.current = true;\n    };\n\n    requestAnimationFrame(() => requestAnimationFrame(runInitialScroll));\n    const t1 = setTimeout(runInitialScroll, 80);\n    const t2 = setTimeout(runInitialScroll, 200);\n    const t3 = setTimeout(runInitialScroll, 400);\n\n    initialScrollSessionRef.current = currentSessionId;\n    return () => { clearTimeout(t1); clearTimeout(t2); clearTimeout(t3); };\n  }, [currentSessionId, fetching, turnsLength, scrollToBottom]);\n\n  // -- Scroll detection — button visibility + auto-scroll flag --------------\n\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container) {return;}\n\n    const onScroll = () => {\n      const { scrollTop, scrollHeight, clientHeight } = container;\n      const nearBottom = scrollHeight - scrollTop - clientHeight < NEAR_BOTTOM_PX;\n      isAutoScrollRef.current = nearBottom;\n      setShowScrollButton(!nearBottom);\n      if (nearBottom) {setUnreadCount(0);}\n    };\n\n    container.addEventListener('scroll', onScroll);\n    return () => container.removeEventListener('scroll', onScroll);\n  }, []);\n\n  // -- Unread tracking when scrolled up -------------------------------------\n\n  useEffect(() => {\n    const prev = prevTurnsLengthRef.current;\n    prevTurnsLengthRef.current = turnsLength;\n    if (turnsLength > prev && showScrollButton) {\n      setUnreadCount(c => c + (turnsLength - prev));\n    }\n  }, [turnsLength, showScrollButton]);\n\n  // -- End-key shortcut -----------------------------------------------------\n\n  const shortcuts = useMemo<ShortcutConfig[]>(() => [{\n    key: 'End',\n    callback: () => { scrollToBottom('smooth'); setUnreadCount(0); },\n    description: 'Scroll to bottom',\n  }], [scrollToBottom]);\n  useKeyboardShortcuts(shortcuts);\n\n  // -- Public callback for the button ---------------------------------------\n\n  const handleScrollToBottom = useCallback(() => {\n    scrollToBottom('smooth');\n    setUnreadCount(0);\n  }, [scrollToBottom]);\n\n  return { containerRef, messagesEndRef, showScrollButton, unreadCount, handleScrollToBottom };\n}\n","/**\n * MessageList — displays conversation turns with auto-scroll and grouping.\n *\n * Uses turn-based architecture where each ConversationTurn groups\n * a user message with its assistant response.\n */\n\nimport { useMemo, ReactNode, lazy, Suspense, Fragment } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { useChatSession, useChatMessaging } from '../context/ChatContext';\nimport { ConversationTurn } from '../types';\nimport { TurnBubble } from './TurnBubble';\nimport { TypingIndicator } from './TypingIndicator';\nimport { ActivityTrace } from './ActivityTrace';\nimport StreamingCursor from './StreamingCursor';\nimport ScrollToBottomButton from './ScrollToBottomButton';\nimport { DateSeparator } from './DateSeparator';\nimport { normalizeStreamingMarkdown } from '../utils/markdownStream';\nimport { useMessageListScroll } from '../hooks/useMessageListScroll';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { isSameDay } from 'date-fns';\n\n// Eagerly start loading the chunk so it's ready before streaming begins\nconst markdownImport = import('./MarkdownRenderer');\nconst MarkdownRenderer = lazy(() =>\n  markdownImport.then((m) => ({ default: m.MarkdownRenderer }))\n);\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction MessageListSkeleton() {\n  return (\n    <div className=\"space-y-6\" aria-hidden=\"true\">\n      <div className=\"flex justify-end\">\n        <div className=\"w-3/5 max-w-md rounded-2xl bg-gray-100 dark:bg-gray-800 p-4 space-y-2\">\n          <div className=\"h-3 w-full rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n          <div className=\"h-3 w-4/5 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n        </div>\n      </div>\n      <div className=\"flex gap-3\">\n        <div className=\"w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse shrink-0\" />\n        <div className=\"w-4/5 max-w-lg rounded-2xl bg-gray-100 dark:bg-gray-800 p-4 space-y-2\">\n          <div className=\"h-3 w-full rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n          <div className=\"h-3 w-5/6 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n          <div className=\"h-3 w-3/5 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n        </div>\n      </div>\n      <div className=\"flex justify-end\">\n        <div className=\"w-2/5 max-w-xs rounded-2xl bg-gray-100 dark:bg-gray-800 p-4 space-y-2\">\n          <div className=\"h-3 w-full rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction StreamingBubble({ content, normalizedContent }: { content: string; normalizedContent: string }) {\n  return (\n    <div className=\"flex min-w-0 gap-3\">\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      <div className=\"flex-1 min-w-0 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-2xl rounded-bl-sm px-4 py-3 text-gray-900 dark:text-gray-100\" style={{ maxWidth: 'var(--bichat-bubble-assistant-max-width, 85%)' }}>\n        <Suspense\n          fallback={\n            <div className=\"prose prose-sm max-w-none dark:prose-invert whitespace-pre-wrap\">\n              {content}\n            </div>\n          }\n        >\n          <MarkdownRenderer content={normalizedContent} sendDisabled />\n        </Suspense>\n        <StreamingCursor />\n      </div>\n    </div>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// MessageList\n// ---------------------------------------------------------------------------\n\ninterface MessageListProps {\n  renderUserTurn?: (turn: ConversationTurn) => ReactNode\n  renderAssistantTurn?: (turn: ConversationTurn) => ReactNode\n  thinkingVerbs?: string[]\n  readOnly?: boolean\n}\n\nexport function MessageList({ renderUserTurn, renderAssistantTurn, thinkingVerbs, readOnly }: MessageListProps) {\n  const { t } = useTranslation();\n  const { session, currentSessionId, fetching } = useChatSession();\n  const {\n    turns, streamingContent, isStreaming,\n    thinkingContent, activeSteps,\n    showActivityTrace, showTypingIndicator,\n  } = useChatMessaging();\n\n  const { containerRef, messagesEndRef, showScrollButton, unreadCount, handleScrollToBottom } =\n    useMessageListScroll({ currentSessionId, fetching, turnsLength: turns.length, streamingContent });\n\n  const normalizedStreaming = useMemo(\n    () => (streamingContent ? normalizeStreamingMarkdown(streamingContent) : ''),\n    [streamingContent],\n  );\n  const showAuthorNames = Boolean(session?.isGroup);\n\n  const showEphemeral = showActivityTrace || showTypingIndicator;\n\n  return (\n    <div className=\"relative flex-1 min-w-0 min-h-0\">\n      <div ref={containerRef} className=\"h-full overflow-y-auto overflow-x-hidden px-4 py-6\">\n        <div className=\"mx-auto w-full min-w-0 space-y-6\">\n          {fetching && turns.length === 0 && <MessageListSkeleton />}\n\n          {turns.map((turn, index) => {\n            const turnDate = new Date(turn.createdAt);\n            const prevDate = index > 0 ? new Date(turns[index - 1].createdAt) : null;\n            const showDateSeparator = !!prevDate && !isSameDay(turnDate, prevDate);\n            const isLast = index === turns.length - 1;\n            const userTurnProps = {\n              allowEdit: readOnly ? false : isLast,\n              showAuthorName: showAuthorNames,\n            };\n\n            return (\n              <Fragment key={turn.id}>\n                {showDateSeparator && <DateSeparator date={turnDate} />}\n                <TurnBubble\n                  turn={turn}\n                  isLastTurn={isLast}\n                  renderUserTurn={renderUserTurn}\n                  renderAssistantTurn={renderAssistantTurn}\n                  userTurnProps={userTurnProps}\n                  assistantTurnProps={readOnly ? { allowRegenerate: false } : undefined}\n                />\n              </Fragment>\n            );\n          })}\n\n          {isStreaming && streamingContent && (\n            <StreamingBubble content={streamingContent} normalizedContent={normalizedStreaming} />\n          )}\n\n          <AnimatePresence>\n            {showEphemeral && (\n              <motion.div\n                key=\"activity-trace\"\n                initial={{ opacity: 0, y: 10 }}\n                animate={{ opacity: 1, y: 0 }}\n                exit={{ opacity: 0 }}\n                transition={{ type: 'spring', damping: 25, stiffness: 300 }}\n              >\n                {showActivityTrace && (\n                  <ActivityTrace thinkingContent={thinkingContent} activeSteps={activeSteps} />\n                )}\n                {showTypingIndicator && <TypingIndicator verbs={thinkingVerbs} />}\n              </motion.div>\n            )}\n          </AnimatePresence>\n\n          <div ref={messagesEndRef} />\n        </div>\n      </div>\n\n      <ScrollToBottomButton\n        show={showScrollButton}\n        onClick={handleScrollToBottom}\n        unreadCount={unreadCount}\n        label={isStreaming && showScrollButton ? t('BiChat.ScrollToBottom.NewMessages') : undefined}\n      />\n    </div>\n  );\n}\n","/**\n * MessageQueueList Component\n * Shows stacked queued messages above the input with remove/edit capabilities\n */\n\nimport { useState, useCallback } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { X, PencilSimple, Check, ArrowCounterClockwise } from '@phosphor-icons/react';\nimport type { QueuedMessage } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface MessageQueueListProps {\n  queue: QueuedMessage[]\n  onRemove: (index: number) => void\n  onUpdate: (index: number, content: string) => void\n}\n\nexport function MessageQueueList({ queue, onRemove, onUpdate }: MessageQueueListProps) {\n  const { t } = useTranslation();\n  const [editingIndex, setEditingIndex] = useState<number | null>(null);\n  const [editValue, setEditValue] = useState('');\n\n  const startEdit = useCallback((index: number) => {\n    setEditingIndex(index);\n    setEditValue(queue[index].content);\n  }, [queue]);\n\n  const saveEdit = useCallback(() => {\n    if (editingIndex === null) {return;}\n    const trimmed = editValue.trim();\n    if (trimmed) {\n      onUpdate(editingIndex, trimmed);\n    }\n    setEditingIndex(null);\n    setEditValue('');\n  }, [editingIndex, editValue, onUpdate]);\n\n  const cancelEdit = useCallback(() => {\n    setEditingIndex(null);\n    setEditValue('');\n  }, []);\n\n  if (queue.length === 0) {return null;}\n\n  return (\n    <div className=\"mb-3 space-y-1.5\">\n      <div className=\"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\">\n        <span className=\"font-medium\">{t('BiChat.Input.QueuedMessages', { count: queue.length })}</span>\n      </div>\n      <AnimatePresence initial={false}>\n        {queue.map((item, index) => (\n          <motion.div\n            key={`queue-${index}-${item.content.slice(0, 20)}`}\n            initial={{ opacity: 0, height: 0 }}\n            animate={{ opacity: 1, height: 'auto' }}\n            exit={{ opacity: 0, height: 0 }}\n            transition={{ duration: 0.15 }}\n            className=\"overflow-hidden\"\n          >\n            <div className=\"flex items-start gap-2 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-2 text-sm\">\n              <span className=\"flex-shrink-0 mt-0.5 w-5 h-5 rounded-full bg-primary-100 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400 flex items-center justify-center text-[10px] font-bold\">\n                {index + 1}\n              </span>\n              {editingIndex === index ? (\n                <div className=\"flex-1 min-w-0 flex flex-col gap-1.5\">\n                  <textarea\n                    value={editValue}\n                    onChange={(e) => setEditValue(e.target.value)}\n                    onKeyDown={(e) => {\n                      if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); saveEdit(); }\n                      if (e.key === 'Escape') {cancelEdit();}\n                    }}\n                    className=\"w-full resize-none rounded border border-primary-300 dark:border-primary-600 bg-transparent px-2 py-1 text-sm text-gray-900 dark:text-white outline-none focus:ring-1 focus:ring-primary-500\"\n                    rows={1}\n                    autoFocus\n                  />\n                  <div className=\"flex gap-1\">\n                    <button\n                      type=\"button\"\n                      onClick={saveEdit}\n                      className=\"cursor-pointer inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-primary-700 dark:text-primary-300 bg-primary-50 dark:bg-primary-900/30 hover:bg-primary-100 dark:hover:bg-primary-900/50 rounded transition-colors\"\n                    >\n                      <Check size={12} weight=\"bold\" />\n                      {t('BiChat.Message.Save')}\n                    </button>\n                    <button\n                      type=\"button\"\n                      onClick={cancelEdit}\n                      className=\"cursor-pointer inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n                    >\n                      <ArrowCounterClockwise size={12} />\n                      {t('BiChat.Message.Cancel')}\n                    </button>\n                  </div>\n                </div>\n              ) : (\n                <p className=\"flex-1 min-w-0 text-gray-700 dark:text-gray-300 truncate\">\n                  {item.content}\n                  {item.attachments.length > 0 && (\n                    <span className=\"ml-1.5 text-gray-400 dark:text-gray-500\">\n                      +{item.attachments.length} {t('BiChat.Input.AttachFiles').toLowerCase()}\n                    </span>\n                  )}\n                </p>\n              )}\n              {editingIndex !== index && (\n                <div className=\"flex items-center gap-0.5 flex-shrink-0\">\n                  <button\n                    type=\"button\"\n                    onClick={() => startEdit(index)}\n                    className=\"cursor-pointer p-1 text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n                    aria-label={t('BiChat.Input.EditQueueItem')}\n                    title={t('BiChat.Input.EditQueueItem')}\n                  >\n                    <PencilSimple size={14} />\n                  </button>\n                  <button\n                    type=\"button\"\n                    onClick={() => onRemove(index)}\n                    className=\"cursor-pointer p-1 text-gray-400 dark:text-gray-500 hover:text-red-500 dark:hover:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 rounded transition-colors\"\n                    aria-label={t('BiChat.Input.RemoveQueueItem')}\n                    title={t('BiChat.Input.RemoveQueueItem')}\n                  >\n                    <X size={14} />\n                  </button>\n                </div>\n              )}\n            </div>\n          </motion.div>\n        ))}\n      </AnimatePresence>\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, useCallback, forwardRef, useImperativeHandle, useMemo } from 'react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport { Paperclip, PaperPlaneRight, X, Bug, ArrowUp, ArrowDown, Stack, Stop, Brain, CaretUpDown, Check } from '@phosphor-icons/react';\nimport AttachmentGrid from './AttachmentGrid';\nimport { MessageQueueList } from './MessageQueueList';\nimport ImageModal from './ImageModal';\nimport {\n  ATTACHMENT_ACCEPT_ATTRIBUTE,\n  convertToBase64,\n  createDataUrl,\n  isImageMimeType,\n  validateAttachmentFile,\n  validateFileCount,\n} from '../utils/fileUtils';\nimport { calculateContextUsagePercent } from '../utils/debugMetrics';\nimport type { Attachment, ImageAttachment, DebugLimits, QueuedMessage, SessionDebugUsage } 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  isStreaming?: boolean\n  fetching?: boolean\n  disabled?: boolean\n  commandError?: string | null\n  debugMode?: boolean\n  debugSessionUsage?: SessionDebugUsage\n  debugLimits?: DebugLimits | null\n  messageQueue?: QueuedMessage[]\n  onClearCommandError?: () => void\n  onMessageChange: (value: string) => void\n  onSubmit: (e: React.FormEvent, attachments: Attachment[]) => void\n  onCancelStreaming?: () => void\n  onUnqueue?: () => { content: string; attachments: Attachment[] } | null\n  onRemoveQueueItem?: (index: number) => void\n  onUpdateQueueItem?: (index: number, content: string) => void\n  placeholder?: string\n  maxFiles?: number\n  maxFileSize?: number\n  containerClassName?: string\n  formClassName?: string\n  reasoningEffortOptions?: string[]\n  reasoningEffort?: string\n  onReasoningEffortChange?: (effort: string) => void\n}\n\n/* -------------------------------------------------------------------------------------------------\n * DebugStatsPanel Sub-component\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DebugStatsPanelProps {\n  debugSessionUsage?: SessionDebugUsage\n  debugLimits?: DebugLimits | null\n}\n\n/** Debug stats are English-only (developer-facing) — no i18n. */\nfunction DebugStatsPanel({ debugSessionUsage, debugLimits }: DebugStatsPanelProps) {\n  const formatTokens = (value: number): string => new Intl.NumberFormat().format(value);\n  const latestPromptTokens = debugSessionUsage?.latestPromptTokens ?? 0;\n  const sessionTotalTokens = debugSessionUsage?.totalTokens ?? 0;\n  const sessionPromptTokens = debugSessionUsage?.promptTokens ?? 0;\n  const sessionCompletionTokens = debugSessionUsage?.completionTokens ?? 0;\n  const hasUsage = (debugSessionUsage?.turnsWithUsage ?? 0) > 0;\n  const policyMaxTokens = debugLimits?.policyMaxTokens ?? 0;\n  const modelMaxTokens = debugLimits?.modelMaxTokens ?? 0;\n  const effectiveMaxTokens = debugLimits?.effectiveMaxTokens ?? 0;\n  const contextPercentValue = calculateContextUsagePercent(latestPromptTokens, effectiveMaxTokens);\n  const contextPercent = contextPercentValue !== null ? contextPercentValue.toFixed(1) : null;\n  const contextPercentNumber = parseFloat(contextPercent || '0');\n  const contextBarColor =\n    contextPercentNumber > 75\n      ? '#ef4444'\n      : contextPercentNumber > 50\n      ? '#f59e0b'\n      : '#10b981';\n\n  return (\n    <div className=\"mb-2 space-y-1.5 text-xs\">\n      {/* Debug badge */}\n      <span className=\"inline-flex items-center gap-1.5 px-2 py-0.5 bg-amber-100 dark:bg-amber-900/40 text-amber-700 dark:text-amber-300 rounded-full font-medium text-[10px]\">\n        <span className=\"relative flex h-1.5 w-1.5\" aria-hidden=\"true\">\n          <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-amber-400 opacity-75\" />\n          <span className=\"relative inline-flex rounded-full h-1.5 w-1.5 bg-amber-500\" />\n        </span>\n        <Bug size={10} />\n        Debug\n      </span>\n\n      {/* Stats container */}\n      <div className=\"rounded-lg border border-gray-200/60 dark:border-gray-700/40 bg-gray-50/50 dark:bg-gray-800/30 px-3 py-2 space-y-2\">\n        {hasUsage ? (\n          <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] tabular-nums\">\n            <span className=\"inline-flex items-center gap-1 text-gray-500 dark:text-gray-400\">\n              <ArrowUp size={10} weight=\"bold\" className=\"text-blue-500 dark:text-blue-400\" />\n              <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(sessionPromptTokens)}</span>\n              prompt\n            </span>\n            <span className=\"inline-flex items-center gap-1 text-gray-500 dark:text-gray-400\">\n              <ArrowDown size={10} weight=\"bold\" className=\"text-indigo-500 dark:text-indigo-400\" />\n              <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(sessionCompletionTokens)}</span>\n              completion\n            </span>\n            <span className=\"inline-flex items-center gap-1 text-gray-500 dark:text-gray-400\">\n              <Stack size={10} weight=\"bold\" className=\"text-violet-500 dark:text-violet-400\" />\n              <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(sessionTotalTokens)}</span>\n              total\n            </span>\n          </div>\n        ) : (\n          <p className=\"text-[11px] text-gray-400 dark:text-gray-500 text-center py-0.5\">\n            Session usage unavailable\n          </p>\n        )}\n\n        {debugLimits && (\n          <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] tabular-nums text-gray-500 dark:text-gray-400\">\n            <span>\n              Policy max{' '}\n              <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(policyMaxTokens)}</span>\n            </span>\n            <span>\n              Model max{' '}\n              <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(modelMaxTokens)}</span>\n            </span>\n            <span>\n              Effective{' '}\n              <span className=\"font-mono font-medium text-gray-700 dark:text-gray-300\">{formatTokens(effectiveMaxTokens)}</span>\n            </span>\n          </div>\n        )}\n\n        {effectiveMaxTokens > 0 && (\n          <div className=\"space-y-1.5\">\n            <div className=\"flex items-center justify-between\">\n              <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n                Context usage\n              </span>\n              <div className=\"flex items-center gap-2\">\n                <span className=\"font-mono text-[10px] text-gray-400 dark:text-gray-500 tabular-nums\">\n                  {formatTokens(latestPromptTokens)} / {formatTokens(effectiveMaxTokens)}\n                </span>\n                {contextPercent && (\n                  <span className={[\n                    'px-1.5 py-0.5 rounded-full text-[10px] font-semibold tabular-nums',\n                    contextPercentNumber > 75\n                      ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400'\n                      : contextPercentNumber > 50\n                      ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-600 dark:text-amber-400'\n                      : 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-600 dark:text-emerald-400',\n                  ].join(' ')}>\n                    {contextPercent}%\n                  </span>\n                )}\n              </div>\n            </div>\n            <div className=\"h-1.5 rounded-full bg-gray-200/80 dark:bg-gray-700/50 overflow-hidden\">\n              <div\n                className=\"h-full rounded-full transition-all duration-700 ease-out\"\n                style={{\n                  width: contextPercent ? `${Math.min(parseFloat(contextPercent), 100)}%` : '0%',\n                  backgroundColor: contextBarColor,\n                }}\n              />\n            </div>\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ReasoningEffortSelector Sub-component\n * -----------------------------------------------------------------------------------------------*/\n\nconst EFFORT_LABEL_KEYS: Record<string, string> = {\n  low: 'BiChat.Input.ReasoningEffortLow',\n  medium: 'BiChat.Input.ReasoningEffortMedium',\n  high: 'BiChat.Input.ReasoningEffortHigh',\n  xhigh: 'BiChat.Input.ReasoningEffortXHigh',\n};\n\ninterface ReasoningEffortSelectorProps {\n  options: string[]\n  value?: string\n  onChange: (effort: string) => void\n  disabled?: boolean\n}\n\nfunction ReasoningEffortSelector({ options, value, onChange, disabled }: ReasoningEffortSelectorProps) {\n  const { t } = useTranslation();\n  const selected = value || options[1] || options[0];\n  const label = t('BiChat.Input.ReasoningEffort');\n  const selectedLabel = t(EFFORT_LABEL_KEYS[selected] ?? selected);\n\n  return (\n    <Menu as=\"div\" className=\"relative flex-shrink-0 self-center\">\n      <MenuButton\n        disabled={disabled}\n        className={[\n          'cursor-pointer inline-flex h-8 items-center gap-1.5 rounded-xl border border-gray-200/80 dark:border-gray-600/70',\n          'bg-white dark:bg-gray-800 px-2.5 text-[11px] font-medium leading-none text-gray-700 dark:text-gray-200',\n          'shadow-sm transition-colors hover:border-gray-300 hover:bg-white dark:hover:border-gray-500 dark:hover:bg-gray-800',\n          'focus:outline-none focus:ring-2 focus:ring-primary-500/20',\n          'disabled:cursor-not-allowed disabled:opacity-40',\n        ].join(' ')}\n        aria-label={label}\n        title={`${label}: ${selectedLabel}`}\n      >\n        <Brain size={14} weight=\"duotone\" className=\"text-primary-600 dark:text-primary-400\" />\n        <span className=\"max-w-[72px] truncate\">{selectedLabel}</span>\n        <CaretUpDown size={12} className=\"text-gray-400 dark:text-gray-500\" />\n      </MenuButton>\n\n      <MenuItems\n        anchor=\"top end\"\n        className=\"isolate z-30 min-w-[148px] rounded-xl border border-gray-200 bg-white p-1 shadow-xl ring-1 ring-black/5 dark:border-gray-700 dark:bg-gray-900 dark:ring-white/10 [--anchor-gap:8px]\"\n      >\n        {options.map((opt) => {\n          const optionLabel = t(EFFORT_LABEL_KEYS[opt] ?? opt);\n          const isSelected = opt === selected;\n\n          return (\n            <MenuItem key={opt}>\n              {({ focus }) => (\n                <button\n                  type=\"button\"\n                  onClick={() => onChange(opt)}\n                  className={[\n                    'flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-left text-[11px] font-medium transition-colors',\n                    focus\n                      ? 'bg-primary-50 text-primary-700 dark:bg-primary-950/40 dark:text-primary-200'\n                      : 'text-gray-700 dark:text-gray-200',\n                  ].join(' ')}\n                >\n                  <span className=\"flex-1 truncate\">{optionLabel}</span>\n                  {isSelected && (\n                    <Check size={12} weight=\"bold\" className=\"text-primary-600 dark:text-primary-400\" />\n                  )}\n                </button>\n              )}\n            </MenuItem>\n          );\n        })}\n      </MenuItems>\n    </Menu>\n  );\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      isStreaming = false,\n      fetching = false,\n      disabled = false,\n      commandError = null,\n      debugMode = false,\n      debugSessionUsage,\n      debugLimits = null,\n      messageQueue = [],\n      onClearCommandError,\n      onMessageChange,\n      onSubmit,\n      onCancelStreaming,\n      onUnqueue,\n      onRemoveQueueItem,\n      onUpdateQueueItem,\n      placeholder: placeholderOverride,\n      maxFiles = MAX_FILES_DEFAULT,\n      maxFileSize = MAX_FILE_SIZE_DEFAULT,\n      containerClassName,\n      formClassName,\n      reasoningEffortOptions,\n      reasoningEffort,\n      onReasoningEffortChange,\n    },\n    ref\n  ) => {\n    const { t } = useTranslation();\n    const [attachments, setAttachments] = useState<Attachment[]>([]);\n    const [isDragging, setIsDragging] = useState(false);\n    const [error, setError] = useState<string | null>(null);\n    const [isFocused, setIsFocused] = useState(false);\n    const [commandListDismissed, setCommandListDismissed] = useState(false);\n    const [activeCommandIndex, setActiveCommandIndex] = useState(0);\n    const [isComposing, setIsComposing] = useState(false);\n    const [dropSuccess, setDropSuccess] = useState(false);\n    const [pendingFileCount, setPendingFileCount] = useState(0);\n    const [viewingImageIndex, setViewingImageIndex] = useState<number | null>(null);\n\n    // Use override or translation\n    const placeholder = placeholderOverride || t('BiChat.Input.Placeholder');\n\n    const textareaRef = useRef<HTMLTextAreaElement>(null);\n    const fileInputRef = useRef<HTMLInputElement>(null);\n    const containerRef = useRef<HTMLDivElement>(null);\n    const formRef = useRef<HTMLFormElement>(null);\n    const commandItemRefs = useRef<Array<HTMLLIElement | null>>([]);\n    const didAutoFocusRef = useRef(false);\n    const isSlashMode = message.trimStart().startsWith('/');\n    const commandQuery = message.trimStart().slice(1).split(/\\s+/)[0]?.toLowerCase() || '';\n\n    const slashCommands = useMemo(\n      () => [\n        { name: '/clear', description: t('BiChat.Slash.ClearDescription') },\n        { name: '/debug', description: t('BiChat.Slash.DebugDescription') },\n        { name: '/compact', description: t('BiChat.Slash.CompactDescription') },\n      ],\n      [t]\n    );\n    const filteredCommands = useMemo(\n      () =>\n        slashCommands.filter((cmd) =>\n          cmd.name.slice(1).startsWith(commandQuery)\n        ),\n      [commandQuery, slashCommands]\n    );\n    const isCommandListVisible = isSlashMode && !commandListDismissed && !loading && !disabled;\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 (didAutoFocusRef.current || loading || disabled || fetching) {return;}\n\n      const frame = requestAnimationFrame(() => {\n        textareaRef.current?.focus();\n        didAutoFocusRef.current = true;\n      });\n\n      return () => cancelAnimationFrame(frame);\n    }, [loading, disabled, fetching]);\n\n    useEffect(() => {\n      if (!error) {return;}\n      const timer = setTimeout(() => setError(null), 5000);\n      return () => clearTimeout(timer);\n    }, [error]);\n\n    useEffect(() => {\n      if (isSlashMode) {\n        setCommandListDismissed(false);\n      }\n    }, [isSlashMode, message]);\n\n    useEffect(() => {\n      if (!isCommandListVisible) {return;}\n\n      const handleOutsideClick = (event: MouseEvent) => {\n        if (!containerRef.current) {return;}\n        if (event.target instanceof Node && !containerRef.current.contains(event.target)) {\n          setCommandListDismissed(true);\n        }\n      };\n\n      document.addEventListener('mousedown', handleOutsideClick);\n      return () => document.removeEventListener('mousedown', handleOutsideClick);\n    }, [isCommandListVisible]);\n\n    useEffect(() => {\n      setActiveCommandIndex(0);\n    }, [commandQuery]);\n\n    useEffect(() => {\n      if (filteredCommands.length === 0) {\n        setActiveCommandIndex(0);\n        return;\n      }\n\n      setActiveCommandIndex((prev) => {\n        if (prev < 0) {return 0;}\n        if (prev >= filteredCommands.length) {return filteredCommands.length - 1;}\n        return prev;\n      });\n    }, [filteredCommands.length]);\n\n    useEffect(() => {\n      if (!isCommandListVisible || filteredCommands.length === 0) {return;}\n      commandItemRefs.current[activeCommandIndex]?.scrollIntoView({\n        block: 'nearest',\n      });\n    }, [activeCommandIndex, filteredCommands.length, isCommandListVisible]);\n\n    const handleFileSelect = async (files: FileList | File[] | null): Promise<boolean> => {\n      if (!files) {return false;}\n      const selectedFiles = Array.isArray(files) ? files : Array.from(files);\n      if (selectedFiles.length === 0) {return false;}\n\n      try {\n        validateFileCount(attachments.length, selectedFiles.length, maxFiles);\n\n        // Extract and validate all files synchronously before any async work.\n        // This ensures File objects are captured while the DataTransfer is still valid.\n        const fileArray: File[] = [];\n        for (let i = 0; i < selectedFiles.length; i++) {\n          const file = selectedFiles[i];\n          validateAttachmentFile(file, maxFileSize);\n          fileArray.push(file);\n        }\n\n        // Show shimmer placeholders while processing\n        setPendingFileCount(fileArray.length);\n\n        // Read all files in parallel\n        const base64Results = await Promise.all(fileArray.map(convertToBase64));\n\n        const newAttachments: Attachment[] = fileArray.map((file, i) => {\n          const attachment: Attachment = {\n            clientKey: crypto.randomUUID(),\n            filename: file.name,\n            mimeType: file.type,\n            sizeBytes: file.size,\n            base64Data: base64Results[i],\n          };\n          if (isImageMimeType(file.type)) {\n            attachment.preview = createDataUrl(base64Results[i], file.type);\n          }\n          return attachment;\n        });\n\n        setAttachments((prev) => [...prev, ...newAttachments]);\n        setPendingFileCount(0);\n        setError(null);\n        return true;\n      } catch (err) {\n        setPendingFileCount(0);\n        setError(err instanceof Error ? err.message : 'Failed to process attachments');\n        return false;\n      }\n    };\n\n    const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n      handleFileSelect(e.target.files);\n      e.target.value = '';\n    };\n\n    useImperativeHandle(ref, () => ({\n      focus: () => textareaRef.current?.focus(),\n      clear: () => {\n        onMessageChange('');\n        setAttachments([]);\n        setError(null);\n      },\n    }));\n\n    const handleRemoveAttachment = (index: number) => {\n      setAttachments((prev) => prev.filter((_, i) => i !== index));\n      setError(null);\n    };\n\n    // ── Image lightbox ──────────────────────────────────\n    const imageAttachments = useMemo(\n      () => attachments.filter((a): a is ImageAttachment =>\n        a.mimeType.startsWith('image/') && !!(a.base64Data && a.preview)\n      ),\n      [attachments]\n    );\n\n    const handleViewAttachment = useCallback((index: number) => {\n      const attachment = attachments[index];\n      if (!attachment || !attachment.mimeType.startsWith('image/')) {return;}\n      const imgIdx = imageAttachments.findIndex((a) => a.filename === attachment.filename && a.preview === attachment.preview);\n      if (imgIdx >= 0) {setViewingImageIndex(imgIdx);}\n    }, [attachments, imageAttachments]);\n\n    const handleImageNavigate = useCallback((direction: 'prev' | 'next') => {\n      setViewingImageIndex((prev) => {\n        if (prev === null) {return null;}\n        const len = imageAttachments.length;\n        if (len <= 0) {return null;}\n        const newIndex = Math.max(0, Math.min(len - 1, prev + (direction === 'prev' ? -1 : 1)));\n        return newIndex;\n      });\n    }, [imageAttachments.length]);\n\n    useEffect(() => {\n      setViewingImageIndex((prev) => {\n        if (imageAttachments.length === 0) {return null;}\n        if (prev != null && (prev < 0 || prev >= imageAttachments.length)) {\n          return Math.max(0, Math.min(prev, imageAttachments.length - 1));\n        }\n        return prev;\n      });\n    }, [imageAttachments.length]);\n\n    // ── Paste-to-attach ─────────────────────────────────\n    const handlePaste = useCallback((e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n      const items = Array.from(e.clipboardData.items);\n      const imageFiles = items\n        .filter((item) => item.kind === 'file' && item.type.startsWith('image/'))\n        .map((item) => item.getAsFile())\n        .filter((file): file is File => file !== null);\n\n      if (imageFiles.length > 0) {\n        e.preventDefault();\n        handleFileSelect(imageFiles);\n      }\n    }, [attachments.length, maxFiles, maxFileSize]); // eslint-disable-line react-hooks/exhaustive-deps\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      const itemFiles = Array.from(e.dataTransfer.items || [])\n        .filter((item) => item.kind === 'file')\n        .map((item) => item.getAsFile())\n        .filter((file): file is File => file !== null);\n      const droppedFiles = itemFiles.length > 0 ? itemFiles : Array.from(e.dataTransfer.files || []);\n      const ok = await handleFileSelect(droppedFiles);\n      if (ok) {\n        setDropSuccess(true);\n        setTimeout(() => setDropSuccess(false), 1500);\n      }\n    };\n\n    const submitCommandSelection = (command: string) => {\n      onMessageChange(command);\n      setCommandListDismissed(true);\n      setActiveCommandIndex(0);\n      requestAnimationFrame(() => {\n        formRef.current?.requestSubmit();\n      });\n    };\n\n    const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n      if (isComposing || e.nativeEvent.isComposing) {\n        return;\n      }\n\n      if (isCommandListVisible) {\n        if (e.key === 'Tab') {\n          e.preventDefault();\n          if (filteredCommands.length > 0) {\n            onMessageChange(filteredCommands[activeCommandIndex].name);\n            setCommandListDismissed(true);\n          }\n          return;\n        }\n\n        if (e.key === 'ArrowDown') {\n          e.preventDefault();\n          if (filteredCommands.length > 0) {\n            setActiveCommandIndex((prev) => (prev + 1) % filteredCommands.length);\n          }\n          return;\n        }\n\n        if (e.key === 'ArrowUp') {\n          e.preventDefault();\n          if (filteredCommands.length > 0) {\n            setActiveCommandIndex((prev) =>\n              prev === 0 ? filteredCommands.length - 1 : prev - 1\n            );\n          }\n          return;\n        }\n\n        if (e.key === 'Escape') {\n          e.preventDefault();\n          setCommandListDismissed(true);\n          return;\n        }\n\n        if (e.key === 'Enter' && !e.shiftKey) {\n          e.preventDefault();\n          if (filteredCommands.length > 0) {\n            submitCommandSelection(filteredCommands[activeCommandIndex].name);\n            return;\n          }\n          handleFormSubmit(e as unknown as React.FormEvent);\n          return;\n        }\n      }\n\n      if (e.key === 'Enter' && !e.shiftKey) {\n        e.preventDefault();\n        if (message.trim() || attachments.length > 0) {\n          handleFormSubmit(e as unknown as React.FormEvent);\n        }\n      }\n\n      if (e.key === 'Escape') {\n        if (isDragging) {\n          setIsDragging(false);\n        } else if (isSlashMode) {\n          setCommandListDismissed(true);\n        } else {\n          textareaRef.current?.blur();\n        }\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 (isComposing) {return;}\n      if (disabled || (!message.trim() && attachments.length === 0)) {\n        return;\n      }\n\n      setCommandListDismissed(true);\n      onSubmit(e, attachments);\n      setAttachments([]);\n      setError(null);\n    };\n\n    const canSubmit = !disabled && (message.trim() || attachments.length > 0);\n    const visibleError = error || commandError;\n    const visibleErrorText = visibleError ? t(visibleError) : '';\n    const resolvedReasoningEffort = reasoningEffortOptions && reasoningEffortOptions.length > 0\n      ? reasoningEffortOptions.includes(reasoningEffort ?? '')\n        ? reasoningEffort\n        : reasoningEffortOptions[1] || reasoningEffortOptions[0]\n      : undefined;\n\n    useEffect(() => {\n      if (!onReasoningEffortChange || !reasoningEffortOptions?.length) {return;}\n      if (!resolvedReasoningEffort || resolvedReasoningEffort === reasoningEffort) {\n        return;\n      }\n      onReasoningEffortChange(resolvedReasoningEffort);\n    }, [reasoningEffort, onReasoningEffortChange, reasoningEffortOptions, resolvedReasoningEffort]);\n\n    const defaultContainerClassName = \"shrink-0 px-4 pt-4 pb-6\";\n\n    return (\n      <div\n        ref={containerRef}\n        className={containerClassName ?? defaultContainerClassName}\n      >\n        <form ref={formRef} onSubmit={handleFormSubmit} className={formClassName ?? \"mx-auto\"}>\n          {/* Error display */}\n          {visibleError && (\n            <div className=\"mb-3 flex items-start gap-2.5 px-3 py-2.5 bg-red-50 dark:bg-red-950/40 border border-red-200/80 dark:border-red-900/60 rounded-xl text-sm shadow-sm\">\n              <div className=\"flex-shrink-0 mt-0.5 flex items-center justify-center w-5 h-5 rounded-full bg-red-100 dark:bg-red-900/40\">\n                <X size={10} className=\"text-red-600 dark:text-red-400\" weight=\"bold\" />\n              </div>\n              <span className=\"flex-1 text-red-700 dark:text-red-300 text-xs leading-relaxed\">{visibleErrorText}</span>\n              <button\n                type=\"button\"\n                onClick={() => {\n                  setError(null);\n                  onClearCommandError?.();\n                }}\n                className=\"cursor-pointer flex-shrink-0 p-0.5 text-red-400 dark:text-red-500 hover:text-red-600 dark:hover:text-red-300 hover:bg-red-100 dark:hover:bg-red-900/40 rounded-md transition-colors\"\n                aria-label={t('BiChat.Input.DismissError')}\n              >\n                <X size={14} />\n              </button>\n            </div>\n          )}\n\n          {/* Message queue list */}\n          {messageQueue.length > 0 && onRemoveQueueItem && onUpdateQueueItem && (\n            <MessageQueueList\n              queue={messageQueue}\n              onRemove={onRemoveQueueItem}\n              onUpdate={onUpdateQueueItem}\n            />\n          )}\n\n          {debugMode && (\n            <DebugStatsPanel\n              debugSessionUsage={debugSessionUsage}\n              debugLimits={debugLimits}\n            />\n          )}\n\n          {/* Attachment preview */}\n          {(attachments.length > 0 || pendingFileCount > 0) && (\n            <div className=\"mb-3\">\n              <AttachmentGrid\n                attachments={attachments}\n                onRemove={handleRemoveAttachment}\n                onView={handleViewAttachment}\n                pendingCount={pendingFileCount}\n              />\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('BiChat.Input.DropFiles')}\n                  </span>\n                </div>\n              </div>\n            )}\n\n            {/* Drop success feedback */}\n            {dropSuccess && (\n              <div className=\"absolute inset-0 z-10 bg-green-50/95 dark:bg-green-900/90 border-2 border-green-400 rounded-2xl flex items-center justify-center animate-pulse pointer-events-none\">\n                <span className=\"text-sm text-green-700 dark:text-green-300 font-medium\">\n                  {t('BiChat.Input.FilesAdded')}\n                </span>\n              </div>\n            )}\n\n            {/* Input container - using inline Tailwind classes */}\n            <div\n              className={`flex items-center gap-2 rounded-2xl p-2 sm:p-3 bg-white dark:bg-gray-800 border shadow-sm transition-all duration-150 ${\n                isFocused\n                  ? 'border-primary-400 dark:border-primary-500 ring-2 ring-primary-500/20 dark:ring-primary-500/25 shadow-[0_0_0_3px_rgba(37,99,235,0.08)]'\n                  : 'border-gray-300 dark:border-gray-600 hover:border-gray-300 dark:hover:border-gray-600 hover:shadow-md'\n              }`}\n            >\n              {/* Attach button */}\n              <button\n                type=\"button\"\n                onClick={() => fileInputRef.current?.click()}\n                disabled={loading || disabled || attachments.length >= maxFiles}\n                className=\"cursor-pointer flex-shrink-0 self-center p-2 text-gray-500 dark:text-gray-400 hover:text-gray-600 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('BiChat.Input.AttachFiles')}\n                title={t('BiChat.Input.AttachFiles')}\n              >\n                <Paperclip size={20} />\n              </button>\n\n              {/* Hidden file input */}\n              <input\n                ref={fileInputRef}\n                type=\"file\"\n                accept={ATTACHMENT_ACCEPT_ATTRIBUTE}\n                multiple\n                onChange={handleFileInputChange}\n                className=\"hidden\"\n                aria-label={t('BiChat.Input.FileInput')}\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) => {\n                    onMessageChange(e.target.value);\n                    onClearCommandError?.();\n                  }}\n                  onKeyDown={handleKeyDown}\n                  onPaste={handlePaste}\n                  onCompositionStart={() => setIsComposing(true)}\n                  onCompositionEnd={() => setIsComposing(false)}\n                  onFocus={() => setIsFocused(true)}\n                  onBlur={(e) => {\n                    setIsFocused(false);\n                    if (!containerRef.current) {return;}\n                    if (!e.relatedTarget || !containerRef.current.contains(e.relatedTarget)) {\n                      setCommandListDismissed(true);\n                    }\n                  }}\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-sm leading-relaxed\"\n                  style={{ maxHeight: `${MAX_HEIGHT}px` }}\n                  rows={1}\n                  disabled={disabled}\n                  aria-busy={loading}\n                  aria-label={t('BiChat.Input.MessageInput')}\n                />\n              </div>\n\n              {/* Reasoning effort selector */}\n              {reasoningEffortOptions && reasoningEffortOptions.length > 0 && onReasoningEffortChange && (\n                <ReasoningEffortSelector\n                  options={reasoningEffortOptions}\n                  value={resolvedReasoningEffort}\n                  onChange={onReasoningEffortChange}\n                  disabled={disabled || loading}\n                />\n              )}\n\n              {/* Submit/cancel button slot */}\n              {isStreaming && onCancelStreaming ? (\n                <button\n                  type=\"button\"\n                  onClick={onCancelStreaming}\n                  disabled={disabled || fetching}\n                  className=\"cursor-pointer flex-shrink-0 self-center p-2 rounded-lg bg-gray-900 hover:bg-gray-800 active:bg-black active:scale-95 text-white shadow-sm transition-all dark:bg-gray-100 dark:hover:bg-gray-200 dark:active:bg-white dark:text-gray-900 disabled:opacity-40 disabled:cursor-not-allowed\"\n                  aria-label={t('BiChat.Common.Cancel')}\n                  title={t('BiChat.Common.Cancel')}\n                >\n                  <Stop size={18} weight=\"fill\" />\n                </button>\n              ) : (\n                <button\n                  type=\"submit\"\n                  disabled={!canSubmit}\n                  className=\"cursor-pointer flex-shrink-0 self-center p-2 rounded-lg bg-primary-600 hover:bg-primary-700 active:bg-primary-800 active:scale-95 text-white shadow-sm transition-all disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-primary-600\"\n                  aria-label={loading ? t('BiChat.Input.Processing') : t('BiChat.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              )}\n            </div>\n\n            {/* Keyboard hint */}\n            {isFocused && !message && !loading && (\n              <span className=\"hidden sm:block absolute -bottom-5 left-14 text-[10px] text-gray-400 dark:text-gray-500 select-none animate-fade-in\">\n                {t('BiChat.Input.ShiftEnterHint')}\n              </span>\n            )}\n\n            {isCommandListVisible && (\n              <div className=\"absolute left-0 right-0 bottom-full mb-1.5 z-20 overflow-hidden rounded-lg border border-gray-200/70 bg-white/98 shadow-md backdrop-blur-xl dark:border-gray-700/70 dark:bg-gray-900/98 dark:shadow-black/20\">\n                {filteredCommands.length > 0 ? (\n                  <ul role=\"listbox\" aria-label={t('BiChat.Slash.CommandsList')} className=\"py-1 px-1\">\n                    {filteredCommands.map((command, index) => {\n                      const isActive = index === activeCommandIndex;\n                      return (\n                        <li\n                          key={command.name}\n                          role=\"option\"\n                          aria-selected={isActive}\n                          ref={(node) => {\n                            commandItemRefs.current[index] = node;\n                          }}\n                          onMouseEnter={() => setActiveCommandIndex(index)}\n                          onMouseDown={(e) => {\n                            e.preventDefault();\n                            submitCommandSelection(command.name);\n                          }}\n                          className={`cursor-pointer flex items-baseline gap-2 rounded-md px-2 py-1.5 transition-colors duration-75 ${\n                            isActive\n                              ? 'bg-gray-100 dark:bg-gray-800'\n                              : 'hover:bg-gray-50 dark:hover:bg-gray-800/50'\n                          }`}\n                        >\n                          <span className=\"text-xs font-medium font-mono text-gray-800 dark:text-gray-200 shrink-0\">\n                            <span className=\"text-gray-400 dark:text-gray-500\">/</span>{command.name.slice(1)}\n                          </span>\n                          <span className=\"text-[11px] text-gray-400 dark:text-gray-500 truncate\">\n                            {command.description}\n                          </span>\n                        </li>\n                      );\n                    })}\n                  </ul>\n                ) : (\n                  <div className=\"px-3 py-2.5 text-center\">\n                    <p className=\"text-[11px] text-gray-400 dark:text-gray-500\">\n                      {t('BiChat.Slash.NoMatches')}\n                    </p>\n                  </div>\n                )}\n              </div>\n            )}\n          </div>\n\n          {/* Image lightbox */}\n          {viewingImageIndex !== null &&\n            viewingImageIndex >= 0 &&\n            viewingImageIndex < imageAttachments.length && (\n            <ImageModal\n              isOpen\n              onClose={() => setViewingImageIndex(null)}\n              attachment={imageAttachments[viewingImageIndex]}\n              allAttachments={imageAttachments}\n              currentIndex={viewingImageIndex}\n              onNavigate={handleImageNavigate}\n            />\n          )}\n        </form>\n      </div>\n    );\n  }\n);\n\nMessageInput.displayName = 'MessageInput';\n","import { motion } from 'framer-motion';\n\ninterface CompactionDoodleProps {\n  title: string\n  subtitle: string\n}\n\nexport function CompactionDoodle({ title, subtitle }: CompactionDoodleProps) {\n  return (\n    <motion.div\n      initial={{ opacity: 0, y: 8, scale: 0.96 }}\n      animate={{ opacity: 1, y: 0, scale: 1 }}\n      exit={{ opacity: 0, y: 4, scale: 0.98 }}\n      transition={{ type: 'spring', stiffness: 400, damping: 28 }}\n      className=\"flex items-center gap-2.5 rounded-xl border border-gray-200/70 bg-white/95 px-3.5 py-2 shadow-sm backdrop-blur-sm dark:border-gray-700/50 dark:bg-gray-800/95\"\n    >\n      <div className=\"relative flex h-5 w-5 items-center justify-center\">\n        <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-primary-400/30\" />\n        <span className=\"relative inline-flex h-2 w-2 rounded-full bg-primary-500\" />\n      </div>\n      <div className=\"flex items-baseline gap-1.5\">\n        <span className=\"text-xs font-medium text-gray-700 dark:text-gray-200\">{title}</span>\n        <span className=\"text-[11px] text-gray-400 dark:text-gray-500\">{subtitle}</span>\n      </div>\n    </motion.div>\n  );\n}\n\nexport default CompactionDoodle;\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, useReducedMotion } from 'framer-motion';\nimport { ChartBar, FileText, Lightbulb, type Icon } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\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  /** Custom prompts to replace the default i18n prompts. Icons cycle from defaults if not provided. */\n  prompts?: Array<{ category: string; text: string; icon?: Icon }>\n}\n\n/** Default prompt definitions with i18n keys and English fallbacks. */\nconst PROMPT_DEFS = [\n  { categoryKey: 'BiChat.Welcome.Prompt1Category', textKey: 'BiChat.Welcome.Prompt1Text', icon: ChartBar, defaultCategory: 'Data Analysis', defaultText: 'Show me a summary of key metrics' },\n  { categoryKey: 'BiChat.Welcome.Prompt2Category', textKey: 'BiChat.Welcome.Prompt2Text', icon: FileText, defaultCategory: 'Reports', defaultText: 'Generate a report for the current period' },\n  { categoryKey: 'BiChat.Welcome.Prompt3Category', textKey: 'BiChat.Welcome.Prompt3Text', icon: Lightbulb, defaultCategory: 'Insights', defaultText: 'What trends can you identify in the data?' },\n] as const;\n\nconst PROMPT_STYLES: { badge: string; icon: string }[] = [\n  {\n    badge: 'bg-sky-50 text-sky-600 ring-sky-600/10 dark:bg-sky-400/10 dark:text-sky-400 dark:ring-sky-400/20',\n    icon: 'text-sky-500 dark:text-sky-400',\n  },\n  {\n    badge: 'bg-teal-50 text-teal-600 ring-teal-600/10 dark:bg-teal-400/10 dark:text-teal-400 dark:ring-teal-400/20',\n    icon: 'text-teal-500 dark:text-teal-400',\n  },\n  {\n    badge: 'bg-amber-50 text-amber-600 ring-amber-600/10 dark:bg-amber-400/10 dark:text-amber-400 dark:ring-amber-400/20',\n    icon: 'text-amber-500 dark:text-amber-400',\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 reducedContainerVariants = {\n  hidden: { opacity: 0 },\n  visible: {\n    opacity: 1,\n    transition: {\n      staggerChildren: 0,\n      delayChildren: 0\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\nconst reducedItemVariants = {\n  hidden: { opacity: 0 },\n  visible: {\n    opacity: 1,\n    y: 0,\n    transition: {\n      duration: 0\n    }\n  }\n};\n\n/** Resolve a translation key, falling back to a default if the key is not translated. */\nfunction tOr(t: (key: string) => string, key: string, defaultValue: string): string {\n  const v = t(key);\n  return v !== key ? v : defaultValue;\n}\n\nconst DEFAULT_ICONS: Icon[] = PROMPT_DEFS.map((d) => d.icon);\n\nfunction WelcomeContent({\n  onPromptSelect,\n  title,\n  description,\n  disabled = false,\n  prompts: customPrompts,\n}: WelcomeContentProps) {\n  const { t } = useTranslation();\n  const shouldReduceMotion = useReducedMotion();\n  const resolvedTitle = title || '';\n  const resolvedDescription = description || '';\n\n  const prompts: ExamplePrompt[] = customPrompts?.length\n    ? customPrompts.map((p, i) => ({\n        category: p.category,\n        text: p.text,\n        icon: p.icon ?? DEFAULT_ICONS[i % DEFAULT_ICONS.length],\n      }))\n    : PROMPT_DEFS.map((def) => ({\n        category: tOr(t, def.categoryKey, def.defaultCategory),\n        text: tOr(t, def.textKey, def.defaultText),\n        icon: def.icon,\n      }));\n\n  const handlePromptClick = (prompt: string) => {\n    if (onPromptSelect && !disabled) {\n      onPromptSelect(prompt);\n    }\n  };\n\n  const activeContainerVariants = shouldReduceMotion ? reducedContainerVariants : containerVariants;\n  const activeItemVariants = shouldReduceMotion ? reducedItemVariants : itemVariants;\n\n  return (\n    <motion.div\n      className=\"relative w-full max-w-5xl mx-auto px-6 text-center\"\n      variants={activeContainerVariants}\n      initial=\"hidden\"\n      animate=\"visible\"\n    >\n      {resolvedTitle && (\n        <motion.h1\n          className=\"relative text-2xl sm:text-3xl font-semibold text-gray-900 dark:text-white mb-4\"\n          variants={activeItemVariants}\n        >\n          {resolvedTitle}\n        </motion.h1>\n      )}\n\n      {resolvedDescription && (\n        <motion.p\n          className=\"text-base text-gray-500 dark:text-gray-400 mb-10 max-w-2xl mx-auto leading-relaxed\"\n          variants={activeItemVariants}\n        >\n          {resolvedDescription}\n        </motion.p>\n      )}\n\n      {/* Example prompts */}\n      <motion.div variants={activeItemVariants}>\n        <div className=\"flex items-center gap-4 mb-5\">\n          <div className=\"h-px flex-1 bg-gradient-to-r from-transparent to-gray-200 dark:to-gray-700/70\" />\n          <span className=\"text-[11px] font-semibold uppercase tracking-[0.12em] text-gray-400 dark:text-gray-500 select-none\">\n            {t('BiChat.Welcome.QuickStart')}\n          </span>\n          <div className=\"h-px flex-1 bg-gradient-to-l from-transparent to-gray-200 dark:to-gray-700/70\" />\n        </div>\n\n        <div className={`grid gap-3 ${prompts.length <= 2 ? 'sm:grid-cols-2' : 'sm:grid-cols-2 lg:grid-cols-3'}`}>\n          {prompts.map((prompt, index) => {\n            const style = PROMPT_STYLES[index % PROMPT_STYLES.length];\n            return (\n              <motion.button\n                key={index}\n                onClick={() => handlePromptClick(prompt.text)}\n                disabled={disabled}\n                className=\"cursor-pointer group flex flex-col items-start text-left p-4 rounded-xl bg-white dark:bg-gray-800/80 border border-gray-200/80 dark:border-gray-700/60 hover:border-gray-300 dark:hover:border-gray-600 hover:bg-gray-50/80 dark:hover:bg-gray-700/30 shadow-sm hover:shadow-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-primary-500/40 focus:ring-offset-2 dark:focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed\"\n                variants={activeItemVariants}\n                whileHover={disabled || shouldReduceMotion ? {} : { y: -3 }}\n                whileTap={disabled || shouldReduceMotion ? {} : { scale: 0.98 }}\n                aria-label={`${prompt.category}: ${prompt.text}`}\n              >\n                <div className=\"mb-3 flex items-center gap-2\">\n                  <prompt.icon\n                    size={16}\n                    weight=\"duotone\"\n                    className={style?.icon ?? 'text-gray-500'}\n                  />\n                  <span\n                    className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-[11px] font-medium ring-1 ring-inset ${style?.badge ?? 'bg-gray-100 text-gray-600 ring-gray-500/10'}`}\n                  >\n                    {prompt.category}\n                  </span>\n                </div>\n\n                <p className=\"text-[13px] text-gray-700 dark:text-gray-200 leading-relaxed group-hover:text-gray-900 dark:group-hover:text-white transition-colors duration-200\">\n                  {prompt.text}\n                </p>\n              </motion.button>\n            );\n          })}\n        </div>\n      </motion.div>\n    </motion.div>\n  );\n}\n\nexport { WelcomeContent };\nexport default WelcomeContent;\n","/**\n * Alert Component\n * Standardized error/success/warning/info messages with retry capability\n */\n\nimport { memo } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { X, Warning, CheckCircle, Info, XCircle } from '@phosphor-icons/react';\nimport { errorMessageVariants } from '../animations/variants';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport type AlertVariant = 'error' | 'success' | 'warning' | 'info'\n\ninterface AlertProps {\n  variant?: AlertVariant\n  message: string\n  title?: string\n  onDismiss?: () => void\n  onRetry?: () => void\n  show?: boolean\n  dismissible?: boolean\n}\n\nconst variantStyles = {\n  error: {\n    container: 'border-red-200 bg-red-50 dark:bg-red-900/20',\n    title: 'text-red-800 dark:text-red-300',\n    message: 'text-red-700 dark:text-red-400',\n    icon: 'text-red-600 dark:text-red-400',\n    button: 'text-red-400 hover:text-red-600 dark:hover:text-red-300',\n    retryButton: 'bg-red-600 dark:bg-red-700 hover:bg-red-700 dark:hover:bg-red-800 text-white',\n    Icon: XCircle,\n  },\n  success: {\n    container: 'border-emerald-200 bg-emerald-50 dark:bg-emerald-900/20',\n    title: 'text-emerald-800 dark:text-emerald-300',\n    message: 'text-emerald-700 dark:text-emerald-400',\n    icon: 'text-emerald-600 dark:text-emerald-400',\n    button: 'text-emerald-400 hover:text-emerald-600 dark:hover:text-emerald-300',\n    retryButton: 'bg-emerald-600 dark:bg-emerald-700 hover:bg-emerald-700 dark:hover:bg-emerald-800 text-white',\n    Icon: CheckCircle,\n  },\n  warning: {\n    container: 'border-amber-200 bg-amber-50 dark:bg-amber-900/20',\n    title: 'text-amber-800 dark:text-amber-300',\n    message: 'text-amber-700 dark:text-amber-400',\n    icon: 'text-amber-600 dark:text-amber-400',\n    button: 'text-amber-400 hover:text-amber-600 dark:hover:text-amber-300',\n    retryButton: 'bg-amber-600 dark:bg-amber-700 hover:bg-amber-700 dark:hover:bg-amber-800 text-white',\n    Icon: Warning,\n  },\n  info: {\n    container: 'border-blue-200 bg-blue-50 dark:bg-blue-900/20',\n    title: 'text-blue-800 dark:text-blue-300',\n    message: 'text-blue-700 dark:text-blue-400',\n    icon: 'text-blue-600 dark:text-blue-400',\n    button: 'text-blue-400 hover:text-blue-600 dark:hover:text-blue-300',\n    retryButton: 'bg-blue-600 dark:bg-blue-700 hover:bg-blue-700 dark:hover:bg-blue-800 text-white',\n    Icon: Info,\n  },\n};\n\nfunction Alert({\n  variant = 'info',\n  message,\n  title,\n  onDismiss,\n  onRetry,\n  show = true,\n  dismissible = true,\n}: AlertProps) {\n  const { t } = useTranslation();\n  const styles = variantStyles[variant];\n  const IconComponent = styles.Icon;\n\n  return (\n    <AnimatePresence>\n      {show && (\n        <motion.div\n          variants={errorMessageVariants}\n          initial=\"initial\"\n          animate=\"animate\"\n          exit=\"exit\"\n          className={`border-t border ${styles.container} px-4 py-3`}\n          role=\"alert\"\n          aria-live=\"assertive\"\n        >\n          <div className=\"w-full flex items-start justify-between px-4\">\n            <div className=\"flex items-start gap-3 flex-1\">\n              {/* Icon */}\n              <IconComponent size={20} className={`w-5 h-5 ${styles.icon} flex-shrink-0 mt-0.5`} />\n\n              {/* Content */}\n              <div className=\"flex-1\">\n                {title && <p className={`text-sm ${styles.title} font-medium`}>{title}</p>}\n                <p className={`text-sm ${styles.message} ${title ? 'mt-1' : ''}`}>{message}</p>\n\n                {/* Retry Button */}\n                {onRetry && (\n                  <button\n                    onClick={onRetry}\n                    className={`mt-2 text-xs px-3 py-1.5 rounded ${styles.retryButton} transition-colors font-medium`}\n                  >\n                    {t('BiChat.Chat.Retry')}\n                  </button>\n                )}\n              </div>\n            </div>\n\n            {/* Dismiss Button */}\n            {dismissible && onDismiss && (\n              <button\n                onClick={onDismiss}\n                className={`${styles.button} transition-colors flex-shrink-0`}\n                aria-label={t('BiChat.Chat.DismissNotification')}\n              >\n                <X size={20} className=\"w-5 h-5\" />\n              </button>\n            )}\n          </div>\n        </motion.div>\n      )}\n    </AnimatePresence>\n  );\n}\n\nexport default memo(Alert);\n","/**\n * Archive Banner Component\n * Displays when a chat session is archived and provides a restore button\n */\n\nimport { memo, useState } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Archive, Spinner } from '@phosphor-icons/react';\nimport { errorMessageVariants } from '../animations/variants';\nimport Alert from './Alert';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ArchiveBannerProps {\n  show?: boolean\n  onRestore?: () => Promise<void>\n  restoring?: boolean\n  onRestoreComplete?: () => void\n}\n\nfunction ArchiveBanner({\n  show = true,\n  onRestore,\n  restoring = false,\n  onRestoreComplete,\n}: ArchiveBannerProps) {\n  const { t } = useTranslation();\n  const [error, setError] = useState<string | null>(null);\n\n  const handleRestore = async () => {\n    try {\n      setError(null);\n      if (onRestore) {\n        await onRestore();\n      }\n      if (onRestoreComplete) {\n        onRestoreComplete();\n      }\n    } catch (err) {\n      const message = err instanceof Error ? err.message : t('BiChat.Archive.RestoreFailed');\n      setError(message);\n    }\n  };\n\n  return (\n    <>\n      <AnimatePresence>\n        {show && (\n          <motion.div\n            variants={errorMessageVariants}\n            initial=\"initial\"\n            animate=\"animate\"\n            exit=\"exit\"\n            className=\"border-t border border-blue-200 bg-blue-50 dark:bg-blue-900/20 px-4 py-3\"\n            role=\"region\"\n            aria-label={t('BiChat.Archive.Banner')}\n          >\n            <div className=\"w-full flex items-start justify-between px-4\">\n              <div className=\"flex items-start gap-3 flex-1\">\n                {/* Icon */}\n                <Archive size={20} className=\"w-5 h-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5\" />\n\n                {/* Content */}\n                <div className=\"flex-1\">\n                  <p className=\"text-sm text-blue-700 dark:text-blue-400\">\n                    {t('BiChat.Archive.Archived')}\n                  </p>\n                </div>\n              </div>\n\n              {/* Restore Button */}\n              <button\n                onClick={handleRestore}\n                disabled={restoring}\n                className=\"ml-2 flex-shrink-0 px-3 py-1.5 text-xs font-medium bg-blue-600 dark:bg-blue-700 hover:bg-blue-700 dark:hover:bg-blue-800 text-white rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1.5\"\n                aria-label={t('BiChat.Archive.Restore')}\n              >\n                {restoring ? (\n                  <>\n                    <Spinner size={16} className=\"w-4 h-4 animate-spin\" />\n                    {t('BiChat.Archive.Restoring')}\n                  </>\n                ) : (\n                  t('BiChat.Archive.Restore')\n                )}\n              </button>\n            </div>\n          </motion.div>\n        )}\n      </AnimatePresence>\n\n      {/* Error Alert */}\n      {error && (\n        <Alert\n          variant=\"error\"\n          message={error}\n          title={t('BiChat.Archive.RestoreFailed')}\n          onDismiss={() => setError(null)}\n          dismissible\n        />\n      )}\n    </>\n  );\n}\n\nexport default memo(ArchiveBanner);\n","/**\n * Main ChatSession component\n * Composes ChatHeader, MessageList, and MessageInput\n *\n * Uses turn-based architecture where each ConversationTurn groups\n * a user message with its assistant response.\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, useCallback, useEffect, useRef, useState } from 'react';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { Sidebar, ShareNetwork } from '@phosphor-icons/react';\nimport { ChatSessionProvider, useChatSession, useChatMessaging, useChatInput } from '../context/ChatContext';\nimport { ChatDataSource, ConversationTurn, type SessionUser } from '../types';\nimport { RateLimiter } from '../utils/RateLimiter';\nimport { ChatHeader } from './ChatHeader';\nimport { MessageList } from './MessageList';\nimport { MessageInput } from './MessageInput';\nimport CompactionDoodle from './CompactionDoodle';\nimport WelcomeContent from './WelcomeContent';\nimport ArchiveBanner from './ArchiveBanner';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { SessionArtifactsPanel } from './SessionArtifactsPanel';\nimport { SessionMembersModal } from './SessionMembersModal';\nimport Alert from './Alert';\nimport { StreamError } from './StreamError';\nimport { isOpenQuestionStatus } from '../machine/hitlLifecycle';\n\ninterface ChatSessionProps {\n  dataSource: ChatDataSource\n  sessionId?: string\n  /** Optional rate limiter to throttle sendMessage */\n  rateLimiter?: RateLimiter\n  /**\n   * Called when a new session is created (e.g. on first message in a \"new\n   * chat\"). Use this to navigate your SPA router to the new session URL.\n   */\n  onSessionCreated?: (sessionId: string) => void\n  /** Alias for isReadOnly (preferred) */\n  readOnly?: boolean\n  isReadOnly?: boolean\n  /** Custom render function for user turns */\n  renderUserTurn?: (turn: ConversationTurn) => ReactNode\n  /** Custom render function for assistant turns */\n  renderAssistantTurn?: (turn: ConversationTurn) => 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  /** Custom content rendered above the message input (e.g., model selector) */\n  inputHeaderSlot?: ReactNode\n  /** Callback when user navigates back */\n  onBack?: () => void\n  /** Custom verbs for the typing indicator (e.g. ['Thinking', 'Analyzing', ...]) */\n  thinkingVerbs?: string[]\n  /** Callback invoked after an archived session is restored (e.g. to navigate or refresh) */\n  onSessionRestored?: (sessionId: string) => void\n  /** Enables the built-in right-side artifacts panel for persisted session artifacts */\n  showArtifactsPanel?: boolean\n  /** Initial expanded state for artifacts panel when no persisted preference exists */\n  artifactsPanelDefaultExpanded?: boolean\n  /** localStorage key for artifacts panel expanded/collapsed state */\n  artifactsPanelStorageKey?: string\n}\n\nconst ARTIFACTS_PANEL_WIDTH_DEFAULT = 352;\nconst ARTIFACTS_PANEL_WIDTH_MIN = 280;\nconst ARTIFACTS_PANEL_WIDTH_MAX = 560;\n\nfunction ChatSessionCore({\n  dataSource,\n  readOnly,\n  isReadOnly,\n  renderUserTurn,\n  renderAssistantTurn,\n  className = '',\n  headerSlot,\n  welcomeSlot,\n  logoSlot,\n  actionsSlot,\n  inputHeaderSlot,\n  onBack,\n  thinkingVerbs,\n  onSessionRestored,\n  showArtifactsPanel = false,\n  artifactsPanelDefaultExpanded = false,\n  artifactsPanelStorageKey = 'bichat.artifacts-panel.expanded',\n}: Omit<ChatSessionProps, 'sessionId'>) {\n  const { t } = useTranslation();\n  const {\n    session,\n    fetching,\n    error,\n    errorRetryable,\n    debugMode,\n    sessionDebugUsage,\n    debugLimits,\n    currentSessionId,\n    setError,\n    retryFetchSession,\n    reasoningEffort,\n    setReasoningEffort,\n    reasoningEffortOptions,\n  } =\n    useChatSession();\n  const {\n    turns,\n    loading,\n    isStreaming,\n    cancel,\n    streamError,\n    streamErrorRetryable,\n    isCompacting,\n    retryLastMessage,\n    clearStreamError,\n    pendingQuestion,\n  } = useChatMessaging();\n  const {\n    inputError,\n    message,\n    setMessage,\n    setInputError,\n    handleSubmit,\n    messageQueue,\n    handleUnqueue,\n    removeQueueItem,\n    updateQueueItem,\n  } = useChatInput();\n\n  const isArchived = session?.status === 'archived';\n  const accessReadOnly = session?.access ? !session.access.canWrite : false;\n  const effectiveReadOnly = Boolean(readOnly ?? isReadOnly) || isArchived || accessReadOnly;\n  const composerDisabled = isOpenQuestionStatus(pendingQuestion?.status);\n  const [restoring, setRestoring] = useState(false);\n  const handleRestore = useCallback(async () => {\n    if (!session?.id) {return;}\n    setRestoring(true);\n    try {\n      await dataSource.unarchiveSession(session.id);\n      retryFetchSession();\n      window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n        detail: { reason: 'restored', sessionId: session.id },\n      }));\n      onSessionRestored?.(session.id);\n    } finally {\n      setRestoring(false);\n    }\n  }, [dataSource, onSessionRestored, retryFetchSession, session?.id]);\n\n  const [artifactsPanelExpanded, setArtifactsPanelExpanded] = useState(\n    artifactsPanelDefaultExpanded\n  );\n  const [membersModalOpen, setMembersModalOpen] = useState(false);\n  const [headerMembers, setHeaderMembers] = useState<SessionUser[] | null>(null);\n  const [artifactsPanelWidth, setArtifactsPanelWidth] = useState(ARTIFACTS_PANEL_WIDTH_DEFAULT);\n  const [isResizingArtifactsPanel, setIsResizingArtifactsPanel] = useState(false);\n  const layoutContainerRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    if (!showArtifactsPanel) {\n      return;\n    }\n\n    let nextValue = artifactsPanelDefaultExpanded;\n    if (typeof window !== 'undefined') {\n      const stored = window.localStorage.getItem(artifactsPanelStorageKey);\n      if (stored !== null) {\n        nextValue = stored === 'true';\n      }\n    }\n\n    setArtifactsPanelExpanded(nextValue);\n  }, [artifactsPanelDefaultExpanded, artifactsPanelStorageKey, showArtifactsPanel]);\n\n  useEffect(() => {\n    if (!showArtifactsPanel) {return;}\n    if (typeof window === 'undefined') {return;}\n    try {\n      const raw = window.localStorage.getItem(`${artifactsPanelStorageKey}.width`);\n      if (raw !== null) {\n        const n = Number.parseInt(raw, 10);\n        if (Number.isFinite(n) && n >= ARTIFACTS_PANEL_WIDTH_MIN && n <= ARTIFACTS_PANEL_WIDTH_MAX) {\n          setArtifactsPanelWidth(n);\n        }\n      }\n    } catch {\n      // ignore\n    }\n  }, [artifactsPanelStorageKey, showArtifactsPanel]);\n\n  // Load full member list for header avatar stack when session and listSessionMembers are available\n  useEffect(() => {\n    if (!session?.id || !dataSource.listSessionMembers) {\n      setHeaderMembers(null);\n      return;\n    }\n    let cancelled = false;\n    dataSource.listSessionMembers(session.id).then((members) => {\n      if (!cancelled) {\n        setHeaderMembers(members.map((m) => m.user));\n      }\n    }).catch(() => {\n      if (!cancelled) {\n        setHeaderMembers(null);\n      }\n    });\n    return () => { cancelled = true; };\n  }, [session?.id, dataSource.listSessionMembers]);\n\n  const handleArtifactsResizeStart = useCallback(() => {\n    setIsResizingArtifactsPanel(true);\n  }, []);\n\n  const handleArtifactsResizeKeyDown = useCallback(\n    (e: React.KeyboardEvent) => {\n      const step = e.shiftKey ? 40 : 20;\n      let nextWidth: number | null = null;\n\n      if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n        nextWidth = Math.min(ARTIFACTS_PANEL_WIDTH_MAX, artifactsPanelWidth + step);\n      } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n        nextWidth = Math.max(ARTIFACTS_PANEL_WIDTH_MIN, artifactsPanelWidth - step);\n      } else if (e.key === 'Home') {\n        nextWidth = ARTIFACTS_PANEL_WIDTH_MIN;\n      } else if (e.key === 'End') {\n        nextWidth = ARTIFACTS_PANEL_WIDTH_MAX;\n      }\n\n      if (nextWidth !== null) {\n        e.preventDefault();\n        setArtifactsPanelWidth(nextWidth);\n        try {\n          window.localStorage.setItem(`${artifactsPanelStorageKey}.width`, String(nextWidth));\n        } catch {\n          // ignore\n        }\n      }\n    },\n    [artifactsPanelWidth, artifactsPanelStorageKey],\n  );\n\n  const lastPanelWidthRef = useRef(artifactsPanelWidth);\n  lastPanelWidthRef.current = artifactsPanelWidth;\n\n  useEffect(() => {\n    if (!isResizingArtifactsPanel) {return;}\n\n    const move = (e: MouseEvent) => {\n      const el = layoutContainerRef.current;\n      if (!el) {return;}\n      const rect = el.getBoundingClientRect();\n      const w = rect.right - e.clientX;\n      const clamped = Math.min(ARTIFACTS_PANEL_WIDTH_MAX, Math.max(ARTIFACTS_PANEL_WIDTH_MIN, w));\n      setArtifactsPanelWidth(clamped);\n    };\n\n    const up = () => {\n      setIsResizingArtifactsPanel(false);\n      try {\n        if (typeof window !== 'undefined') {\n          window.localStorage.setItem(\n            `${artifactsPanelStorageKey}.width`,\n            String(lastPanelWidthRef.current)\n          );\n        }\n      } catch {\n        // ignore\n      }\n    };\n\n    document.addEventListener('mousemove', move, { passive: true });\n    document.addEventListener('mouseup', up);\n    document.body.style.cursor = 'col-resize';\n    document.body.style.userSelect = 'none';\n    return () => {\n      document.removeEventListener('mousemove', move);\n      document.removeEventListener('mouseup', up);\n      document.body.style.cursor = '';\n      document.body.style.userSelect = '';\n    };\n  }, [isResizingArtifactsPanel, artifactsPanelStorageKey]);\n\n  if (fetching && turns.length === 0 && !session) {\n    return (\n      <div className=\"flex h-full items-center justify-center\">\n        <div className=\"text-gray-500 dark:text-gray-400\">{t('BiChat.Input.Processing')}</div>\n      </div>\n    );\n  }\n\n  // Show welcome screen for new sessions with no turns\n  const showWelcome = !session && turns.length === 0;\n  const activeSessionId =\n    session?.id ||\n    (currentSessionId && currentSessionId !== 'new'\n      ? currentSessionId\n      : undefined);\n\n  const supportsArtifactsPanel = typeof dataSource.fetchSessionArtifacts === 'function';\n  const showArtifactsControls = Boolean(showArtifactsPanel && supportsArtifactsPanel && activeSessionId);\n  const shouldRenderArtifactsPanel = Boolean(\n    showArtifactsControls && artifactsPanelExpanded && !showWelcome && activeSessionId\n  );\n\n  const handlePromptSelect = (prompt: string) => {\n    setMessage(prompt);\n  };\n\n  const handleToggleArtifactsPanel = () => {\n    const nextValue = !artifactsPanelExpanded;\n    setArtifactsPanelExpanded(nextValue);\n\n    if (typeof window !== 'undefined') {\n      window.localStorage.setItem(artifactsPanelStorageKey, nextValue ? 'true' : 'false');\n      if (nextValue) {\n        window.dispatchEvent(new CustomEvent('bichat:artifacts-panel-expanded', { detail: { expanded: true } }));\n      }\n    }\n  };\n\n  const canShowShareButton = Boolean(\n    session?.access?.canManageMembers\n    && dataSource.listUsers\n    && dataSource.listSessionMembers\n    && dataSource.addSessionMember\n    && dataSource.updateSessionMemberRole\n    && dataSource.removeSessionMember\n  );\n\n  const shareButton = canShowShareButton ? (\n    <button\n      type=\"button\"\n      onClick={() => setMembersModalOpen(true)}\n      className=\"inline-flex cursor-pointer items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-gray-500 transition-all duration-150 hover:bg-gray-100 hover:text-gray-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-200\"\n      aria-label={t('BiChat.Share.Title')}\n      title={t('BiChat.Share.Title')}\n    >\n      <ShareNetwork className=\"h-4 w-4\" />\n      {t('BiChat.Share.Button')}\n    </button>\n  ) : null;\n\n  const headerActions = (\n    <>\n      {shareButton}\n      {showArtifactsControls && (\n        <button\n          type=\"button\"\n          onClick={handleToggleArtifactsPanel}\n          className={[\n            'inline-flex cursor-pointer items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium transition-all duration-150',\n            'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50',\n            artifactsPanelExpanded\n              ? 'bg-primary-50 text-primary-700 hover:bg-primary-100 dark:bg-primary-950/30 dark:text-primary-300 dark:hover:bg-primary-900/40'\n              : 'text-gray-500 hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-200',\n          ].join(' ')}\n          aria-label={artifactsPanelExpanded ? t('BiChat.Artifacts.ToggleHide') : t('BiChat.Artifacts.ToggleShow')}\n          aria-expanded={artifactsPanelExpanded}\n          title={artifactsPanelExpanded ? t('BiChat.Artifacts.ToggleHide') : t('BiChat.Artifacts.ToggleShow')}\n        >\n          <Sidebar className=\"h-4 w-4\" weight={artifactsPanelExpanded ? 'duotone' : 'regular'} />\n          {t('BiChat.Artifacts.Title')}\n        </button>\n      )}\n      {actionsSlot}\n    </>\n  );\n\n  return (\n    <main\n      className={`flex min-w-0 min-h-0 flex-1 flex-col overflow-hidden bg-gray-50 dark:bg-gray-900 ${className}`}\n    >\n      {headerSlot || (\n        <ChatHeader\n          session={session}\n          onBack={onBack}\n          readOnly={effectiveReadOnly}\n          logoSlot={logoSlot}\n          actionsSlot={headerActions}\n          members={headerMembers ?? (session?.owner ? [session.owner] : undefined)}\n          onMembersClick={canShowShareButton ? () => setMembersModalOpen(true) : undefined}\n        />\n      )}\n      {error && (\n        <Alert\n          variant={errorRetryable ? 'warning' : 'error'}\n          title={t('BiChat.Error.Generic')}\n          message={error}\n          onDismiss={() => setError(null)}\n          onRetry={errorRetryable ? retryFetchSession : undefined}\n        />\n      )}\n\n      <div\n        ref={layoutContainerRef}\n        // overflow-clip (not overflow-hidden): an overflow-hidden box is still a\n        // scroll container, so focusing a control near the bottom (e.g. a radio\n        // in the inline question form) lets the browser scroll this box to\n        // reveal it — and with no scrollbar the chat is shoved off-screen with\n        // no way back (blank until refresh). overflow-clip clips without\n        // creating a scroll container, so it cannot be scrolled on focus.\n        className=\"relative flex min-h-0 flex-1 overflow-clip\"\n      >\n        <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n          {showWelcome ? (\n            <div className=\"flex flex-1 flex-col overflow-auto\">\n              <div className=\"flex flex-1 items-center justify-center px-4 py-8\">\n                <div className=\"w-full max-w-5xl\">\n                  {welcomeSlot || (\n                    <WelcomeContent onPromptSelect={handlePromptSelect} disabled={loading || composerDisabled} />\n                  )}\n                  {streamError && (\n                    <div className=\"px-6 pt-4\">\n                      <StreamError\n                        error={streamError}\n                        compact\n                        onRetry={streamErrorRetryable ? () => void retryLastMessage() : undefined}\n                        onDismiss={clearStreamError}\n                      />\n                    </div>\n                  )}\n                  {!effectiveReadOnly && inputHeaderSlot}\n                  {!effectiveReadOnly && (\n                    <MessageInput\n                      message={message}\n                      loading={loading}\n                      isStreaming={isStreaming}\n                      fetching={fetching}\n                      commandError={inputError}\n                      onClearCommandError={() => setInputError(null)}\n                      debugMode={debugMode}\n                      debugSessionUsage={sessionDebugUsage}\n                      debugLimits={debugLimits}\n                      onMessageChange={setMessage}\n                      onSubmit={handleSubmit}\n                      messageQueue={messageQueue}\n                      onUnqueue={handleUnqueue}\n                      onRemoveQueueItem={removeQueueItem}\n                      onUpdateQueueItem={updateQueueItem}\n                      onCancelStreaming={cancel}\n                      containerClassName=\"pt-6 px-6\"\n                      formClassName=\"mx-auto\"\n                      disabled={composerDisabled}\n                      reasoningEffortOptions={reasoningEffortOptions}\n                      reasoningEffort={reasoningEffort}\n                      onReasoningEffortChange={setReasoningEffort}\n                    />\n                  )}\n                  <p className=\"mt-4 pb-1 text-center text-xs text-gray-500 dark:text-gray-400\">\n                    {t('BiChat.Welcome.Disclaimer')}\n                  </p>\n                </div>\n              </div>\n            </div>\n          ) : (\n            <>\n              {isArchived && (\n                <ArchiveBanner\n                  show\n                  onRestore={handleRestore}\n                  restoring={restoring}\n                />\n              )}\n              <MessageList\n                renderUserTurn={renderUserTurn}\n                renderAssistantTurn={renderAssistantTurn}\n                thinkingVerbs={thinkingVerbs}\n                readOnly={effectiveReadOnly}\n              />\n              <AnimatePresence>\n                {isCompacting && (\n                  <div className=\"flex justify-center px-4 pb-2\">\n                    <CompactionDoodle\n                      title={t('BiChat.Slash.CompactingTitle')}\n                      subtitle={t('BiChat.Slash.CompactingSubtitle')}\n                    />\n                  </div>\n                )}\n              </AnimatePresence>\n              {streamError && (\n                <div className=\"px-4 pb-2\">\n                  <StreamError\n                    error={streamError}\n                    compact\n                    onRetry={streamErrorRetryable ? () => void retryLastMessage() : undefined}\n                    onDismiss={clearStreamError}\n                  />\n                </div>\n              )}\n              {!effectiveReadOnly && inputHeaderSlot}\n              {!effectiveReadOnly && (\n                <MessageInput\n                  message={message}\n                  loading={loading}\n                  isStreaming={isStreaming}\n                  fetching={fetching}\n                  commandError={inputError}\n                  onClearCommandError={() => setInputError(null)}\n                  debugMode={debugMode}\n                  debugSessionUsage={sessionDebugUsage}\n                  debugLimits={debugLimits}\n                  onMessageChange={setMessage}\n                  onSubmit={handleSubmit}\n                  messageQueue={messageQueue}\n                  onUnqueue={handleUnqueue}\n                  onRemoveQueueItem={removeQueueItem}\n                  onUpdateQueueItem={updateQueueItem}\n                  onCancelStreaming={cancel}\n                  disabled={composerDisabled}\n                  reasoningEffortOptions={reasoningEffortOptions}\n                  reasoningEffort={reasoningEffort}\n                  onReasoningEffortChange={setReasoningEffort}\n                />\n              )}\n            </>\n          )}\n        </div>\n\n        {/* Desktop: persistent slot with animated width so main content expands in sync */}\n        <motion.div\n          className=\"hidden lg:flex lg:min-h-0 shrink-0 overflow-hidden\"\n          animate={{\n            width: shouldRenderArtifactsPanel && activeSessionId ? artifactsPanelWidth : 0,\n          }}\n          transition={\n            isResizingArtifactsPanel\n              ? { duration: 0 }\n              : { type: 'spring', stiffness: 320, damping: 32 }\n          }\n        >\n          {shouldRenderArtifactsPanel && activeSessionId && (\n            <motion.div\n              className=\"flex min-h-0\"\n              style={{ width: artifactsPanelWidth }}\n              initial={{ x: '100%' }}\n              animate={{ x: 0 }}\n              transition={{ type: 'spring', stiffness: 320, damping: 32 }}\n            >\n              <div\n                role=\"separator\"\n                tabIndex={0}\n                aria-label={t('BiChat.Artifacts.Resize')}\n                aria-orientation=\"vertical\"\n                aria-valuenow={artifactsPanelWidth}\n                aria-valuemin={ARTIFACTS_PANEL_WIDTH_MIN}\n                aria-valuemax={ARTIFACTS_PANEL_WIDTH_MAX}\n                onMouseDown={handleArtifactsResizeStart}\n                onKeyDown={handleArtifactsResizeKeyDown}\n                className=\"relative flex shrink-0 cursor-col-resize touch-none items-center justify-center w-2 transition-colors lg:flex group/resize after:absolute after:inset-y-0 after:left-0 after:w-0.5 after:bg-gray-300 dark:after:bg-gray-600 after:transition-colors group-hover/resize:after:bg-primary-400 dark:group-hover/resize:after:bg-primary-500 focus-visible:outline-none focus-visible:after:bg-primary-500 dark:focus-visible:after:bg-primary-400\"\n              >\n                <span className=\"absolute h-10 w-1.5 cursor-col-resize rounded-full bg-gray-400 transition-colors group-hover/resize:bg-primary-400 dark:bg-gray-500 dark:group-hover/resize:bg-primary-500\" />\n              </div>\n              <SessionArtifactsPanel\n                dataSource={dataSource}\n                sessionId={activeSessionId}\n                isStreaming={isStreaming}\n                allowDrop={!effectiveReadOnly}\n                className=\"min-h-0 min-w-0 flex-1\"\n              />\n            </motion.div>\n          )}\n        </motion.div>\n\n        <AnimatePresence>\n          {shouldRenderArtifactsPanel && activeSessionId && (\n            <motion.div\n              key=\"artifacts-mobile\"\n              className=\"fixed inset-0 z-40 flex lg:hidden\"\n              initial={{ x: '100%' }}\n              animate={{ x: 0 }}\n              exit={{ x: '100%' }}\n              transition={{ type: 'spring', stiffness: 320, damping: 32 }}\n              role=\"dialog\"\n              aria-modal=\"true\"\n            >\n              <motion.button\n                type=\"button\"\n                className=\"cursor-pointer flex-1 bg-black/40\"\n                initial={{ opacity: 0 }}\n                animate={{ opacity: 1 }}\n                exit={{ opacity: 0 }}\n                onClick={handleToggleArtifactsPanel}\n                aria-label={t('BiChat.Common.Close')}\n              />\n              <SessionArtifactsPanel\n                dataSource={dataSource}\n                sessionId={activeSessionId}\n                isStreaming={isStreaming}\n                allowDrop={!effectiveReadOnly}\n                className=\"flex h-full w-full max-w-sm min-h-0\"\n              />\n            </motion.div>\n          )}\n        </AnimatePresence>\n      </div>\n      {canShowShareButton && (\n        <SessionMembersModal\n          isOpen={membersModalOpen}\n          sessionId={session?.id}\n          dataSource={dataSource}\n          onClose={() => setMembersModalOpen(false)}\n        />\n      )}\n    </main>\n  );\n}\n\nexport function ChatSession(props: ChatSessionProps) {\n  const { dataSource, sessionId, rateLimiter, onSessionCreated, ...coreProps } = props;\n\n  return (\n    <ChatSessionProvider\n      dataSource={dataSource}\n      sessionId={sessionId}\n      rateLimiter={rateLimiter}\n      onSessionCreated={onSessionCreated}\n    >\n      <ChatSessionCore dataSource={dataSource} {...coreProps} />\n    </ChatSessionProvider>\n  );\n}\n\nexport type { ChatSessionProps };\n","import { type ChangeEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Paperclip, Plus } from '@phosphor-icons/react';\nimport type { ChatDataSource, SessionArtifact } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useOptionalChatMessaging } from '../context/ChatContext';\nimport { SessionArtifactList } from './SessionArtifactList';\nimport { SessionArtifactPreviewModal } from './SessionArtifactPreviewModal';\n\ninterface SessionArtifactsPanelProps {\n  dataSource: ChatDataSource\n  sessionId: string\n  isStreaming: boolean\n  allowDrop?: boolean\n  className?: string\n  /** When provided, used instead of useChatMessaging().artifactsInvalidationTrigger (allows use outside SDK ChatSessionProvider). */\n  artifactsInvalidationTrigger?: number\n}\n\nconst PAGE_SIZE = 50;\n\nfunction mergeArtifacts(existing: SessionArtifact[], incoming: SessionArtifact[]): SessionArtifact[] {\n  const merged = [...existing];\n  const existingIds = new Set(existing.map((artifact) => artifact.id));\n\n  for (const artifact of incoming) {\n    if (existingIds.has(artifact.id)) {\n      continue;\n    }\n    merged.push(artifact);\n    existingIds.add(artifact.id);\n  }\n\n  return merged;\n}\n\nexport function SessionArtifactsPanel({\n  dataSource,\n  sessionId,\n  isStreaming,\n  allowDrop = true,\n  className = '',\n  artifactsInvalidationTrigger: artifactsInvalidationTriggerProp,\n}: SessionArtifactsPanelProps) {\n  const { t } = useTranslation();\n  const messaging = useOptionalChatMessaging();\n  const artifactsInvalidationTrigger =\n    typeof artifactsInvalidationTriggerProp === 'number'\n      ? artifactsInvalidationTriggerProp\n      : messaging?.artifactsInvalidationTrigger ?? 0;\n\n  const [fetching, setFetching] = useState(true);\n  const [refreshing, setRefreshing] = useState(false);\n  const [loadingMore, setLoadingMore] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [artifacts, setArtifacts] = useState<SessionArtifact[]>([]);\n  const [previewArtifactID, setPreviewArtifactID] = useState<string | null>(null);\n  const [hasMore, setHasMore] = useState(false);\n  const [isDragging, setIsDragging] = useState(false);\n  const [dropSuccess, setDropSuccess] = useState(false);\n\n  const requestSeq = useRef(0);\n  const hasLoadedRef = useRef(false);\n  const prevStreamingRef = useRef(isStreaming);\n  const artifactsRef = useRef<SessionArtifact[]>([]);\n  const nextOffsetRef = useRef(0);\n  const dragDepthRef = useRef(0);\n  const dropSuccessTimerRef = useRef<number | null>(null);\n\n  const canFetchArtifacts = typeof dataSource.fetchSessionArtifacts === 'function';\n  const canDropFiles = allowDrop && typeof dataSource.uploadSessionArtifacts === 'function';\n\n  const tRef = useRef(t);\n  tRef.current = t;\n\n  const fetchArtifacts = useCallback(\n    async (opts: { reset: boolean; manual: boolean }) => {\n      if (!canFetchArtifacts || !dataSource.fetchSessionArtifacts) {\n        setFetching(false);\n        setRefreshing(false);\n        setLoadingMore(false);\n        setArtifacts([]);\n        setError(null);\n        setHasMore(false);\n        nextOffsetRef.current = 0;\n        return;\n      }\n\n      const requestID = ++requestSeq.current;\n      const offset = opts.reset ? 0 : nextOffsetRef.current;\n\n      if (!hasLoadedRef.current || opts.reset) {\n        if (opts.manual && hasLoadedRef.current) {\n          setRefreshing(true);\n        } else {\n          setFetching(true);\n        }\n      } else {\n        setLoadingMore(true);\n      }\n      setError(null);\n\n      try {\n        const response = await dataSource.fetchSessionArtifacts(sessionId, {\n          limit: PAGE_SIZE,\n          offset,\n        });\n        if (requestID !== requestSeq.current) {\n          return;\n        }\n\n        const page = [...(response.artifacts || [])].sort(\n          (a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt)\n        );\n\n        const nextList = opts.reset ? page : mergeArtifacts(artifactsRef.current, page);\n\n        setArtifacts(nextList);\n        artifactsRef.current = nextList;\n        hasLoadedRef.current = true;\n\n        const resolvedHasMore = Boolean(response.hasMore);\n        const resolvedNextOffset =\n          typeof response.nextOffset === 'number'\n            ? response.nextOffset\n            : offset + page.length;\n\n        setHasMore(resolvedHasMore);\n        nextOffsetRef.current = resolvedNextOffset;\n      } catch (err) {\n        if (requestID !== requestSeq.current) {\n          return;\n        }\n        setError(err instanceof Error ? err.message : tRef.current('BiChat.Artifacts.FailedToLoad'));\n      } finally {\n        if (requestID === requestSeq.current) {\n          setFetching(false);\n          setRefreshing(false);\n          setLoadingMore(false);\n        }\n      }\n    },\n    [canFetchArtifacts, dataSource, sessionId]\n  );\n\n  useEffect(() => {\n    hasLoadedRef.current = false;\n    setFetching(true);\n    setRefreshing(false);\n    setLoadingMore(false);\n    setError(null);\n    setArtifacts([]);\n    artifactsRef.current = [];\n    setPreviewArtifactID(null);\n    setHasMore(false);\n    nextOffsetRef.current = 0;\n    void fetchArtifacts({ reset: true, manual: false });\n  }, [fetchArtifacts, sessionId]);\n\n  useEffect(() => {\n    const wasStreaming = prevStreamingRef.current;\n    if (wasStreaming && !isStreaming) {\n      void fetchArtifacts({ reset: true, manual: false });\n    }\n    prevStreamingRef.current = isStreaming;\n  }, [fetchArtifacts, isStreaming]);\n\n  useEffect(() => {\n    if (artifactsInvalidationTrigger > 0 && sessionId && canFetchArtifacts) {\n      void fetchArtifacts({ reset: true, manual: false });\n    }\n  }, [artifactsInvalidationTrigger, sessionId, canFetchArtifacts, fetchArtifacts]);\n\n  const visibilityFetchRef = useRef(fetchArtifacts);\n  visibilityFetchRef.current = fetchArtifacts;\n  const sessionIdRef = useRef(sessionId);\n  sessionIdRef.current = sessionId;\n  const canFetchRef = useRef(canFetchArtifacts);\n  canFetchRef.current = canFetchArtifacts;\n\n  useEffect(() => {\n    const handler = () => {\n      if (\n        document.visibilityState === 'visible' &&\n        sessionIdRef.current &&\n        canFetchRef.current\n      ) {\n        void visibilityFetchRef.current({ reset: true, manual: false });\n      }\n    };\n    document.addEventListener('visibilitychange', handler);\n    return () => document.removeEventListener('visibilitychange', handler);\n  }, []);\n\n  const previewArtifact = useMemo(\n    () => artifacts.find((artifact) => artifact.id === previewArtifactID) ?? null,\n    [artifacts, previewArtifactID]\n  );\n\n  const clearDropSuccessTimer = useCallback(() => {\n    if (dropSuccessTimerRef.current === null) {return;}\n    window.clearTimeout(dropSuccessTimerRef.current);\n    dropSuccessTimerRef.current = null;\n  }, []);\n\n  useEffect(() => {\n    return () => {\n      clearDropSuccessTimer();\n    };\n  }, [clearDropSuccessTimer]);\n\n  const setDropSuccessState = useCallback(() => {\n    setDropSuccess(true);\n    clearDropSuccessTimer();\n    dropSuccessTimerRef.current = window.setTimeout(() => {\n      setDropSuccess(false);\n      dropSuccessTimerRef.current = null;\n    }, 1400);\n  }, [clearDropSuccessTimer]);\n\n  const hasDragFiles = useCallback((e: React.DragEvent): boolean => {\n    return Array.from(e.dataTransfer.types || []).includes('Files');\n  }, []);\n\n  const handleDragEnter = useCallback((e: React.DragEvent) => {\n    if (!canDropFiles || !hasDragFiles(e)) {return;}\n    e.preventDefault();\n    e.stopPropagation();\n    dragDepthRef.current += 1;\n    setIsDragging(true);\n  }, [canDropFiles, hasDragFiles]);\n\n  const handleDragOver = useCallback((e: React.DragEvent) => {\n    if (!canDropFiles || !hasDragFiles(e)) {return;}\n    e.preventDefault();\n    e.stopPropagation();\n    e.dataTransfer.dropEffect = 'copy';\n  }, [canDropFiles, hasDragFiles]);\n\n  const handleDragLeave = useCallback((e: React.DragEvent) => {\n    if (!canDropFiles || !hasDragFiles(e)) {return;}\n    e.preventDefault();\n    e.stopPropagation();\n    dragDepthRef.current = Math.max(0, dragDepthRef.current - 1);\n    if (dragDepthRef.current === 0) {\n      setIsDragging(false);\n    }\n  }, [canDropFiles, hasDragFiles]);\n\n  const handleDrop = useCallback(async (e: React.DragEvent) => {\n    if (!canDropFiles || !dataSource.uploadSessionArtifacts || !hasDragFiles(e)) {return;}\n    e.preventDefault();\n    e.stopPropagation();\n    dragDepthRef.current = 0;\n    setIsDragging(false);\n\n    const itemFiles = Array.from(e.dataTransfer.items || [])\n      .filter((item) => item.kind === 'file')\n      .map((item) => item.getAsFile())\n      .filter((file): file is File => file !== null);\n    const droppedFiles = itemFiles.length > 0 ? itemFiles : Array.from(e.dataTransfer.files || []);\n\n    if (droppedFiles.length === 0) {return;}\n    try {\n      const result = await dataSource.uploadSessionArtifacts(sessionId, droppedFiles);\n      if ((result.artifacts || []).length > 0) {\n        setDropSuccessState();\n        void fetchArtifacts({ reset: true, manual: false });\n      }\n      setError(null);\n    } catch (err) {\n      setError(err instanceof Error ? err.message : tRef.current('BiChat.Artifacts.FailedToLoad'));\n    }\n  }, [canDropFiles, dataSource, fetchArtifacts, hasDragFiles, sessionId, setDropSuccessState]);\n\n  const canRenameArtifacts = typeof dataSource.renameSessionArtifact === 'function';\n  const canDeleteArtifacts = typeof dataSource.deleteSessionArtifact === 'function';\n\n  const handleRenameArtifact = useCallback(\n    async (artifact: SessionArtifact, name: string) => {\n      if (!dataSource.renameSessionArtifact) {\n        return;\n      }\n      const updatedArtifact = await dataSource.renameSessionArtifact(\n        artifact.id,\n        name,\n        artifact.description || ''\n      );\n      setArtifacts((prev) => {\n        const next = prev.map((item) => (item.id === updatedArtifact.id ? updatedArtifact : item));\n        artifactsRef.current = next;\n        return next;\n      });\n    },\n    [dataSource]\n  );\n\n  const canDeleteArtifact = useCallback((artifact: SessionArtifact): boolean => {\n    return artifact.type === 'attachment' && !artifact.messageId;\n  }, []);\n\n  const handleDeleteArtifact = useCallback(\n    async (artifact: SessionArtifact) => {\n      if (!dataSource.deleteSessionArtifact || !canDeleteArtifact(artifact)) {\n        return;\n      }\n      await dataSource.deleteSessionArtifact(artifact.id);\n      setArtifacts((prev) => {\n        const next = prev.filter((item) => item.id !== artifact.id);\n        artifactsRef.current = next;\n        return next;\n      });\n      setPreviewArtifactID((current) => (current === artifact.id ? null : current));\n    },\n    [canDeleteArtifact, dataSource]\n  );\n\n  const fileInputRef = useRef<HTMLInputElement>(null);\n\n  const handleAttachClick = useCallback(() => {\n    fileInputRef.current?.click();\n  }, []);\n\n  const handleFileInputChange = useCallback(\n    async (e: ChangeEvent<HTMLInputElement>) => {\n      if (!dataSource.uploadSessionArtifacts || !e.target.files?.length) {return;}\n      const files = Array.from(e.target.files);\n      try {\n        const result = await dataSource.uploadSessionArtifacts(sessionId, files);\n        if ((result.artifacts || []).length > 0) {\n          setDropSuccessState();\n          void fetchArtifacts({ reset: true, manual: false });\n        }\n        setError(null);\n      } catch (err) {\n        setError(err instanceof Error ? err.message : tRef.current('BiChat.Artifacts.FailedToLoad'));\n      } finally {\n        // Reset input so same file can be re-selected\n        e.target.value = '';\n      }\n    },\n    [dataSource, fetchArtifacts, sessionId, setDropSuccessState]\n  );\n\n  return (\n    <aside\n      className={[\n        'relative flex min-w-0 flex-1 flex-col border-l border-gray-200 bg-white dark:border-gray-700/80 dark:bg-gray-900',\n        isDragging ? 'bg-primary-50/40 dark:bg-primary-950/20' : '',\n        className,\n      ].join(' ')}\n      aria-label={t('BiChat.Artifacts.Title')}\n      onDragEnter={handleDragEnter}\n      onDragOver={handleDragOver}\n      onDragLeave={handleDragLeave}\n      onDrop={handleDrop}\n    >\n      {(isDragging || dropSuccess) && (\n        <div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center bg-white/85 dark:bg-gray-900/85\">\n          <div\n            className={[\n              'mx-4 flex w-full max-w-xs flex-col items-center gap-2 rounded-xl border-2 border-dashed px-4 py-6 text-center',\n              dropSuccess\n                ? 'border-emerald-400 bg-emerald-50 text-emerald-700 dark:border-emerald-500 dark:bg-emerald-950/30 dark:text-emerald-300'\n                : 'border-primary-400 bg-primary-50 text-primary-700 dark:border-primary-500 dark:bg-primary-950/30 dark:text-primary-300',\n            ].join(' ')}\n          >\n            <Paperclip className=\"h-5 w-5\" weight=\"bold\" />\n            <span className=\"text-sm font-medium\">\n              {dropSuccess ? t('BiChat.Input.FilesAdded') : t('BiChat.Input.DropFiles')}\n            </span>\n          </div>\n        </div>\n      )}\n\n      <header className=\"flex items-center justify-between border-b border-gray-200 px-3 py-2 dark:border-gray-700/80\">\n        <div className=\"min-w-0 flex-1\">\n          <h2 className=\"truncate text-sm font-semibold text-gray-900 dark:text-gray-100\">\n            {t('BiChat.Artifacts.Title')} ({artifacts.length})\n          </h2>\n        </div>\n        {canDropFiles && (\n          <>\n            <button\n              type=\"button\"\n              onClick={handleAttachClick}\n              className=\"ml-2 flex-shrink-0 rounded-md p-1.5 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:text-gray-500 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n              aria-label={t('BiChat.Artifacts.AttachFiles')}\n              title={t('BiChat.Artifacts.AttachFiles')}\n            >\n              <Plus className=\"h-4 w-4\" weight=\"bold\" />\n            </button>\n            <input\n              ref={fileInputRef}\n              type=\"file\"\n              multiple\n              className=\"hidden\"\n              onChange={handleFileInputChange}\n              aria-label={t('BiChat.Artifacts.AttachFiles')}\n            />\n          </>\n        )}\n      </header>\n\n      <div className=\"min-h-0 flex-1 overflow-y-auto px-3 py-3\">\n        {fetching ? (\n          <div className=\"flex h-full items-center justify-center text-sm text-gray-500 dark:text-gray-400\">\n            {t('BiChat.Artifacts.Loading')}\n          </div>\n        ) : error ? (\n          <div className=\"space-y-3 rounded-lg border border-red-200 bg-red-50 p-3 dark:border-red-900/70 dark:bg-red-950/30\">\n            <p className=\"text-sm font-medium text-red-800 dark:text-red-300\">{t('BiChat.Artifacts.FailedToLoad')}</p>\n            <p className=\"text-xs text-red-700 dark:text-red-400\">{error}</p>\n            <button\n              type=\"button\"\n              onClick={() => {\n                void fetchArtifacts({ reset: true, manual: true });\n              }}\n              className=\"cursor-pointer rounded-md border border-red-300 px-2 py-1 text-xs font-medium text-red-700 hover:bg-red-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-400/50 dark:border-red-800 dark:text-red-300 dark:hover:bg-red-900/40\"\n            >\n              {t('BiChat.Alert.Retry')}\n            </button>\n          </div>\n        ) : !canFetchArtifacts ? (\n          <div className=\"rounded-lg border border-amber-200 bg-amber-50 p-3 text-sm text-amber-800 dark:border-amber-900/70 dark:bg-amber-950/30 dark:text-amber-200\">\n            {t('BiChat.Artifacts.Unsupported')}\n          </div>\n        ) : (\n          <>\n            <SessionArtifactList\n              artifacts={artifacts}\n              selectedArtifactId={previewArtifactID || undefined}\n              onSelect={(artifact) => setPreviewArtifactID(artifact.id)}\n            />\n\n            {hasMore && (\n              <div className=\"mt-3 flex justify-center\">\n                <button\n                  type=\"button\"\n                  onClick={() => {\n                    void fetchArtifacts({ reset: false, manual: true });\n                  }}\n                  disabled={loadingMore || refreshing || fetching}\n                  className=\"cursor-pointer rounded-md border border-gray-200 px-3 py-1.5 text-xs font-medium text-gray-700 transition-colors hover:bg-gray-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800\"\n                >\n                  {loadingMore ? t('BiChat.Artifacts.LoadingMore') : t('BiChat.Artifacts.LoadMore')}\n                </button>\n              </div>\n            )}\n          </>\n        )}\n      </div>\n\n      <SessionArtifactPreviewModal\n        isOpen={previewArtifact !== null}\n        artifact={previewArtifact}\n        onClose={() => setPreviewArtifactID(null)}\n        canRename={canRenameArtifacts}\n        canDelete={Boolean(previewArtifact && canDeleteArtifacts && canDeleteArtifact(previewArtifact))}\n        onRename={canRenameArtifacts ? handleRenameArtifact : undefined}\n        onDelete={canDeleteArtifacts ? handleDeleteArtifact : undefined}\n      />\n    </aside>\n  );\n}\n","import { type ReactNode, useState, useMemo } from 'react';\nimport {\n  ChartBar,\n  Code,\n  FileCsv,\n  Image as ImageIcon,\n  Package,\n  Table as TableIcon,\n} from '@phosphor-icons/react';\nimport type { SessionArtifact } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { formatFileSize, getFileVisual, CHART_VISUAL, type FileVisual } from '../utils/fileUtils';\nimport { getArtifactName, isImageArtifact } from '../utils/artifactHelpers';\n\ninterface SessionArtifactListProps {\n  artifacts: SessionArtifact[]\n  selectedArtifactId?: string\n  onSelect: (artifact: SessionArtifact) => void\n}\n\nconst TYPE_LABEL_KEYS: Record<string, string> = {\n  chart: 'BiChat.Artifacts.GroupCharts',\n  table: 'BiChat.Artifacts.GroupTables',\n  code_output: 'BiChat.Artifacts.GroupCodeOutputs',\n  export: 'BiChat.Artifacts.GroupExports',\n  attachment: 'BiChat.Artifacts.GroupAttachments',\n  other: 'BiChat.Artifacts.GroupOther',\n};\n\nfunction getGroupIcon(type: string): ReactNode {\n  const cls = 'h-3.5 w-3.5';\n  switch (type) {\n    case 'chart':\n      return <ChartBar className={cls} weight=\"bold\" />;\n    case 'table':\n      return <TableIcon className={cls} weight=\"bold\" />;\n    case 'code_output':\n      return <Code className={cls} weight=\"bold\" />;\n    case 'export':\n      return <FileCsv className={cls} weight=\"bold\" />;\n    case 'attachment':\n      return <ImageIcon className={cls} weight=\"bold\" />;\n    default:\n      return <Package className={cls} weight=\"bold\" />;\n  }\n}\n\nfunction ImageThumbnail({ src, alt }: { src: string; alt: string }) {\n  const [failed, setFailed] = useState(false);\n  if (failed) {\n    return (\n      <div className=\"w-full aspect-video rounded-lg bg-violet-50 dark:bg-violet-900/30 flex items-center justify-center\">\n        <ImageIcon className=\"h-6 w-6 text-violet-400 dark:text-violet-500\" weight=\"duotone\" />\n      </div>\n    );\n  }\n  return (\n    <img\n      src={src}\n      alt={alt}\n      onError={() => setFailed(true)}\n      className=\"w-full rounded-lg object-cover max-h-32 bg-gray-100 dark:bg-gray-800\"\n    />\n  );\n}\n\nfunction getArtifactFileVisual(artifact: SessionArtifact): FileVisual {\n  if (artifact.type === 'chart') {return CHART_VISUAL;}\n  if (artifact.type === 'code_output') {\n    const v = getFileVisual(artifact.mimeType, getArtifactName(artifact));\n    // Code outputs get a sky accent unless they resolve to something specific (image, etc.)\n    if (v.label === 'TEXT' || v.label === 'FILE') {\n      return { ...v, iconColor: 'text-sky-600 dark:text-sky-400', bgColor: 'bg-sky-100 dark:bg-sky-900/40' };\n    }\n    return v;\n  }\n  return getFileVisual(artifact.mimeType, getArtifactName(artifact));\n}\n\nfunction groupArtifactsByType(artifacts: SessionArtifact[]): Array<{ type: string; items: SessionArtifact[] }> {\n  const grouped = new Map<string, SessionArtifact[]>();\n\n  for (const artifact of artifacts) {\n    const type = artifact.type || 'other';\n    const existing = grouped.get(type);\n    if (existing) {\n      existing.push(artifact);\n      continue;\n    }\n    grouped.set(type, [artifact]);\n  }\n\n  return Array.from(grouped.entries())\n    .map(([type, items]) => ({\n      type,\n      items: items.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt)),\n    }))\n    .sort((a, b) => a.type.localeCompare(b.type));\n}\n\nexport function SessionArtifactList({\n  artifacts,\n  selectedArtifactId,\n  onSelect,\n}: SessionArtifactListProps) {\n  const { t } = useTranslation();\n  const grouped = useMemo(() => groupArtifactsByType(artifacts), [artifacts]);\n\n  if (artifacts.length === 0) {\n    return (\n      <div className=\"flex h-full flex-col items-center justify-center gap-3 px-4 py-12 text-center\">\n        <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-gray-100 dark:bg-gray-800\">\n          <Package className=\"h-6 w-6 text-gray-400 dark:text-gray-500\" weight=\"duotone\" />\n        </div>\n        <div>\n          <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\n            {t('BiChat.Artifacts.Empty')}\n          </p>\n          <p className=\"mt-0.5 text-xs text-gray-400 dark:text-gray-500\">\n            {t('BiChat.Artifacts.EmptySubtitle')}\n          </p>\n          <p className=\"mt-2 text-xs text-gray-400 dark:text-gray-500\">\n            {t('BiChat.Artifacts.EmptyHint')}\n          </p>\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"space-y-5\">\n      {grouped.map((group) => (\n        <section key={group.type}>\n          <div className=\"mb-2 flex items-center gap-1.5 px-0.5\">\n            <span className=\"text-gray-400 dark:text-gray-500\">{getGroupIcon(group.type)}</span>\n            <h3 className=\"text-[11px] font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n              {TYPE_LABEL_KEYS[group.type] ? t(TYPE_LABEL_KEYS[group.type]) : group.type.replace(/_/g, ' ')}\n            </h3>\n            <span className=\"ml-auto text-[10px] tabular-nums text-gray-400 dark:text-gray-500\">\n              {group.items.length}\n            </span>\n          </div>\n          <div className=\"space-y-1\">\n            {group.items.map((artifact) => {\n              const isSelected = artifact.id === selectedArtifactId;\n              const visual = getArtifactFileVisual(artifact);\n              const Icon = visual.icon;\n              const artifactName = getArtifactName(artifact);\n              return (\n                <button\n                  key={artifact.id}\n                  type=\"button\"\n                  onClick={() => onSelect(artifact)}\n                  className={`cursor-pointer group/item w-full rounded-lg border px-3 py-2 text-left transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 ${\n                    isSelected\n                      ? 'border-primary-200 bg-primary-50/80 shadow-sm dark:border-primary-800/60 dark:bg-primary-950/40'\n                      : 'border-transparent bg-white hover:border-gray-200 hover:bg-gray-50 hover:shadow-sm dark:bg-gray-900 dark:hover:border-gray-700/80 dark:hover:bg-gray-800/60'\n                  }`}\n                >\n                  {isImageArtifact(artifact) && artifact.url ? (\n                    <div>\n                      <ImageThumbnail src={artifact.url} alt={artifactName} />\n                      <div className=\"mt-2\">\n                        <span className=\"block truncate text-[13px] font-medium text-gray-900 dark:text-gray-100\">\n                          {artifactName}\n                        </span>\n                        <span className=\"flex items-center gap-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n                          <span>{formatFileSize(artifact.sizeBytes)}</span>\n                          {artifact.description && (\n                            <>\n                              <span className=\"w-0.5 h-0.5 rounded-full bg-gray-300 dark:bg-gray-600\" />\n                              <span className=\"truncate\">{artifact.description}</span>\n                            </>\n                          )}\n                        </span>\n                      </div>\n                    </div>\n                  ) : (\n                    <div className=\"flex items-center gap-2.5\">\n                      <span className={`flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-lg ${visual.bgColor} ${visual.iconColor}`}>\n                        <Icon size={20} weight=\"duotone\" />\n                      </span>\n                      <span className=\"min-w-0 flex-1\">\n                        <span className=\"block truncate text-[13px] font-medium text-gray-900 dark:text-gray-100\">\n                          {artifactName}\n                        </span>\n                        <span className=\"flex items-center gap-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n                          <span>{formatFileSize(artifact.sizeBytes)}</span>\n                          {artifact.description && (\n                            <>\n                              <span className=\"w-0.5 h-0.5 rounded-full bg-gray-300 dark:bg-gray-600\" />\n                              <span className=\"truncate\">{artifact.description}</span>\n                            </>\n                          )}\n                        </span>\n                      </span>\n                    </div>\n                  )}\n                </button>\n              );\n            })}\n          </div>\n        </section>\n      ))}\n    </div>\n  );\n}\n","import type { SessionArtifact } from '../types';\n\nexport const FALLBACK_ARTIFACT_NAME = 'Untitled artifact';\n\nexport function getArtifactName(artifact: SessionArtifact): string {\n  const name = artifact.name?.trim();\n  return name && name.length > 0 ? name : FALLBACK_ARTIFACT_NAME;\n}\n\nexport function isImageArtifact(artifact: SessionArtifact): boolean {\n  const mime = artifact.mimeType?.toLowerCase() || '';\n  const name = getArtifactName(artifact).toLowerCase();\n  return mime.startsWith('image/') || /\\.(png|jpe?g|gif|webp|svg|bmp)$/.test(name);\n}\n\nexport function isPDFArtifact(artifact: SessionArtifact): boolean {\n  const mime = artifact.mimeType?.toLowerCase() || '';\n  const name = getArtifactName(artifact).toLowerCase();\n  return mime.includes('pdf') || name.endsWith('.pdf');\n}\n\nexport function isOfficeDocumentArtifact(artifact: SessionArtifact): boolean {\n  const mime = artifact.mimeType?.toLowerCase() || '';\n  const name = getArtifactName(artifact).toLowerCase();\n  return (\n    mime.includes('wordprocessingml') ||\n    mime.includes('msword') ||\n    mime.includes('excel') ||\n    mime.includes('spreadsheet') ||\n    /\\.(docx?|xlsx?|xlsm|xlsb)$/.test(name)\n  );\n}\n\nexport function isTextArtifact(artifact: SessionArtifact): boolean {\n  const mime = artifact.mimeType?.toLowerCase() || '';\n  const name = getArtifactName(artifact).toLowerCase();\n  return (\n    mime.startsWith('text/') ||\n    mime.includes('json') ||\n    mime.includes('xml') ||\n    mime.includes('yaml') ||\n    mime.includes('csv') ||\n    mime.includes('tab-separated') ||\n    /\\.(txt|md|json|xml|ya?ml|csv|tsv|log|sql)$/.test(name)\n  );\n}\n","import { useEffect, useState } from 'react';\n// Shadow-DOM-safe dialog: Headless UI Dialog portals to document.body, escaping\n// the shadow root and dropping all scoped Tailwind. InlineDialog stays inline.\nimport { InlineDialog, InlineDialogBackdrop, InlineDialogPanel } from './InlineDialog';\nimport { FloppyDisk, PencilSimple, Trash, X } from '@phosphor-icons/react';\nimport type { SessionArtifact } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { SessionArtifactPreview } from './SessionArtifactPreview';\n\ninterface SessionArtifactPreviewModalProps {\n  isOpen: boolean\n  artifact: SessionArtifact | null\n  canRename?: boolean\n  canDelete?: boolean\n  onClose: () => void\n  onRename?: (artifact: SessionArtifact, name: string) => Promise<void>\n  onDelete?: (artifact: SessionArtifact) => Promise<void>\n}\n\nexport function SessionArtifactPreviewModal({\n  isOpen,\n  artifact,\n  canRename = false,\n  canDelete = false,\n  onClose,\n  onRename,\n  onDelete,\n}: SessionArtifactPreviewModalProps) {\n  const { t } = useTranslation();\n  const [isEditingName, setIsEditingName] = useState(false);\n  const [nameDraft, setNameDraft] = useState('');\n  const [submittingRename, setSubmittingRename] = useState(false);\n  const [submittingDelete, setSubmittingDelete] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  useEffect(() => {\n    setIsEditingName(false);\n    setSubmittingRename(false);\n    setSubmittingDelete(false);\n    setError(null);\n    setNameDraft(artifact?.name || '');\n  }, [artifact]);\n\n  const handleClose = () => {\n    if (submittingRename || submittingDelete) {\n      return;\n    }\n    onClose();\n  };\n\n  const handleRename = async () => {\n    if (!artifact || !onRename) {\n      return;\n    }\n\n    const nextName = nameDraft.trim();\n    if (!nextName || nextName === artifact.name) {\n      setIsEditingName(false);\n      setNameDraft(artifact.name);\n      return;\n    }\n\n    setSubmittingRename(true);\n    setError(null);\n    try {\n      await onRename(artifact, nextName);\n      setIsEditingName(false);\n    } catch (err) {\n      setError(err instanceof Error ? err.message : t('BiChat.Artifacts.RenameFailed'));\n    } finally {\n      setSubmittingRename(false);\n    }\n  };\n\n  const handleDelete = async () => {\n    if (!artifact || !onDelete) {\n      return;\n    }\n    if (!window.confirm(t('BiChat.Artifacts.DeleteConfirm'))) {\n      return;\n    }\n\n    setSubmittingDelete(true);\n    setError(null);\n    try {\n      await onDelete(artifact);\n      onClose();\n    } catch (err) {\n      setError(err instanceof Error ? err.message : t('BiChat.Artifacts.DeleteFailed'));\n    } finally {\n      setSubmittingDelete(false);\n    }\n  };\n\n  if (!artifact) {\n    return null;\n  }\n\n  return (\n    <InlineDialog open={isOpen} onClose={handleClose} className=\"relative z-50\">\n      <InlineDialogBackdrop className=\"fixed inset-0 bg-black/50 backdrop-blur-sm\" />\n\n      <div className=\"fixed inset-0 overflow-y-auto p-4 lg:p-6\">\n        <div className=\"mx-auto flex min-h-full w-full max-w-6xl items-center justify-center\">\n          <InlineDialogPanel className=\"flex max-h-[92vh] w-full flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\">\n            <div className=\"flex items-start justify-between gap-3 border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n              <div className=\"min-w-0 flex-1\">\n                {isEditingName ? (\n                  <div className=\"flex items-center gap-2\">\n                    <input\n                      value={nameDraft}\n                      onChange={(e) => setNameDraft(e.target.value)}\n                      onKeyDown={(e) => {\n                        if (e.key === 'Enter') {\n                          e.preventDefault();\n                          void handleRename();\n                        }\n                        if (e.key === 'Escape') {\n                          e.preventDefault();\n                          setIsEditingName(false);\n                          setNameDraft(artifact.name);\n                        }\n                      }}\n                      className=\"w-full rounded-lg border border-gray-300 px-3 py-1.5 text-sm text-gray-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100\"\n                      aria-label={t('BiChat.Artifacts.Rename')}\n                      autoFocus\n                    />\n                    <button\n                      type=\"button\"\n                      onClick={() => {\n                        void handleRename();\n                      }}\n                      disabled={submittingRename}\n                      className=\"cursor-pointer inline-flex items-center gap-1 rounded-lg bg-primary-600 px-2.5 py-1.5 text-xs font-medium text-white transition-colors hover:bg-primary-700 disabled:cursor-not-allowed disabled:opacity-60\"\n                    >\n                      <FloppyDisk className=\"h-3.5 w-3.5\" weight=\"bold\" />\n                      {t('BiChat.Message.Save')}\n                    </button>\n                    <button\n                      type=\"button\"\n                      onClick={() => {\n                        setIsEditingName(false);\n                        setNameDraft(artifact.name);\n                      }}\n                      disabled={submittingRename}\n                      className=\"cursor-pointer rounded-lg border border-gray-200 px-2.5 py-1.5 text-xs font-medium text-gray-700 transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800\"\n                    >\n                      {t('BiChat.Message.Cancel')}\n                    </button>\n                  </div>\n                ) : (\n                  <h2 className=\"truncate text-base font-semibold text-gray-900 dark:text-gray-100\">\n                    {artifact.name}\n                  </h2>\n                )}\n                {artifact.description && (\n                  <p className=\"mt-1 truncate text-xs text-gray-500 dark:text-gray-400\">\n                    {artifact.description}\n                  </p>\n                )}\n              </div>\n\n              <div className=\"flex items-center gap-1.5\">\n                {canRename && onRename && !isEditingName && (\n                  <button\n                    type=\"button\"\n                    onClick={() => {\n                      setError(null);\n                      setIsEditingName(true);\n                    }}\n                    className=\"cursor-pointer rounded-lg border border-gray-200 p-2 text-gray-600 transition-colors hover:bg-gray-50 hover:text-gray-900 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n                    aria-label={t('BiChat.Artifacts.Rename')}\n                    title={t('BiChat.Artifacts.Rename')}\n                  >\n                    <PencilSimple className=\"h-4 w-4\" weight=\"regular\" />\n                  </button>\n                )}\n                {canDelete && onDelete && (\n                  <button\n                    type=\"button\"\n                    onClick={() => {\n                      void handleDelete();\n                    }}\n                    disabled={submittingDelete}\n                    className=\"cursor-pointer rounded-lg border border-red-200 p-2 text-red-600 transition-colors hover:bg-red-50 hover:text-red-700 disabled:cursor-not-allowed disabled:opacity-60 dark:border-red-900/60 dark:text-red-400 dark:hover:bg-red-950/30 dark:hover:text-red-300\"\n                    aria-label={t('BiChat.Artifacts.Delete')}\n                    title={t('BiChat.Artifacts.Delete')}\n                  >\n                    <Trash className=\"h-4 w-4\" weight=\"regular\" />\n                  </button>\n                )}\n                <button\n                  type=\"button\"\n                  onClick={handleClose}\n                  className=\"cursor-pointer rounded-lg border border-gray-200 p-2 text-gray-600 transition-colors hover:bg-gray-50 hover:text-gray-900 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n                  aria-label={t('BiChat.Common.Close')}\n                  title={t('BiChat.Common.Close')}\n                >\n                  <X className=\"h-4 w-4\" weight=\"bold\" />\n                </button>\n              </div>\n            </div>\n\n            <div className=\"min-h-0 flex-1 overflow-auto p-4 lg:p-5\">\n              {error && (\n                <div className=\"mb-3 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900/70 dark:bg-red-950/30 dark:text-red-300\">\n                  {error}\n                </div>\n              )}\n              <SessionArtifactPreview artifact={artifact} />\n            </div>\n          </InlineDialogPanel>\n        </div>\n      </div>\n    </InlineDialog>\n  );\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { ArrowSquareOut, DownloadSimple, FileText, SpinnerGap, WarningCircle } from '@phosphor-icons/react';\nimport type { SessionArtifact } from '../types';\nimport { parseChartDataFromSpec, isRecord } from '../utils/chartSpec';\nimport { parseRenderTableDataFromMetadata } from '../utils/tableSpec';\nimport { ChartCard } from './ChartCard';\nimport { InteractiveTableCard } from './InteractiveTableCard';\nimport { useTranslation } from '../hooks/useTranslation';\nimport {\n  getArtifactName,\n  isImageArtifact,\n  isPDFArtifact,\n  isOfficeDocumentArtifact,\n  isTextArtifact,\n} from '../utils/artifactHelpers';\n\ninterface SessionArtifactPreviewProps {\n  artifact: SessionArtifact\n}\n\nconst TEXT_PREVIEW_MAX_CHARS = 24000;\n\nfunction parseChartDataFromArtifact(artifact: SessionArtifact) {\n  const metadata = artifact.metadata;\n  if (!metadata || !isRecord(metadata)) {\n    return null;\n  }\n\n  const spec = isRecord(metadata.spec) ? metadata.spec : metadata;\n  if (!isRecord(spec)) {\n    return null;\n  }\n\n  return parseChartDataFromSpec(spec, getArtifactName(artifact));\n}\n\nfunction isAbsoluteHTTPURL(url: string): boolean {\n  return /^https?:\\/\\//i.test(url);\n}\n\nfunction WarningBox({ message }: { message: string }) {\n  return (\n    <div className=\"flex items-start gap-2.5 rounded-xl border border-amber-200/80 bg-amber-50 p-3 text-sm text-amber-800 dark:border-amber-800/40 dark:bg-amber-950/20 dark:text-amber-200\">\n      <WarningCircle className=\"mt-0.5 h-4 w-4 shrink-0\" weight=\"duotone\" />\n      <span className=\"leading-relaxed\">{message}</span>\n    </div>\n  );\n}\n\nfunction ArtifactActions({ url }: { url: string }) {\n  const { t } = useTranslation();\n  const openLabel = t('BiChat.Artifacts.OpenInNewTab');\n  const downloadLabel = t('BiChat.Artifacts.Download');\n\n  return (\n    <div className=\"flex items-center gap-2\">\n      <a\n        href={url}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n        className=\"inline-flex items-center gap-2 rounded-lg border border-gray-200 px-3 py-1.5 text-xs font-medium text-gray-700 transition-colors hover:bg-gray-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800\"\n      >\n        <ArrowSquareOut className=\"h-3.5 w-3.5\" weight=\"bold\" />\n        {openLabel}\n      </a>\n      <a\n        href={url}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n        download\n        className=\"inline-flex items-center gap-2 rounded-lg bg-primary-600 px-3 py-1.5 text-xs font-medium text-white shadow-sm transition-colors hover:bg-primary-700\"\n      >\n        <DownloadSimple className=\"h-3.5 w-3.5\" weight=\"bold\" />\n        {downloadLabel}\n      </a>\n    </div>\n  );\n}\n\nfunction TextArtifactPreview({ artifact }: { artifact: SessionArtifact }) {\n  const { t } = useTranslation();\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<string | null>(null);\n  const [content, setContent] = useState('');\n  const [truncated, setTruncated] = useState(false);\n\n  useEffect(() => {\n    if (!artifact.url) {\n      setLoading(false);\n      setError(t('BiChat.Artifacts.TextPreviewFailed'));\n      return;\n    }\n\n    const controller = new AbortController();\n    setLoading(true);\n    setError(null);\n    setContent('');\n    setTruncated(false);\n\n    fetch(artifact.url, { signal: controller.signal, credentials: 'include' })\n      .then(async (response) => {\n        if (!response.ok) {\n          throw new Error(`HTTP ${response.status}`);\n        }\n        const text = await response.text();\n        if (text.length > TEXT_PREVIEW_MAX_CHARS) {\n          setContent(text.slice(0, TEXT_PREVIEW_MAX_CHARS));\n          setTruncated(true);\n          return;\n        }\n        setContent(text);\n      })\n      .catch((err) => {\n        if (err instanceof Error && err.name === 'AbortError') {\n          return;\n        }\n        setError(t('BiChat.Artifacts.TextPreviewFailed'));\n      })\n      .finally(() => {\n        setLoading(false);\n      });\n\n    return () => {\n      controller.abort();\n    };\n  }, [artifact.url, t]);\n\n  if (loading) {\n    return (\n      <div className=\"flex min-h-[320px] items-center justify-center rounded-xl border border-gray-200 bg-gray-50 text-sm text-gray-500 dark:border-gray-700/60 dark:bg-gray-800/30 dark:text-gray-400\">\n        <SpinnerGap className=\"mr-2 h-4 w-4 animate-spin\" />\n        {t('BiChat.Artifacts.PreviewLoading')}\n      </div>\n    );\n  }\n\n  if (error) {\n    return <WarningBox message={error} />;\n  }\n\n  return (\n    <div className=\"space-y-2\">\n      <pre className=\"max-h-[70vh] overflow-auto rounded-xl border border-gray-200 bg-gray-50 p-3 text-xs leading-relaxed text-gray-800 dark:border-gray-700/60 dark:bg-gray-900 dark:text-gray-100\">\n        {content || t('BiChat.Artifacts.PreviewUnavailable')}\n      </pre>\n      {truncated && (\n        <p className=\"text-xs text-gray-500 dark:text-gray-400\">{t('BiChat.Artifacts.TextPreviewTruncated')}</p>\n      )}\n    </div>\n  );\n}\n\nexport function SessionArtifactPreview({ artifact }: SessionArtifactPreviewProps) {\n  const { t } = useTranslation();\n  const artifactName = getArtifactName(artifact);\n\n  const officeViewerURL = useMemo(() => {\n    if (!artifact.url || !isAbsoluteHTTPURL(artifact.url)) {\n      return null;\n    }\n    return `https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(artifact.url)}`;\n  }, [artifact.url]);\n\n  if (artifact.type === 'chart') {\n    const chartData = parseChartDataFromArtifact(artifact);\n    if (chartData) {\n      return <ChartCard chartData={chartData} />;\n    }\n    return <WarningBox message={t('BiChat.Artifacts.ChartUnavailable')} />;\n  }\n\n  if (artifact.type === 'table' && artifact.metadata && typeof artifact.metadata === 'object') {\n    const tableData = parseRenderTableDataFromMetadata(\n      artifact.metadata as Record<string, unknown>,\n      artifact.id\n    );\n    if (tableData) {\n      return (\n        <div className=\"rounded-xl border border-gray-200/80 bg-white dark:border-gray-700/60 dark:bg-gray-900/30\">\n          <InteractiveTableCard table={tableData} />\n        </div>\n      );\n    }\n    return <WarningBox message={t('BiChat.Artifacts.PreviewUnavailable')} />;\n  }\n\n  if (isImageArtifact(artifact)) {\n    if (!artifact.url) {\n      return <WarningBox message={t('BiChat.Artifacts.ImageUnavailable')} />;\n    }\n\n    return (\n      <div className=\"space-y-3\">\n        <div className=\"overflow-hidden rounded-xl border border-gray-200/80 bg-gray-50/50 dark:border-gray-700/60 dark:bg-gray-800/30\">\n          <img\n            src={artifact.url}\n            alt={artifactName}\n            className=\"h-auto max-h-[72vh] w-full object-contain\"\n            loading=\"lazy\"\n          />\n        </div>\n        <ArtifactActions url={artifact.url} />\n      </div>\n    );\n  }\n\n  if (isPDFArtifact(artifact)) {\n    if (!artifact.url) {\n      return <WarningBox message={t('BiChat.Artifacts.DownloadUnavailable')} />;\n    }\n\n    return (\n      <div className=\"space-y-3\">\n        <div className=\"overflow-hidden rounded-xl border border-gray-200/80 bg-gray-50 dark:border-gray-700/60 dark:bg-gray-900\">\n          <iframe\n            src={artifact.url}\n            title={artifactName}\n            className=\"h-[72vh] w-full\"\n          />\n        </div>\n        <ArtifactActions url={artifact.url} />\n      </div>\n    );\n  }\n\n  if (isOfficeDocumentArtifact(artifact)) {\n    if (!artifact.url) {\n      return <WarningBox message={t('BiChat.Artifacts.DownloadUnavailable')} />;\n    }\n\n    return (\n      <div className=\"space-y-3\">\n        {officeViewerURL ? (\n          <div className=\"overflow-hidden rounded-xl border border-gray-200/80 bg-gray-50 dark:border-gray-700/60 dark:bg-gray-900\">\n            <iframe\n              src={officeViewerURL}\n              title={artifactName}\n              className=\"h-[72vh] w-full\"\n            />\n          </div>\n        ) : (\n          <WarningBox message={t('BiChat.Artifacts.OfficePreviewUnavailable')} />\n        )}\n        <ArtifactActions url={artifact.url} />\n      </div>\n    );\n  }\n\n  if (isTextArtifact(artifact)) {\n    return (\n      <div className=\"space-y-3\">\n        <TextArtifactPreview artifact={artifact} />\n        {artifact.url && <ArtifactActions url={artifact.url} />}\n      </div>\n    );\n  }\n\n  if (artifact.url) {\n    return (\n      <div className=\"space-y-3\">\n        <div className=\"flex min-h-[240px] flex-col items-center justify-center rounded-xl border border-gray-200/80 bg-gray-50/60 p-6 text-center dark:border-gray-700/60 dark:bg-gray-900\">\n          <FileText className=\"h-8 w-8 text-gray-400 dark:text-gray-500\" weight=\"duotone\" />\n          <p className=\"mt-3 text-sm font-medium text-gray-800 dark:text-gray-100\">{t('BiChat.Artifacts.PreviewUnavailable')}</p>\n          <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">{t('BiChat.Artifacts.PreviewNotSupported')}</p>\n        </div>\n        <ArtifactActions url={artifact.url} />\n      </div>\n    );\n  }\n\n  return <WarningBox message={t('BiChat.Artifacts.DownloadUnavailable')} />;\n}\n","import type { RenderTableData, RenderTableExport } from '../types';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readString(value: unknown): string | null {\n  if (typeof value !== 'string') {return null;}\n  const trimmed = value.trim();\n  return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction readPositiveInteger(value: unknown): number | null {\n  if (typeof value === 'string') {\n    const trimmed = value.trim();\n    if (!/^\\d+$/.test(trimmed)) {return null;}\n    const parsed = Number(trimmed);\n    return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;\n  }\n  if (typeof value !== 'number' || !Number.isFinite(value)) {return null;}\n  const n = Math.floor(value);\n  return n > 0 ? n : null;\n}\n\nfunction normalizeRows(value: unknown): unknown[][] {\n  if (!Array.isArray(value)) {return [];}\n\n  const rows: unknown[][] = [];\n  for (const row of value) {\n    if (!Array.isArray(row)) {continue;}\n    rows.push(row);\n  }\n  return rows;\n}\n\nfunction parseExport(value: unknown): RenderTableExport | undefined {\n  if (!isRecord(value)) {return undefined;}\n  const url = readString(value.url);\n  if (!url) {return undefined;}\n\n  return {\n    url,\n    filename: readString(value.filename) || 'table_export.xlsx',\n    rowCount: readPositiveInteger(value.row_count) || readPositiveInteger(value.rowCount) || undefined,\n    fileSizeKB: readPositiveInteger(value.file_size_kb) || readPositiveInteger(value.fileSizeKB) || undefined,\n  };\n}\n\n/**\n * Parses RenderTableData from a record (e.g. artifact metadata from render_table tool).\n */\nexport function parseRenderTableDataFromMetadata(\n  metadata: Record<string, unknown>,\n  fallbackId: string\n): RenderTableData | null {\n  if (!isRecord(metadata)) {return null;}\n  return parseRenderTableDataFromObject(metadata, fallbackId);\n}\n\nfunction parseRenderTableDataFromObject(parsed: Record<string, unknown>, fallbackId: string): RenderTableData | null {\n  const columns = Array.isArray(parsed.columns)\n    ? parsed.columns\n        .map((column) => readString(column))\n        .filter((column): column is string => column !== null)\n    : [];\n  if (columns.length === 0) {return null;}\n\n  const rows = normalizeRows(parsed.rows);\n\n  const headersRaw = Array.isArray(parsed.headers)\n    ? parsed.headers\n        .map((header) => readString(header))\n        .filter((header): header is string => header !== null)\n    : [];\n  const headers = headersRaw.length === columns.length ? headersRaw : columns;\n\n  const columnTypesRaw = Array.isArray(parsed.column_types)\n    ? parsed.column_types\n    : Array.isArray(parsed.columnTypes)\n      ? parsed.columnTypes\n      : [];\n  const columnTypes =\n    columnTypesRaw.length === columns.length\n      ? columnTypesRaw.map((t) => readString(t) || 'string')\n      : undefined;\n\n  const totalRows =\n    readPositiveInteger(parsed.total_rows) ||\n    readPositiveInteger(parsed.totalRows) ||\n    readPositiveInteger(parsed.row_count) ||\n    readPositiveInteger(parsed.rowCount) ||\n    rows.length;\n  const pageSize = readPositiveInteger(parsed.page_size) || readPositiveInteger(parsed.pageSize) || 25;\n\n  const query = readString(parsed.query) || readString(parsed.sql);\n  if (!query) {return null;}\n\n  return {\n    id: readString(parsed.id) || fallbackId,\n    title: readString(parsed.title) || undefined,\n    query,\n    columns,\n    columnTypes,\n    headers,\n    rows,\n    totalRows,\n    pageSize,\n    truncated: parsed.truncated === true,\n    truncatedReason: readString(parsed.truncated_reason) || readString(parsed.truncatedReason) || undefined,\n    export: parseExport(parsed.export),\n    exportPrompt: readString(parsed.export_prompt) || readString(parsed.exportPrompt) || undefined,\n  };\n}\n\nexport function parseRenderTableDataFromJsonString(\n  json: string,\n  fallbackId: string\n): RenderTableData | null {\n  const trimmed = json.trim();\n  if (!trimmed) {return null;}\n\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(trimmed);\n  } catch {\n    return null;\n  }\n\n  if (!isRecord(parsed)) {return null;}\n  return parseRenderTableDataFromObject(parsed, fallbackId);\n}\n","/**\n * SessionMembersModal\n * Polished sharing dialog for managing session members.\n * Uses InlineDialog, UserAvatars, custom search dropdown, and segmented role controls.\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport {\n  InlineDialog, InlineDialogBackdrop, InlineDialogPanel, InlineDialogTitle,\n} from './InlineDialog';\nimport { UserPlus, Trash, Crown, UsersThree, MagnifyingGlass, X } from '@phosphor-icons/react';\nimport type { ChatDataSource, SessionMember, SessionUser } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { UserAvatar } from './UserAvatar';\nimport { ConfirmModal } from './ConfirmModal';\n\nexport interface SessionMembersModalProps {\n  isOpen: boolean\n  sessionId?: string\n  dataSource: ChatDataSource\n  onClose: () => void\n}\n\n// ---------------------------------------------------------------------------\n// RoleSegmentedControl\n// ---------------------------------------------------------------------------\n\nconst ROLES: readonly ['editor', 'viewer'] = ['editor', 'viewer'];\n\nfunction RoleSegmentedControl({\n  value,\n  onChange,\n  disabled,\n  size = 'md',\n  t,\n}: {\n  value: 'editor' | 'viewer'\n  onChange: (role: 'editor' | 'viewer') => void\n  disabled?: boolean\n  size?: 'sm' | 'md'\n  t: (key: string) => string\n}) {\n  const btnBase = size === 'sm'\n    ? 'px-2 py-0.5 text-[11px]'\n    : 'px-3 py-1 text-xs';\n  const currentIndex = ROLES.indexOf(value);\n\n  const handleKeyDown = (e: React.KeyboardEvent) => {\n    if (disabled) {return;}\n    let nextIndex: number | null = null;\n    if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n      e.preventDefault();\n      nextIndex = currentIndex <= 0 ? ROLES.length - 1 : currentIndex - 1;\n    } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n      e.preventDefault();\n      nextIndex = currentIndex >= ROLES.length - 1 ? 0 : currentIndex + 1;\n    }\n    if (nextIndex !== null) {\n      const nextRole = ROLES[nextIndex];\n      onChange(nextRole);\n      const target = e.currentTarget.querySelector(`[data-role=\"${nextRole}\"]`) as HTMLButtonElement | null;\n      target?.focus();\n    }\n  };\n\n  return (\n    <div\n      role=\"radiogroup\"\n      aria-label={t('BiChat.Share.RoleLabel')}\n      className=\"inline-flex rounded-lg border border-gray-200 dark:border-gray-700 p-0.5 bg-gray-50 dark:bg-gray-800/50\"\n      onKeyDown={handleKeyDown}\n    >\n      {ROLES.map((role) => (\n        <button\n          key={role}\n          type=\"button\"\n          role=\"radio\"\n          aria-checked={value === role}\n          tabIndex={value === role ? 0 : -1}\n          data-role={role}\n          disabled={disabled}\n          onClick={() => onChange(role)}\n          className={`${btnBase} cursor-pointer rounded-md font-medium transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 disabled:opacity-50 disabled:cursor-not-allowed ${\n            value === role\n              ? 'bg-primary-600 text-white shadow-sm'\n              : 'text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100'\n          }`}\n        >\n          {role === 'editor' ? t('BiChat.Share.RoleEditor') : t('BiChat.Share.RoleViewer')}\n        </button>\n      ))}\n    </div>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// Skeleton\n// ---------------------------------------------------------------------------\n\nfunction MemberSkeleton() {\n  return (\n    <div className=\"flex items-center gap-3 rounded-xl px-3 py-2.5\" aria-hidden=\"true\">\n      <div className=\"w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse flex-shrink-0\" />\n      <div className=\"flex-1 space-y-1.5\">\n        <div className=\"h-3 w-28 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n        <div className=\"h-2.5 w-16 rounded bg-gray-100 dark:bg-gray-800 animate-pulse\" />\n      </div>\n      <div className=\"h-6 w-16 rounded-lg bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n    </div>\n  );\n}\n\n// ---------------------------------------------------------------------------\n// SessionMembersModal\n// ---------------------------------------------------------------------------\n\nexport function SessionMembersModal({ isOpen, sessionId, dataSource, onClose }: SessionMembersModalProps) {\n  const headingId = useId();\n  const { t } = useTranslation();\n  const statusTimerRef = useRef<ReturnType<typeof setTimeout>>();\n  const [loading, setLoading] = useState(false);\n  const [saving, setSaving] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [users, setUsers] = useState<SessionUser[]>([]);\n  const [members, setMembers] = useState<SessionMember[]>([]);\n  const [selectedUser, setSelectedUser] = useState<SessionUser | null>(null);\n  const [selectedRole, setSelectedRole] = useState<'editor' | 'viewer'>('editor');\n  const [query, setQuery] = useState('');\n  const [confirmRemove, setConfirmRemove] = useState<SessionMember | null>(null);\n  const [statusMessage, setStatusMessage] = useState<string | null>(null);\n  const [dropdownOpen, setDropdownOpen] = useState(false);\n  const [dropdownHighlightIndex, setDropdownHighlightIndex] = useState(0);\n  const dropdownOptionRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n  const canManageMembers = Boolean(\n    dataSource.listUsers\n    && dataSource.listSessionMembers\n    && dataSource.addSessionMember\n    && dataSource.updateSessionMemberRole\n    && dataSource.removeSessionMember\n  );\n\n  const refresh = useCallback(async () => {\n    if (!sessionId || !canManageMembers) {\n      return;\n    }\n    setLoading(true);\n    setError(null);\n    try {\n      const [usersData, membersData] = await Promise.all([\n        dataSource.listUsers!(),\n        dataSource.listSessionMembers!(sessionId),\n      ]);\n      setUsers(usersData);\n      setMembers(membersData);\n    } catch {\n      setError(t('BiChat.Share.LoadFailed'));\n    } finally {\n      setLoading(false);\n    }\n  }, [canManageMembers, dataSource, sessionId, t]);\n\n  useEffect(() => {\n    if (!isOpen) {\n      return;\n    }\n    void refresh();\n  }, [isOpen, refresh]);\n\n  // Reset state when modal closes\n  useEffect(() => {\n    if (!isOpen) {\n      setQuery('');\n      setSelectedUser(null);\n      setSelectedRole('editor');\n      setError(null);\n      setConfirmRemove(null);\n      setStatusMessage(null);\n      setDropdownOpen(false);\n      setDropdownHighlightIndex(0);\n    }\n  }, [isOpen]);\n\n  const memberIDs = useMemo(() => new Set(members.map((m) => m.user.id)), [members]);\n  const availableUsers = useMemo(\n    () => users.filter((user) => !memberIDs.has(user.id)),\n    [users, memberIDs],\n  );\n\n  const filteredUsers = useMemo(() => {\n    if (!query.trim()) {\n      return availableUsers;\n    }\n    const q = query.toLowerCase();\n    return availableUsers.filter(\n      (u) =>\n        u.firstName.toLowerCase().includes(q)\n        || u.lastName.toLowerCase().includes(q)\n        || `${u.firstName} ${u.lastName}`.toLowerCase().includes(q)\n    );\n  }, [availableUsers, query]);\n\n  // Reset dropdown highlight when filtered list changes\n  useEffect(() => {\n    setDropdownHighlightIndex((i) =>\n      Math.min(Math.max(0, i), Math.max(0, filteredUsers.length - 1))\n    );\n  }, [filteredUsers.length]);\n\n  useEffect(() => () => clearTimeout(statusTimerRef.current), []);\n\n  const flashStatus = useCallback((msg: string) => {\n    clearTimeout(statusTimerRef.current);\n    setStatusMessage(msg);\n    statusTimerRef.current = setTimeout(() => setStatusMessage(null), 3000);\n  }, []);\n\n  const handleAdd = useCallback(async () => {\n    if (!sessionId || !selectedUser || !dataSource.addSessionMember) {\n      return;\n    }\n    setSaving(true);\n    setError(null);\n    try {\n      await dataSource.addSessionMember(sessionId, selectedUser.id, selectedRole);\n      setSelectedUser(null);\n      setQuery('');\n      flashStatus(t('BiChat.Share.MemberAdded'));\n      await refresh();\n    } catch {\n      setError(t('BiChat.Share.AddFailed'));\n    } finally {\n      setSaving(false);\n    }\n  }, [sessionId, selectedUser, selectedRole, dataSource.addSessionMember, refresh, t, flashStatus]);\n\n  const handleUpdateRole = useCallback(async (userId: string, role: 'editor' | 'viewer') => {\n    if (!sessionId || !dataSource.updateSessionMemberRole) {\n      return;\n    }\n    setSaving(true);\n    setError(null);\n    try {\n      await dataSource.updateSessionMemberRole(sessionId, userId, role);\n      await refresh();\n    } catch {\n      setError(t('BiChat.Share.UpdateFailed'));\n    } finally {\n      setSaving(false);\n    }\n  }, [sessionId, dataSource.updateSessionMemberRole, refresh]);\n\n  const handleRemove = useCallback(async (userId: string) => {\n    if (!sessionId || !dataSource.removeSessionMember) {\n      return;\n    }\n    setSaving(true);\n    setError(null);\n    try {\n      await dataSource.removeSessionMember(sessionId, userId);\n      flashStatus(t('BiChat.Share.MemberRemoved'));\n      await refresh();\n    } catch {\n      setError(t('BiChat.Share.RemoveFailed'));\n    } finally {\n      setSaving(false);\n    }\n  }, [sessionId, dataSource.removeSessionMember, refresh, flashStatus]);\n\n  return (\n    <>\n      <InlineDialog open={isOpen} onClose={onClose} className=\"relative z-40\">\n        <InlineDialogBackdrop className=\"fixed inset-0 bg-black/40 dark:bg-black/60 backdrop-blur-sm transition-opacity duration-200\" />\n\n        <div className=\"fixed inset-0 flex items-center justify-center z-50 p-4\">\n          <InlineDialogPanel\n            aria-labelledby={headingId}\n            className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl dark:shadow-2xl dark:shadow-black/30 max-w-md w-full\"\n          >\n            {/* Header */}\n            <div className=\"flex items-center justify-between px-6 pt-5 pb-4\">\n              <div className=\"flex items-center gap-3\">\n                <div className=\"flex items-center justify-center w-9 h-9 rounded-xl bg-primary-50 dark:bg-primary-950/40 border border-primary-200/60 dark:border-primary-800/40\">\n                  <UsersThree size={18} weight=\"duotone\" className=\"text-primary-600 dark:text-primary-400\" />\n                </div>\n                <InlineDialogTitle id={headingId} className=\"text-base font-semibold text-gray-900 dark:text-gray-100\">\n                  {t('BiChat.Share.Title')}\n                </InlineDialogTitle>\n              </div>\n              <button\n                type=\"button\"\n                onClick={onClose}\n                className=\"rounded-lg p-1.5 text-gray-400 hover:text-gray-600 hover:bg-gray-100 dark:hover:text-gray-300 dark:hover:bg-gray-700 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n                aria-label={t('BiChat.Common.Close')}\n              >\n                <X size={18} />\n              </button>\n            </div>\n\n            {/* Body */}\n            <div className=\"px-6 pb-5 space-y-4\">\n              {!canManageMembers && (\n                <div className=\"rounded-xl border border-amber-200 bg-amber-50 px-3 py-2.5 text-xs text-amber-700 dark:border-amber-800/60 dark:bg-amber-900/20 dark:text-amber-300\">\n                  {t('BiChat.Share.Unsupported')}\n                </div>\n              )}\n\n              {error && (\n                <div className=\"rounded-xl border border-red-200 bg-red-50 px-3 py-2.5 text-xs text-red-700 dark:border-red-800/60 dark:bg-red-900/20 dark:text-red-300\">\n                  {error}\n                </div>\n              )}\n\n              {/* Status announcements for screen readers */}\n              <div aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n                {statusMessage}\n              </div>\n\n              {/* Members list */}\n              <div>\n                <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n                  {t('BiChat.Share.Members')}{!loading && members.length > 0 ? ` (${members.length})` : ''}\n                </h3>\n\n                <div className=\"max-h-64 overflow-y-auto -mx-1 px-1 space-y-1\">\n                  {loading ? (\n                    <>\n                      <MemberSkeleton />\n                      <MemberSkeleton />\n                      <MemberSkeleton />\n                    </>\n                  ) : members.length === 0 ? (\n                    <div className=\"flex flex-col items-center justify-center py-8 text-gray-400 dark:text-gray-500\">\n                      <UsersThree size={32} weight=\"thin\" className=\"mb-2\" />\n                      <p className=\"text-sm\">{t('BiChat.Share.Empty')}</p>\n                    </div>\n                  ) : (\n                    members.map((member) => (\n                      <div\n                        key={member.user.id}\n                        className=\"flex items-center gap-3 rounded-xl px-3 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700/40\"\n                      >\n                        <UserAvatar\n                          firstName={member.user.firstName}\n                          lastName={member.user.lastName}\n                          initials={member.user.initials}\n                          size=\"sm\"\n                        />\n                        <div className=\"flex-1 min-w-0\">\n                          <div className=\"truncate text-sm font-medium text-gray-900 dark:text-gray-100\">\n                            {member.user.firstName} {member.user.lastName}\n                          </div>\n                        </div>\n\n                        {member.role === 'owner' ? (\n                          <span className=\"inline-flex items-center gap-1 rounded-full bg-amber-50 dark:bg-amber-900/20 border border-amber-200/60 dark:border-amber-800/40 px-2.5 py-0.5 text-[11px] font-medium text-amber-700 dark:text-amber-300\">\n                            <Crown size={12} weight=\"duotone\" />\n                            {t('BiChat.Share.RoleOwner')}\n                          </span>\n                        ) : (\n                          <div className=\"flex items-center gap-2 flex-shrink-0\">\n                            <RoleSegmentedControl\n                              value={member.role}\n                              onChange={(role) => handleUpdateRole(member.user.id, role)}\n                              disabled={saving}\n                              size=\"sm\"\n                              t={t}\n                            />\n                            <button\n                              type=\"button\"\n                              disabled={saving}\n                              onClick={() => setConfirmRemove(member)}\n                              className=\"cursor-pointer rounded-lg p-1.5 text-gray-400 transition-colors hover:bg-red-50 hover:text-red-600 dark:hover:bg-red-900/20 dark:hover:text-red-400 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500/50\"\n                              aria-label={`${t('BiChat.Share.Remove')} ${member.user.firstName} ${member.user.lastName}`}\n                            >\n                              <Trash size={14} />\n                            </button>\n                          </div>\n                        )}\n                      </div>\n                    ))\n                  )}\n                </div>\n              </div>\n\n              {/* Add member */}\n              {canManageMembers && (\n                <div className=\"rounded-xl border border-gray-200 dark:border-gray-700 p-3 space-y-3\">\n                  <h3 className=\"text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n                    {t('BiChat.Share.AddMember')}\n                  </h3>\n\n                  {/* User search + dropdown — outer container owns blur-to-close so keyboard nav does not close dropdown */}\n                  <div\n                    className=\"relative\"\n                    onBlur={(e: React.FocusEvent<HTMLDivElement>) => {\n                      if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n                        setDropdownOpen(false);\n                      }\n                    }}\n                  >\n                    <div className=\"relative\">\n                      <MagnifyingGlass\n                        size={14}\n                        className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500\"\n                      />\n                      <input\n                        type=\"text\"\n                        className=\"w-full rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800/60 pl-8 pr-3 py-2 text-sm text-gray-900 dark:text-gray-100 placeholder-gray-400 dark:placeholder-gray-500 transition-colors focus:border-primary-400 dark:focus:border-primary-600 focus:outline-none focus:ring-2 focus:ring-primary-500/20\"\n                        placeholder={t('BiChat.Share.SearchUsers')}\n                        value={selectedUser ? `${selectedUser.firstName} ${selectedUser.lastName}` : query}\n                        onFocus={() => { setDropdownOpen(true); setDropdownHighlightIndex(0); if (selectedUser) { setSelectedUser(null); setQuery(''); } }}\n                        onChange={(e) => { setQuery(e.target.value); setSelectedUser(null); setDropdownOpen(true); setDropdownHighlightIndex(0); }}\n                        onKeyDown={(e) => {\n                          if (!dropdownOpen || filteredUsers.length === 0) {\n                            if (e.key === 'Escape') { setDropdownOpen(false); }\n                            return;\n                          }\n                          if (e.key === 'Escape') {\n                            e.preventDefault();\n                            setDropdownOpen(false);\n                            setDropdownHighlightIndex(0);\n                            return;\n                          }\n                          if (e.key === 'ArrowDown') {\n                            e.preventDefault();\n                            const next = (dropdownHighlightIndex + 1) % filteredUsers.length;\n                            setDropdownHighlightIndex(next);\n                            setTimeout(() => dropdownOptionRefs.current[next]?.focus(), 0);\n                            return;\n                          }\n                          if (e.key === 'ArrowUp') {\n                            e.preventDefault();\n                            const next = dropdownHighlightIndex <= 0 ? filteredUsers.length - 1 : dropdownHighlightIndex - 1;\n                            setDropdownHighlightIndex(next);\n                            setTimeout(() => dropdownOptionRefs.current[next]?.focus(), 0);\n                            return;\n                          }\n                          if (e.key === 'Enter') {\n                            e.preventDefault();\n                            const user = filteredUsers[dropdownHighlightIndex];\n                            if (user) {\n                              setSelectedUser(user);\n                              setQuery('');\n                              setDropdownOpen(false);\n                            }\n                          }\n                        }}\n                      />\n                    </div>\n\n                    {dropdownOpen && !selectedUser && (\n                      <div className=\"absolute z-10 mt-1 max-h-48 w-full overflow-auto rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 shadow-lg py-1\">\n                        {filteredUsers.length === 0 ? (\n                          <div className=\"px-3 py-2 text-sm text-gray-500 dark:text-gray-400\">\n                            {availableUsers.length === 0\n                              ? t('BiChat.Share.NoUsersAvailable')\n                              : t('BiChat.Share.NoSearchResults')}\n                          </div>\n                        ) : (\n                          filteredUsers.map((user, index) => (\n                            <button\n                              key={user.id}\n                              type=\"button\"\n                              ref={(el) => { dropdownOptionRefs.current[index] = el; }}\n                              className={`flex w-full items-center gap-2.5 px-3 py-2 cursor-pointer transition-colors hover:bg-primary-50 dark:hover:bg-primary-900/20 ${index === dropdownHighlightIndex ? 'bg-primary-50 dark:bg-primary-900/20' : ''}`}\n                              onMouseDown={(e) => e.preventDefault()}\n                              onClick={() => { setSelectedUser(user); setQuery(''); setDropdownOpen(false); }}\n                            >\n                              <UserAvatar\n                                firstName={user.firstName}\n                                lastName={user.lastName}\n                                initials={user.initials}\n                                size=\"xs\"\n                              />\n                              <span className=\"text-sm text-gray-900 dark:text-gray-100\">\n                                {user.firstName} {user.lastName}\n                              </span>\n                            </button>\n                          ))\n                        )}\n                      </div>\n                    )}\n                  </div>\n\n                  {/* Role selector + Add button */}\n                  <div className=\"flex items-center justify-between\">\n                    <RoleSegmentedControl\n                      value={selectedRole}\n                      onChange={setSelectedRole}\n                      disabled={saving}\n                      t={t}\n                    />\n                    <button\n                      type=\"button\"\n                      onClick={handleAdd}\n                      disabled={saving || !selectedUser}\n                      className=\"inline-flex cursor-pointer items-center gap-1.5 rounded-xl bg-primary-600 px-3.5 py-2 text-sm font-medium text-white shadow-sm transition-all duration-150 hover:bg-primary-700 hover:shadow active:bg-primary-800 disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-800\"\n                    >\n                      <UserPlus size={14} />\n                      {t('BiChat.Share.Add')}\n                    </button>\n                  </div>\n                </div>\n              )}\n            </div>\n          </InlineDialogPanel>\n        </div>\n      </InlineDialog>\n\n      {/* Remove confirmation */}\n      <ConfirmModal\n        isOpen={!!confirmRemove}\n        isDanger\n        title={t('BiChat.Share.RemoveConfirmTitle')}\n        message={\n          confirmRemove\n            ? t('BiChat.Share.RemoveConfirmMessage').replace(\n                '{{name}}',\n                `${confirmRemove.user.firstName} ${confirmRemove.user.lastName}`\n              )\n            : ''\n        }\n        confirmText={t('BiChat.Share.Remove')}\n        onConfirm={() => {\n          if (confirmRemove) {\n            void handleRemove(confirmRemove.user.id);\n          }\n          setConfirmRemove(null);\n        }}\n        onCancel={() => setConfirmRemove(null)}\n      />\n    </>\n  );\n}\n\nexport default SessionMembersModal;\n","/**\n * ConfirmModal Component\n * Polished confirmation dialog with contextual icon, refined typography,\n * and smooth micro-interactions.\n * Uses @headlessui/react Dialog for accessible modal behavior.\n */\n\nimport { memo } from 'react';\nimport {\n  InlineDialog, InlineDialogBackdrop, InlineDialogPanel, InlineDialogTitle, InlineDialogDescription,\n} from './InlineDialog';\nimport { WarningCircle } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface ConfirmModalProps {\n  /** Whether the modal is open */\n  isOpen: boolean\n  /** Modal title */\n  title: string\n  /** Modal message/description */\n  message: string\n  /** Callback when user confirms */\n  onConfirm: () => void\n  /** Callback when user cancels */\n  onCancel: () => void\n  /** Confirm button text (defaults to \"Confirm\") */\n  confirmText?: string\n  /** Cancel button text (defaults to \"Cancel\") */\n  cancelText?: string\n  /** Whether this is a danger/destructive action (red confirm button) */\n  isDanger?: boolean\n}\n\nfunction ConfirmModalBase({\n  isOpen,\n  title,\n  message,\n  onConfirm,\n  onCancel,\n  confirmText,\n  cancelText,\n  isDanger = false,\n}: ConfirmModalProps) {\n  const { t } = useTranslation();\n  const resolvedConfirmText = confirmText?.trim() ? confirmText : t('BiChat.Common.Confirm');\n  const resolvedCancelText = cancelText?.trim() ? cancelText : t('BiChat.Common.Cancel');\n  return (\n    <InlineDialog open={isOpen} onClose={onCancel} className=\"relative z-40\">\n      {/* Backdrop */}\n      <InlineDialogBackdrop className=\"fixed inset-0 bg-black/40 dark:bg-black/60 backdrop-blur-sm transition-opacity duration-200\" />\n\n      {/* Modal */}\n      <div className=\"fixed inset-0 flex items-center justify-center z-50 p-4\">\n        <InlineDialogPanel className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl dark:shadow-2xl dark:shadow-black/30 max-w-sm w-full overflow-hidden\">\n          <div className=\"px-6 pt-6 pb-5\">\n            {/* Icon + Title */}\n            <div className=\"flex items-start gap-4\">\n              {isDanger && (\n                <div className=\"flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-xl bg-red-50 dark:bg-red-950/40 border border-red-200/60 dark:border-red-800/40\">\n                  <WarningCircle size={22} weight=\"duotone\" className=\"text-red-600 dark:text-red-400\" />\n                </div>\n              )}\n              <div className=\"flex-1 min-w-0\">\n                <InlineDialogTitle className=\"text-base font-semibold text-gray-900 dark:text-gray-100 leading-snug\">\n                  {title}\n                </InlineDialogTitle>\n                <InlineDialogDescription className=\"mt-2 text-sm text-gray-600 dark:text-gray-400 leading-relaxed\">\n                  {message}\n                </InlineDialogDescription>\n              </div>\n            </div>\n          </div>\n\n          {/* Actions */}\n          <div className=\"flex items-center justify-end gap-2.5 px-6 pb-5\">\n            <button\n              type=\"button\"\n              onClick={onCancel}\n              {...(isDanger ? { 'data-autofocus': true } : {})}\n              className=\"cursor-pointer px-4 py-2 text-sm font-medium rounded-xl text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700/60 hover:bg-gray-200 dark:hover:bg-gray-700 active:bg-gray-250 dark:active:bg-gray-600 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-800\"\n              data-testid=\"confirm-modal-cancel\"\n            >\n              {resolvedCancelText}\n            </button>\n            <button\n              type=\"button\"\n              {...(!isDanger ? { 'data-autofocus': true } : {})}\n              onClick={onConfirm}\n              className={[\n                'cursor-pointer px-4 py-2 text-sm font-medium rounded-xl text-white',\n                'transition-all duration-150 shadow-sm hover:shadow',\n                'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-800',\n                isDanger\n                  ? 'bg-red-600 hover:bg-red-700 active:bg-red-800 focus-visible:ring-red-500/50'\n                  : 'bg-primary-600 hover:bg-primary-700 active:bg-primary-800 focus-visible:ring-primary-500/50',\n              ].join(' ')}\n              data-testid=\"confirm-modal-confirm\"\n            >\n              {resolvedConfirmText}\n            </button>\n          </div>\n        </InlineDialogPanel>\n      </div>\n    </InlineDialog>\n  );\n}\n\nconst ConfirmModal = memo(ConfirmModalBase);\nConfirmModal.displayName = 'ConfirmModal';\n\nexport { ConfirmModal };\nexport default ConfirmModal;\n","/**\n * StreamError Component\n * Error recovery UI for streaming failures\n */\n\nimport { motion } from 'framer-motion';\nimport { Warning, ArrowClockwise, ArrowsCounterClockwise, X } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface StreamErrorProps {\n  /** Error message to display */\n  error: string\n  /** Callback to retry the failed operation */\n  onRetry?: () => void\n  /** Callback to regenerate the message */\n  onRegenerate?: () => void\n  /** Callback to dismiss the error */\n  onDismiss?: () => void\n  /** Whether to show compact mode (less padding) */\n  compact?: boolean\n}\n\nexport function StreamError({\n  error,\n  onRetry,\n  onRegenerate,\n  onDismiss,\n  compact = false,\n}: StreamErrorProps) {\n  const { t } = useTranslation();\n\n  return (\n    <motion.div\n      initial={{ opacity: 0, y: 10 }}\n      animate={{ opacity: 1, y: 0 }}\n      exit={{ opacity: 0, y: -10 }}\n      className={`flex items-start gap-3 ${compact ? 'px-3 py-2.5' : 'px-4 py-3'} bg-red-50 dark:bg-red-950/40 border border-red-200/80 dark:border-red-900/60 rounded-xl shadow-sm`}\n      role=\"alert\"\n    >\n      <div className=\"flex-shrink-0 mt-0.5 flex items-center justify-center w-7 h-7 rounded-full bg-red-100 dark:bg-red-900/40\">\n        <Warning\n          className=\"w-4 h-4 text-red-600 dark:text-red-400\"\n          weight=\"fill\"\n        />\n      </div>\n      <div className=\"flex-1 min-w-0\">\n        <p className=\"text-sm font-medium text-red-800 dark:text-red-200 leading-snug\">\n          {t('BiChat.Error.Generic')}\n        </p>\n        <p className=\"mt-0.5 text-xs text-red-600/80 dark:text-red-400/70 break-words leading-relaxed\">\n          {error}\n        </p>\n        <div className=\"flex items-center gap-2 mt-2\">\n          {onRetry && (\n            <button\n              onClick={onRetry}\n              className=\"cursor-pointer inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-white bg-red-600 hover:bg-red-700 active:bg-red-800 dark:bg-red-700 dark:hover:bg-red-600 rounded-lg transition-colors shadow-sm\"\n              type=\"button\"\n            >\n              <ArrowClockwise className=\"w-3.5 h-3.5\" />\n              {t('BiChat.StreamError.Retry')}\n            </button>\n          )}\n          {onRegenerate && (\n            <button\n              onClick={onRegenerate}\n              className=\"cursor-pointer inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg transition-colors shadow-sm\"\n              type=\"button\"\n            >\n              <ArrowsCounterClockwise className=\"w-3.5 h-3.5\" />\n              {t('BiChat.StreamError.Regenerate')}\n            </button>\n          )}\n        </div>\n      </div>\n      {onDismiss && (\n        <button\n          onClick={onDismiss}\n          className=\"cursor-pointer flex-shrink-0 mt-0.5 inline-flex items-center justify-center w-6 h-6 text-red-400 dark:text-red-500 hover:text-red-600 dark:hover:text-red-300 hover:bg-red-100 dark:hover:bg-red-900/40 rounded-md transition-colors\"\n          type=\"button\"\n          aria-label={t('BiChat.Chat.DismissNotification')}\n        >\n          <X className=\"w-3.5 h-3.5\" />\n        </button>\n      )}\n    </motion.div>\n  );\n}\n","import { useEffect, useCallback, useMemo } from 'react';\nimport { Lightning, Brain } from '@phosphor-icons/react';\nimport { useChatSession } from '../context/ChatContext';\nimport { useIotaContext } from '../context/IotaContext';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ModelEntry {\n  id: string\n  label: string\n  default?: boolean\n}\n\nexport function ModelSelector() {\n  const { model, setModel } = useChatSession();\n  const context = useIotaContext();\n  const { t } = useTranslation();\n\n  const models: ModelEntry[] = useMemo(\n    () => context.extensions?.llm?.models ?? [],\n    [context.extensions?.llm?.models],\n  );\n\n  const defaultModel = models.find((m) => m.default) ?? models[0];\n  const currentModel = model ?? defaultModel?.id;\n\n  // Set default model on mount\n  useEffect(() => {\n    if (!model && defaultModel) {\n      setModel(defaultModel.id);\n    }\n  }, [model, defaultModel, setModel]);\n\n  // Keyboard shortcut: Cmd+Shift+M to rotate\n  const rotateModel = useCallback(() => {\n    const currentIndex = models.findIndex((m) => m.id === currentModel);\n    const nextIndex = (currentIndex + 1) % models.length;\n    setModel(models[nextIndex].id);\n  }, [currentModel, models, setModel]);\n\n  useEffect(() => {\n    const handler = (e: KeyboardEvent) => {\n      const isModifierPressed = e.metaKey || e.ctrlKey;\n      const isShortcutKey = e.code === 'KeyM' || e.key.toLowerCase() === 'm';\n\n      if (isModifierPressed && e.shiftKey && !e.altKey && isShortcutKey) {\n        e.preventDefault();\n        rotateModel();\n      }\n    };\n    document.addEventListener('keydown', handler);\n    return () => document.removeEventListener('keydown', handler);\n  }, [rotateModel]);\n\n  // Don't render if less than 2 models\n  if (models.length < 2) {return null;}\n\n  return (\n    <div className=\"flex items-center justify-between px-4 pt-3 pb-1\">\n      <div className=\"inline-flex rounded-lg bg-gray-100 p-0.5 dark:bg-gray-800\">\n        {models.map((m, i) => {\n          const isActive = m.id === currentModel;\n          const isFast = i === 0;\n          return (\n            <button\n              key={m.id}\n              type=\"button\"\n              onClick={() => setModel(m.id)}\n              className={`\n                flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-all duration-150\n                ${\n                  isActive\n                    ? isFast\n                      ? 'bg-white text-amber-600 shadow-sm dark:bg-gray-700 dark:text-amber-400'\n                      : 'bg-white text-blue-600 shadow-sm dark:bg-gray-700 dark:text-blue-400'\n                    : 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300'\n                }\n              `}\n            >\n              {isFast ? <Lightning size={13} weight=\"fill\" /> : <Brain size={13} weight=\"fill\" />}\n              <span>{t(m.label)}</span>\n            </button>\n          );\n        })}\n      </div>\n      <span className=\"hidden select-none text-[10px] text-gray-400 sm:block dark:text-gray-500\">\n        {navigator.platform.includes('Mac') ? '\\u2318' : 'Ctrl'}{'\\u21E7'}M\n      </span>\n    </div>\n  );\n}\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// =============================================================================\n// Layer 4: Full Components\n// =============================================================================\n\nexport { ChatSession, type ChatSessionProps } from './components/ChatSession';\nexport { ModelSelector } from './components/ModelSelector';\nexport { SessionArtifactsPanel } from './components/SessionArtifactsPanel';\nexport { SessionArtifactList } from './components/SessionArtifactList';\nexport { SessionArtifactPreview } from './components/SessionArtifactPreview';\nexport { ChatHeader } from './components/ChatHeader';\nexport { MessageList } from './components/MessageList';\nexport { TurnBubble, type TurnBubbleProps, type TurnBubbleClassNames } from './components/TurnBubble';\nexport { UserTurnView, type UserTurnViewProps } from './components/UserTurnView';\nexport { AssistantTurnView, type AssistantTurnViewProps } from './components/AssistantTurnView';\nexport { MarkdownRenderer } from './components/MarkdownRenderer';\nexport { ChartCard, type ChartCardHost } 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 { AttachmentGrid } from './components/AttachmentGrid';\nexport { ImageModal } from './components/ImageModal';\nexport { WelcomeContent } from './components/WelcomeContent';\nexport { CodeOutputsPanel } from './components/CodeOutputsPanel';\nexport { StreamingCursor } from './components/StreamingCursor';\nexport { ScrollToBottomButton } from './components/ScrollToBottomButton';\nexport { CompactionDoodle } from './components/CompactionDoodle';\nexport { EmptyState, type EmptyStateProps } from './components/EmptyState';\nexport { EditableText, type EditableTextProps, type EditableTextRef } from './components/EditableText';\nexport { SearchInput, type SearchInputProps } from './components/SearchInput';\nexport {\n  Skeleton,\n  SkeletonGroup,\n  SkeletonText,\n  SkeletonAvatar,\n  SkeletonCard,\n  ListItemSkeleton,\n  type SkeletonProps,\n  type SkeletonGroupProps,\n} from './components/Skeleton';\n\n// Phase 2 components\nexport { CodeBlock } from './components/CodeBlock';\nexport { LoadingSpinner } from './components/LoadingSpinner';\nexport { TableExportButton } from './components/TableExportButton';\nexport { TableWithExport } from './components/TableWithExport';\nexport { InteractiveTableCard, type TableCardHost } from './components/InteractiveTableCard';\nexport { TabbedTableGroup, type TabbedTableGroupProps } from './components/TabbedTableGroup';\nexport { TabbedChartGroup, type TabbedChartGroupProps } from './components/TabbedChartGroup';\nexport {\n  useDataTable,\n  type UseDataTableReturn,\n  type DataTableOptions,\n  type ColumnMeta,\n  type SortState,\n  type ColumnStats,\n} from './hooks/useDataTable';\nexport { type ColumnType, type FormattedCell } from './utils/columnTypes';\n\n// Phase 5 generic components\nexport { Toast, type ToastProps } from './components/Toast';\nexport { ToastContainer } from './components/ToastContainer';\nexport { ConfirmModal, type ConfirmModalProps } from './components/ConfirmModal';\nexport { UserAvatar, type UserAvatarProps } from './components/UserAvatar';\nexport { AvatarStack, type AvatarStackProps } from './components/AvatarStack';\nexport { SessionMembersModal, type SessionMembersModalProps } from './components/SessionMembersModal';\nexport { PermissionGuard, type PermissionGuardProps } from './components/PermissionGuard';\nexport { ErrorBoundary, DefaultErrorContent } from './components/ErrorBoundary';\nexport { TypingIndicator, type TypingIndicatorProps } from './components/TypingIndicator';\nexport { ActivityTrace, type ActivityTraceProps } from './components/ActivityTrace';\n\n// Session management components\nexport { default as Sidebar } from './components/Sidebar';\nexport type { SidebarProps, ActiveTab } from './components/Sidebar';\nexport { default as SessionItem } from './components/SessionItem';\nexport { default as ArchivedChatList } from './components/ArchivedChatList';\nexport { default as AllChatsList } from './components/AllChatsList';\nexport { UserFilter } from './components/UserFilter';\nexport { default as DateGroupHeader } from './components/DateGroupHeader';\nexport { default as SessionSkeleton } from './components/SessionSkeleton';\n\n// Layout component\nexport { BiChatLayout, type BiChatLayoutProps, type SidebarDrawerProps } from './components/BiChatLayout';\n\n// Specialized message components\nexport { SystemMessage } from './components/SystemMessage';\nexport { DebugPanel, type DebugPanelProps } from './components/DebugPanel';\n\n// Generic UI components\nexport { default as Alert } from './components/Alert';\nexport { default as ArchiveBanner } from './components/ArchiveBanner';\nexport { RetryActionArea } from './components/RetryActionArea';\nexport { StreamError } from './components/StreamError';\nexport { MessageActions } from './components/MessageActions';\nexport { default as AttachmentPreview } from './components/AttachmentPreview';\nexport { default as AttachmentUpload } from './components/AttachmentUpload';\nexport { default as ScreenReaderAnnouncer } from './components/ScreenReaderAnnouncer';\nexport { default as SkipLink } from './components/SkipLink';\nexport { TouchContextMenu } from './components/TouchContextMenu';\n\n// Question form wizard\nexport { default as QuestionForm } from './components/QuestionForm';\nexport { default as QuestionStep } from './components/QuestionStep';\nexport { default as ConfirmationStep } from './components/ConfirmationStep';\n\n// =============================================================================\n// Layer 3: Composites (Styled with Slots)\n// =============================================================================\n\nexport {\n  UserMessage,\n  type UserMessageProps,\n  type UserMessageSlots,\n  type UserMessageClassNames,\n  type UserMessageAvatarSlotProps,\n  type UserMessageContentSlotProps,\n  type UserMessageAttachmentsSlotProps,\n  type UserMessageActionsSlotProps,\n} from './components/UserMessage';\n\nexport {\n  AssistantMessage,\n  type AssistantMessageProps,\n  type AssistantMessageSlots,\n  type AssistantMessageClassNames,\n  type AssistantMessageAvatarSlotProps,\n  type AssistantMessageContentSlotProps,\n  type AssistantMessageSourcesSlotProps,\n  type AssistantMessageChartsSlotProps,\n  type AssistantMessageCodeOutputsSlotProps,\n  type AssistantMessageTablesSlotProps,\n  type AssistantMessageArtifactsSlotProps,\n  type AssistantMessageActionsSlotProps,\n  type AssistantMessageExplanationSlotProps,\n  type RegenerateModelOption,\n} from './components/AssistantMessage';\n\n// =============================================================================\n// Layer 2: Primitives (Unstyled Compound Components)\n// =============================================================================\n\n// Primitives are exported from a separate entry point for tree-shaking\n// import { Turn, Avatar, Bubble, ActionButton } from '@iota-uz/sdk/bichat/primitives'\nexport * from './primitives';\n\n// =============================================================================\n// Layer 1: Headless Hooks\n// =============================================================================\n\n// Existing hooks\nexport { useStreaming } from './hooks/useStreaming';\nexport {\n  useActiveRuns,\n  type UseActiveRunsOptions,\n  type UseActiveRunsResult,\n  type ActiveRunSnapshot,\n} from './hooks/useActiveRuns';\nexport { useTranslation } from './hooks/useTranslation';\nexport { useModalLock } from './hooks/useModalLock';\nexport { useFocusTrap } from './hooks/useFocusTrap';\nexport { useToast, type ToastAction, type ToastItem, type ToastType, type UseToastReturn } from './hooks/useToast';\n\n// New composability hooks\nexport {\n  useImageGallery,\n  type UseImageGalleryOptions,\n  type UseImageGalleryReturn,\n} from './hooks/useImageGallery';\n\nexport {\n  useAutoScroll,\n  type UseAutoScrollOptions,\n  type UseAutoScrollReturn,\n} from './hooks/useAutoScroll';\n\nexport {\n  useMessageActions,\n  type UseMessageActionsOptions,\n  type UseMessageActionsReturn,\n} from './hooks/useMessageActions';\n\nexport {\n  useAttachments,\n  type UseAttachmentsOptions,\n  type UseAttachmentsReturn,\n  type FileValidationError,\n} from './hooks/useAttachments';\n\nexport {\n  useMarkdownCopy,\n  type UseMarkdownCopyOptions,\n  type UseMarkdownCopyReturn,\n} from './hooks/useMarkdownCopy';\n\n// Session & interaction hooks\nexport { useScrollToBottom } from './hooks/useScrollToBottom';\nexport { useKeyboardShortcuts, type ShortcutConfig } from './hooks/useKeyboardShortcuts';\nexport { useLongPress } from './hooks/useLongPress';\nexport { useSidebarState, type UseSidebarStateReturn } from './hooks/useSidebarState';\nexport { useHttpDataSourceConfigFromApplet } from './hooks/useHttpDataSourceConfigFromApplet';\nexport {\n  useBichatRouter,\n  type UseBichatRouterParams,\n  type UseBichatRouterReturn,\n} from './hooks/useBichatRouter';\n\n// =============================================================================\n// Animations\n// =============================================================================\n\nexport * from './animations';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nexport { ChatSessionProvider, useChatSession, useChatMessaging, useOptionalChatMessaging, useChatInput, type ChatSessionProviderProps } from './context/ChatContext';\nexport { IotaContextProvider, useIotaContext, hasPermission } from './context/IotaContext';\nexport {\n  ConfigProvider,\n  useConfig,\n  useRequiredConfig,\n} from './config/ConfigContext';\n\n// =============================================================================\n// Theme\n// =============================================================================\n\nexport { ThemeProvider, useTheme } from './theme/ThemeProvider';\nexport { lightTheme, darkTheme } from './theme/themes';\n\n// =============================================================================\n// API Utilities\n// =============================================================================\n\nexport { getCSRFToken, addCSRFHeader, createHeadersWithCSRF } from './api/csrf';\n\n// =============================================================================\n// Data Sources\n// =============================================================================\n\nexport { HttpDataSource, createHttpDataSource } from './data/HttpDataSource';\nexport type { BichatRPC } from './data/rpc.generated';\nexport { RunEventsConnectError } from './data/MessageTransport';\n\n// =============================================================================\n// Machine (framework-agnostic state management)\n// =============================================================================\n\nexport { ChatMachine, type ChatMachineConfig } from './machine';\n\n// =============================================================================\n// SSE Parsing\n// =============================================================================\n\nexport { parseBichatStream, parseBichatStreamEvents, parseSSEStream } from './utils/sseParser';\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport { RateLimiter } from './utils/RateLimiter';\nexport { getToolLabel } from './utils/toolLabels';\nexport { groupSteps } from './utils/activitySteps';\nexport * from './utils/fileUtils';\nexport { groupSessionsByDate } from './utils/sessionGrouping';\nexport { toErrorDisplay, isPermissionDeniedError, type RPCErrorDisplay } from './utils/errorDisplay';\nexport {\n  splitIntoTextBlocks,\n  readTextBlockOffsets,\n  type AssistantTextBlock,\n} from './utils/textBlocks';\nexport {\n  STREAM_EVENT_TYPES,\n  TERMINAL_STREAM_EVENT_TYPES,\n  isTerminalEvent,\n  type StreamEventType,\n  type TerminalStreamEventType,\n} from './utils/eventNames';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type {\n  // Core types\n  Session,\n  ToolCall,\n  Citation,\n  Attachment,\n  ImageAttachment,\n  QueuedMessage,\n  CodeOutput,\n  ChartData,\n  ChartSeries,\n  RenderTableData,\n  RenderTableExport,\n  Artifact,\n  SessionArtifact,\n  // HITL question types\n  PendingQuestion,\n  Question,\n  QuestionOption,\n  QuestionAnswerData,\n  QuestionAnswers,\n  // Streaming types\n  StreamEvent,\n  StreamChunk,\n  ActiveRunDelivery,\n  // Split data source interfaces\n  SessionStore,\n  MessageTransport,\n  ArtifactStore,\n  AdminStore,\n  // Combined data source interface\n  ChatDataSource,\n  ChatSessionContextValue,\n  ChatSessionStateValue,\n  ChatMessagingStateValue,\n  ChatInputStateValue,\n  // Session management types\n  SessionListResult,\n  SessionUser,\n  SessionMember,\n  SessionAccess,\n  SessionGroup,\n  // Turn-based architecture types\n  ConversationTurn,\n  UserTurn,\n  AssistantTurn,\n  // Activity trace types\n  ActivityStep,\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// =============================================================================\n// Enums\n// =============================================================================\n\nexport { MessageRole } from './types';\n\n// =============================================================================\n// CSS Variables Reference\n// =============================================================================\n// The styles.css file provides comprehensive CSS variables for theming.\n// Import styles: import '@iota-uz/sdk/bichat/styles.css'\n//\n// Key variable prefixes:\n// - --bichat-spacing-*    : Spacing scale (0-16, xs/sm/md/lg/xl/2xl)\n// - --bichat-color-*      : Colors (gray, primary, semantic, component-specific)\n// - --bichat-font-*       : Typography (family, size, weight, line-height)\n// - --bichat-radius-*     : Border radius (sm/md/lg/xl/2xl/full, semantic)\n// - --bichat-shadow-*     : Box shadows (xs/sm/md/lg/xl/2xl)\n// - --bichat-transition-* : Transition durations\n// - --bichat-z-*          : Z-index scale\n//\n// Dark mode: Use .dark class or [data-theme=\"dark\"] attribute\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, useReducedMotion } 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  const prefersReducedMotion = useReducedMotion();\n  const duration = prefersReducedMotion ? 0 : 0.4;\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, delay: prefersReducedMotion ? 0 : 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, delay: prefersReducedMotion ? 0 : 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, delay: prefersReducedMotion ? 0 : 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, delay: prefersReducedMotion ? 0 : 0.4 }}\n          >\n            {action}\n          </motion.div>\n        )}\n      </div>\n    </motion.div>\n  );\n}\n\nconst MemoizedEmptyState = memo(EmptyState);\nMemoizedEmptyState.displayName = 'EmptyState';\n\nexport { MemoizedEmptyState as EmptyState };\nexport default MemoizedEmptyState;\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';\nimport { useTranslation } from '../hooks/useTranslation';\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,\n      className = '',\n      inputClassName = '',\n      size = 'sm',\n    },\n    ref\n  ) => {\n    const { t } = useTranslation();\n    const resolvedPlaceholder = placeholder ?? t('BiChat.Common.Untitled');\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        setIsEditing(true);\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      e.stopPropagation();\n\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      setIsEditing(true);\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) => {\n            e.preventDefault();\n            e.stopPropagation();\n          }}\n          onPointerDown={(e) => e.stopPropagation()}\n        >\n          <input\n            ref={inputRef}\n            type=\"text\"\n            value={editValue}\n            onChange={(e) => setEditValue(e.target.value)}\n            onKeyDown={handleKeyDown}\n            onKeyUp={(e) => e.stopPropagation()}\n            onBlur={handleBlur}\n            maxLength={maxLength}\n            placeholder={resolvedPlaceholder}\n            onClick={(e) => e.stopPropagation()}\n            onPointerDown={(e) => e.stopPropagation()}\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-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:focus-visible:ring-primary-600/30 text-gray-900 dark:text-white ${inputClassName}`}\n            aria-label={t('BiChat.EditableText.AriaLabel')}\n          />\n        </div>\n      );\n    }\n\n    const displayValue = value || resolvedPlaceholder;\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={t('BiChat.EditableText.DoubleClickToEdit')}\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\nconst MemoizedEditableText = memo(EditableText);\n\nexport { MemoizedEditableText as EditableText };\nexport default MemoizedEditableText;\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';\nimport { useTranslation } from '../hooks/useTranslation';\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,\n  autoFocus = false,\n  onSubmit,\n  onEscape,\n  className = '',\n  size = 'md',\n  disabled = false,\n  ariaLabel,\n}: SearchInputProps) {\n  const { t } = useTranslation();\n  const resolvedPlaceholder = placeholder ?? t('BiChat.Common.Search');\n  const resolvedAriaLabel = ariaLabel ?? t('BiChat.Common.Search');\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={resolvedPlaceholder}\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-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:border-primary-400 dark:focus-visible: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={resolvedAriaLabel}\n      />\n\n      {/* Clear Button */}\n      {value && !disabled && (\n        <button\n          type=\"button\"\n          onClick={handleClear}\n          className={`cursor-pointer 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={t('BiChat.Search.Clear')}\n          title={t('BiChat.Search.Clear')}\n        >\n          <X size={sizes.icon - 2} weight=\"bold\" />\n        </button>\n      )}\n    </div>\n  );\n}\n\nconst MemoizedSearchInput = memo(SearchInput);\nMemoizedSearchInput.displayName = 'SearchInput';\n\nexport { MemoizedSearchInput as SearchInput };\nexport default MemoizedSearchInput;\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\nconst MemoizedSkeleton = memo(Skeleton);\nMemoizedSkeleton.displayName = 'Skeleton';\n\nexport { MemoizedSkeleton as Skeleton };\nexport default MemoizedSkeleton;\n","/**\n * LoadingSpinner Component\n * Displays animated loading indicators\n */\n\nimport { memo } from 'react';\nimport { CircleNotch } from '@phosphor-icons/react';\n\ntype SpinnerVariant = 'spinner' | 'dots' | 'pulse'\n\ninterface LoadingSpinnerProps {\n  variant?: SpinnerVariant\n  size?: 'sm' | 'md' | 'lg'\n  message?: string\n}\n\nfunction SpinnerLoader({\n  size = 'md',\n  message,\n}: {\n  size: 'sm' | 'md' | 'lg'\n  message?: string\n}) {\n  const sizeMap = {\n    sm: 16,\n    md: 32,\n    lg: 48,\n  };\n\n  const sizeClasses = {\n    sm: 'h-4 w-4',\n    md: 'h-8 w-8',\n    lg: 'h-12 w-12',\n  };\n\n  return (\n    <div className=\"flex flex-col items-center justify-center\" role=\"status\" aria-live=\"polite\">\n      <CircleNotch\n        size={sizeMap[size]}\n        className={`${sizeClasses[size]} animate-spin motion-reduce:animate-none text-[var(--bichat-primary)]`}\n      />\n      {message && <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-400\">{message}</p>}\n    </div>\n  );\n}\n\nfunction DotsLoader({\n  size = 'md',\n  message,\n}: {\n  size: 'sm' | 'md' | 'lg'\n  message?: string\n}) {\n  const dotSizeClasses = {\n    sm: 'w-1.5 h-1.5',\n    md: 'w-2 h-2',\n    lg: 'w-3 h-3',\n  };\n\n  const gapClasses = {\n    sm: 'gap-0.5',\n    md: 'gap-1',\n    lg: 'gap-1.5',\n  };\n\n  return (\n    <div className=\"flex flex-col items-center justify-center\" role=\"status\" aria-live=\"polite\">\n      <div className={`flex ${gapClasses[size]}`}>\n        {[0, 1, 2].map((index) => (\n          <div\n            key={index}\n            className={`${dotSizeClasses[size]} bg-[var(--bichat-primary)] rounded-full animate-bounce motion-reduce:animate-none`}\n            style={{ animationDelay: `${index * 0.15}s` }}\n          />\n        ))}\n      </div>\n      {message && <p className=\"mt-3 text-sm text-gray-600 dark:text-gray-400\">{message}</p>}\n    </div>\n  );\n}\n\nfunction PulseLoader({\n  size = 'md',\n  message,\n}: {\n  size: 'sm' | 'md' | 'lg'\n  message?: string\n}) {\n  const sizeClasses = {\n    sm: 'h-4 w-4',\n    md: 'h-8 w-8',\n    lg: 'h-12 w-12',\n  };\n\n  return (\n    <div className=\"flex flex-col items-center justify-center\" role=\"status\" aria-live=\"polite\">\n      <div className={`${sizeClasses[size]} bg-[var(--bichat-primary)] rounded-full animate-pulse motion-reduce:animate-none`} />\n      {message && <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-400\">{message}</p>}\n    </div>\n  );\n}\n\nfunction LoadingSpinner({ variant = 'spinner', size = 'md', message }: LoadingSpinnerProps) {\n  switch (variant) {\n    case 'dots':\n      return <DotsLoader size={size} message={message} />;\n    case 'pulse':\n      return <PulseLoader size={size} message={message} />;\n    case 'spinner':\n    default:\n      return <SpinnerLoader size={size} message={message} />;\n  }\n}\n\nconst MemoizedLoadingSpinner = memo(LoadingSpinner);\nMemoizedLoadingSpinner.displayName = 'LoadingSpinner';\n\nexport { MemoizedLoadingSpinner as LoadingSpinner };\nexport default MemoizedLoadingSpinner;\n","/**\n * Toast Component\n * Individual toast notification with auto-dismiss, progress bar, and accessibility.\n * Uses @headlessui/react Transition for CSS-driven enter/leave animations.\n */\n\nimport { useEffect, useState, useCallback, useRef, useSyncExternalStore } from 'react';\nimport { Transition } from '@headlessui/react';\nimport { CheckCircle, XCircle, Info, Warning, X } from '@phosphor-icons/react';\nimport type { ToastType, ToastAction } from '../hooks/useToast';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface ToastProps {\n  id: string\n  type: ToastType\n  message: string\n  duration?: number\n  onDismiss: (id: string) => void\n  /** Label for dismiss button (defaults to \"Dismiss\") */\n  dismissLabel?: string\n  /** Optional action button rendered in the toast */\n  action?: ToastAction\n}\n\nconst typeConfig: Record<\n  ToastType,\n  { accent: string; bg: string; icon: string; progress: string; iconEl: typeof CheckCircle }\n> = {\n  success: {\n    accent: 'text-emerald-600 dark:text-emerald-400',\n    bg: 'bg-emerald-50 dark:bg-emerald-950/40 border-emerald-200/80 dark:border-emerald-800/50',\n    icon: 'bg-emerald-100 dark:bg-emerald-900/50',\n    progress: 'bg-emerald-500 dark:bg-emerald-400',\n    iconEl: CheckCircle,\n  },\n  error: {\n    accent: 'text-red-600 dark:text-red-400',\n    bg: 'bg-red-50 dark:bg-red-950/40 border-red-200/80 dark:border-red-800/50',\n    icon: 'bg-red-100 dark:bg-red-900/50',\n    progress: 'bg-red-500 dark:bg-red-400',\n    iconEl: XCircle,\n  },\n  info: {\n    accent: 'text-blue-600 dark:text-blue-400',\n    bg: 'bg-blue-50 dark:bg-blue-950/40 border-blue-200/80 dark:border-blue-800/50',\n    icon: 'bg-blue-100 dark:bg-blue-900/50',\n    progress: 'bg-blue-500 dark:bg-blue-400',\n    iconEl: Info,\n  },\n  warning: {\n    accent: 'text-amber-600 dark:text-amber-400',\n    bg: 'bg-amber-50 dark:bg-amber-950/40 border-amber-200/80 dark:border-amber-800/50',\n    icon: 'bg-amber-100 dark:bg-amber-900/50',\n    progress: 'bg-amber-500 dark:bg-amber-400',\n    iconEl: Warning,\n  },\n};\n\nconst reducedMotionQuery = '(prefers-reduced-motion: reduce)';\nlet reducedMotionMql: MediaQueryList | null = null;\nfunction getReducedMotionMql(): MediaQueryList | null {\n  if (typeof window === 'undefined') {return null;}\n  if (!reducedMotionMql) {\n    reducedMotionMql = window.matchMedia(reducedMotionQuery);\n  }\n  return reducedMotionMql;\n}\nfunction subscribeReducedMotion(callback: () => void): () => void {\n  const mql = getReducedMotionMql();\n  if (!mql) {return () => {};}\n  mql.addEventListener('change', callback);\n  return () => mql.removeEventListener('change', callback);\n}\nfunction getReducedMotionSnapshot(): boolean {\n  const mql = getReducedMotionMql();\n  return mql ? mql.matches : false;\n}\nfunction getReducedMotionServerSnapshot(): boolean {\n  return false;\n}\n\nexport function Toast({\n  id,\n  type,\n  message,\n  duration = 5000,\n  onDismiss,\n  dismissLabel,\n  action,\n}: ToastProps) {\n  const { t } = useTranslation();\n  const resolvedDismissLabel = dismissLabel ?? t('BiChat.Chat.DismissNotification');\n  const config = typeConfig[type];\n  const Icon = config.iconEl;\n  const [show, setShow] = useState(false);\n  const [paused, setPaused] = useState(false);\n  const remainingRef = useRef(duration);\n  const startRef = useRef(Date.now());\n\n  const prefersReducedMotion = useSyncExternalStore(\n    subscribeReducedMotion,\n    getReducedMotionSnapshot,\n    getReducedMotionServerSnapshot\n  );\n\n  // Trigger enter transition on mount\n  useEffect(() => {\n    const frame = requestAnimationFrame(() => setShow(true));\n    return () => cancelAnimationFrame(frame);\n  }, []);\n\n  // Auto-dismiss with pause/resume on hover\n  useEffect(() => {\n    if (paused) {return;}\n\n    startRef.current = Date.now();\n    const timer = setTimeout(() => {\n      setShow(false);\n      // Wait for leave transition before removing from DOM\n      setTimeout(() => onDismiss(id), 200);\n    }, remainingRef.current);\n\n    return () => {\n      // Capture how much time remains when pausing\n      const elapsed = Date.now() - startRef.current;\n      remainingRef.current = Math.max(0, remainingRef.current - elapsed);\n      clearTimeout(timer);\n    };\n  }, [id, paused, onDismiss]);\n\n  const handleDismiss = useCallback(() => {\n    setShow(false);\n    setTimeout(() => onDismiss(id), 200);\n  }, [id, onDismiss]);\n\n  const ariaLive = type === 'error' ? 'assertive' : 'polite';\n  const role = type === 'error' || type === 'warning' ? 'alert' : 'status';\n\n  return (\n    <Transition\n      show={show}\n      enter=\"transition duration-200 ease-out\"\n      enterFrom=\"-translate-y-2 opacity-0 scale-95\"\n      enterTo=\"translate-y-0 opacity-100 scale-100\"\n      leave=\"transition duration-150 ease-in\"\n      leaveFrom=\"translate-y-0 opacity-100 scale-100\"\n      leaveTo=\"-translate-y-2 opacity-0 scale-95\"\n    >\n      <div\n        className={`relative flex items-start gap-3 rounded-xl border px-4 py-3 shadow-lg shadow-black/5 dark:shadow-black/20 backdrop-blur-sm min-w-[320px] max-w-[420px] overflow-hidden ${config.bg}`}\n        role={role}\n        aria-live={ariaLive}\n        aria-atomic=\"true\"\n        onMouseEnter={() => setPaused(true)}\n        onMouseLeave={() => setPaused(false)}\n      >\n        {/* Icon */}\n        <div className={`mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-lg ${config.icon}`}>\n          <Icon size={16} className={config.accent} weight=\"fill\" />\n        </div>\n\n        {/* Message */}\n        <p className=\"flex-1 pt-0.5 text-sm font-medium leading-snug text-gray-800 dark:text-gray-100\">\n          {message}\n        </p>\n\n        {/* Action button */}\n        {action && (\n          <button\n            type=\"button\"\n            onClick={() => {\n              action.onClick();\n              handleDismiss();\n            }}\n            className={`shrink-0 text-sm font-semibold underline-offset-2 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-primary-500/50 cursor-pointer ${config.accent}`}\n          >\n            {action.label}\n          </button>\n        )}\n\n        {/* Dismiss */}\n        <button\n          onClick={handleDismiss}\n          className=\"mt-0.5 -mr-1 cursor-pointer shrink-0 rounded-lg p-1 text-gray-400 hover:text-gray-600 hover:bg-gray-200/60 dark:text-gray-500 dark:hover:text-gray-300 dark:hover:bg-gray-700/60 transition-colors duration-100\"\n          aria-label={resolvedDismissLabel}\n        >\n          <X size={14} weight=\"bold\" />\n        </button>\n\n        {/* Progress bar */}\n        <div className=\"absolute inset-x-0 bottom-0 h-0.5 bg-black/5 dark:bg-white/5\">\n          <div\n            className={`h-full ${config.progress} origin-left motion-reduce:animate-none`}\n            style={\n              prefersReducedMotion\n                ? {}\n                : {\n                    animation: `bichat-toast-progress ${duration}ms linear forwards`,\n                    animationPlayState: paused ? 'paused' : 'running',\n                  }\n            }\n          />\n        </div>\n      </div>\n    </Transition>\n  );\n}\n\nexport default Toast;\n","/**\n * ToastContainer Component\n * Container for rendering toast notifications.\n * Positioned at bottom-right to stay out of the way of primary content.\n */\n\nimport { Toast } from './Toast';\nimport type { ToastItem } from '../hooks/useToast';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ToastContainerProps {\n  toasts: ToastItem[]\n  onDismiss: (id: string) => void\n  /** Label for dismiss buttons */\n  dismissLabel?: string\n}\n\nexport function ToastContainer({ toasts, onDismiss, dismissLabel }: ToastContainerProps) {\n  const { t } = useTranslation();\n  if (toasts.length === 0) {return null;}\n\n  return (\n    <div\n      aria-label={t('BiChat.Common.Notifications')}\n      className=\"fixed top-6 right-6 z-[var(--bichat-z-toast,60)] flex flex-col gap-2 pointer-events-none\"\n    >\n      {toasts.map((toast) => (\n        <div key={toast.id} className=\"pointer-events-auto\">\n          <Toast {...toast} onDismiss={onDismiss} dismissLabel={dismissLabel} />\n        </div>\n      ))}\n    </div>\n  );\n}\n\nexport default ToastContainer;\n","/**\n * PermissionGuard Component\n * Conditionally renders children based on permission checks\n *\n * @example\n * // Single permission\n * <PermissionGuard permissions={['chat.read']} hasPermission={hasPermission}>\n *   <ChatList />\n * </PermissionGuard>\n *\n * // Multiple permissions (AND logic - all required)\n * <PermissionGuard permissions={['chat.read', 'chat.write']} mode=\"all\">\n *   <AdminPanel />\n * </PermissionGuard>\n *\n * // Multiple permissions (OR logic - any required)\n * <PermissionGuard permissions={['chat.read', 'chat.readOwn']} mode=\"any\">\n *   <ChatList />\n * </PermissionGuard>\n *\n * // With custom fallback\n * <PermissionGuard\n *   permissions={['chat.write']}\n *   fallback={<div>You don't have permission</div>}\n * >\n *   <CreateChatButton />\n * </PermissionGuard>\n */\n\nimport type { ReactNode } from 'react';\n\nexport interface PermissionGuardProps {\n  /** Permission names to check */\n  permissions: string[]\n  /** Check mode: 'all' requires all permissions (AND), 'any' requires at least one (OR) */\n  mode?: 'all' | 'any'\n  /** Function to check if user has a specific permission */\n  hasPermission: (permission: string) => boolean\n  /** Fallback to render when permissions are not satisfied */\n  fallback?: ReactNode\n  /** Children to render when permissions are satisfied */\n  children: ReactNode\n}\n\n/**\n * Permission guard component.\n * Conditionally renders children based on permission checks.\n */\nexport function PermissionGuard({\n  permissions,\n  mode = 'all',\n  hasPermission,\n  fallback = null,\n  children,\n}: PermissionGuardProps) {\n  // Handle empty permissions array (no permissions required, always render)\n  if (permissions.length === 0) {\n    return <>{children}</>;\n  }\n\n  // Check permissions based on mode\n  const permitted =\n    mode === 'all'\n      ? permissions.every((p) => hasPermission(p))\n      : permissions.some((p) => hasPermission(p));\n\n  return permitted ? <>{children}</> : <>{fallback}</>;\n}\n\nexport default PermissionGuard;\n","/**\n * ErrorBoundary Component\n * React error boundary for catching and displaying errors gracefully\n */\n\nimport { Component, ErrorInfo, ReactNode } from 'react';\nimport { WarningCircle, ArrowClockwise } from '@phosphor-icons/react';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ErrorBoundaryProps {\n  children: ReactNode\n  /** Optional custom error UI */\n  fallback?: ReactNode | ((error: Error | null, reset: () => void) => ReactNode)\n  /** Callback when an error is caught */\n  onError?: (error: Error, errorInfo: ErrorInfo) => void\n  /** Pre-translated strings for the emergency fallback (hook-free). Cache these before errors occur. */\n  emergencyStrings?: { title: string; fallback: string; retry: string }\n}\n\ninterface ErrorBoundaryState {\n  hasError: boolean\n  error: Error | null\n}\n\ninterface FallbackGuardProps {\n  primaryError: Error | null\n  onReset: () => void\n  renderFallback: () => ReactNode\n  onFallbackError?: (error: Error, errorInfo: ErrorInfo) => void\n  cachedStrings?: { title: string; fallback: string; retry: string }\n}\n\ninterface FallbackGuardState {\n  fallbackFailed: boolean\n}\n\n/**\n * Default error UI component\n */\nfunction DefaultErrorContent({\n  error,\n  onReset,\n  resetLabel,\n  errorTitle,\n}: {\n  error: Error | null\n  onReset?: () => void\n  resetLabel?: string\n  errorTitle?: string\n}) {\n  const { t } = useTranslation();\n  const resolvedResetLabel = resetLabel ?? t('BiChat.Common.TryAgain');\n  const resolvedErrorTitle = errorTitle ?? t('BiChat.Error.SomethingWentWrong');\n  return (\n    <div className=\"flex flex-col items-center justify-center p-8 text-center min-h-[200px]\">\n      {/* Decorative background pattern */}\n      <div className=\"absolute inset-0 overflow-hidden pointer-events-none opacity-[0.03] dark:opacity-[0.04]\" aria-hidden=\"true\">\n        <svg className=\"absolute -top-8 -right-8 w-64 h-64 text-red-500\" viewBox=\"0 0 200 200\" fill=\"currentColor\">\n          <circle cx=\"100\" cy=\"100\" r=\"80\" opacity=\"0.5\" />\n          <circle cx=\"100\" cy=\"100\" r=\"50\" opacity=\"0.3\" />\n          <circle cx=\"100\" cy=\"100\" r=\"25\" opacity=\"0.2\" />\n        </svg>\n      </div>\n\n      <div className=\"relative flex flex-col items-center\">\n        {/* Icon with soft glow ring */}\n        <div className=\"relative mb-5\">\n          <div className=\"absolute inset-0 rounded-full bg-red-100 dark:bg-red-900/30 scale-150 blur-md\" />\n          <div className=\"relative flex items-center justify-center w-14 h-14 rounded-full bg-red-50 dark:bg-red-900/20 border border-red-200/60 dark:border-red-800/40\">\n            <WarningCircle size={28} className=\"text-red-500 dark:text-red-400\" weight=\"fill\" />\n          </div>\n        </div>\n\n        <h2 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-1.5\">{resolvedErrorTitle}</h2>\n        <p className=\"text-sm text-gray-500 dark:text-gray-400 mb-5 max-w-md leading-relaxed\">\n          {error?.message || t('BiChat.Error.UnexpectedError')}\n        </p>\n\n        {onReset && (\n          <button\n            type=\"button\"\n            onClick={onReset}\n            className=\"flex items-center gap-2 px-5 py-2.5 bg-red-600 hover:bg-red-700 active:bg-red-800 text-white rounded-lg transition-colors shadow-sm text-sm font-medium\"\n          >\n            <ArrowClockwise size={16} weight=\"bold\" />\n            {resolvedResetLabel}\n          </button>\n        )}\n      </div>\n    </div>\n  );\n}\n\n/**\n * Hook-free emergency fallback used when the configured fallback crashes.\n */\nfunction StaticEmergencyErrorContent({\n  error,\n  onReset,\n  titleText,\n  fallbackText,\n  retryText,\n}: {\n  error: Error | null\n  onReset?: () => void\n  titleText?: string\n  fallbackText?: string\n  retryText?: string\n}) {\n  return (\n    <div className=\"flex flex-col items-center justify-center p-8 text-center min-h-[200px]\">\n      <div className=\"relative flex flex-col items-center\">\n        <div className=\"relative mb-5\">\n          <div className=\"absolute inset-0 rounded-full bg-red-100 scale-150 blur-md\" />\n          <div className=\"relative flex items-center justify-center w-14 h-14 rounded-full bg-red-50 border border-red-200/60\">\n            <WarningCircle size={28} className=\"text-red-500\" weight=\"fill\" />\n          </div>\n        </div>\n\n        <h2 className=\"text-lg font-semibold text-gray-900 mb-1.5\">{titleText || 'Something went wrong'}</h2>\n        <p className=\"text-sm text-gray-500 mb-5 max-w-md leading-relaxed\">\n          {error?.message || fallbackText || 'An unexpected UI error occurred.'}\n        </p>\n\n        {onReset && (\n          <button\n            type=\"button\"\n            onClick={onReset}\n            className=\"flex items-center gap-2 px-5 py-2.5 bg-red-600 hover:bg-red-700 active:bg-red-800 text-white rounded-lg transition-colors shadow-sm text-sm font-medium\"\n          >\n            <ArrowClockwise size={16} weight=\"bold\" />\n            {retryText || 'Try again'}\n          </button>\n        )}\n      </div>\n    </div>\n  );\n}\n\nclass FallbackGuard extends Component<FallbackGuardProps, FallbackGuardState> {\n  constructor(props: FallbackGuardProps) {\n    super(props);\n    this.state = { fallbackFailed: false };\n  }\n\n  static getDerivedStateFromError(): FallbackGuardState {\n    return { fallbackFailed: true };\n  }\n\n  componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n    this.props.onFallbackError?.(error, errorInfo);\n  }\n\n  render() {\n    if (this.state.fallbackFailed) {\n      return (\n        <StaticEmergencyErrorContent\n          error={this.props.primaryError}\n          onReset={this.props.onReset}\n          titleText={this.props.cachedStrings?.title}\n          fallbackText={this.props.cachedStrings?.fallback}\n          retryText={this.props.cachedStrings?.retry}\n        />\n      );\n    }\n    return this.props.renderFallback();\n  }\n}\n\nclass ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n  constructor(props: ErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false, error: null };\n  }\n\n  static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n    return { hasError: true, error };\n  }\n\n  componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n    console.error('React Error Boundary caught an error:', error, errorInfo);\n    this.props.onError?.(error, errorInfo);\n  }\n\n  handleReset = () => {\n    this.setState({ hasError: false, error: null });\n  };\n\n  handleFallbackError = (error: Error, errorInfo: ErrorInfo) => {\n    console.error('React Error Boundary fallback crashed:', {\n      primaryError: this.state.error,\n      fallbackError: error,\n      errorInfo,\n    });\n    this.props.onError?.(error, errorInfo);\n  };\n\n  render() {\n    if (this.state.hasError) {\n      return (\n        <FallbackGuard\n          key={`${this.state.error?.name ?? 'Error'}:${this.state.error?.message ?? ''}`}\n          primaryError={this.state.error}\n          onReset={this.handleReset}\n          onFallbackError={this.handleFallbackError}\n          cachedStrings={this.props.emergencyStrings}\n          renderFallback={() => {\n            // Custom fallback\n            if (this.props.fallback) {\n              if (typeof this.props.fallback === 'function') {\n                return this.props.fallback(this.state.error, this.handleReset);\n              }\n              return this.props.fallback;\n            }\n\n            // Default error UI\n            return <DefaultErrorContent error={this.state.error} onReset={this.handleReset} />;\n          }}\n        />\n      );\n    }\n\n    return this.props.children;\n  }\n}\n\nexport default ErrorBoundary;\nexport { ErrorBoundary, DefaultErrorContent };\n","interface SessionSkeletonProps {\n  count?: number\n}\n\nexport default function SessionSkeleton({ count = 5 }: SessionSkeletonProps) {\n  return (\n    <div className=\"space-y-1 px-2\">\n      {Array.from({ length: count }).map((_, index) => (\n        <div\n          key={index}\n          className=\"animate-pulse px-3 py-2 rounded-lg\"\n        >\n          <div className=\"flex items-center gap-2\">\n            {/* Icon placeholder */}\n            <div className=\"w-5 h-5 bg-gray-300 dark:bg-gray-700 rounded\" />\n            {/* Text placeholder */}\n            <div className=\"flex-1\">\n              <div className=\"h-4 bg-gray-300 dark:bg-gray-700 rounded w-3/4\" />\n            </div>\n          </div>\n        </div>\n      ))}\n    </div>\n  );\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\n\ninterface LongPressOptions {\n  delay?: number; // Default: 500ms\n  onLongPress: (e: React.TouchEvent | React.MouseEvent) => void;\n  onPressStart?: () => void;\n  onPressCancel?: () => void;\n  moveThreshold?: number; // Default: 10px - cancel if moved more\n  hapticFeedback?: boolean; // Default: true\n}\n\ninterface LongPressEventHandlers {\n  onTouchStart: (e: React.TouchEvent) => void;\n  onTouchEnd: (e: React.TouchEvent) => void;\n  onTouchMove: (e: React.TouchEvent) => void;\n  onMouseDown?: (e: React.MouseEvent) => void; // For desktop testing\n  onMouseUp?: (e: React.MouseEvent) => void;\n  onMouseLeave?: (e: React.MouseEvent) => void;\n}\n\ninterface LongPressResult {\n  handlers: LongPressEventHandlers;\n  isPressed: boolean;\n}\n\nexport function useLongPress(options: LongPressOptions): LongPressResult {\n  const {\n    delay = 500,\n    onLongPress,\n    onPressStart,\n    onPressCancel,\n    moveThreshold = 10,\n    hapticFeedback = true,\n  } = options;\n\n  const [isPressed, setIsPressed] = useState(false);\n  const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const startPosRef = useRef<{ x: number; y: number } | null>(null);\n  const eventRef = useRef<React.TouchEvent | React.MouseEvent | null>(null);\n\n  const clearTimer = useCallback(() => {\n    if (timerRef.current) {\n      clearTimeout(timerRef.current);\n      timerRef.current = null;\n    }\n  }, []);\n\n  const handlePressStart = useCallback(\n    (e: React.TouchEvent | React.MouseEvent) => {\n      // Note: Do NOT call preventDefault() on touchstart - it breaks long-press on iPadOS Safari\n      // Text selection is prevented via CSS user-select: none on .touch-tap class instead\n\n      setIsPressed(true);\n      eventRef.current = e;\n\n      // Store starting position\n      const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX;\n      const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY;\n      startPosRef.current = { x: clientX, y: clientY };\n\n      onPressStart?.();\n\n      clearTimer();\n      timerRef.current = setTimeout(() => {\n        if (hapticFeedback && navigator.vibrate) {\n          navigator.vibrate(10);\n        }\n        onLongPress(eventRef.current!);\n      }, delay);\n    },\n    [delay, onLongPress, onPressStart, hapticFeedback, clearTimer]\n  );\n\n  const handlePressEnd = useCallback(() => {\n    clearTimer();\n    setIsPressed(false);\n    startPosRef.current = null;\n    eventRef.current = null;\n  }, [clearTimer]);\n\n  const handlePressCancel = useCallback(() => {\n    clearTimer();\n    setIsPressed(false);\n    startPosRef.current = null;\n    eventRef.current = null;\n    onPressCancel?.();\n  }, [clearTimer, onPressCancel]);\n\n  const handleMove = useCallback(\n    (e: React.TouchEvent | React.MouseEvent) => {\n      if (!startPosRef.current || !isPressed) {return;}\n\n      const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX;\n      const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY;\n\n      const deltaX = Math.abs(clientX - startPosRef.current.x);\n      const deltaY = Math.abs(clientY - startPosRef.current.y);\n\n      if (deltaX > moveThreshold || deltaY > moveThreshold) {\n        handlePressCancel();\n      }\n    },\n    [isPressed, moveThreshold, handlePressCancel]\n  );\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => {\n      clearTimer();\n    };\n  }, [clearTimer]);\n\n  return {\n    handlers: {\n      onTouchStart: handlePressStart,\n      onTouchEnd: handlePressEnd,\n      onTouchMove: handleMove,\n      onMouseDown: handlePressStart,\n      onMouseUp: handlePressEnd,\n      onMouseLeave: handlePressCancel,\n    },\n    isPressed,\n  };\n}\n","import { useEffect, useMemo, useRef, useState, useCallback, FC, ReactNode, CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface ContextMenuItem {\n  id: string;\n  label: string;\n  icon?: ReactNode;\n  onClick: () => void;\n  variant?: 'default' | 'danger';\n  disabled?: boolean;\n}\n\ninterface TouchContextMenuProps {\n  items: ContextMenuItem[];\n  isOpen: boolean;\n  onClose: () => void;\n  anchorRect: DOMRect | null;\n}\n\nexport const TouchContextMenu: FC<TouchContextMenuProps> = ({\n  items,\n  isOpen,\n  onClose,\n  anchorRect,\n}) => {\n  const { t } = useTranslation();\n  const [focusedIndex, setFocusedIndex] = useState(-1);\n  const menuRef = useRef<HTMLDivElement>(null);\n  const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n  const enabledIndices = useMemo(\n    () => items.reduce<number[]>((acc, item, i) => {\n      if (!item.disabled) {acc.push(i);}\n      return acc;\n    }, []),\n    [items]\n  );\n\n  const focusItem = useCallback((index: number) => {\n    setFocusedIndex(index);\n    itemRefs.current[index]?.focus();\n  }, []);\n\n  // Auto-focus first enabled item on open\n  useEffect(() => {\n    if (!isOpen) {\n      setFocusedIndex(-1);\n      return;\n    }\n\n    // Small delay to let the menu render\n    const timer = requestAnimationFrame(() => {\n      if (enabledIndices.length > 0) {\n        focusItem(enabledIndices[0]);\n      }\n    });\n    return () => cancelAnimationFrame(timer);\n  }, [isOpen, enabledIndices, focusItem]);\n\n  // Keyboard navigation\n  useEffect(() => {\n    if (!isOpen) {return;}\n\n    const handleKeyDown = (e: KeyboardEvent) => {\n      const currentEnabledPos = enabledIndices.indexOf(focusedIndex);\n\n      switch (e.key) {\n        case 'Escape':\n          e.preventDefault();\n          onClose();\n          break;\n        case 'ArrowDown': {\n          e.preventDefault();\n          const nextPos = currentEnabledPos < enabledIndices.length - 1\n            ? currentEnabledPos + 1\n            : 0;\n          focusItem(enabledIndices[nextPos]);\n          break;\n        }\n        case 'ArrowUp': {\n          e.preventDefault();\n          const prevPos = currentEnabledPos > 0\n            ? currentEnabledPos - 1\n            : enabledIndices.length - 1;\n          focusItem(enabledIndices[prevPos]);\n          break;\n        }\n        case 'Home':\n          e.preventDefault();\n          if (enabledIndices.length > 0) {focusItem(enabledIndices[0]);}\n          break;\n        case 'End':\n          e.preventDefault();\n          if (enabledIndices.length > 0) {focusItem(enabledIndices[enabledIndices.length - 1]);}\n          break;\n      }\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    return () => document.removeEventListener('keydown', handleKeyDown);\n  }, [isOpen, onClose, focusedIndex, enabledIndices, focusItem]);\n\n  if (!isOpen || !anchorRect) {return null;}\n\n  const viewportHeight = window.innerHeight;\n  const menuEstimatedHeight = items.length * 44 + 16;\n  const spaceBelow = viewportHeight - anchorRect.bottom;\n  const shouldShowAbove = spaceBelow < menuEstimatedHeight && anchorRect.top > spaceBelow;\n\n  const style: CSSProperties = {\n    position: 'fixed',\n    left: `${anchorRect.left}px`,\n    width: `${anchorRect.width}px`,\n    zIndex: 9999,\n    ...(shouldShowAbove\n      ? { bottom: `${viewportHeight - anchorRect.top}px` }\n      : { top: `${anchorRect.bottom}px` }),\n  };\n\n  return createPortal(\n    <AnimatePresence>\n      {isOpen && (\n        <>\n          <div\n            className=\"fixed inset-0 z-[9998]\"\n            onClick={onClose}\n          />\n\n          <motion.div\n            ref={menuRef}\n            role=\"menu\"\n            aria-label={t('BiChat.ContextMenu')}\n            initial={{ opacity: 0, scale: 0.95 }}\n            animate={{ opacity: 1, scale: 1 }}\n            exit={{ opacity: 0, scale: 0.95 }}\n            transition={{ duration: 0.15 }}\n            style={style}\n            className=\"rounded-xl shadow-xl backdrop-blur bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 overflow-hidden\"\n          >\n            <div className=\"py-2\">\n              {items.map((item, index) => (\n                <button\n                  key={item.id}\n                  ref={(el) => { itemRefs.current[index] = el; }}\n                  role=\"menuitem\"\n                  tabIndex={focusedIndex === index ? 0 : -1}\n                  onClick={() => {\n                    if (!item.disabled) {\n                      item.onClick();\n                      onClose();\n                    }\n                  }}\n                  disabled={item.disabled}\n                  className={`\n                    w-full flex items-center gap-3 px-4 py-2.5 min-h-[44px]\n                    text-left text-sm font-medium transition-colors\n                    ${item.disabled\n                      ? 'opacity-50 cursor-not-allowed'\n                      : 'cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 active:bg-gray-200 dark:active:bg-gray-600'}\n                    ${item.variant === 'danger'\n                      ? 'text-red-600 dark:text-red-400'\n                      : 'text-gray-900 dark:text-gray-100'}\n                  `}\n                >\n                  {item.icon && (\n                    <span className=\"flex-shrink-0 w-5 h-5 flex items-center justify-center\">\n                      {item.icon}\n                    </span>\n                  )}\n                  <span className=\"flex-1\">{item.label}</span>\n                </button>\n              ))}\n            </div>\n          </motion.div>\n        </>\n      )}\n    </AnimatePresence>,\n    document.body\n  );\n};\n","/**\n * SessionItem Component\n * Individual chat session item in the sidebar with actions menu\n * Router-agnostic: uses onSelect callback instead of Link\n */\n\nimport React, { useRef, memo, useState, useEffect, useMemo } from 'react';\nimport { motion, useMotionValue, useTransform, type PanInfo } from 'framer-motion';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport { DotsThree, Check, Bookmark, PencilSimple, Archive, ArrowsClockwise, ArrowUUpLeft, Trash, UsersThree } from '@phosphor-icons/react';\nimport { EditableText, type EditableTextRef } from './EditableText';\nimport { sessionItemVariants } from '../animations/variants';\nimport type { Session } from '../types';\nimport { useLongPress } from '../hooks/useLongPress';\nimport { TouchContextMenu, type ContextMenuItem } from './TouchContextMenu';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { formatRelativeTime } from '../utils/dateFormatting';\n\ninterface SessionItemProps {\n  session: Session\n  isActive: boolean\n  mode?: 'active' | 'archived'\n  onSelect: (sessionId: string) => void\n  onArchive?: () => void\n  onRestore?: () => void\n  onPin?: () => void\n  onRename?: (newTitle: string) => void\n  onRegenerateTitle?: () => void\n  onDelete?: () => void\n  testIdPrefix?: string\n  className?: string\n}\n\nconst SessionItem = memo<SessionItemProps>(\n  ({\n    session,\n    isActive,\n    mode = 'active',\n    onSelect,\n    onArchive,\n    onRestore,\n    onPin,\n    onRename,\n    onRegenerateTitle,\n    onDelete,\n    testIdPrefix = 'sidebar',\n    className = '',\n  }) => {\n    const editableTitleRef = useRef<EditableTextRef>(null);\n    const itemRef = useRef<HTMLDivElement>(null);\n    const [menuOpen, setMenuOpen] = useState(false);\n    const [menuAnchor, setMenuAnchor] = useState<DOMRect | null>(null);\n    const [isTouch, setIsTouch] = useState(false);\n    const { t } = useTranslation();\n\n    // Drag-to-archive gesture\n    const isDraggingRef = useRef(false);\n    const dragX = useMotionValue(0);\n    const archiveOpacity = useTransform(dragX, [-80, -40, 0], [1, 0.5, 0]);\n    const archiveScale = useTransform(dragX, [-80, -40, 0], [1, 0.8, 0.6]);\n    const canDragArchive = !!onArchive;\n\n    const handleDragEnd = (_: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n      if (info.offset.x < -80 && onArchive) {\n        onArchive();\n      }\n      // Defer reset so the click event (which fires synchronously after dragEnd)\n      // still sees isDraggingRef=true and skips navigation.\n      requestAnimationFrame(() => {\n        isDraggingRef.current = false;\n      });\n    };\n\n    // Detect touch device\n    useEffect(() => {\n      setIsTouch('ontouchend' in document);\n    }, []);\n\n    // Only treat empty/whitespace title as generating.\n    // Non-empty placeholders should be displayed as-is.\n    const isTitleGenerating = !session.title?.trim();\n\n    // Generate title from session (use existing title or show generating state)\n    const displayTitle = isTitleGenerating ? t('BiChat.Common.Generating') : (session.title ?? t('BiChat.Common.Untitled'));\n    const lastActivity = formatRelativeTime(session.updatedAt, t);\n    const accessRole = session.access?.role ?? 'owner';\n    const roleLabel =\n      accessRole === 'editor'\n        ? t('BiChat.Share.RoleEditor')\n        : accessRole === 'viewer'\n          ? t('BiChat.Share.RoleViewer')\n          : accessRole === 'read_all'\n            ? t('BiChat.Share.RoleReadOnly')\n            : '';\n    const visibilityLabel =\n      session.isGroup\n        ? t('BiChat.Sidebar.GroupChat')\n        : accessRole === 'editor' || accessRole === 'viewer'\n          ? t('BiChat.Sidebar.SharedWithYou')\n          : '';\n    const isGroupOrShared = Boolean(session.isGroup || (session.memberCount && session.memberCount > 1));\n    const metaParts = [lastActivity, visibilityLabel, roleLabel].filter(Boolean);\n\n    // Long press handlers for touch devices\n    const { handlers: longPressHandlers } = useLongPress({\n      delay: 500,\n      onLongPress: (e) => {\n        const target = e.currentTarget as HTMLElement;\n        setMenuAnchor(target.getBoundingClientRect());\n        setMenuOpen(true);\n      },\n      hapticFeedback: true,\n    });\n\n    // Add contextmenu event listener as fallback for iPadOS\n    useEffect(() => {\n      const element = itemRef.current;\n      if (!element) {return;}\n\n      const isIPad = /iPad|Macintosh/i.test(navigator.userAgent) && 'ontouchend' in document;\n      if (!isIPad) {return;}\n\n      const handleContextMenu = (e: Event) => {\n        e.preventDefault();\n        const target = e.currentTarget as HTMLElement;\n        setMenuAnchor(target.getBoundingClientRect());\n        setMenuOpen(true);\n      };\n\n      element.addEventListener('contextmenu', handleContextMenu);\n      return () => element.removeEventListener('contextmenu', handleContextMenu);\n    }, [itemRef]);\n\n    const contextMenuItems: ContextMenuItem[] = useMemo(\n      () =>\n        mode === 'archived'\n          ? [\n            ...(onRestore ? [{\n              id: 'restore',\n              label: t('BiChat.Archived.RestoreButton'),\n              icon: <ArrowUUpLeft size={20} />,\n              onClick: () => onRestore(),\n            }] : []),\n            ...(onRename ? [{\n              id: 'rename',\n              label: t('BiChat.Sidebar.RenameChat'),\n              icon: <PencilSimple size={20} />,\n              onClick: () => editableTitleRef.current?.startEditing(),\n            }] : []),\n          ]\n          : [\n            ...(onPin ? [{\n              id: 'pin',\n              label: session.pinned ? t('BiChat.Sidebar.UnpinChat') : t('BiChat.Sidebar.PinChat'),\n              icon: session.pinned ? <Check size={20} /> : <Bookmark size={20} />,\n              onClick: () => onPin(),\n            }] : []),\n            ...(onRename ? [{\n              id: 'rename',\n              label: t('BiChat.Sidebar.RenameChat'),\n              icon: <PencilSimple size={20} />,\n              onClick: () => editableTitleRef.current?.startEditing(),\n            }] : []),\n            ...(onRegenerateTitle ? [{\n              id: 'regenerate',\n              label: t('BiChat.Sidebar.RegenerateTitle'),\n              icon: <ArrowsClockwise size={20} />,\n              onClick: () => onRegenerateTitle(),\n            }] : []),\n            ...(onArchive ? [{\n              id: 'archive',\n              label: t('BiChat.Sidebar.ArchiveChat'),\n              icon: <Archive size={20} />,\n              onClick: () => onArchive(),\n              variant: 'danger' as const,\n            }] : []),\n            ...(onDelete ? [{\n              id: 'delete',\n              label: t('BiChat.Sidebar.DeleteChat'),\n              icon: <Trash size={20} />,\n              onClick: () => onDelete(),\n              variant: 'danger' as const,\n            }] : []),\n          ],\n      [mode, session.pinned, onRestore, onPin, onRename, onRegenerateTitle, onArchive, onDelete, t],\n    );\n\n    const hasContextMenu = contextMenuItems.length > 0;\n\n    return (\n      <>\n        <motion.div\n          variants={sessionItemVariants}\n          initial=\"initial\"\n          animate=\"animate\"\n          whileHover=\"hover\"\n          exit=\"exit\"\n          className=\"relative overflow-hidden rounded-lg\"\n        >\n          {/* Archive zone — revealed by drag */}\n          {canDragArchive && (\n            <motion.div\n              className=\"absolute inset-y-0 right-0 w-20 flex items-center justify-center bg-gray-500 dark:bg-gray-600 rounded-r-lg\"\n              style={{ opacity: archiveOpacity, scale: archiveScale }}\n              aria-hidden=\"true\"\n            >\n              <Archive size={20} className=\"text-white\" />\n            </motion.div>\n          )}\n\n          {/* Draggable item content */}\n          <motion.div\n            drag={canDragArchive ? 'x' : false}\n            dragDirectionLock\n            dragConstraints={{ left: -100, right: 0 }}\n            dragElastic={{ left: 0.2, right: 0.5 }}\n            dragSnapToOrigin\n            style={{ x: canDragArchive ? dragX : undefined }}\n            onDragStart={() => { isDraggingRef.current = true; }}\n            onDragEnd={canDragArchive ? handleDragEnd : undefined}\n            className=\"relative\"\n          >\n          <div\n            role=\"button\"\n            tabIndex={0}\n            ref={itemRef}\n            onClick={() => {\n              if (isDraggingRef.current) {return;}\n              onSelect(session.id);\n            }}\n            onKeyDown={(e) => {\n              const target = e.target as HTMLElement | null;\n              const isFromEditable = !!target?.closest('input, textarea, [contenteditable=\"true\"]');\n              if (isFromEditable) {return;}\n\n              if (e.key === 'Enter' || e.key === ' ') {\n                e.preventDefault();\n                onSelect(session.id);\n              }\n            }}\n            className={`block w-full text-left px-3 py-2 rounded-lg transition-smooth group relative touch-tap cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 ${\n              isActive\n                ? 'bg-primary-50/50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-400 border-l-4 border-primary-400 dark:border-primary-600'\n                : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 active:bg-gray-200 dark:active:bg-gray-700 border-l-4 border-transparent'\n            } ${className}`}\n            aria-current={isActive ? 'page' : undefined}\n            data-session-item\n            data-testid={`${testIdPrefix}-session-${session.id}`}\n            {...longPressHandlers}\n          >\n            <div className=\"flex items-center justify-between gap-2\">\n              <div className=\"flex items-start gap-2 min-w-0 flex-1\">\n                {isGroupOrShared && (\n                  <UsersThree size={14} weight=\"duotone\" className=\"text-primary-500 dark:text-primary-400 mt-1 flex-shrink-0\" />\n                )}\n                <div className=\"flex flex-col min-w-0 flex-1\">\n                  <EditableText\n                    ref={editableTitleRef}\n                    value={displayTitle}\n                    onSave={(newTitle) => onRename?.(newTitle)}\n                    isLoading={isTitleGenerating}\n                  />\n                  <span className=\"text-[11px] text-gray-400 dark:text-gray-500 truncate mt-0.5\">\n                    {metaParts.join(' • ')}\n                    {isGroupOrShared && session.memberCount && session.memberCount > 0 && (\n                      <span className=\"inline-flex items-center ml-1 rounded-full bg-primary-50 dark:bg-primary-900/30 px-1.5 text-[10px] font-medium text-primary-600 dark:text-primary-400\">\n                        {session.memberCount}\n                      </span>\n                    )}\n                  </span>\n                </div>\n              </div>\n              {!isTouch && hasContextMenu && (\n                <Menu>\n                  <MenuButton\n                    onClick={(e: React.MouseEvent) => {\n                      e.preventDefault();\n                      e.stopPropagation();\n                    }}\n                    className=\"opacity-0 group-hover:opacity-100 p-1.5 rounded hover:bg-gray-200 dark:hover:bg-gray-700 transition-smooth flex-shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n                    aria-label={t('BiChat.Sidebar.ChatOptions')}\n                    data-testid={`${testIdPrefix}-session-options-${session.id}`}\n                  >\n                    <DotsThree size={16} className=\"w-4 h-4\" weight=\"bold\" />\n                  </MenuButton>\n                  <MenuItems\n                    anchor=\"bottom start\"\n                    className=\"w-52 bg-white dark:bg-gray-900 rounded-xl shadow-xl border border-gray-200 dark:border-gray-700 z-30 [--anchor-gap:8px] mt-1 p-2 space-y-1\"\n                  >\n                    {mode !== 'archived' && onPin && (\n                      <MenuItem>\n                        {({ focus }) => (\n                          <button\n                            onClick={(e) => {\n                              e.preventDefault();\n                              e.stopPropagation();\n                              onPin();\n                            }}\n                            className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 transition-smooth ${\n                              focus\n                                ? 'bg-gray-100 dark:bg-gray-800/70 ring-1 ring-gray-200/80 dark:ring-gray-700/80'\n                                : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n                            }`}\n                            aria-label={session.pinned ? t('BiChat.Sidebar.UnpinChat') : t('BiChat.Sidebar.PinChat')}\n                            data-testid={`${testIdPrefix}-session-pin-${session.id}`}\n                          >\n                            {session.pinned ? (\n                              <Check size={16} className=\"w-4 h-4\" />\n                            ) : (\n                              <Bookmark size={16} className=\"w-4 h-4\" />\n                            )}\n                            {session.pinned ? t('BiChat.Sidebar.UnpinChat') : t('BiChat.Sidebar.PinChat')}\n                          </button>\n                        )}\n                      </MenuItem>\n                    )}\n                    {onRename && (\n                      <MenuItem>\n                        {({ focus, close }) => (\n                          <button\n                            onClick={(e) => {\n                              e.preventDefault();\n                              e.stopPropagation();\n                              editableTitleRef.current?.startEditing();\n                              close();\n                            }}\n                            className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 transition-smooth ${\n                              focus\n                                ? 'bg-gray-100 dark:bg-gray-800/70 ring-1 ring-gray-200/80 dark:ring-gray-700/80'\n                                : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n                            }`}\n                            aria-label={t('BiChat.Sidebar.RenameChat')}\n                            data-testid={`${testIdPrefix}-session-rename-${session.id}`}\n                          >\n                            <PencilSimple size={16} className=\"w-4 h-4\" />\n                            {t('BiChat.Sidebar.RenameChat')}\n                          </button>\n                        )}\n                      </MenuItem>\n                    )}\n                    {mode !== 'archived' && onRegenerateTitle && (\n                      <MenuItem>\n                        {({ focus, close }) => (\n                          <button\n                            onClick={(e) => {\n                              e.preventDefault();\n                              e.stopPropagation();\n                              onRegenerateTitle();\n                              close();\n                            }}\n                            className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 transition-smooth ${\n                              focus\n                                ? 'bg-gray-100 dark:bg-gray-800/70 ring-1 ring-gray-200/80 dark:ring-gray-700/80'\n                                : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n                            }`}\n                            aria-label={t('BiChat.Sidebar.RegenerateTitle')}\n                            data-testid={`${testIdPrefix}-session-regenerate-${session.id}`}\n                          >\n                            <ArrowsClockwise size={16} className=\"w-4 h-4\" />\n                            {t('BiChat.Sidebar.RegenerateTitle')}\n                          </button>\n                        )}\n                      </MenuItem>\n                    )}\n                    {mode === 'archived' && onRestore && (\n                      <MenuItem>\n                        {({ focus }) => (\n                          <button\n                            onClick={(e) => {\n                              e.preventDefault();\n                              e.stopPropagation();\n                              onRestore();\n                            }}\n                            className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-smooth ${\n                              focus\n                                ? 'text-green-700 dark:text-green-300 bg-green-50 dark:bg-green-900/20 ring-1 ring-green-200/70 dark:ring-green-500/30'\n                                : 'text-green-700 dark:text-green-300 hover:bg-green-50/70 dark:hover:bg-green-900/10'\n                            }`}\n                            aria-label={t('BiChat.Archived.RestoreButton')}\n                            data-testid={`${testIdPrefix}-session-restore-${session.id}`}\n                          >\n                            <ArrowUUpLeft size={16} className=\"w-4 h-4\" />\n                            {t('BiChat.Archived.RestoreButton')}\n                          </button>\n                        )}\n                      </MenuItem>\n                    )}\n                    {mode !== 'archived' && onArchive && (\n                      <MenuItem>\n                        {({ focus }) => (\n                          <button\n                            onClick={(e) => {\n                              e.preventDefault();\n                              e.stopPropagation();\n                              onArchive();\n                            }}\n                            className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-smooth ${\n                              focus\n                                ? 'text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 ring-1 ring-amber-200/70 dark:ring-amber-500/30'\n                                : 'text-amber-600 dark:text-amber-400 hover:bg-amber-50/70 dark:hover:bg-amber-900/10'\n                            }`}\n                            aria-label={t('BiChat.Sidebar.ArchiveChat')}\n                            data-testid={`${testIdPrefix}-session-archive-${session.id}`}\n                          >\n                            <Archive size={16} className=\"w-4 h-4\" />\n                            {t('BiChat.Sidebar.ArchiveChat')}\n                          </button>\n                        )}\n                      </MenuItem>\n                    )}\n                    {onDelete && (\n                      <MenuItem>\n                        {({ focus }) => (\n                          <button\n                            onClick={(e) => {\n                              e.preventDefault();\n                              e.stopPropagation();\n                              onDelete();\n                            }}\n                            className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-smooth ${\n                              focus\n                                ? 'text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 ring-1 ring-red-200/70 dark:ring-red-500/30'\n                                : 'text-red-600 dark:text-red-400 hover:bg-red-50/70 dark:hover:bg-red-900/10'\n                            }`}\n                            aria-label={t('BiChat.Sidebar.DeleteChat')}\n                            data-testid={`${testIdPrefix}-session-delete-${session.id}`}\n                          >\n                            <Trash size={16} className=\"w-4 h-4\" />\n                            {t('BiChat.Sidebar.DeleteChat')}\n                          </button>\n                        )}\n                      </MenuItem>\n                    )}\n                  </MenuItems>\n                </Menu>\n              )}\n            </div>\n          </div>\n          </motion.div>\n        </motion.div>\n        <TouchContextMenu\n          items={contextMenuItems}\n          isOpen={menuOpen}\n          onClose={() => setMenuOpen(false)}\n          anchorRect={menuAnchor}\n        />\n      </>\n    );\n  }\n);\n\nSessionItem.displayName = 'SessionItem';\n\nexport default SessionItem;\n","interface DateGroupHeaderProps {\n  groupName: string\n  count: number\n}\n\n/**\n * Sticky header for date-based session groups\n * Displays group name and session count\n */\nexport default function DateGroupHeader({ groupName, count }: DateGroupHeaderProps) {\n  return (\n    <div className=\"sticky top-0 bg-surface-300 dark:bg-gray-900 px-4 py-2 text-sm font-medium z-10 border-b border-gray-100 dark:border-gray-800\">\n      <div className=\"flex items-center justify-between\">\n        <span className=\"text-gray-700 dark:text-gray-300 font-semibold\">{groupName}</span>\n        <span className=\"text-xs text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 px-2 py-0.5 rounded-full\">\n          {count}\n        </span>\n      </div>\n    </div>\n  );\n}\n","/**\n * UserFilter Component\n * Dropdown to filter chats by user\n * Uses @headlessui/react Menu for accessible dropdown\n */\n\nimport { memo } from 'react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport { CaretDown, X } from '@phosphor-icons/react';\nimport { UserAvatar } from './UserAvatar';\nimport { useTranslation } from '../hooks/useTranslation';\nimport type { SessionUser } from '../types';\n\ninterface UserFilterProps {\n  users: SessionUser[]\n  selectedUser: SessionUser | null\n  onUserChange: (user: SessionUser | null) => void\n  loading?: boolean\n}\n\nfunction UserFilter({ users, selectedUser, onUserChange, loading }: UserFilterProps) {\n  const { t } = useTranslation();\n\n  return (\n    <div className=\"relative\">\n      <Menu>\n        {({ open }) => (\n          <>\n            <MenuButton\n              disabled={loading}\n              className={`\n                cursor-pointer w-full px-3 py-2 bg-white dark:bg-gray-800\n                border border-gray-300 dark:border-gray-600\n                rounded-lg text-sm text-left\n                hover:bg-gray-50 dark:hover:bg-gray-700\n                focus:outline-none focus:ring-2 focus:ring-primary-500\n                transition-smooth\n                disabled:opacity-50 disabled:cursor-not-allowed\n                flex items-center justify-between gap-2\n              `}\n              aria-label={t('BiChat.AllChats.AllUsers')}\n            >\n              {selectedUser ? (\n                <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n                  <UserAvatar\n                    firstName={selectedUser.firstName}\n                    lastName={selectedUser.lastName}\n                    initials={selectedUser.initials}\n                    size=\"sm\"\n                  />\n                  <span className=\"truncate text-gray-900 dark:text-gray-100\">\n                    {selectedUser.firstName} {selectedUser.lastName}\n                  </span>\n                </div>\n              ) : (\n                <span className=\"text-gray-500 dark:text-gray-400\">\n                  {loading ? t('BiChat.AllChats.LoadingUsers') : t('BiChat.AllChats.AllUsers')}\n                </span>\n              )}\n\n              <div className=\"flex items-center gap-1 flex-shrink-0\">\n                {selectedUser && (\n                  <button\n                    onClick={(e) => {\n                      e.preventDefault();\n                      e.stopPropagation();\n                      onUserChange(null);\n                    }}\n                    className=\"cursor-pointer p-1 rounded hover:bg-gray-200 dark:hover:bg-gray-600 transition-smooth\"\n                    aria-label={t('BiChat.Common.Clear')}\n                  >\n                    <X size={14} className=\"w-3.5 h-3.5 text-gray-600 dark:text-gray-400\" />\n                  </button>\n                )}\n                <CaretDown\n                  size={16}\n                  className={`w-4 h-4 text-gray-600 dark:text-gray-400 transition-transform ${\n                    open ? 'rotate-180' : ''\n                  }`}\n                />\n              </div>\n            </MenuButton>\n\n            <MenuItems\n              anchor=\"bottom start\"\n              className=\"\n                w-[var(--button-width)]\n                max-h-64 overflow-y-auto\n                bg-white dark:bg-gray-800\n                border border-gray-200 dark:border-gray-700\n                rounded-lg shadow-lg\n                z-50\n                [--anchor-gap:4px]\n                mt-1 p-1\n              \"\n            >\n              {/* \"All users\" option */}\n              <MenuItem>\n                {({ focus }) => (\n                  <button\n                    onClick={() => onUserChange(null)}\n                    className={`\n                      cursor-pointer w-full text-left px-3 py-2 rounded-lg text-sm\n                      transition-smooth\n                      ${\n                        focus\n                          ? 'bg-gray-100 dark:bg-gray-700'\n                          : 'hover:bg-gray-50 dark:hover:bg-gray-750'\n                      }\n                      ${\n                        !selectedUser\n                          ? 'text-primary-700 dark:text-primary-400 font-medium'\n                          : 'text-gray-900 dark:text-gray-100'\n                      }\n                    `}\n                  >\n                    {t('BiChat.AllChats.AllUsers')}\n                  </button>\n                )}\n              </MenuItem>\n\n              {/* Divider */}\n              {users.length > 0 && (\n                <div className=\"border-t border-gray-200 dark:border-gray-700 my-1\" />\n              )}\n\n              {/* User options */}\n              {users.map((user) => (\n                <MenuItem key={user.id}>\n                  {({ focus }) => (\n                    <button\n                      onClick={() => onUserChange(user)}\n                      className={`\n                        cursor-pointer w-full text-left px-3 py-2 rounded-lg text-sm\n                        transition-smooth\n                        flex items-center gap-2\n                        ${\n                          focus\n                            ? 'bg-gray-100 dark:bg-gray-700'\n                            : 'hover:bg-gray-50 dark:hover:bg-gray-750'\n                        }\n                        ${\n                          selectedUser?.id === user.id\n                            ? 'text-primary-700 dark:text-primary-400 font-medium'\n                            : 'text-gray-900 dark:text-gray-100'\n                        }\n                      `}\n                    >\n                      <UserAvatar\n                        firstName={user.firstName}\n                        lastName={user.lastName}\n                        initials={user.initials}\n                        size=\"sm\"\n                      />\n                      <span className=\"truncate\">\n                        {user.firstName} {user.lastName}\n                      </span>\n                    </button>\n                  )}\n                </MenuItem>\n              ))}\n\n              {/* Empty state */}\n              {users.length === 0 && (\n                <div className=\"px-3 py-6 text-center\">\n                  <p className=\"text-sm text-gray-700 dark:text-gray-300\">{t('BiChat.AllChats.NoUsersFound')}</p>\n                </div>\n              )}\n            </MenuItems>\n          </>\n        )}\n      </Menu>\n    </div>\n  );\n}\n\nconst MemoizedUserFilter = memo(UserFilter);\nMemoizedUserFilter.displayName = 'UserFilter';\n\nexport { MemoizedUserFilter as UserFilter };\nexport default MemoizedUserFilter;\n","/**\n * AllChatsList Component\n * Displays organization-wide chat sessions with infinite scroll\n * Uses ChatDataSource for data fetching (no GraphQL dependency)\n */\n\nimport { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { motion, AnimatePresence } from 'framer-motion';\nimport { Archive, CaretRight } from '@phosphor-icons/react';\nimport { UserAvatar } from './UserAvatar';\nimport { UserFilter } from './UserFilter';\nimport SessionSkeleton from './SessionSkeleton';\nimport { EmptyState } from './EmptyState';\nimport { staggerContainerVariants } from '../animations/variants';\nimport { useTranslation } from '../hooks/useTranslation';\nimport type { ChatDataSource, Session, SessionUser } from '../types';\n\ninterface AllChatsListProps {\n  dataSource: ChatDataSource\n  onSessionSelect: (sessionId: string) => void\n  activeSessionId?: string\n}\n\nexport default function AllChatsList({ dataSource, onSessionSelect, activeSessionId }: AllChatsListProps) {\n  const { t } = useTranslation();\n\n  // State\n  const [includeArchived, setIncludeArchived] = useState(false);\n  const [selectedUser, setSelectedUser] = useState<SessionUser | null>(null);\n  const [offset, setOffset] = useState(0);\n  const [fetching, setFetching] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [chats, setChats] = useState<Session[]>([]);\n  const [totalCount, setTotalCount] = useState(0);\n  const [hasMore, setHasMore] = useState(false);\n  const [users, setUsers] = useState<SessionUser[]>([]);\n  const [usersLoading, setUsersLoading] = useState(false);\n\n  const limit = 20;\n\n  // Fetch users list\n  useEffect(() => {\n    if (!dataSource.listUsers) {return;}\n\n    let cancelled = false;\n    setUsersLoading(true);\n\n    dataSource.listUsers().then((result) => {\n      if (!cancelled) {\n        setUsers(result);\n        setUsersLoading(false);\n      }\n    }).catch(() => {\n      if (!cancelled) {\n        setUsersLoading(false);\n      }\n    });\n\n    return () => { cancelled = true; };\n  }, [dataSource]);\n\n  // Fetch chats\n  useEffect(() => {\n    if (!dataSource.listAllSessions) {return;}\n\n    let cancelled = false;\n    setFetching(true);\n    setError(null);\n\n    dataSource.listAllSessions({\n      limit,\n      offset,\n      includeArchived,\n      userId: selectedUser?.id || null,\n    }).then((result) => {\n      if (!cancelled) {\n        if (offset === 0) {\n          setChats(result.sessions);\n        } else {\n          setChats((prev) => [...prev, ...result.sessions]);\n        }\n        setTotalCount(result.total);\n        setHasMore(result.hasMore);\n        setFetching(false);\n      }\n    }).catch(() => {\n      if (!cancelled) {\n        setError(t('BiChat.AllChats.FailedToLoad'));\n        setFetching(false);\n      }\n    });\n\n    return () => { cancelled = true; };\n  }, [dataSource, offset, includeArchived, selectedUser, t]);\n\n  // Reset offset when filter changes\n  useEffect(() => {\n    setOffset(0);\n    setChats([]);\n  }, [includeArchived, selectedUser]);\n\n  // Load more handler\n  const handleLoadMore = useCallback(() => {\n    if (!fetching && hasMore) {\n      setOffset((prev) => prev + limit);\n    }\n  }, [fetching, hasMore]);\n\n  const loadMoreNodeRef = useRef<HTMLDivElement | null>(null);\n\n  const loadMoreRef = useCallback((node: HTMLDivElement | null) => {\n    loadMoreNodeRef.current = node;\n  }, []);\n\n  // Infinite scroll observer\n  useEffect(() => {\n    const node = loadMoreNodeRef.current;\n    if (!node || fetching || !hasMore) {return;}\n\n    const observer = new IntersectionObserver((entries) => {\n      if (entries[0].isIntersecting) {\n        handleLoadMore();\n      }\n    }, { threshold: 0.1 });\n\n    observer.observe(node);\n\n    return () => observer.disconnect();\n  }, [fetching, hasMore, handleLoadMore]);\n\n  // Derive unique users from chat data if listUsers is not available\n  const derivedUsers = useMemo(() => {\n    if (dataSource.listUsers) {return users;}\n    const userMap = new Map<string, SessionUser>();\n    chats.forEach((chat) => {\n      if (chat.owner && !userMap.has(chat.owner.id)) {\n        userMap.set(chat.owner.id, chat.owner);\n      }\n    });\n    return Array.from(userMap.values());\n  }, [chats, users, dataSource.listUsers]);\n\n  // Expanded state for user groups (tracks expanded owner IDs; collapsed by default)\n  const [expandedGroups, setExpandedGroups] = useState<Set<string>>(new Set());\n\n  const toggleGroup = useCallback((ownerId: string) => {\n    setExpandedGroups((prev) => {\n      const next = new Set(prev);\n      if (next.has(ownerId)) {\n        next.delete(ownerId);\n      } else {\n        next.add(ownerId);\n      }\n      return next;\n    });\n  }, []);\n\n  // Auto-expand the group containing the active session (e.g. deep-link)\n  useEffect(() => {\n    if (!activeSessionId || selectedUser) { return; }\n    const chat = chats.find(c => c.id === activeSessionId);\n    if (chat?.owner?.id) {\n      setExpandedGroups(prev => {\n        if (prev.has(chat.owner!.id)) { return prev; }\n        return new Set([...prev, chat.owner!.id]);\n      });\n    }\n  }, [activeSessionId, chats, selectedUser]);\n\n  // Group chats by owner when no specific user is selected\n  const groupedChats = useMemo(() => {\n    if (selectedUser) {return null;} // flat list when user is selected\n\n    const groupMap = new Map<string, { owner: SessionUser; chats: Session[]; latestUpdatedAt: string }>();\n\n    chats.forEach((chat) => {\n      const owner = chat.owner ?? {\n        id: '__unknown__',\n        firstName: t('BiChat.Common.Untitled'),\n        lastName: '',\n        initials: '?',\n      };\n      const ownerId = owner.id;\n\n      if (!groupMap.has(ownerId)) {\n        groupMap.set(ownerId, {\n          owner,\n          chats: [],\n          latestUpdatedAt: chat.updatedAt,\n        });\n      }\n\n      const group = groupMap.get(ownerId)!;\n      group.chats.push(chat);\n\n      // Track the most recent updatedAt for sorting groups\n      if (chat.updatedAt > group.latestUpdatedAt) {\n        group.latestUpdatedAt = chat.updatedAt;\n      }\n    });\n\n    // Sort groups by most recently active first\n    return Array.from(groupMap.values()).sort(\n      (a, b) => b.latestUpdatedAt.localeCompare(a.latestUpdatedAt),\n    );\n  }, [chats, selectedUser, t]);\n\n  return (\n    <div\n      className=\"flex flex-col h-full overflow-hidden\"\n      onClick={(e) => e.stopPropagation()}\n      onPointerDown={(e) => e.stopPropagation()}\n    >\n      {/* Filter Controls */}\n      <div className=\"px-4 py-3 space-y-3 border-b border-gray-200 dark:border-gray-700 flex-shrink-0\">\n        {/* User filter */}\n        <UserFilter\n          users={derivedUsers}\n          selectedUser={selectedUser}\n          onUserChange={setSelectedUser}\n          loading={usersLoading || (fetching && chats.length === 0)}\n        />\n\n        {/* Include archived toggle */}\n        <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n          <input\n            type=\"checkbox\"\n            checked={includeArchived}\n            onChange={(e) => setIncludeArchived(e.target.checked)}\n            className=\"\n              w-4 h-4 rounded border-gray-300 dark:border-gray-600\n              text-primary-600 focus:ring-primary-500 focus:ring-offset-0\n              bg-white dark:bg-gray-800\n              cursor-pointer\n            \"\n          />\n          <span className=\"text-sm text-gray-700 dark:text-gray-300 flex items-center gap-1.5\">\n            <Archive size={16} className=\"w-4 h-4\" />\n            {t('BiChat.AllChats.IncludeArchived')}\n          </span>\n        </label>\n\n        {/* Results count */}\n        {totalCount > 0 && (\n          <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n            {totalCount === 1\n              ? t('BiChat.AllChats.ChatFound', { count: totalCount })\n              : t('BiChat.AllChats.ChatsFound', { count: totalCount })}\n          </p>\n        )}\n      </div>\n\n      {/* Chat List */}\n      <nav className=\"flex-1 overflow-y-auto px-2 pb-4 hide-scrollbar\" aria-label={t('BiChat.AllChats.OrganizationChats')}>\n        {fetching && chats.length === 0 ? (\n          <SessionSkeleton count={5} />\n        ) : (\n          <>\n            {chats.length > 0 ? (\n              <motion.div\n                className=\"space-y-1 mt-2\"\n                variants={staggerContainerVariants}\n                initial=\"hidden\"\n                animate=\"visible\"\n                role=\"list\"\n                aria-label={t('BiChat.AllChats.OrganizationChatSessions')}\n              >\n                {groupedChats ? (\n                  /* ── Grouped view (no user selected) ── */\n                  groupedChats.map((group) => {\n                    const ownerId = group.owner.id;\n                    const ownerName = [group.owner.firstName, group.owner.lastName].filter(Boolean).join(' ');\n                    const isCollapsed = !expandedGroups.has(ownerId);\n\n                    return (\n                      <div key={ownerId} className=\"mb-1\">\n                        {/* Group header */}\n                        <div\n                          role=\"button\"\n                          tabIndex={0}\n                          onClick={() => toggleGroup(ownerId)}\n                          onKeyDown={(e) => {\n                            if (e.key === 'Enter' || e.key === ' ') {\n                              e.preventDefault();\n                              toggleGroup(ownerId);\n                            }\n                          }}\n                          className=\"flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-lg transition-smooth select-none\"\n                          aria-expanded={!isCollapsed}\n                        >\n                          <CaretRight\n                            size={14}\n                            weight=\"bold\"\n                            className={`shrink-0 text-gray-500 dark:text-gray-400 transition-transform duration-150 ${isCollapsed ? '' : 'rotate-90'}`}\n                          />\n                          <UserAvatar\n                            firstName={group.owner.firstName}\n                            lastName={group.owner.lastName}\n                            initials={group.owner.initials}\n                            size=\"sm\"\n                          />\n                          <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate flex-1 min-w-0\">\n                            {ownerName || t('BiChat.Common.Untitled')}\n                          </span>\n                          <span className=\"text-xs text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 px-2 py-0.5 rounded-full flex-shrink-0\">\n                            {group.chats.length}\n                          </span>\n                        </div>\n\n                        {/* Group items */}\n                        <AnimatePresence initial={false}>\n                          {!isCollapsed && (\n                            <motion.div\n                              key={`group-${ownerId}`}\n                              initial={{ height: 0, opacity: 0 }}\n                              animate={{ height: 'auto', opacity: 1 }}\n                              exit={{ height: 0, opacity: 0 }}\n                              transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n                              className=\"overflow-hidden\"\n                            >\n                              <div className=\"space-y-0.5 pl-6\">\n                                {group.chats.map((chat) => (\n                                  <motion.div\n                                    key={chat.id}\n                                    initial={{ opacity: 0, y: -10 }}\n                                    animate={{ opacity: 1, y: 0 }}\n                                    exit={{ opacity: 0, y: -10 }}\n                                  >\n                                    <div\n                                      role=\"link\"\n                                      tabIndex={0}\n                                      onClick={() => onSessionSelect(chat.id)}\n                                      onKeyDown={(e) => {\n                                        if (e.key === 'Enter' || e.key === ' ') {\n                                          e.preventDefault();\n                                          onSessionSelect(chat.id);\n                                        }\n                                      }}\n                                      className={`\n                                        block px-3 py-2 rounded-lg transition-smooth group cursor-pointer\n                                        ${\n                                          chat.id === activeSessionId\n                                            ? 'bg-primary-50/50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-400 border-l-4 border-primary-400 dark:border-primary-600'\n                                            : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 border-l-4 border-transparent'\n                                        }\n                                      `}\n                                      aria-current={chat.id === activeSessionId ? 'page' : undefined}\n                                    >\n                                      <div className=\"flex items-center gap-2 min-w-0\">\n                                        <p className=\"text-sm truncate flex-1 min-w-0\">\n                                          {chat.title || t('BiChat.Common.Untitled')}\n                                        </p>\n                                        <div className=\"flex items-center gap-1.5 flex-shrink-0\">\n                                          {chat.isGroup && chat.memberCount && chat.memberCount > 1 && (\n                                            <span className=\"text-xs text-gray-400 dark:text-gray-500\">\n                                              {chat.memberCount}\n                                            </span>\n                                          )}\n                                          {chat.status === 'archived' && (\n                                            <span className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 rounded-full text-xs\">\n                                              <Archive size={12} className=\"w-3 h-3\" />\n                                              {t('BiChat.Chat.Archived')}\n                                            </span>\n                                          )}\n                                        </div>\n                                      </div>\n                                    </div>\n                                  </motion.div>\n                                ))}\n                              </div>\n                            </motion.div>\n                          )}\n                        </AnimatePresence>\n                      </div>\n                    );\n                  })\n                ) : (\n                  /* ── Flat view (user selected) ── */\n                  chats.map((chat) => {\n                    const owner = chat.owner ?? {\n                      id: '',\n                      firstName: '',\n                      lastName: '',\n                      initials: 'U',\n                    };\n                    const ownerName = [owner.firstName, owner.lastName].filter(Boolean).join(' ');\n                    return (\n                      <motion.div\n                        key={chat.id}\n                        initial={{ opacity: 0, y: -10 }}\n                        animate={{ opacity: 1, y: 0 }}\n                        exit={{ opacity: 0, y: -10 }}\n                      >\n                        <div\n                          role=\"link\"\n                          tabIndex={0}\n                          onClick={() => onSessionSelect(chat.id)}\n                          onKeyDown={(e) => {\n                            if (e.key === 'Enter' || e.key === ' ') {\n                              e.preventDefault();\n                              onSessionSelect(chat.id);\n                            }\n                          }}\n                          className={`\n                            block px-3 py-2 rounded-lg transition-smooth group cursor-pointer\n                            ${\n                              chat.id === activeSessionId\n                                ? 'bg-primary-50/50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-400 border-l-4 border-primary-400 dark:border-primary-600'\n                                : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 border-l-4 border-transparent'\n                            }\n                          `}\n                          aria-current={chat.id === activeSessionId ? 'page' : undefined}\n                        >\n                          <div className=\"flex items-start gap-2\">\n                            {/* Owner avatar */}\n                            <UserAvatar\n                              firstName={owner.firstName}\n                              lastName={owner.lastName}\n                              initials={owner.initials}\n                              size=\"sm\"\n                            />\n\n                            {/* Chat info */}\n                            <div className=\"flex-1 min-w-0\">\n                              <p className=\"text-sm font-medium truncate\">\n                                {chat.title || t('BiChat.Common.Untitled')}\n                              </p>\n                              {ownerName && (\n                                <p className=\"text-xs text-gray-500 dark:text-gray-400 truncate\">\n                                  {ownerName}\n                                </p>\n                              )}\n                              {chat.status === 'archived' && (\n                                <span className=\"inline-flex items-center gap-1 mt-1 px-2 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 rounded-full text-xs\">\n                                  <Archive size={12} className=\"w-3 h-3\" />\n                                  {t('BiChat.Chat.Archived')}\n                                </span>\n                              )}\n                            </div>\n                          </div>\n                        </div>\n                      </motion.div>\n                    );\n                  })\n                )}\n\n                {/* Load more trigger */}\n                {hasMore && (\n                  <div ref={loadMoreRef} className=\"py-4 text-center\">\n                    {fetching ? (\n                      <SessionSkeleton count={2} />\n                    ) : (\n                      <button\n                        onClick={handleLoadMore}\n                        className=\"text-sm text-primary-600 dark:text-primary-400 hover:underline\"\n                      >\n                        {t('BiChat.AllChats.LoadMore')}\n                      </button>\n                    )}\n                  </div>\n                )}\n              </motion.div>\n            ) : (\n              <EmptyState\n                title={t('BiChat.AllChats.NoChatsFound')}\n                description={\n                  selectedUser\n                    ? t('BiChat.AllChats.NoChatsFromUser', { firstName: selectedUser.firstName, lastName: selectedUser.lastName })\n                    : includeArchived\n                    ? t('BiChat.AllChats.NoChatsInOrg')\n                    : t('BiChat.AllChats.NoActiveChatsInOrg')\n                }\n              />\n            )}\n          </>\n        )}\n\n        {error && (\n          <div className=\"mx-2 mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n            <p className=\"text-xs text-red-600 dark:text-red-400\">\n              {error}\n            </p>\n          </div>\n        )}\n      </nav>\n    </div>\n  );\n}\n","/**\n * Sidebar Component\n * Main chat sidebar with session list, search, and session management.\n * Router-agnostic: uses callbacks for navigation instead of react-router-dom.\n *\n * Collapse UX (matches SDK sidebar pattern):\n * - Click empty space to toggle\n * - Cursor hints (e-resize / w-resize)\n * - localStorage persistence\n * - Keyboard shortcut: Cmd+B toggle\n */\n\nimport React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { motion, useReducedMotion } from 'framer-motion';\nimport { X, Plus, Archive, CaretLineLeft, CaretLineRight, Gear, Users, List, ChatCircle, MagnifyingGlass } from '@phosphor-icons/react';\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';\nimport SessionSkeleton from './SessionSkeleton';\nimport SessionItem from './SessionItem';\nimport ConfirmModal from './ConfirmModal';\nimport SearchInput from './SearchInput';\nimport DateGroupHeader from './DateGroupHeader';\nimport { EmptyState } from './EmptyState';\nimport LoadingSpinner from './LoadingSpinner';\nimport AllChatsList from './AllChatsList';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useToast } from '../hooks/useToast';\nimport { groupSessionsByDate } from '../utils/sessionGrouping';\nimport {\n  staggerContainerVariants,\n  buttonVariants,\n} from '../animations/variants';\nimport type { Session, ChatDataSource } from '../types';\nimport { ToastContainer } from './ToastContainer';\nimport { toErrorDisplay, type RPCErrorDisplay } from '../utils/errorDisplay';\n\n/** Matches sidebar width transition (duration-300) + small buffer for focus-after-expand */\nconst SIDEBAR_EXPAND_FOCUS_DELAY_MS = 350;\n\nfunction ErrorAlert({ error }: { error: RPCErrorDisplay }) {\n  const amber = error.isPermissionDenied;\n  return (\n    <div\n      className={`mx-2 mt-4 p-3 border rounded-xl cursor-default ${\n        amber\n          ? 'bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800'\n          : 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800'\n      }`}\n    >\n      <p\n        className={`text-xs font-medium ${\n          amber\n            ? 'text-amber-700 dark:text-amber-300'\n            : 'text-red-600 dark:text-red-400'\n        }`}\n      >\n        {error.title}\n      </p>\n      {error.description && (\n        <p\n          className={`mt-1 text-xs ${\n            amber\n              ? 'text-amber-600 dark:text-amber-400'\n              : 'text-red-500 dark:text-red-300'\n          }`}\n        >\n          {error.description}\n        </p>\n      )}\n    </div>\n  );\n}\n\nconst COLLAPSE_STORAGE_KEY = 'bichat-sidebar-collapsed';\nconst SESSION_RECONCILE_POLL_INTERVAL_MS = 2000;\nconst SESSION_RECONCILE_MAX_POLLS = 30;\nconst ACTIVE_SESSION_MISS_MAX_RETRIES = 8;\nconst ACTIVE_SESSION_MISS_RETRY_DELAY_MS = 1000;\nconst MAX_COLLAPSED_INDICATORS = 5;\n\nfunction useSidebarCollapse() {\n  const [isCollapsed, setIsCollapsed] = useState(() => {\n    try {\n      return localStorage.getItem(COLLAPSE_STORAGE_KEY) === 'true';\n    } catch {\n      return false;\n    }\n  });\n\n  const isCollapsedRef = useRef(isCollapsed);\n  useEffect(() => {\n    isCollapsedRef.current = isCollapsed;\n  }, [isCollapsed]);\n\n  const toggle = useCallback(() => {\n    setIsCollapsed((prev) => {\n      const next = !prev;\n      try { localStorage.setItem(COLLAPSE_STORAGE_KEY, String(next)); } catch { /* noop */ }\n      return next;\n    });\n  }, []);\n\n  const expand = useCallback(() => {\n    setIsCollapsed(false);\n    try { localStorage.setItem(COLLAPSE_STORAGE_KEY, 'false'); } catch { /* noop */ }\n  }, []);\n\n  const collapse = useCallback(() => {\n    setIsCollapsed(true);\n    try { localStorage.setItem(COLLAPSE_STORAGE_KEY, 'true'); } catch { /* noop */ }\n  }, []);\n\n  return { isCollapsed, isCollapsedRef, toggle, expand, collapse };\n}\n\nexport type ActiveTab = 'my-chats' | 'all-chats'\n\nexport interface SidebarProps {\n  dataSource: ChatDataSource\n  onSessionSelect: (sessionId: string) => void\n  onNewChat: () => void\n  onArchivedView?: () => void\n  activeSessionId?: string\n  creating?: boolean\n  showAllChatsTab?: boolean\n  isOpen?: boolean\n  onClose?: () => void\n  headerSlot?: React.ReactNode\n  footerSlot?: React.ReactNode\n  className?: string\n  /** Controlled active tab. When provided, overrides internal state. */\n  activeTab?: ActiveTab\n  /** Called when tab changes. Use with activeTab for controlled mode. */\n  onTabChange?: (tab: ActiveTab) => void\n}\n\nexport default function Sidebar({\n  dataSource,\n  onSessionSelect,\n  onNewChat,\n  onArchivedView,\n  activeSessionId,\n  creating,\n  showAllChatsTab,\n  isOpen: _isOpen,\n  onClose,\n  headerSlot,\n  footerSlot,\n  className = '',\n  activeTab: controlledActiveTab,\n  onTabChange,\n}: SidebarProps) {\n  const { t } = useTranslation();\n  const toast = useToast();\n  const shouldReduceMotion = useReducedMotion();\n  const sessionListRef = useRef<HTMLElement>(null);\n  const searchContainerRef = useRef<HTMLDivElement>(null);\n  const activeSessionMissRetriesRef = useRef<Record<string, number>>({});\n\n  // Collapse state — disabled when used as a mobile drawer (onClose present)\n  const { isCollapsed, toggle, expand, collapse } = useSidebarCollapse();\n  const collapsible = !onClose; // desktop only\n\n  // Click-on-empty-space to toggle (same pattern as SDK sidebar)\n  const handleSidebarClick = useCallback(\n    (e: React.MouseEvent<HTMLElement>) => {\n      if (!collapsible) {return;}\n      const interactive = 'a, button, input, textarea, select, summary, label, [role=\"button\"], [role=\"link\"], [contenteditable=\"true\"], [data-no-sidebar-toggle]';\n      if ((e.target as HTMLElement).closest(interactive)) {return;}\n      toggle();\n    },\n    [collapsible, toggle]\n  );\n\n  // Keyboard shortcut: Cmd+B (toggle)\n  useEffect(() => {\n    if (!collapsible) {return;}\n\n    const handleKeyDown = (e: KeyboardEvent) => {\n      const isMod = e.metaKey || e.ctrlKey;\n\n      if (isMod && e.key === 'b') {\n        e.preventDefault();\n        toggle();\n      }\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    return () => document.removeEventListener('keydown', handleKeyDown);\n  }, [collapsible, toggle]);\n\n  // Auto-collapse when artifacts panel expands\n  useEffect(() => {\n    if (!collapsible) {return;}\n\n    const handler = (e: Event) => {\n      const detail = (e as CustomEvent<{ expanded: boolean }>).detail;\n      if (detail?.expanded) {\n        collapse();\n      }\n    };\n    window.addEventListener('bichat:artifacts-panel-expanded', handler);\n    return () => window.removeEventListener('bichat:artifacts-panel-expanded', handler);\n  }, [collapsible, collapse]);\n\n  const showCollapsed = collapsible && isCollapsed;\n\n  // Allow tooltips to escape sidebar bounds once collapse transition settles\n  const [collapsedOverflowVisible, setCollapsedOverflowVisible] = useState(false);\n  useEffect(() => {\n    if (!showCollapsed) {\n      setCollapsedOverflowVisible(false);\n      return;\n    }\n    const timer = setTimeout(() => setCollapsedOverflowVisible(true), 300);\n    return () => clearTimeout(timer);\n  }, [showCollapsed]);\n\n  // View state (my chats vs all chats) — controlled or uncontrolled\n  const [internalActiveTab, setInternalActiveTab] = useState<ActiveTab>('my-chats');\n  const activeTab = controlledActiveTab ?? internalActiveTab;\n  const handleTabChange = useCallback((tab: ActiveTab) => {\n    if (controlledActiveTab === undefined) {\n      setInternalActiveTab(tab);\n    }\n    onTabChange?.(tab);\n  }, [controlledActiveTab, onTabChange]);\n\n  // Search state\n  const [searchQuery, setSearchQuery] = useState('');\n\n  // Session data\n  const [sessions, setSessions] = useState<Session[]>([]);\n  const [loading, setLoading] = useState(true);\n  const [loadError, setLoadError] = useState<RPCErrorDisplay | null>(null);\n  const [actionError, setActionError] = useState<RPCErrorDisplay | null>(null);\n  const accessDenied = loadError?.isPermissionDenied === true;\n\n  // Refresh key — bump to re-fetch sessions\n  const [refreshKey, setRefreshKey] = useState(0);\n  const [reconcilePollToken, setReconcilePollToken] = useState(0);\n\n  // Confirm modal state\n  const [showConfirm, setShowConfirm] = useState(false);\n  const [sessionToArchive, setSessionToArchive] = useState<string | null>(null);\n\n  // Fetch sessions\n  const fetchSessions = useCallback(async () => {\n    try {\n      setLoading(true);\n      setLoadError(null);\n      setActionError(null);\n      const result = await dataSource.listSessions({ limit: 50 });\n      setSessions(result.sessions);\n    } catch (err) {\n      console.error('Failed to load sessions:', err);\n      setLoadError(toErrorDisplay(err, t('BiChat.Sidebar.FailedToLoadSessions')));\n    } finally {\n      setLoading(false);\n    }\n  }, [dataSource, t]);\n\n  useEffect(() => {\n    fetchSessions();\n  }, [fetchSessions, refreshKey]);\n\n  useEffect(() => {\n    const handleSessionsUpdated = (event: Event) => {\n      setRefreshKey((k) => k + 1);\n\n      const detail = (event as CustomEvent<{ reason?: string }>).detail;\n      const reason = detail?.reason;\n      if (!reason || reason === 'session_created' || reason === 'message_sent' || reason === 'title_regenerate_requested') {\n        setReconcilePollToken((k) => k + 1);\n      }\n    };\n\n    window.addEventListener('bichat:sessions-updated', handleSessionsUpdated);\n    return () => {\n      window.removeEventListener('bichat:sessions-updated', handleSessionsUpdated);\n    };\n  }, []);\n\n  useEffect(() => {\n    activeSessionMissRetriesRef.current = {};\n  }, [activeSessionId]);\n\n  useEffect(() => {\n    if (!activeSessionId) {return;}\n    if (loading) {return;}\n\n    const hasActiveSession = sessions.some((session) => session.id === activeSessionId);\n    if (hasActiveSession) {\n      delete activeSessionMissRetriesRef.current[activeSessionId];\n      return;\n    }\n\n    const attempts = activeSessionMissRetriesRef.current[activeSessionId] ?? 0;\n    if (attempts >= ACTIVE_SESSION_MISS_MAX_RETRIES) {\n      return;\n    }\n    activeSessionMissRetriesRef.current[activeSessionId] = attempts + 1;\n\n    const timeoutId = window.setTimeout(() => {\n      setRefreshKey((k) => k + 1);\n      setReconcilePollToken((k) => k + 1);\n    }, ACTIVE_SESSION_MISS_RETRY_DELAY_MS);\n\n    return () => window.clearTimeout(timeoutId);\n  }, [activeSessionId, loading, sessions]);\n\n  // Poll for title updates on sessions with placeholder titles.\n  // Use a stable boolean so that updating sessions inside the poll\n  // does NOT re-trigger the effect (which would create overlapping intervals).\n  const hasPlaceholderTitles = useMemo(() => {\n    const newChatLabel = t('BiChat.Chat.NewChat');\n    return (\n      Array.isArray(sessions) &&\n      sessions.some((s) => s && (!s.title || s.title === newChatLabel))\n    );\n  }, [sessions, t]);\n\n  useEffect(() => {\n    if (!hasPlaceholderTitles && reconcilePollToken === 0) {return;}\n\n    let pollCount = 0;\n\n    const intervalId = setInterval(async () => {\n      pollCount++;\n      try {\n        const result = await dataSource.listSessions({ limit: 50 });\n        setSessions(result.sessions);\n      } catch {\n        // ignore poll errors\n      }\n      if (pollCount >= SESSION_RECONCILE_MAX_POLLS) {\n        clearInterval(intervalId);\n      }\n    }, SESSION_RECONCILE_POLL_INTERVAL_MS);\n\n    return () => clearInterval(intervalId);\n  }, [hasPlaceholderTitles, dataSource, reconcilePollToken]);\n\n  const handleArchiveRequest = (sessionId: string) => {\n    setSessionToArchive(sessionId);\n    setShowConfirm(true);\n  };\n\n  const handleUndoArchive = useCallback(async (sessionId: string) => {\n    try {\n      await dataSource.unarchiveSession(sessionId);\n      setRefreshKey((k) => k + 1);\n      window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n        detail: { reason: 'unarchived', sessionId },\n      }));\n    } catch (undoErr) {\n      console.error('Failed to restore session:', undoErr);\n      toast.error(t('BiChat.Sidebar.FailedToRestoreChat'));\n    }\n  }, [dataSource, t, toast]);\n\n  const confirmArchive = async () => {\n    if (!sessionToArchive) {return;}\n\n    const wasCurrentSession = activeSessionId === sessionToArchive;\n    const archivedId = sessionToArchive;\n\n    try {\n      await dataSource.archiveSession(archivedId);\n      setRefreshKey((k) => k + 1);\n      window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n        detail: { reason: 'archived', sessionId: archivedId },\n      }));\n\n      if (wasCurrentSession) {\n        onSessionSelect('');\n      }\n\n      toast.success(t('BiChat.Sidebar.ChatArchived'), 8000, {\n        label: t('BiChat.Common.Undo'),\n        onClick: () => handleUndoArchive(archivedId),\n      });\n    } catch (err) {\n      console.error('Failed to archive session:', err);\n      const display = toErrorDisplay(err, t('BiChat.Sidebar.FailedToArchiveChat'));\n      setActionError(display);\n      toast.error(display.title);\n    } finally {\n      setShowConfirm(false);\n      setSessionToArchive(null);\n    }\n  };\n\n  const handleTogglePin = useCallback(async (\n    sessionId: string,\n    currentlyPinned: boolean\n  ) => {\n    try {\n      if (currentlyPinned) {\n        await dataSource.unpinSession(sessionId);\n      } else {\n        await dataSource.pinSession(sessionId);\n      }\n      setRefreshKey((k) => k + 1);\n    } catch (err) {\n      console.error('Failed to toggle pin:', err);\n      const display = toErrorDisplay(err, t('BiChat.Sidebar.FailedToTogglePin'));\n      setActionError(display);\n      toast.error(display.title);\n    }\n  }, [dataSource, t, toast]);\n\n  const handleRenameSession = useCallback(async (sessionId: string, newTitle: string) => {\n    try {\n      await dataSource.renameSession(sessionId, newTitle);\n      toast.success(t('BiChat.Sidebar.ChatRenamedSuccessfully'));\n      setRefreshKey((k) => k + 1);\n    } catch (err) {\n      console.error('Failed to update session title:', err);\n      const display = toErrorDisplay(err, t('BiChat.Sidebar.FailedToRenameChat'));\n      setActionError(display);\n      toast.error(display.title);\n    }\n  }, [dataSource, t, toast]);\n\n  const handleRegenerateTitle = useCallback(async (sessionId: string) => {\n    try {\n      await dataSource.regenerateSessionTitle(sessionId);\n      toast.success(t('BiChat.Sidebar.TitleRegenerated'));\n      window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n        detail: { reason: 'title_regenerate_requested', sessionId },\n      }));\n    } catch (err) {\n      console.error('Failed to regenerate title:', err);\n      const display = toErrorDisplay(err, t('BiChat.Sidebar.FailedToRegenerateTitle'));\n      setActionError(display);\n      toast.error(display.title);\n    }\n  }, [dataSource, t, toast]);\n\n  // Stable callbacks for SessionItem — accept session ID as parameter\n  const handleSessionSelect = useCallback(\n    (sessionId: string) => onSessionSelect(sessionId),\n    [onSessionSelect],\n  );\n  const handleSessionArchive = useCallback(\n    (sessionId: string) => handleArchiveRequest(sessionId),\n    [],\n  );\n  const handleSessionPin = useCallback(\n    (sessionId: string, pinned: boolean) => handleTogglePin(sessionId, pinned),\n    [handleTogglePin],\n  );\n  const handleSessionRename = useCallback(\n    (sessionId: string, newTitle: string) => handleRenameSession(sessionId, newTitle),\n    [handleRenameSession],\n  );\n  const handleSessionRegenerateTitle = useCallback(\n    (sessionId: string) => handleRegenerateTitle(sessionId),\n    [handleRegenerateTitle],\n  );\n\n  // Filter sessions by search\n  const filteredSessions = useMemo(() => {\n    if (!searchQuery.trim()) {return sessions;}\n    const q = searchQuery.toLowerCase();\n    return sessions.filter((s) => s.title?.toLowerCase().includes(q));\n  }, [sessions, searchQuery]);\n\n  // Separate pinned and unpinned\n  const pinnedSessions = useMemo(\n    () => filteredSessions.filter((s) => s.pinned),\n    [filteredSessions]\n  );\n  const unpinnedSessions = useMemo(\n    () => filteredSessions.filter((s) => !s.pinned),\n    [filteredSessions]\n  );\n\n  // Group unpinned sessions by date\n  const sessionGroups = useMemo(() => {\n    const groups = groupSessionsByDate(unpinnedSessions, t);\n    return Array.isArray(groups)\n      ? groups.map((group) => ({\n          ...group,\n          sessions: Array.isArray(group.sessions) ? group.sessions : [],\n        }))\n      : [];\n  }, [unpinnedSessions, t]);\n\n  // Keep collapsed indicators in the same visual order as expanded list.\n  const orderedUnpinnedSessions = useMemo(\n    () => sessionGroups.flatMap((group) => group.sessions),\n    [sessionGroups]\n  );\n\n  // Collapsed sidebar indicators — pinned first, then most recent\n  const collapsedIndicators = useMemo(() => {\n    const seen = new Set<string>();\n    const result: Session[] = [];\n    for (const s of [...pinnedSessions, ...orderedUnpinnedSessions]) {\n      if (seen.has(s.id)) {continue;}\n      seen.add(s.id);\n      result.push(s);\n      if (result.length >= MAX_COLLAPSED_INDICATORS) {break;}\n    }\n    return result;\n  }, [pinnedSessions, orderedUnpinnedSessions]);\n\n  const totalSessionCount = filteredSessions.length;\n  const overflowCount = Math.max(0, totalSessionCount - collapsedIndicators.length);\n\n  // Keyboard navigation for session list (WAI-ARIA listbox pattern)\n  const handleSessionListKeyDown = useCallback(\n    (e: React.KeyboardEvent<HTMLElement>) => {\n      const nav = sessionListRef.current;\n      if (!nav) {return;}\n\n      const focusableItems = Array.from(\n        nav.querySelectorAll<HTMLElement>('button[data-session-item]')\n      );\n      if (focusableItems.length === 0) {return;}\n\n      const currentIndex = focusableItems.indexOf(\n        document.activeElement as HTMLElement\n      );\n\n      let nextIndex: number | null = null;\n\n      switch (e.key) {\n        case 'ArrowDown':\n          e.preventDefault();\n          nextIndex =\n            currentIndex < 0 ? 0 : Math.min(currentIndex + 1, focusableItems.length - 1);\n          break;\n        case 'ArrowUp':\n          e.preventDefault();\n          nextIndex =\n            currentIndex < 0\n              ? focusableItems.length - 1\n              : Math.max(currentIndex - 1, 0);\n          break;\n        case 'Home':\n          e.preventDefault();\n          nextIndex = 0;\n          break;\n        case 'End':\n          e.preventDefault();\n          nextIndex = focusableItems.length - 1;\n          break;\n      }\n\n      if (nextIndex !== null) {\n        focusableItems[nextIndex].focus();\n      }\n    },\n    []\n  );\n\n  return (\n    <>\n      <aside\n        onClick={collapsible ? handleSidebarClick : undefined}\n        className={`relative bg-surface-300 dark:bg-gray-900 border-r border-gray-200 dark:border-gray-700 h-full min-h-0 flex flex-col ${collapsedOverflowVisible ? 'overflow-visible' : 'overflow-hidden'} transition-[width] duration-300 ease-in-out ${\n          showCollapsed\n            ? 'w-16 cursor-e-resize'\n            : collapsible\n              ? 'w-64 cursor-w-resize'\n              : 'w-64'\n        } ${className}`}\n        style={{ willChange: 'width' }}\n        role=\"navigation\"\n        aria-label={t('BiChat.Sidebar.ChatSessions')}\n      >\n        {/* Collapsed overlay — absolutely positioned, fades in after width shrinks */}\n        {collapsible && (\n          <div\n            className={`absolute inset-x-0 top-0 bottom-0 z-10 flex flex-col items-center pt-3 gap-3 transition-opacity ${\n              showCollapsed\n                ? 'opacity-100 duration-150 delay-100'\n                : 'opacity-0 pointer-events-none duration-100'\n            }`}\n          >\n            <div className=\"group/tooltip relative\">\n              <motion.button\n                onClick={(e) => {\n                  e.stopPropagation();\n                  onNewChat();\n                }}\n                disabled={creating || loading || accessDenied}\n                className=\"w-10 h-10 rounded-lg bg-primary-600 hover:bg-primary-700 active:bg-primary-800 text-white shadow-sm flex items-center justify-center disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer transition-colors focus-visible:ring-2 focus-visible:ring-primary-400/50\"\n                title={t('BiChat.Chat.NewChat')}\n                aria-label={t('BiChat.Sidebar.CreateNewChat')}\n                whileTap={{ scale: 0.95 }}\n              >\n                {creating ? (\n                  <div className=\"w-4 h-4 border-2 border-white/50 border-t-transparent rounded-full animate-spin\" />\n                ) : (\n                  <Plus size={18} weight=\"bold\" />\n                )}\n              </motion.button>\n              <span className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 rounded-md bg-gray-900 dark:bg-gray-100 px-2 py-1 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/tooltip:opacity-100 transition-opacity whitespace-nowrap shadow-lg\">\n                {t('BiChat.Chat.NewChat')}\n              </span>\n            </div>\n\n            {/* Search button — expands sidebar and focuses search */}\n            <div className=\"group/search relative\">\n              <motion.button\n                onClick={(e) => {\n                  e.stopPropagation();\n                  expand();\n                  setTimeout(() => {\n                    const input = searchContainerRef.current?.querySelector('input');\n                    input?.focus();\n                  }, SIDEBAR_EXPAND_FOCUS_DELAY_MS);\n                }}\n                className=\"w-10 h-10 rounded-lg bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 text-gray-500 dark:text-gray-400 flex items-center justify-center cursor-pointer transition-colors focus-visible:ring-2 focus-visible:ring-primary-400/50 focus-visible:outline-none\"\n                aria-label={t('BiChat.Sidebar.SearchChats')}\n                whileTap={{ scale: 0.95 }}\n              >\n                <MagnifyingGlass size={18} />\n              </motion.button>\n              <span className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 rounded-md bg-gray-900 dark:bg-gray-100 px-2 py-1 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/search:opacity-100 group-focus-within/search:opacity-100 transition-opacity whitespace-nowrap shadow-lg\">\n                {t('BiChat.Sidebar.SearchChats')}\n              </span>\n            </div>\n\n            {/* Session indicators */}\n            {collapsedIndicators.length > 0 && (\n              <motion.div\n                className=\"flex flex-col items-center gap-1.5 mt-1\"\n                variants={shouldReduceMotion ? undefined : staggerContainerVariants}\n                initial=\"hidden\"\n                animate={showCollapsed ? 'visible' : 'hidden'}\n              >\n                {collapsedIndicators.map((session) => {\n                  const isActive = session.id === activeSessionId;\n                  const initial = session.title?.trim()?.[0]?.toUpperCase();\n                  return (\n                    <motion.div\n                      key={session.id}\n                      className=\"group/indicator relative\"\n                      variants={\n                        shouldReduceMotion\n                          ? undefined\n                          : {\n                              hidden: { opacity: 0, scale: 0.8 },\n                              visible: { opacity: 1, scale: 1 },\n                            }\n                      }\n                    >\n                      <motion.button\n                        onClick={(e) => {\n                          e.stopPropagation();\n                          onSessionSelect(session.id);\n                        }}\n                        className={`w-9 h-9 rounded-full flex items-center justify-center text-xs font-medium cursor-pointer transition-colors focus-visible:ring-2 focus-visible:ring-primary-400/50 focus-visible:outline-none ${\n                          isActive\n                            ? 'bg-primary-100 dark:bg-primary-900/40 text-primary-700 dark:text-primary-300 ring-2 ring-primary-500 dark:ring-primary-400'\n                            : 'bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'\n                        }`}\n                        aria-label={session.title || t('BiChat.Chat.NewChat')}\n                        whileTap={{ scale: 0.95 }}\n                      >\n                        {initial ? (\n                          initial\n                        ) : (\n                          <ChatCircle size={16} weight=\"fill\" />\n                        )}\n                      </motion.button>\n                      <div className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 w-52 rounded-lg bg-gray-900 dark:bg-gray-100 px-3 py-2 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/indicator:opacity-100 group-focus-within/indicator:opacity-100 transition-opacity shadow-lg break-words\">\n                        {session.title || t('BiChat.Chat.NewChat')}\n                      </div>\n                    </motion.div>\n                  );\n                })}\n                {overflowCount > 0 && (\n                  <motion.div\n                    className=\"group/overflow relative\"\n                    variants={\n                      shouldReduceMotion\n                        ? undefined\n                        : {\n                            hidden: { opacity: 0, scale: 0.8 },\n                            visible: { opacity: 1, scale: 1 },\n                          }\n                    }\n                  >\n                    <motion.button\n                      onClick={(e) => {\n                        e.stopPropagation();\n                        toggle();\n                      }}\n                      className=\"w-9 h-9 rounded-full flex items-center justify-center text-[10px] font-semibold bg-gray-50 dark:bg-gray-800/60 text-gray-500 dark:text-gray-500 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors focus-visible:ring-2 focus-visible:ring-primary-400/50 focus-visible:outline-none\"\n                      aria-label={t('BiChat.Sidebar.MoreChats', { count: overflowCount })}\n                      whileTap={{ scale: 0.95 }}\n                    >\n                      +{overflowCount}\n                    </motion.button>\n                    <span className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 rounded-md bg-gray-900 dark:bg-gray-100 px-2 py-1 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/overflow:opacity-100 group-focus-within/overflow:opacity-100 transition-opacity whitespace-nowrap shadow-lg\">\n                      {t('BiChat.Sidebar.ChatSessions')}\n                    </span>\n                  </motion.div>\n                )}\n              </motion.div>\n            )}\n          </div>\n        )}\n\n        {/* Expanded content — fades out before width shrinks */}\n        <div\n          className={`flex flex-col flex-1 min-h-0 w-64 shrink-0 transition-opacity ${\n            showCollapsed\n              ? 'opacity-0 pointer-events-none duration-100'\n              : collapsible\n                ? 'opacity-100 duration-150 delay-[200ms]'\n                : ''\n          }`}\n        >\n          {/* Header — only rendered when there is content to show */}\n          {(headerSlot || onClose) && (\n            <div className=\"p-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between\">\n              {headerSlot}\n              {onClose && (\n                <motion.button\n                  onClick={onClose}\n                  className=\"cursor-pointer p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-smooth text-gray-600 dark:text-gray-400\"\n                  title={t('BiChat.Sidebar.CloseSidebar')}\n                  aria-label={t('BiChat.Sidebar.CloseSidebar')}\n                  whileHover=\"hover\"\n                  whileTap=\"tap\"\n                  variants={buttonVariants}\n                >\n                  <X size={20} className=\"w-5 h-5\" />\n                </motion.button>\n              )}\n            </div>\n          )}\n\n          {/* Conditional content based on active view */}\n          {activeTab === 'all-chats' && showAllChatsTab ? (\n            <AllChatsList\n              dataSource={dataSource}\n              onSessionSelect={onSessionSelect}\n              activeSessionId={activeSessionId}\n            />\n          ) : (\n            <>\n              {/* Search Input */}\n              <div ref={searchContainerRef} className=\"mt-3 px-4\">\n                <SearchInput\n                  value={searchQuery}\n                  onChange={setSearchQuery}\n                  placeholder={t('BiChat.Sidebar.SearchChats')}\n                />\n              </div>\n\n              {/* New Chat Button */}\n              <div className=\"p-4\">\n                <motion.button\n                  onClick={(e) => {\n                    e.stopPropagation();\n                    onNewChat();\n                  }}\n                  disabled={creating || loading || accessDenied}\n                  className=\"cursor-pointer w-full px-4 py-2.5 bg-primary-600 dark:bg-primary-700 text-white rounded-lg hover:bg-primary-700 hover:-translate-y-0.5 active:bg-primary-800 transition-all duration-150 font-medium shadow-sm disabled:opacity-40 disabled:cursor-not-allowed flex items-center justify-center gap-2 focus-visible:ring-2 focus-visible:ring-primary-400/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900\"\n                  title={accessDenied ? t('BiChat.Sidebar.MissingPermission') : t('BiChat.Chat.NewChat')}\n                  aria-label={t('BiChat.Sidebar.CreateNewChat')}\n                  whileHover={shouldReduceMotion ? {} : { y: -1 }}\n                  whileTap={shouldReduceMotion ? {} : { scale: 0.98 }}\n                >\n                  {creating ? (\n                    <>\n                      <LoadingSpinner variant=\"spinner\" size=\"sm\" />\n                      <span>{t('BiChat.Common.Creating')}</span>\n                    </>\n                  ) : (\n                    <>\n                      <Plus size={16} weight=\"bold\" />\n                      <span>{t('BiChat.Chat.NewChat')}</span>\n                    </>\n                  )}\n                </motion.button>\n              </div>\n\n              {/* Chat History */}\n              <nav\n                ref={sessionListRef}\n                className=\"flex-1 overflow-y-auto px-2 pb-4 hide-scrollbar\"\n                aria-label={t('BiChat.Sidebar.ChatHistory')}\n                onKeyDown={handleSessionListKeyDown}\n              >\n                {loading && sessions.length === 0 ? (\n                  <SessionSkeleton count={5} />\n                ) : (\n                  <>\n                    {/* Pinned Sessions */}\n                    {pinnedSessions.length > 0 && (\n                      <div className=\"mb-4\">\n                        <DateGroupHeader\n                          groupName={t('BiChat.Common.Pinned')}\n                          count={pinnedSessions.length}\n                        />\n                        <motion.div\n                          className=\"space-y-1 mt-2\"\n                          variants={staggerContainerVariants}\n                          initial=\"hidden\"\n                          animate=\"visible\"\n                          role=\"list\"\n                          aria-label={t('BiChat.Sidebar.PinnedChats')}\n                        >\n                          {pinnedSessions.map((session) => {\n                            const canWrite = session.access?.canWrite ?? true;\n                            return (\n                              <SessionItem\n                                key={session.id}\n                                session={session}\n                                isActive={session.id === activeSessionId}\n                                onSelect={() => handleSessionSelect(session.id)}\n                                onArchive={canWrite ? () => handleSessionArchive(session.id) : undefined}\n                                onPin={canWrite ? () => handleSessionPin(session.id, session.pinned) : undefined}\n                                onRename={canWrite ? (newTitle) => handleSessionRename(session.id, newTitle) : undefined}\n                                onRegenerateTitle={canWrite ? () => handleSessionRegenerateTitle(session.id) : undefined}\n                              />\n                            );\n                          })}\n                        </motion.div>\n                        <div className=\"border-b border-gray-200 dark:border-gray-700 my-3\" />\n                      </div>\n                    )}\n\n                    {/* Grouped Sessions by Date */}\n                    {sessionGroups.map((group) => (\n                      <div key={group.name} className=\"mb-4\">\n                        <DateGroupHeader\n                          groupName={group.name}\n                          count={group.sessions.length}\n                        />\n                        <motion.div\n                          className=\"space-y-1 mt-2\"\n                          variants={staggerContainerVariants}\n                          initial=\"hidden\"\n                          animate=\"visible\"\n                          role=\"list\"\n                          aria-label={`${group.name} chats`}\n                        >\n                          {group.sessions.map((session) => {\n                            const canWrite = session.access?.canWrite ?? true;\n                            return (\n                              <SessionItem\n                                key={session.id}\n                                session={session}\n                                isActive={session.id === activeSessionId}\n                                onSelect={() => handleSessionSelect(session.id)}\n                                onArchive={canWrite ? () => handleSessionArchive(session.id) : undefined}\n                                onPin={canWrite ? () => handleSessionPin(session.id, session.pinned) : undefined}\n                                onRename={canWrite ? (newTitle) => handleSessionRename(session.id, newTitle) : undefined}\n                                onRegenerateTitle={canWrite ? () => handleSessionRegenerateTitle(session.id) : undefined}\n                              />\n                            );\n                          })}\n                        </motion.div>\n                      </div>\n                    ))}\n\n                    {/* Empty State */}\n                    {filteredSessions.length === 0 && !loading && (\n                      <EmptyState\n                        title={\n                          searchQuery\n                            ? t('BiChat.Sidebar.NoChatsFound', { query: searchQuery })\n                            : t('BiChat.Sidebar.NoChatsYet')\n                        }\n                        description={\n                          searchQuery\n                            ? undefined\n                            : t('BiChat.Sidebar.CreateOneToGetStarted')\n                        }\n                        action={\n                          searchQuery ? (\n                            <button\n                              onClick={() => setSearchQuery('')}\n                              className=\"cursor-pointer text-sm text-primary-600 dark:text-primary-400 hover:underline\"\n                            >\n                              {t('BiChat.Common.Clear')}\n                            </button>\n                          ) : undefined\n                        }\n                      />\n                    )}\n                  </>\n                )}\n\n                {loadError && <ErrorAlert error={loadError} />}\n                {actionError && !loadError && <ErrorAlert error={actionError} />}\n              </nav>\n\n              {/* Footer slot */}\n              {footerSlot}\n            </>\n          )}\n\n          {/* Footer — settings (left) + collapse toggle (right) */}\n          {collapsible && (\n            <div className=\"mt-auto border-t border-gray-100 dark:border-gray-800/80 px-4 py-3 flex items-center justify-between\">\n              {/* Gear settings menu */}\n              {(onArchivedView || showAllChatsTab) ? (\n                <Menu>\n                  <MenuButton\n                    onClick={(e: React.MouseEvent) => {\n                      e.stopPropagation();\n                    }}\n                    disabled={loading || accessDenied}\n                    className=\"flex items-center justify-center rounded-lg text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 p-2\"\n                    aria-label={t('BiChat.Sidebar.Settings')}\n                    title={t('BiChat.Sidebar.Settings')}\n                  >\n                    <Gear size={20} />\n                  </MenuButton>\n                  <MenuItems\n                    anchor=\"top start\"\n                    className=\"w-48 bg-white dark:bg-gray-900 rounded-xl shadow-lg border border-gray-200 dark:border-gray-700 z-[var(--bichat-z-dropdown,10)] [--anchor-gap:8px] mb-1 p-1.5\"\n                  >\n                    {onArchivedView && (\n                      <MenuItem>\n                        {({ focus, close }) => (\n                          <button\n                            onClick={(e) => {\n                              e.preventDefault();\n                              e.stopPropagation();\n                              onArchivedView();\n                              close();\n                            }}\n                            className={`cursor-pointer flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-[13px] text-gray-600 dark:text-gray-300 transition-colors ${\n                              focus ? 'bg-gray-100 dark:bg-gray-800/70' : ''\n                            }`}\n                            aria-label={t('BiChat.Sidebar.ArchivedChats')}\n                          >\n                            <Archive size={16} className=\"text-gray-400 dark:text-gray-500\" />\n                            {t('BiChat.Sidebar.ArchivedChats')}\n                          </button>\n                        )}\n                      </MenuItem>\n                    )}\n                    {showAllChatsTab && activeTab !== 'all-chats' && (\n                      <MenuItem>\n                        {({ focus, close }) => (\n                          <button\n                            onClick={(e) => {\n                              e.preventDefault();\n                              e.stopPropagation();\n                              handleTabChange('all-chats');\n                              close();\n                            }}\n                            className={`cursor-pointer flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-[13px] text-gray-600 dark:text-gray-300 transition-colors ${\n                              focus ? 'bg-gray-100 dark:bg-gray-800/70' : ''\n                            }`}\n                            aria-label={t('BiChat.Sidebar.AllChats')}\n                          >\n                            <Users size={16} className=\"text-gray-400 dark:text-gray-500\" />\n                            {t('BiChat.Sidebar.AllChats')}\n                          </button>\n                        )}\n                      </MenuItem>\n                    )}\n                    {showAllChatsTab && activeTab === 'all-chats' && (\n                      <MenuItem>\n                        {({ focus, close }) => (\n                          <button\n                            onClick={(e) => {\n                              e.preventDefault();\n                              e.stopPropagation();\n                              handleTabChange('my-chats');\n                              close();\n                            }}\n                            className={`cursor-pointer flex w-full items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-[13px] text-gray-600 dark:text-gray-300 transition-colors ${\n                              focus ? 'bg-gray-100 dark:bg-gray-800/70' : ''\n                            }`}\n                            aria-label={t('BiChat.Sidebar.MyChats')}\n                          >\n                            <List size={16} className=\"text-gray-400 dark:text-gray-500\" />\n                            {t('BiChat.Sidebar.MyChats')}\n                          </button>\n                        )}\n                      </MenuItem>\n                    )}\n                  </MenuItems>\n                </Menu>\n              ) : (\n                <div />\n              )}\n\n              {/* Collapse toggle */}\n              <button\n                onClick={(e) => {\n                  e.stopPropagation();\n                  toggle();\n                }}\n                className=\"flex items-center gap-2 rounded-lg px-3 py-2 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n                title={t('BiChat.Sidebar.CollapseSidebar')}\n                aria-label={t('BiChat.Sidebar.CollapseSidebar')}\n              >\n                <CaretLineLeft size={16} />\n                <span className=\"text-xs font-medium\">{t('BiChat.Sidebar.Collapse')}</span>\n              </button>\n            </div>\n          )}\n        </div>\n\n        {/* Collapsed footer — expand button */}\n        {collapsible && showCollapsed && (\n          <div className=\"absolute bottom-0 inset-x-0 z-10 border-t border-gray-100 dark:border-gray-800/80 py-3 flex justify-center\">\n            <div className=\"group/tooltip relative\">\n              <button\n                onClick={(e) => {\n                  e.stopPropagation();\n                  toggle();\n                }}\n                className=\"w-10 h-10 flex items-center justify-center rounded-lg text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n                title={t('BiChat.Sidebar.ExpandSidebar')}\n                aria-label={t('BiChat.Sidebar.ExpandSidebar')}\n              >\n                <CaretLineRight size={16} />\n              </button>\n              <span className=\"pointer-events-none absolute left-full ml-2 top-1/2 -translate-y-1/2 rounded-md bg-gray-900 dark:bg-gray-100 px-2 py-1 text-xs font-medium text-white dark:text-gray-900 opacity-0 group-hover/tooltip:opacity-100 transition-opacity whitespace-nowrap shadow-lg\">\n                {t('BiChat.Sidebar.Expand')}\n              </span>\n            </div>\n          </div>\n        )}\n      </aside>\n\n      {/* Confirm Archive Modal */}\n      <ConfirmModal\n        isOpen={showConfirm}\n        title={t('BiChat.Sidebar.ArchiveChatSession')}\n        message={t('BiChat.Sidebar.ArchiveChatMessage')}\n        confirmText={t('BiChat.Sidebar.ArchiveButton')}\n        cancelText={t('BiChat.Common.Cancel')}\n        isDanger={true}\n        onConfirm={confirmArchive}\n        onCancel={() => {\n          setShowConfirm(false);\n          setSessionToArchive(null);\n        }}\n      />\n\n      {/* Toast notifications */}\n      <ToastContainer toasts={toast.toasts} onDismiss={toast.dismiss} />\n    </>\n  );\n}\n","/**\n * useToast Hook\n * Manages toast notification state\n */\n\nimport { useState, useCallback, useRef } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning'\n\nexport interface ToastAction {\n  label: string\n  onClick: () => void\n}\n\nexport interface ToastItem {\n  id: string\n  type: ToastType\n  message: string\n  duration?: number\n  action?: ToastAction\n}\n\nexport interface UseToastReturn {\n  toasts: ToastItem[]\n  success: (msg: string, duration?: number, action?: ToastAction) => void\n  error: (msg: string, duration?: number, action?: ToastAction) => void\n  info: (msg: string, duration?: number, action?: ToastAction) => void\n  warning: (msg: string, duration?: number, action?: ToastAction) => void\n  dismiss: (id: string) => void\n  dismissAll: () => void\n}\n\n/**\n * Generate a unique ID for a toast\n */\nfunction generateId(): string {\n  return Math.random().toString(36).substring(7);\n}\n\nconst DEDUPE_WINDOW_MS = 2500;\nconst MAX_ACTIVE_TOASTS = 5;\n\n/**\n * Hook for managing toast notifications\n *\n * @example\n * ```tsx\n * const { toasts, success, error, dismiss } = useToast()\n *\n * // Show a success toast\n * success('Operation completed!')\n *\n * // Show an error toast with custom duration\n * error('Something went wrong', 10000)\n *\n * // Render toasts\n * <ToastContainer toasts={toasts} onDismiss={dismiss} />\n * ```\n */\nexport function useToast(): UseToastReturn {\n  const [toasts, setToasts] = useState<ToastItem[]>([]);\n  const recentToastMapRef = useRef<Map<string, number>>(new Map());\n\n  const showToast = useCallback(\n    (type: ToastType, message: string, duration?: number, action?: ToastAction) => {\n      const normalizedMessage = message.trim().toLowerCase();\n      const key = `${type}:${normalizedMessage}`;\n      const now = Date.now();\n      const lastShownAt = recentToastMapRef.current.get(key);\n      if (lastShownAt && now - lastShownAt < DEDUPE_WINDOW_MS) {\n        return;\n      }\n\n      // Drop old dedupe entries to keep map small.\n      for (const [mapKey, ts] of recentToastMapRef.current.entries()) {\n        if (now - ts > DEDUPE_WINDOW_MS * 4) {\n          recentToastMapRef.current.delete(mapKey);\n        }\n      }\n      recentToastMapRef.current.set(key, now);\n\n      const id = generateId();\n      setToasts((prev) => {\n        const next = [...prev, { id, type, message, duration, action }];\n        if (next.length <= MAX_ACTIVE_TOASTS) {return next;}\n        return next.slice(next.length - MAX_ACTIVE_TOASTS);\n      });\n    },\n    []\n  );\n\n  const dismiss = useCallback((id: string) => {\n    setToasts((prev) => prev.filter((t) => t.id !== id));\n  }, []);\n\n  const dismissAll = useCallback(() => {\n    setToasts([]);\n    recentToastMapRef.current.clear();\n  }, []);\n\n  const success = useCallback(\n    (msg: string, duration?: number, action?: ToastAction) => showToast('success', msg, duration, action),\n    [showToast],\n  );\n  const error = useCallback(\n    (msg: string, duration?: number, action?: ToastAction) => showToast('error', msg, duration, action),\n    [showToast],\n  );\n  const info = useCallback(\n    (msg: string, duration?: number, action?: ToastAction) => showToast('info', msg, duration, action),\n    [showToast],\n  );\n  const warning = useCallback(\n    (msg: string, duration?: number, action?: ToastAction) => showToast('warning', msg, duration, action),\n    [showToast],\n  );\n\n  return {\n    toasts,\n    success,\n    error,\n    info,\n    warning,\n    dismiss,\n    dismissAll,\n  };\n}\n","import { differenceInDays, startOfDay } from 'date-fns';\nimport type { Session, SessionGroup } from '../types';\n\n/**\n * Groups chat sessions by date relative to today\n * Categories: Today, Yesterday, Last 7 Days, Last 30 Days, Older\n * Sessions within each group are sorted by updatedAt (most recent first)\n */\nexport function groupSessionsByDate(sessions: Session[], t?: (key: string) => string): SessionGroup[] {\n  // Ensure sessions is always an array\n  const safeSessions = Array.isArray(sessions) ? sessions : [];\n\n  const now = new Date();\n  const today = startOfDay(now);\n\n  // Use translation function if provided, otherwise use key as fallback\n  const translate = t || ((key: string) => key);\n\n  // Map internal keys to translation keys\n  const dateLabels: Record<string, string> = {\n    'Today': translate('BiChat.DateGroup.Today'),\n    'Yesterday': translate('BiChat.DateGroup.Yesterday'),\n    'Last 7 Days': translate('BiChat.DateGroup.Last7Days'),\n    'Last 30 Days': translate('BiChat.DateGroup.Last30Days'),\n    'Older': translate('BiChat.DateGroup.Older'),\n  };\n\n  // Initialize all groups in the desired order\n  const groupMap = new Map<string, Session[]>([\n    ['Today', []],\n    ['Yesterday', []],\n    ['Last 7 Days', []],\n    ['Last 30 Days', []],\n    ['Older', []],\n  ]);\n\n  // Categorize each session\n  safeSessions.forEach((session) => {\n    const sessionDate = new Date(session.updatedAt);\n    const daysDiff = differenceInDays(today, startOfDay(sessionDate));\n\n    if (daysDiff === 0) {\n      groupMap.get('Today')!.push(session);\n    } else if (daysDiff === 1) {\n      groupMap.get('Yesterday')!.push(session);\n    } else if (daysDiff <= 7) {\n      groupMap.get('Last 7 Days')!.push(session);\n    } else if (daysDiff <= 30) {\n      groupMap.get('Last 30 Days')!.push(session);\n    } else {\n      groupMap.get('Older')!.push(session);\n    }\n  });\n\n  // Sort sessions within each group by updatedAt (most recent first)\n  groupMap.forEach((sessions) => {\n    sessions.sort((a, b) => {\n      return new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime();\n    });\n  });\n\n  // Convert to array and filter out empty groups, translating names\n  const groups: SessionGroup[] = [];\n  groupMap.forEach((sessions, internalName) => {\n    if (sessions.length > 0) {\n      groups.push({ name: dateLabels[internalName] || internalName, sessions });\n    }\n  });\n\n  return groups;\n}\n","/**\n * ArchivedChatList Component\n * Displays archived chat sessions with restore functionality.\n * Router-agnostic: uses callbacks for navigation instead of react-router-dom.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { motion } from 'framer-motion';\nimport { Archive, ArrowLeft } from '@phosphor-icons/react';\nimport SessionItem from './SessionItem';\nimport SearchInput from './SearchInput';\nimport DateGroupHeader from './DateGroupHeader';\nimport LoadingSpinner from './LoadingSpinner';\nimport ConfirmModal from './ConfirmModal';\nimport { EmptyState } from './EmptyState';\nimport { ToastContainer } from './ToastContainer';\nimport { useTranslation } from '../hooks/useTranslation';\nimport { useToast, type UseToastReturn } from '../hooks/useToast';\nimport { groupSessionsByDate } from '../utils/sessionGrouping';\nimport { staggerContainerVariants } from '../animations/variants';\nimport type { Session, ChatDataSource } from '../types';\n\nexport interface ArchivedChatListProps {\n  dataSource: ChatDataSource\n  onBack: () => void\n  onSessionSelect: (sessionId: string) => void\n  activeSessionId?: string\n  className?: string\n  toast?: UseToastReturn\n}\n\nexport default function ArchivedChatList({\n  dataSource,\n  onBack,\n  onSessionSelect,\n  activeSessionId,\n  className = '',\n  toast: toastFromProps,\n}: ArchivedChatListProps) {\n  const { t } = useTranslation();\n  const localToast = useToast();\n  const toast = toastFromProps ?? localToast;\n  const shouldRenderToastContainer = !toastFromProps;\n\n  // Search state\n  const [searchQuery, setSearchQuery] = useState('');\n\n  // Session data\n  const [sessions, setSessions] = useState<Session[]>([]);\n  const [loading, setLoading] = useState(true);\n\n  // Refresh key\n  const [refreshKey, setRefreshKey] = useState(0);\n\n  // Confirm modal state for restore action\n  const [showConfirm, setShowConfirm] = useState(false);\n  const [sessionToRestore, setSessionToRestore] = useState<string | null>(null);\n\n  // Fetch archived sessions\n  const fetchSessions = useCallback(async () => {\n    try {\n      setLoading(true);\n      const result = await dataSource.listSessions({\n        limit: 100,\n        includeArchived: true,\n      });\n      setSessions(result.sessions.filter((s) => s.status === 'archived'));\n    } catch (err) {\n      console.error('Failed to load archived sessions:', err);\n    } finally {\n      setLoading(false);\n    }\n  }, [dataSource]);\n\n  useEffect(() => {\n    fetchSessions();\n  }, [fetchSessions, refreshKey]);\n\n  const handleRestoreRequest = (sessionId: string) => {\n    setSessionToRestore(sessionId);\n    setShowConfirm(true);\n  };\n\n  const confirmRestore = async () => {\n    if (!sessionToRestore) {return;}\n\n    try {\n      const restoredSessionID = sessionToRestore;\n      await dataSource.unarchiveSession(restoredSessionID);\n      window.dispatchEvent(new CustomEvent('bichat:sessions-updated', {\n        detail: { reason: 'restored', sessionId: restoredSessionID },\n      }));\n      setRefreshKey((k) => k + 1);\n      toast.success(t('BiChat.Archived.ChatRestoredSuccessfully'));\n    } catch (err) {\n      console.error('Failed to restore session:', err);\n      toast.error(t('BiChat.Archived.FailedToRestoreChat'));\n    } finally {\n      setShowConfirm(false);\n      setSessionToRestore(null);\n    }\n  };\n\n  const handleRenameSession = async (sessionId: string, newTitle: string) => {\n    try {\n      await dataSource.renameSession(sessionId, newTitle);\n      toast.success(t('BiChat.Sidebar.ChatRenamedSuccessfully'));\n      setRefreshKey((k) => k + 1);\n    } catch (err) {\n      console.error('Failed to update session title:', err);\n      toast.error(t('BiChat.Sidebar.FailedToRenameChat'));\n    }\n  };\n\n  // Filter by search query\n  const filteredSessions = useMemo(() => {\n    if (!searchQuery.trim()) {return sessions;}\n    const q = searchQuery.toLowerCase();\n    return sessions.filter((s) => s.title?.toLowerCase().includes(q));\n  }, [sessions, searchQuery]);\n\n  // Group sessions by date\n  const sessionGroups = useMemo(() => {\n    const groups = groupSessionsByDate(filteredSessions, t);\n    return Array.isArray(groups)\n      ? groups.map((group) => ({\n          ...group,\n          sessions: Array.isArray(group.sessions) ? group.sessions : [],\n        }))\n      : [];\n  }, [filteredSessions, t]);\n\n  const isEmpty = sessions.length === 0;\n  const isEmptyAfterSearch = filteredSessions.length === 0 && !!searchQuery;\n\n  return (\n    <div\n      className={`flex-1 flex flex-col bg-gray-50 dark:bg-gray-900 ${className}`}\n    >\n      {/* Header */}\n      <div className=\"border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 px-6 py-4\">\n        <div className=\"flex items-center gap-3 mb-4\">\n          <button\n            onClick={onBack}\n            className=\"inline-flex items-center gap-2 px-3 py-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors text-gray-600 dark:text-gray-400\"\n            aria-label={t('BiChat.Archived.BackToChats')}\n          >\n            <ArrowLeft size={20} className=\"w-5 h-5\" />\n            {t('BiChat.Common.Back')}\n          </button>\n        </div>\n\n        <div className=\"flex items-center gap-2 mb-4\">\n          <Archive\n            size={24}\n            className=\"w-6 h-6 text-gray-600 dark:text-gray-400\"\n          />\n          <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n            {t('BiChat.Archived.Title')}\n          </h1>\n        </div>\n\n        {/* Search */}\n        <SearchInput\n          value={searchQuery}\n          onChange={setSearchQuery}\n          placeholder={t('BiChat.Archived.SearchArchivedChats')}\n        />\n      </div>\n\n      {/* Content */}\n      <div className=\"flex-1 overflow-y-auto\">\n        {loading && sessions.length === 0 ? (\n          <div className=\"flex items-center justify-center h-full\">\n            <LoadingSpinner />\n          </div>\n        ) : isEmpty ? (\n          <div className=\"flex items-center justify-center h-full px-6\">\n            <EmptyState\n              icon={\n                <Archive\n                  size={48}\n                  className=\"text-gray-400 dark:text-gray-500\"\n                />\n              }\n              title={t('BiChat.Archived.NoArchivedChats')}\n              description={t('BiChat.Archived.NoArchivedChatsDescription')}\n            />\n          </div>\n        ) : isEmptyAfterSearch ? (\n          <div className=\"flex items-center justify-center h-full px-6\">\n            <EmptyState\n              icon={\n                <Archive\n                  size={48}\n                  className=\"text-gray-400 dark:text-gray-500\"\n                />\n              }\n              title={t('BiChat.Archived.NoResults')}\n              description={t('BiChat.Archived.NoResultsDescription', {\n                query: searchQuery,\n              })}\n            />\n          </div>\n        ) : (\n          <motion.div\n            className=\"px-4 py-4 space-y-4\"\n            variants={staggerContainerVariants}\n            initial=\"hidden\"\n            animate=\"visible\"\n          >\n            {sessionGroups.map((group) => (\n              <div key={group.name}>\n                <DateGroupHeader\n                  groupName={group.name}\n                  count={group.sessions.length}\n                />\n                <motion.ul className=\"space-y-1 mt-3 mb-4\" role=\"list\">\n                  {group.sessions.map((session) => (\n                    <motion.li key={session.id} className=\"opacity-70\">\n                      <SessionItem\n                        session={session}\n                        isActive={session.id === activeSessionId}\n                        mode=\"archived\"\n                        testIdPrefix=\"archived\"\n                        onSelect={() => onSessionSelect(session.id)}\n                        onRestore={() => handleRestoreRequest(session.id)}\n                        onRename={(newTitle) =>\n                          handleRenameSession(session.id, newTitle)\n                        }\n                      />\n                    </motion.li>\n                  ))}\n                </motion.ul>\n              </div>\n            ))}\n          </motion.div>\n        )}\n      </div>\n\n      {/* Confirm Restore Modal */}\n      <ConfirmModal\n        isOpen={showConfirm}\n        title={t('BiChat.Archived.RestoreChat')}\n        message={t('BiChat.Archived.RestoreChatMessage')}\n        confirmText={t('BiChat.Archived.RestoreButton')}\n        cancelText={t('BiChat.Common.Cancel')}\n        isDanger={false}\n        onConfirm={confirmRestore}\n        onCancel={() => {\n          setShowConfirm(false);\n          setSessionToRestore(null);\n        }}\n      />\n\n      {/* Toast notifications */}\n      {shouldRenderToastContainer && (\n        <ToastContainer toasts={toast.toasts} onDismiss={toast.dismiss} />\n      )}\n    </div>\n  );\n}\n","/**\n * Skip to main content link for keyboard navigation\n * Hidden by default, visible on keyboard focus\n * Allows users to skip navigation and go directly to main content\n */\n\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport default function SkipLink() {\n  const { t } = useTranslation();\n\n  return (\n    <a\n      href=\"#main-content\"\n      className=\"sr-only focus-visible:not-sr-only focus-visible:absolute focus-visible:top-4 focus-visible:left-4 focus-visible:z-50 focus-visible:bg-primary-600 focus-visible:text-white focus-visible:px-4 focus-visible:py-2 focus-visible:rounded-lg focus-visible:shadow-lg\"\n    >\n      {t('BiChat.SkipLink.Label')}\n    </a>\n  );\n}\n","/**\n * useSidebarState — mobile breakpoint detection + drawer open/close state.\n * SSR-safe. Auto-closes drawer when resizing to desktop.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 767px)';\n\nfunction getIsMobile(): boolean {\n  if (typeof window === 'undefined') {return false;}\n  return window.matchMedia(MOBILE_QUERY).matches;\n}\n\nexport interface UseSidebarStateReturn {\n  isMobile: boolean\n  isMobileOpen: boolean\n  openMobile: () => void\n  closeMobile: () => void\n  toggleMobile: () => void\n}\n\nexport function useSidebarState(): UseSidebarStateReturn {\n  const [isMobile, setIsMobile] = useState(getIsMobile);\n  const [isMobileOpen, setIsMobileOpen] = useState(false);\n\n  useEffect(() => {\n    if (typeof window === 'undefined') {return;}\n\n    const mql = window.matchMedia(MOBILE_QUERY);\n\n    const handler = (e: MediaQueryListEvent) => {\n      setIsMobile(e.matches);\n      if (!e.matches) {setIsMobileOpen(false);}\n    };\n\n    // Safari < 14 uses addListener; modern browsers use addEventListener\n    if (mql.addEventListener) {\n      mql.addEventListener('change', handler);\n    } else if (mql.addListener) {\n      mql.addListener(handler);\n    }\n\n    return () => {\n      if (mql.removeEventListener) {\n        mql.removeEventListener('change', handler);\n      } else if (mql.removeListener) {\n        mql.removeListener(handler);\n      }\n    };\n  }, []);\n\n  const openMobile = useCallback(() => setIsMobileOpen(true), []);\n  const closeMobile = useCallback(() => setIsMobileOpen(false), []);\n  const toggleMobile = useCallback(() => setIsMobileOpen((v) => !v), []);\n\n  return { isMobile, isMobileOpen, openMobile, closeMobile, toggleMobile };\n}\n","/**\n * BiChatLayout Component\n * Full-page layout with responsive sidebar, mobile drawer, page transitions,\n * keyboard shortcuts (Cmd+N), and SkipLink accessibility.\n *\n * Router-agnostic: consumers provide renderSidebar, routeKey, and onNewChat callbacks.\n */\n\nimport React, { useEffect, useRef, useMemo } from 'react';\nimport { AnimatePresence, motion, type PanInfo } from 'framer-motion';\nimport { List } from '@phosphor-icons/react';\nimport SkipLink from './SkipLink';\nimport { useSidebarState, type UseSidebarStateReturn } from '../hooks/useSidebarState';\nimport { useFocusTrap } from '../hooks/useFocusTrap';\nimport { useKeyboardShortcuts, type ShortcutConfig } from '../hooks/useKeyboardShortcuts';\nimport { useTranslation } from '../hooks/useTranslation';\n\nexport interface SidebarDrawerProps {\n  onClose?: () => void\n}\n\nexport interface BiChatLayoutProps {\n  /** Render function for the sidebar. Receives `{ onClose }` when in mobile drawer mode. */\n  renderSidebar: (props: SidebarDrawerProps) => React.ReactNode\n  /** Main page content */\n  children: React.ReactNode\n  /** Callback for Cmd+N keyboard shortcut */\n  onNewChat?: () => void\n  /** Key for AnimatePresence page transitions (e.g. location.pathname). Omit to disable transitions. */\n  routeKey?: string\n  /** Custom class for the root container */\n  className?: string\n}\n\nexport function BiChatLayout({\n  renderSidebar,\n  children,\n  onNewChat,\n  routeKey,\n  className = '',\n}: BiChatLayoutProps) {\n  const { t } = useTranslation();\n  const { isMobile, isMobileOpen, openMobile, closeMobile } = useSidebarState();\n  const drawerRef = useRef<HTMLDivElement>(null);\n  const menuButtonRef = useRef<HTMLButtonElement>(null);\n\n  // Focus trap on mobile drawer\n  useFocusTrap(drawerRef, isMobile && isMobileOpen, menuButtonRef.current);\n\n  // Cmd+N keyboard shortcut\n  const shortcuts = useMemo<ShortcutConfig[]>(() => {\n    if (!onNewChat) {return [];}\n    return [{ key: 'n', ctrl: true, callback: onNewChat, description: 'New chat' }];\n  }, [onNewChat]);\n  useKeyboardShortcuts(shortcuts);\n\n  // Escape key closes mobile drawer\n  useEffect(() => {\n    if (!isMobile || !isMobileOpen) {return;}\n\n    const onKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') {\n        e.preventDefault();\n        closeMobile();\n      }\n    };\n    document.addEventListener('keydown', onKeyDown);\n    return () => document.removeEventListener('keydown', onKeyDown);\n  }, [closeMobile, isMobile, isMobileOpen]);\n\n  // Swipe-left to close drawer\n  const handleDrawerDragEnd = (_: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n    if (info.offset.x < -80) {\n      closeMobile();\n    }\n  };\n\n  // Page transition content\n  const content = routeKey ? (\n    <AnimatePresence mode=\"wait\" initial={false}>\n      <motion.div\n        key={routeKey}\n        className=\"flex flex-1 min-w-0 min-h-0\"\n        initial={{ opacity: 0, y: 4 }}\n        animate={{ opacity: 1, y: 0 }}\n        exit={{ opacity: 0, y: -4 }}\n        transition={{ duration: 0.15, ease: 'easeOut' }}\n      >\n        {children}\n      </motion.div>\n    </AnimatePresence>\n  ) : (\n    <div className=\"flex flex-1 min-w-0 min-h-0\">{children}</div>\n  );\n\n  return (\n    <div className={`relative flex flex-1 w-full h-full min-h-0 overflow-hidden ${className}`}>\n      <SkipLink />\n\n      {/* Sidebar — desktop */}\n      <div className=\"hidden md:block\">\n        {renderSidebar({})}\n      </div>\n\n      {/* Sidebar — mobile drawer */}\n      <AnimatePresence>\n        {isMobile && isMobileOpen && (\n          <>\n            {/* Backdrop */}\n            <motion.div\n              key=\"sidebar-backdrop\"\n              className=\"fixed inset-0 z-[var(--bichat-z-overlay,30)] bg-black/40\"\n              initial={{ opacity: 0 }}\n              animate={{ opacity: 1 }}\n              exit={{ opacity: 0 }}\n              onClick={closeMobile}\n              aria-hidden=\"true\"\n            />\n            {/* Drawer */}\n            <motion.div\n              key=\"sidebar-drawer\"\n              className=\"fixed inset-y-0 left-0 z-[var(--bichat-z-modal,40)] w-[18rem] max-w-[85vw] shadow-2xl\"\n              initial={{ x: '-100%' }}\n              animate={{ x: 0 }}\n              exit={{ x: '-100%' }}\n              transition={{ type: 'spring', stiffness: 320, damping: 32 }}\n              drag=\"x\"\n              dragDirectionLock\n              dragConstraints={{ left: -120, right: 0 }}\n              dragElastic={{ left: 0.2, right: 0 }}\n              onDragEnd={handleDrawerDragEnd}\n              onClick={(e) => e.stopPropagation()}\n            >\n              <div ref={drawerRef} className=\"h-full bg-white dark:bg-gray-900\">\n                {renderSidebar({ onClose: closeMobile })}\n              </div>\n            </motion.div>\n          </>\n        )}\n      </AnimatePresence>\n\n      {/* Main Content */}\n      <main id=\"main-content\" className=\"relative flex-1 min-w-0 flex flex-col min-h-0 overflow-hidden\">\n        {/* Mobile menu button */}\n        {isMobile && !isMobileOpen && (\n          <button\n            ref={menuButtonRef}\n            onClick={openMobile}\n            className=\"md:hidden absolute top-3 left-3 z-[var(--bichat-z-sticky,20)] w-10 h-10 rounded-xl bg-white/90 dark:bg-gray-900/90 text-gray-700 dark:text-gray-200 border border-gray-200/60 dark:border-gray-800/80 shadow-sm flex items-center justify-center hover:bg-white dark:hover:bg-gray-900 transition-colors cursor-pointer focus-visible:ring-2 focus-visible:ring-primary-400/50\"\n            aria-label={t('BiChat.Layout.OpenSidebar')}\n            title={t('BiChat.Layout.OpenSidebar')}\n          >\n            <List size={20} weight=\"bold\" />\n          </button>\n        )}\n        {content}\n      </main>\n    </div>\n  );\n}\n\n// Re-export useSidebarState for consumers who want custom layout control\nexport { useSidebarState, type UseSidebarStateReturn };\n","import { useState, memo } from 'react';\nimport { Copy, ArrowClockwise, PencilSimple } from '@phosphor-icons/react';\nimport { MessageRole } from '../types';\nimport { useToast } from '../hooks/useToast';\nimport { useTranslation } from '../hooks/useTranslation';\nimport LoadingSpinner from './LoadingSpinner';\n\ninterface ActionableMessage {\n  id: string\n  role: MessageRole\n  content: string\n}\n\ninterface MessageActionsProps {\n  message: ActionableMessage\n  onCopy: (text: string) => Promise<void>\n  onRegenerate?: (messageId: string) => Promise<void>\n  onEdit?: (message: ActionableMessage) => void\n}\n\nfunction MessageActions({\n  message,\n  onCopy,\n  onRegenerate,\n  onEdit,\n}: MessageActionsProps) {\n  const [copying, setCopying] = useState(false);\n  const [regenerating, setRegenerating] = useState(false);\n  const toast = useToast();\n  const { t } = useTranslation();\n\n  const isUser = message.role === MessageRole.User;\n\n  const handleCopy = async () => {\n    setCopying(true);\n    try {\n      await onCopy(message.content);\n      toast.success(t('BiChat.Message.CopiedToClipboard'));\n    } catch {\n      toast.error(t('BiChat.Message.FailedToCopy'));\n    } finally {\n      setCopying(false);\n    }\n  };\n\n  const handleRegenerate = async () => {\n    if (!onRegenerate) {return;}\n    setRegenerating(true);\n    try {\n      await onRegenerate(message.id);\n    } finally {\n      setRegenerating(false);\n    }\n  };\n\n  return (\n    <div className=\"flex items-center gap-2\">\n      {/* Copy button */}\n      <button\n        onClick={handleCopy}\n        disabled={copying}\n        title={copying ? t('BiChat.Message.Copying') : t('BiChat.Message.CopyMessage')}\n        className=\"cursor-pointer text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-700 dark:hover:text-gray-300 rounded-md transition-colors disabled:opacity-50 p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n        aria-label={copying ? t('BiChat.Message.Copying') : t('BiChat.Message.CopyMessage')}\n      >\n        {copying ? (\n          <LoadingSpinner variant=\"spinner\" size=\"sm\" />\n        ) : (\n          <Copy size={16} className=\"w-4 h-4\" />\n        )}\n      </button>\n\n      {/* Regenerate button (AI messages only) */}\n      {!isUser && onRegenerate && (\n        <button\n          onClick={handleRegenerate}\n          disabled={regenerating}\n          title={regenerating ? t('BiChat.Message.Regenerating') : t('BiChat.Message.Regenerate')}\n          className=\"cursor-pointer text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-700 dark:hover:text-gray-300 rounded-md transition-colors disabled:opacity-50 p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n          aria-label={regenerating ? t('BiChat.Message.Regenerating') : t('BiChat.Message.Regenerate')}\n        >\n          {regenerating ? (\n            <LoadingSpinner variant=\"spinner\" size=\"sm\" />\n          ) : (\n            <ArrowClockwise size={16} className=\"w-4 h-4\" />\n          )}\n        </button>\n      )}\n\n      {/* Edit button (user messages only) */}\n      {isUser && onEdit && (\n        <button\n          onClick={() => onEdit(message)}\n          title={t('BiChat.Message.EditMessage')}\n          className=\"cursor-pointer text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-700 dark:hover:text-gray-300 rounded-md transition-colors p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n          aria-label={t('BiChat.Message.EditMessage')}\n        >\n          <PencilSimple size={16} className=\"w-4 h-4\" />\n        </button>\n      )}\n    </div>\n  );\n}\n\nexport default memo(MessageActions);\nexport { MessageActions };\nexport type { ActionableMessage };\n","/**\n * AttachmentPreview Component\n * Displays thumbnail preview of an image attachment\n * Shows filename, size, remove button, and supports click-to-enlarge\n */\n\nimport { memo, useState } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport { ImageAttachment } from '../types';\nimport { formatFileSize, createDataUrl } from '../utils/fileUtils';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface AttachmentPreviewProps {\n  /** The attachment to display */\n  attachment: ImageAttachment\n  /** Optional callback when remove button is clicked */\n  onRemove?: () => void\n  /** Optional callback when thumbnail is clicked (for enlargement) */\n  onClick?: () => void\n  /** If true, hide remove button and disable click interactions */\n  readonly?: boolean\n}\n\nconst AttachmentPreview = memo<AttachmentPreviewProps>(({ attachment, onRemove, onClick, readonly = false }) => {\n  const { t } = useTranslation();\n  const [isImageLoaded, setIsImageLoaded] = useState(false);\n  const [imageError, setImageError] = useState(false);\n\n  const previewUrl = attachment.preview || createDataUrl(attachment.base64Data, attachment.mimeType);\n  const isClickable = onClick !== undefined && !readonly;\n  const showRemoveButton = onRemove !== undefined && !readonly;\n\n  return (\n    <div\n      className={`\n        relative\n        rounded-lg\n        border border-gray-200 dark:border-gray-700\n        bg-white dark:bg-gray-800\n        p-2\n        transition-all\n        duration-200\n        ${isClickable ? 'cursor-pointer hover:shadow-md hover:border-primary-400 dark:hover:border-primary-500' : ''}\n        ${!isClickable ? 'hover:shadow-sm' : ''}\n      `}\n      onClick={isClickable ? onClick : undefined}\n      role={isClickable ? 'button' : undefined}\n      tabIndex={isClickable ? 0 : undefined}\n      onKeyDown={\n        isClickable\n          ? (e) => {\n              if (e.key === 'Enter' || e.key === ' ') {\n                e.preventDefault();\n                onClick?.();\n              }\n            }\n          : undefined\n      }\n    >\n      {/* Thumbnail Container */}\n      <div className=\"relative mb-2 overflow-hidden rounded-md bg-gray-100 dark:bg-gray-700 aspect-square\">\n        {/* Loading Skeleton */}\n        {!isImageLoaded && !imageError && (\n          <div className=\"absolute inset-0 animate-pulse bg-gray-200 dark:bg-gray-600\" />\n        )}\n\n        {/* Error State */}\n        {imageError && (\n          <div className=\"absolute inset-0 flex items-center justify-center bg-gray-100 dark:bg-gray-700\">\n            <span className=\"text-xs text-gray-500 dark:text-gray-400\">{t('BiChat.Attachment.PreviewUnavailable')}</span>\n          </div>\n        )}\n\n        {/* Image */}\n        <img\n          src={previewUrl}\n          alt={attachment.filename}\n          className={`\n            w-full h-full object-cover\n            transition-opacity duration-200\n            ${isImageLoaded ? 'opacity-100' : 'opacity-0'}\n            ${isClickable ? 'group-hover:scale-105' : ''}\n          `}\n          onLoad={() => setIsImageLoaded(true)}\n          onError={() => setImageError(true)}\n        />\n      </div>\n\n      {/* Filename */}\n      {!isImageLoaded && !imageError ? (\n        <div className=\"h-3 w-3/4 bg-gray-200 dark:bg-gray-600 rounded animate-pulse mb-1\" />\n      ) : (\n        <p\n          className=\"text-xs font-medium text-gray-700 dark:text-gray-300 truncate\"\n          title={attachment.filename}\n        >\n          {attachment.filename}\n        </p>\n      )}\n\n      {/* File Size */}\n      {!isImageLoaded && !imageError ? (\n        <div className=\"h-3 w-1/2 bg-gray-200 dark:bg-gray-600 rounded animate-pulse mb-1\" />\n      ) : (\n        <p className=\"text-xs text-gray-500 dark:text-gray-400 mb-1\">\n          {formatFileSize(attachment.sizeBytes)}\n        </p>\n      )}\n\n      {/* Remove Button */}\n      {showRemoveButton && (\n        <button\n          type=\"button\"\n          onClick={(e) => {\n            e.stopPropagation();\n            onRemove?.();\n          }}\n          className=\"absolute top-1 right-1 flex items-center justify-center bg-red-500 hover:bg-red-600 dark:bg-red-600 dark:hover:bg-red-700 text-white rounded-full transition-all duration-200 shadow-sm hover:shadow-md active:scale-90 w-6 h-6\"\n          aria-label={`Remove ${attachment.filename}`}\n          title={t('BiChat.Attachment.Remove')}\n        >\n          <X size={14} className=\"w-3.5 h-3.5\" weight=\"bold\" />\n        </button>\n      )}\n    </div>\n  );\n});\n\nAttachmentPreview.displayName = 'AttachmentPreview';\n\nexport default AttachmentPreview;\n","/**\n * AttachmentUpload Component\n * Handles file selection and base64 encoding for chat attachments\n * Provides loading states, validation, and error handling\n */\n\nimport { memo, useRef, useCallback, useState } from 'react';\nimport { Paperclip, CircleNotch } from '@phosphor-icons/react';\nimport { Attachment } from '../types';\nimport {\n  ATTACHMENT_ACCEPT_ATTRIBUTE,\n  convertToBase64,\n  createDataUrl,\n  formatFileSize,\n  isImageMimeType,\n  validateAttachmentFile,\n} from '../utils/fileUtils';\nimport { useToast } from '../hooks/useToast';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface AttachmentError {\n  filename: string\n  error: string\n}\n\ninterface AttachmentUploadProps {\n  /** Callback fired when files are successfully converted and validated */\n  onAttachmentsSelected: (attachments: Attachment[]) => void\n  /** Maximum number of attachments allowed (default: 10) */\n  maxAttachments?: number\n  /** Maximum file size in bytes (default: 20 MB) */\n  maxSizeBytes?: number\n  /** Whether the component is disabled */\n  disabled?: boolean\n}\n\nconst AttachmentUpload = memo<AttachmentUploadProps>(\n  ({ onAttachmentsSelected, maxAttachments = 10, maxSizeBytes = 20 * 1024 * 1024, disabled = false }) => {\n    const fileInputRef = useRef<HTMLInputElement>(null);\n    const [isLoading, setIsLoading] = useState(false);\n    const toast = useToast();\n    const { t } = useTranslation();\n\n    /**\n     * Handles file selection from the input element\n     * Validates, converts to base64, and calls onAttachmentsSelected\n     */\n    const handleFileSelect = useCallback(\n      async (e: React.ChangeEvent<HTMLInputElement>) => {\n        const files = Array.from(e.target.files || []);\n\n        // Reset input so same file selection can be processed again\n        if (fileInputRef.current) {\n          fileInputRef.current.value = '';\n        }\n\n        if (files.length === 0) {\n          return;\n        }\n\n        setIsLoading(true);\n\n        try {\n          // Validate file count\n          if (files.length > maxAttachments) {\n            toast.error(t('BiChat.Error.MaxFiles', { max: maxAttachments, selected: files.length }));\n            setIsLoading(false);\n            return;\n          }\n\n          const attachments: Attachment[] = [];\n          const errors: AttachmentError[] = [];\n\n          // Process each file\n          for (const file of files) {\n            // Validate file\n            try {\n              validateAttachmentFile(file, maxSizeBytes);\n            } catch (validationErr) {\n              errors.push({ filename: file.name, error: validationErr instanceof Error ? validationErr.message : String(validationErr) });\n              continue;\n            }\n\n            try {\n              // Convert to base64\n              const base64Data = await convertToBase64(file);\n              const attachment: Attachment = {\n                clientKey: crypto.randomUUID(),\n                filename: file.name,\n                mimeType: file.type,\n                sizeBytes: file.size,\n                base64Data,\n              };\n              if (isImageMimeType(file.type)) {\n                attachment.preview = createDataUrl(base64Data, file.type);\n              }\n\n              attachments.push(attachment);\n            } catch (err) {\n              errors.push({\n                filename: file.name,\n                error: err instanceof Error ? err.message : String(err),\n              });\n            }\n          }\n\n          // Show error toasts for failed files\n          if (errors.length > 0) {\n            errors.forEach((err) => {\n              toast.error(`${err.filename}: ${err.error}`);\n            });\n          }\n\n          // Call parent callback with successful attachments\n          if (attachments.length > 0) {\n            onAttachmentsSelected(attachments);\n            const message =\n              attachments.length === 1\n                ? t('BiChat.Attachment.FileAdded', { size: formatFileSize(attachments[0].sizeBytes) })\n                : t('BiChat.Attachment.FileAdded', { size: `${attachments.length} files` });\n            toast.success(message);\n          } else if (errors.length > 0) {\n            toast.error(t('BiChat.Attachment.InvalidFile'));\n          }\n        } finally {\n          setIsLoading(false);\n        }\n      },\n      [maxAttachments, maxSizeBytes, onAttachmentsSelected, toast, t]\n    );\n\n    /**\n     * Triggers the hidden file input\n     */\n    const handleClick = useCallback(() => {\n      fileInputRef.current?.click();\n    }, []);\n\n    const isDisabled = disabled || isLoading;\n\n    return (\n      <div className=\"relative\">\n        {/* Hidden File Input */}\n        <input\n          ref={fileInputRef}\n          type=\"file\"\n          multiple\n          accept={ATTACHMENT_ACCEPT_ATTRIBUTE}\n          onChange={handleFileSelect}\n          disabled={isDisabled}\n          className=\"sr-only\"\n          aria-label={t('BiChat.Attachment.SelectFiles')}\n        />\n\n        {/* Trigger Button */}\n        <button\n          type=\"button\"\n          onClick={handleClick}\n          disabled={isDisabled}\n          className=\"\n            flex items-center justify-center\n            w-8 h-8\n            text-gray-600 dark:text-gray-400\n            hover:text-gray-800 dark:hover:text-gray-200\n            hover:bg-gray-100 dark:hover:bg-gray-700\n            disabled:text-gray-400 dark:disabled:text-gray-600\n            disabled:opacity-50 disabled:cursor-not-allowed\n            rounded-lg\n            transition-all\n            duration-200\n            active:scale-95\n            focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\n          \"\n          aria-label={t('BiChat.Attachment.SelectFiles')}\n          aria-busy={isLoading}\n        >\n          {isLoading ? (\n            <CircleNotch size={20} className=\"w-5 h-5 animate-spin\" weight=\"fill\" />\n          ) : (\n            <Paperclip size={20} className=\"w-5 h-5\" weight=\"fill\" />\n          )}\n        </button>\n      </div>\n    );\n  }\n);\n\nAttachmentUpload.displayName = 'AttachmentUpload';\n\nexport default AttachmentUpload;\n","import { useEffect, useState } from 'react';\n\ninterface ScreenReaderAnnouncerProps {\n  message: string\n  politeness?: 'polite' | 'assertive'\n  clearAfter?: number\n}\n\n/**\n * Screen reader announcer component for live region updates\n * Uses ARIA live regions to announce dynamic content changes\n *\n * @param message - The message to announce\n * @param politeness - 'polite' (wait for pause) or 'assertive' (immediate)\n * @param clearAfter - Optional milliseconds to clear message after announcement\n *\n * @example\n * <ScreenReaderAnnouncer\n *   message=\"New message received\"\n *   politeness=\"polite\"\n * />\n */\nexport default function ScreenReaderAnnouncer({\n  message,\n  politeness = 'polite',\n  clearAfter,\n}: ScreenReaderAnnouncerProps) {\n  const [announcement, setAnnouncement] = useState(message);\n\n  useEffect(() => {\n    setAnnouncement(message);\n\n    if (clearAfter && message) {\n      const timer = setTimeout(() => {\n        setAnnouncement('');\n      }, clearAfter);\n      return () => clearTimeout(timer);\n    }\n    return undefined;\n  }, [message, clearAfter]);\n\n  return (\n    <div\n      role=\"status\"\n      aria-live={politeness}\n      aria-atomic=\"true\"\n      className=\"sr-only\"\n    >\n      {announcement}\n    </div>\n  );\n}\n","/**\n * QuestionForm Component\n * Multi-step modal wizard for answering pending questions\n * Includes question steps and confirmation step with progress indicator\n * Supports custom \"Other\" text input for all questions\n */\n\nimport { useState } from 'react';\nimport { X } from '@phosphor-icons/react';\nimport { type PendingQuestion, type QuestionAnswers, type QuestionAnswerData } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\nimport QuestionStep from './QuestionStep';\nimport ConfirmationStep from './ConfirmationStep';\nimport { LoadingSpinner } from './LoadingSpinner';\nimport { isQuestionAnswered, validateAnswers } from '../utils/questionFormUtils';\n\ninterface QuestionFormProps {\n  pendingQuestion: PendingQuestion\n  sessionId: string\n  onSubmit: (answers: QuestionAnswers) => Promise<void>\n  onCancel: () => void\n}\n\nexport default function QuestionForm({\n  pendingQuestion,\n  onSubmit,\n  onCancel,\n}: QuestionFormProps) {\n  const { t } = useTranslation();\n  const [currentStep, setCurrentStep] = useState(0);\n  const [answers, setAnswers] = useState<QuestionAnswers>({});\n  const [isSubmitting, setIsSubmitting] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const questions = pendingQuestion.questions;\n  const isConfirmationStep = currentStep === questions.length;\n  const isFirstStep = currentStep === 0;\n  const isLastStep = currentStep === questions.length - 1;\n\n  // Check if current question is answered\n  const currentQuestionAnswered =\n    isConfirmationStep ||\n    (questions[currentStep]?.id &&\n      isQuestionAnswered(answers[questions[currentStep].id]));\n\n  const handleAnswer = (answerData: QuestionAnswerData) => {\n    const currentQuestion = questions[currentStep];\n    if (currentQuestion) {\n      setAnswers((prev) => ({\n        ...prev,\n        [currentQuestion.id]: answerData,\n      }));\n    }\n  };\n\n  const handleNext = () => {\n    if (!currentQuestionAnswered) {return;}\n    if (isLastStep) {\n      setCurrentStep(isConfirmationStep ? currentStep : currentStep + 1);\n    } else {\n      setCurrentStep(currentStep + 1);\n    }\n  };\n\n  const handleBack = () => {\n    if (currentStep > 0) {\n      setCurrentStep(currentStep - 1);\n    }\n  };\n\n  const handleSubmitAnswers = async () => {\n    const validationError = validateAnswers(questions, answers, t);\n    if (validationError) {\n      setError(validationError);\n      return;\n    }\n\n    setIsSubmitting(true);\n    setError(null);\n\n    try {\n      await onSubmit(answers);\n    } catch (err) {\n      const errorMessage =\n        err instanceof Error ? err.message : t('BiChat.Error.Generic');\n      setError(errorMessage);\n      setIsSubmitting(false);\n    }\n  };\n\n  // Calculate progress text\n  const totalSteps = questions.length + 1;\n  const progressText = isConfirmationStep\n    ? t('BiChat.QuestionForm.Step', { current: totalSteps, total: totalSteps })\n    : t('BiChat.QuestionForm.Step', { current: currentStep + 1, total: totalSteps });\n\n  return (\n    <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 p-4\">\n      {/* Modal Container */}\n      <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto\">\n        {/* Header */}\n        <div className=\"border-b border-gray-200 dark:border-gray-700 p-6\">\n          <div className=\"flex items-center justify-between mb-4\">\n            <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n              {t('BiChat.QuestionForm.Title')}\n            </h2>\n            <button\n              onClick={onCancel}\n              disabled={isSubmitting}\n              className=\"cursor-pointer text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 disabled:opacity-50\"\n              aria-label={t('BiChat.Common.Close')}\n            >\n              <X className=\"w-6 h-6\" />\n            </button>\n          </div>\n\n          {/* Progress Indicator */}\n          <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n            {progressText}\n          </div>\n\n          {/* Progress Bar */}\n          <div className=\"mt-3 h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\n            <div\n              className=\"h-full bg-primary-600 transition-all duration-300\"\n              style={{\n                width: `${((currentStep + 1) / totalSteps) * 100}%`,\n              }}\n            />\n          </div>\n        </div>\n\n        {/* Content */}\n        <div className=\"p-6\">\n          {error && (\n            <div className=\"mb-6 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n              <p className=\"text-red-700 dark:text-red-400 text-sm\">{error}</p>\n            </div>\n          )}\n\n          {isConfirmationStep ? (\n            <ConfirmationStep questions={questions} answers={answers} />\n          ) : (\n            <QuestionStep\n              question={questions[currentStep]!}\n              selectedAnswers={answers}\n              onAnswer={handleAnswer}\n            />\n          )}\n        </div>\n\n        {/* Footer */}\n        <div className=\"border-t border-gray-200 dark:border-gray-700 p-6 flex gap-3 justify-between\">\n          {/* Back Button */}\n          {!isFirstStep && (\n            <button\n              onClick={handleBack}\n              disabled={isSubmitting}\n              className=\"cursor-pointer px-6 py-2 text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 disabled:opacity-50 font-medium transition-colors\"\n            >\n              {t('BiChat.QuestionForm.Back')}\n            </button>\n          )}\n\n          <div className=\"flex-1\" />\n\n          {isConfirmationStep ? (\n            <>\n              {/* Cancel Button */}\n              <button\n                onClick={onCancel}\n                disabled={isSubmitting}\n                className=\"cursor-pointer px-6 py-2 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 disabled:opacity-50 font-medium transition-colors\"\n              >\n                {t('BiChat.Message.Cancel')}\n              </button>\n\n              {/* Submit Button */}\n              <button\n                onClick={handleSubmitAnswers}\n                disabled={isSubmitting}\n                className=\"cursor-pointer px-6 py-2 bg-primary-600 hover:bg-primary-700 disabled:opacity-50 text-white rounded-lg font-medium transition-colors flex items-center gap-2\"\n              >\n                {isSubmitting && <LoadingSpinner size=\"sm\" />}\n                {isSubmitting ? t('BiChat.QuestionForm.Submitting') : t('BiChat.QuestionForm.Confirm')}\n              </button>\n            </>\n          ) : (\n            /* Next Button */\n            <button\n              onClick={handleNext}\n              disabled={!currentQuestionAnswered || isSubmitting}\n              className=\"cursor-pointer px-6 py-2 bg-primary-600 hover:bg-primary-700 disabled:opacity-50 text-white rounded-lg font-medium transition-colors\"\n            >\n              {t('BiChat.QuestionForm.Next')}\n            </button>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n}\n","/**\n * QuestionStep Component\n * Displays a single question with options to select from\n * Supports both single-select (radio) and multi-select (checkboxes)\n * Includes automatic \"Other\" option for custom text input\n */\n\nimport { useState, useEffect } from 'react';\nimport { type Question, type QuestionAnswers, type QuestionAnswerData } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface QuestionStepProps {\n  question: Question\n  selectedAnswers: QuestionAnswers\n  onAnswer: (answerData: QuestionAnswerData) => void\n}\n\nexport default function QuestionStep({\n  question,\n  selectedAnswers,\n  onAnswer,\n}: QuestionStepProps) {\n  const { t } = useTranslation();\n  const answerData = selectedAnswers[question.id] || { options: [] };\n  const selectedOptions = answerData.options || [];\n  const isMultiSelect = question.type === 'MULTIPLE_CHOICE';\n\n  // Local state for \"Other\" text input\n  const [otherText, setOtherText] = useState(answerData.customText || '');\n\n  // Sync local state with props when switching questions\n  useEffect(() => {\n    const data = selectedAnswers[question.id] || { options: [] };\n    setOtherText(data.customText || '');\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [question.id]);\n\n  const handleOptionClick = (optionID: string) => {\n    setOtherText('');\n    if (isMultiSelect) {\n      // Multi-select: toggle the option\n      const newOptions = selectedOptions.includes(optionID)\n        ? selectedOptions.filter((a) => a !== optionID)\n        : [...selectedOptions, optionID];\n      onAnswer({ options: newOptions, customText: undefined });\n    } else {\n      // Single-select: replace with new selection and clear custom text.\n      onAnswer({ options: [optionID], customText: undefined });\n    }\n  };\n\n  const handleOtherTextChange = (text: string) => {\n    setOtherText(text);\n    onAnswer({\n      options: [],\n      customText: text || undefined\n    });\n  };\n\n  return (\n    <div className=\"space-y-6\">\n      {/* Question Header */}\n      <div>\n        <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">\n          {question.text}\n        </h3>\n      </div>\n\n      {/* Multi-select hint */}\n      {isMultiSelect && (\n        <p className=\"text-sm text-gray-500 dark:text-gray-500 italic\">\n          {t('BiChat.Question.SelectMulti')}\n        </p>\n      )}\n\n      {/* Options Grid */}\n      <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n        {(question.options || []).map((option) => {\n          const isSelected = selectedOptions.includes(option.id);\n\n          return (\n            <button\n              key={option.id}\n              onClick={() => handleOptionClick(option.id)}\n              className={`\n                cursor-pointer relative p-4 text-left border-2 rounded-lg transition-all\n                ${\n                  isSelected\n                    ? 'border-primary-500 bg-white dark:bg-gray-800'\n                    : 'border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600'\n                }\n                focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900\n              `}\n              type=\"button\"\n              aria-pressed={isSelected}\n            >\n              <div className=\"flex items-start gap-3\">\n                {/* Radio or Checkbox */}\n                <div className=\"flex-shrink-0 mt-1\">\n                  {isMultiSelect ? (\n                    <input\n                      type=\"checkbox\"\n                      checked={isSelected}\n                      readOnly\n                      className=\"w-5 h-5 text-primary-600 border-gray-300 rounded focus:ring-0 dark:bg-gray-700 dark:border-gray-600\"\n                    />\n                  ) : (\n                    <input\n                      type=\"radio\"\n                      checked={isSelected}\n                      readOnly\n                      className=\"w-5 h-5 text-primary-600 border-gray-300 focus:ring-0 dark:bg-gray-700 dark:border-gray-600\"\n                    />\n                  )}\n                </div>\n\n                {/* Label */}\n                <div className=\"flex-1 min-w-0\">\n                  <p className=\"font-medium text-gray-900 dark:text-white\">\n                    {option.label}\n                  </p>\n                </div>\n              </div>\n            </button>\n          );\n        })}\n      </div>\n\n      {/* \"Other\" Text Input - always shown */}\n      <div>\n        <label htmlFor=\"other-input\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n          {t('BiChat.Question.SpecifyOther')}:\n        </label>\n        <textarea\n          id=\"other-input\"\n          value={otherText}\n          onChange={(e) => handleOtherTextChange(e.target.value)}\n          placeholder={t('BiChat.Question.OtherOption')}\n          rows={3}\n          className=\"w-full px-4 py-3 border-2 border-gray-200 dark:border-gray-700 rounded-lg\n            bg-white dark:bg-gray-800 text-gray-900 dark:text-white\n            placeholder-gray-400 dark:placeholder-gray-500\n            focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-primary-500\n            resize-none\"\n        />\n      </div>\n    </div>\n  );\n}\n","/**\n * ConfirmationStep Component\n * Displays a summary of all questions and selected answers for review before submission\n * Supports both predefined options and custom \"Other\" text\n */\n\nimport { type Question, type QuestionAnswers } from '../types';\nimport { useTranslation } from '../hooks/useTranslation';\n\ninterface ConfirmationStepProps {\n  questions: Question[]\n  answers: QuestionAnswers\n}\n\nexport default function ConfirmationStep({\n  questions,\n  answers,\n}: ConfirmationStepProps) {\n  const { t } = useTranslation();\n\n  return (\n    <div className=\"space-y-6\">\n      {/* Header */}\n      <div>\n        <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n          {t('BiChat.QuestionForm.ReviewTitle')}\n        </h3>\n        <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n          {t('BiChat.QuestionForm.ReviewDescription')}\n        </p>\n      </div>\n\n      {/* Questions Summary */}\n      <div className=\"space-y-4\">\n        {questions.map((question) => {\n          const answerData = answers[question.id] || { options: [] };\n          const selectedOptions = answerData.options || [];\n          const customText = answerData.customText;\n          const optionLabelByID = new Map((question.options || []).map((option) => [option.id, option.label]));\n\n          const hasAnswer = selectedOptions.length > 0 || !!customText;\n\n          return (\n            <div\n              key={question.id}\n              className=\"p-4 border border-gray-200 dark:border-gray-700 rounded-lg bg-gray-50 dark:bg-gray-800\"\n            >\n              {/* Question Text */}\n              <h4 className=\"font-medium text-gray-900 dark:text-white mb-2\">\n                {question.text}\n              </h4>\n\n              {/* Selected Answers as Tags */}\n              {hasAnswer ? (\n                <div className=\"flex flex-wrap gap-2\">\n                  {/* Predefined options */}\n                  {selectedOptions.map((option) => (\n                    <span\n                      key={option}\n                      className=\"inline-flex items-center px-3 py-1 rounded-lg text-sm font-medium border border-primary-500 bg-primary-500/10 text-primary-600 dark:border-primary-400 dark:bg-primary-400/10 dark:text-primary-400\"\n                    >\n                      {optionLabelByID.get(option) || option}\n                    </span>\n                  ))}\n\n                  {/* Custom \"Other\" text - displayed with distinct styling */}\n                  {customText && (\n                    <span className=\"inline-flex items-center px-3 py-1 rounded-lg text-sm font-medium border border-amber-500 bg-amber-500/10 text-amber-600 dark:border-amber-400 dark:bg-amber-400/10 dark:text-amber-400\">\n                      <span className=\"font-semibold mr-1\">{t('BiChat.Question.OtherOption')}:</span>\n                      <span className=\"italic\">{customText}</span>\n                    </span>\n                  )}\n                </div>\n              ) : (\n                <p className=\"text-sm text-gray-400 dark:text-gray-500 italic\">\n                  {t('BiChat.QuestionForm.Skip')}\n                </p>\n              )}\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\n","/**\n * Shared validation utilities for QuestionForm components\n */\n\nimport type { Question, QuestionAnswerData, QuestionAnswers } from '../types';\n\n/**\n * Checks if a question has been answered.\n * A question is answered if it has at least one selected option OR custom text.\n */\nexport function isQuestionAnswered(data: QuestionAnswerData | undefined): boolean {\n  if (!data) {return false;}\n  return (data.options?.length ?? 0) > 0 || !!data.customText;\n}\n\n/**\n * Validates that all questions are answered and custom text is valid.\n * Returns null if valid, or an error message string if invalid.\n *\n * @param questions - Array of questions to validate\n * @param answers - Map of question IDs to answer data\n * @param t - Optional translation function for error messages\n */\nexport function validateAnswers(\n  questions: Question[],\n  answers: QuestionAnswers,\n  t?: (key: string, params?: Record<string, string | number | boolean>) => string\n): string | null {\n  const allAnswered = questions.every((q) => isQuestionAnswered(answers[q.id]));\n  if (!allAnswered) {\n    return t ? t('BiChat.Error.AllQuestionsRequired') : 'Please answer all questions before submitting';\n  }\n\n  for (const q of questions) {\n    const data = answers[q.id];\n    if (data && (data.options?.length ?? 0) === 0 && data.customText === '') {\n      return t\n        ? t('BiChat.Error.CustomTextRequired', { question: q.text })\n        : `Please enter custom text for question: ${q.text}`;\n    }\n  }\n\n  return null;\n}\n","/**\n * Slot Primitive\n * Utility component for the asChild pattern (similar to @radix-ui/react-slot)\n */\n\nimport {\n  Children,\n  cloneElement,\n  forwardRef,\n  isValidElement,\n  type HTMLAttributes,\n  type ReactNode,\n  type ReactElement,\n} from 'react';\n\ntype AnyProps = Record<string, unknown>\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps): AnyProps {\n  const overrideProps: AnyProps = { ...childProps };\n\n  for (const propName in childProps) {\n    const slotPropValue = slotProps[propName];\n    const childPropValue = childProps[propName];\n\n    const isHandler = /^on[A-Z]/.test(propName);\n    if (isHandler) {\n      // Merge event handlers\n      if (slotPropValue && childPropValue) {\n        overrideProps[propName] = (...args: unknown[]) => {\n          ;(childPropValue as (...a: unknown[]) => void)(...args)\n          ;(slotPropValue as (...a: unknown[]) => void)(...args);\n        };\n      } else if (slotPropValue) {\n        overrideProps[propName] = slotPropValue;\n      }\n    } else if (propName === 'style') {\n      // Merge styles\n      overrideProps[propName] = { ...(slotPropValue as object), ...(childPropValue as object) };\n    } else if (propName === 'className') {\n      // Merge classNames\n      overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(' ');\n    }\n  }\n\n  return { ...slotProps, ...overrideProps };\n}\n\nexport interface SlotProps extends HTMLAttributes<HTMLElement> {\n  children?: ReactNode\n}\n\n/**\n * Slot component that merges its props with its child element's props\n * Used for the asChild pattern to allow consumers to customize the rendered element\n */\nexport const Slot = forwardRef<HTMLElement, SlotProps>((props, forwardedRef) => {\n  const { children, ...slotProps } = props;\n\n  if (!isValidElement(children)) {\n    return null;\n  }\n\n  const childrenRef = (children as ReactElement & { ref?: unknown }).ref;\n\n  return cloneElement(children as ReactElement, {\n    ...mergeProps(slotProps, children.props as AnyProps),\n    ref: forwardedRef\n      ? composeRefs(forwardedRef, childrenRef as React.Ref<unknown>)\n      : childrenRef,\n  } as AnyProps);\n});\n\nSlot.displayName = 'Slot';\n\n/**\n * Compose multiple refs into one\n */\nfunction composeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n  return (node) => {\n    refs.forEach((ref) => {\n      if (typeof ref === 'function') {\n        ref(node);\n      } else if (ref != null) {\n        ;(ref as React.MutableRefObject<T | null>).current = node;\n      }\n    });\n  };\n}\n\n/**\n * Helper type for components that support asChild\n * Extends the HTML attributes while adding asChild option\n */\nexport type AsChildProps<T extends HTMLAttributes<HTMLElement> = HTMLAttributes<HTMLElement>> = T & {\n  /** Merge props with child element instead of rendering wrapper */\n  asChild?: boolean\n}\n\n/**\n * Get children count (flattens fragments)\n */\nexport function getValidChildren(children: ReactNode): ReactElement[] {\n  return Children.toArray(children).filter(isValidElement) as ReactElement[];\n}\n","/**\n * Turn Primitive\n * Compound component for rendering a conversation turn (user + assistant)\n */\n\nimport {\n  createContext,\n  useContext,\n  forwardRef,\n  type HTMLAttributes,\n} from 'react';\nimport { Slot, type AsChildProps } from './Slot';\n\n/* -------------------------------------------------------------------------------------------------\n * TurnContext\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TurnContextValue {\n  /** Turn identifier */\n  turnId?: string\n}\n\nconst TurnContext = createContext<TurnContextValue | undefined>(undefined);\n\nfunction useTurnContext() {\n  const context = useContext(TurnContext);\n  if (!context) {\n    throw new Error('Turn components must be used within Turn.Root');\n  }\n  return context;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnRootProps = AsChildProps<HTMLAttributes<HTMLDivElement>> & {\n  /** Turn identifier for tracking */\n  turnId?: string\n}\n\nconst TurnRoot = forwardRef<HTMLDivElement, TurnRootProps>((props, ref) => {\n  const { asChild, turnId, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'div';\n\n  return (\n    <TurnContext.Provider value={{ turnId }}>\n      <Comp ref={ref} data-turn-id={turnId} {...domProps}>\n        {children}\n      </Comp>\n    </TurnContext.Provider>\n  );\n});\n\nTurnRoot.displayName = 'Turn.Root';\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.User\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnUserProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst TurnUser = forwardRef<HTMLDivElement, TurnUserProps>((props, ref) => {\n  const { asChild, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'div';\n\n  return (\n    <Comp ref={ref} data-turn-role=\"user\" {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nTurnUser.displayName = 'Turn.User';\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Assistant\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnAssistantProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst TurnAssistant = forwardRef<HTMLDivElement, TurnAssistantProps>((props, ref) => {\n  const { asChild, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'div';\n\n  return (\n    <Comp ref={ref} data-turn-role=\"assistant\" {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nTurnAssistant.displayName = 'Turn.Assistant';\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Timestamp\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnTimestampProps = AsChildProps<HTMLAttributes<HTMLTimeElement>> & {\n  /** ISO date string or Date object */\n  date?: string | Date\n  /** Custom formatter */\n  formatter?: (date: Date) => string\n}\n\nconst defaultFormatter = (date: Date) =>\n  date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });\n\nconst TurnTimestamp = forwardRef<HTMLTimeElement, TurnTimestampProps>((props, ref) => {\n  const { asChild, date, formatter = defaultFormatter, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'time';\n\n  const dateObj = date ? (typeof date === 'string' ? new Date(date) : date) : null;\n  const formattedTime = dateObj ? formatter(dateObj) : '';\n  const isoString = dateObj?.toISOString();\n\n  return (\n    <Comp ref={ref} dateTime={isoString} {...domProps}>\n      {children ?? formattedTime}\n    </Comp>\n  );\n});\n\nTurnTimestamp.displayName = 'Turn.Timestamp';\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Actions\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnActionsProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst TurnActions = forwardRef<HTMLDivElement, TurnActionsProps>((props, ref) => {\n  const { asChild, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'div';\n\n  return (\n    <Comp ref={ref} role=\"group\" aria-label=\"Message actions\" {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nTurnActions.displayName = 'Turn.Actions';\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Turn = {\n  Root: TurnRoot,\n  User: TurnUser,\n  Assistant: TurnAssistant,\n  Timestamp: TurnTimestamp,\n  Actions: TurnActions,\n};\n\nexport { useTurnContext };\nexport type { TurnRootProps, TurnUserProps, TurnAssistantProps, TurnTimestampProps, TurnActionsProps };\n","/**\n * Avatar Primitive\n * Compound component for displaying user avatars with image and fallback\n */\n\nimport {\n  createContext,\n  useContext,\n  useState,\n  forwardRef,\n  type HTMLAttributes,\n  type ImgHTMLAttributes,\n} from 'react';\nimport { Slot, type AsChildProps } from './Slot';\n\n/* -------------------------------------------------------------------------------------------------\n * AvatarContext\n * -----------------------------------------------------------------------------------------------*/\n\ntype ImageLoadingStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\ninterface AvatarContextValue {\n  imageLoadingStatus: ImageLoadingStatus\n  setImageLoadingStatus: (status: ImageLoadingStatus) => void\n}\n\nconst AvatarContext = createContext<AvatarContextValue | undefined>(undefined);\n\nfunction useAvatarContext() {\n  const context = useContext(AvatarContext);\n  if (!context) {\n    throw new Error('Avatar components must be used within Avatar.Root');\n  }\n  return context;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Avatar.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype AvatarRootProps = AsChildProps<HTMLAttributes<HTMLSpanElement>>\n\nconst AvatarRoot = forwardRef<HTMLSpanElement, AvatarRootProps>((props, ref) => {\n  const { asChild, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'span';\n  const [imageLoadingStatus, setImageLoadingStatus] = useState<ImageLoadingStatus>('idle');\n\n  return (\n    <AvatarContext.Provider value={{ imageLoadingStatus, setImageLoadingStatus }}>\n      <Comp ref={ref} {...domProps}>\n        {children}\n      </Comp>\n    </AvatarContext.Provider>\n  );\n});\n\nAvatarRoot.displayName = 'Avatar.Root';\n\n/* -------------------------------------------------------------------------------------------------\n * Avatar.Image\n * -----------------------------------------------------------------------------------------------*/\n\ntype AvatarImageProps = AsChildProps<ImgHTMLAttributes<HTMLImageElement>> & {\n  /** Called when loading status changes */\n  onLoadingStatusChange?: (status: ImageLoadingStatus) => void\n}\n\nconst AvatarImage = forwardRef<HTMLImageElement, AvatarImageProps>((props, ref) => {\n  const { asChild, src, alt, onLoadingStatusChange, onLoad, onError, ...domProps } = props;\n  const { setImageLoadingStatus } = useAvatarContext();\n  const Comp = asChild ? Slot : 'img';\n\n  const handleLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n    setImageLoadingStatus('loaded');\n    onLoadingStatusChange?.('loaded');\n    onLoad?.(e);\n  };\n\n  const handleError = (e: React.SyntheticEvent<HTMLImageElement>) => {\n    setImageLoadingStatus('error');\n    onLoadingStatusChange?.('error');\n    onError?.(e);\n  };\n\n  // Start loading when src is provided\n  if (src) {\n    return (\n      <Comp\n        ref={ref}\n        src={src}\n        alt={alt || ''}\n        onLoad={handleLoad}\n        onError={handleError}\n        {...domProps}\n      />\n    );\n  }\n\n  return null;\n});\n\nAvatarImage.displayName = 'Avatar.Image';\n\n/* -------------------------------------------------------------------------------------------------\n * Avatar.Fallback\n * -----------------------------------------------------------------------------------------------*/\n\ntype AvatarFallbackProps = AsChildProps<HTMLAttributes<HTMLSpanElement>> & {\n  /** Delay before showing fallback (in ms) */\n  delayMs?: number\n}\n\nconst AvatarFallback = forwardRef<HTMLSpanElement, AvatarFallbackProps>((props, ref) => {\n  const { asChild, delayMs = 0, children, ...domProps } = props;\n  const { imageLoadingStatus } = useAvatarContext();\n  const Comp = asChild ? Slot : 'span';\n  const [canRender, setCanRender] = useState(delayMs === 0);\n\n  // Handle delay\n  if (delayMs > 0 && !canRender) {\n    setTimeout(() => setCanRender(true), delayMs);\n  }\n\n  // Only show fallback if image hasn't loaded\n  if (imageLoadingStatus === 'loaded') {\n    return null;\n  }\n\n  if (!canRender) {\n    return null;\n  }\n\n  return (\n    <Comp ref={ref} {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nAvatarFallback.displayName = 'Avatar.Fallback';\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Avatar = {\n  Root: AvatarRoot,\n  Image: AvatarImage,\n  Fallback: AvatarFallback,\n};\n\nexport { useAvatarContext };\nexport type { AvatarRootProps, AvatarImageProps, AvatarFallbackProps, ImageLoadingStatus };\n","/**\n * Bubble Primitive\n * Compound component for message bubble containers\n */\n\nimport {\n  createContext,\n  useContext,\n  forwardRef,\n  type HTMLAttributes,\n} from 'react';\nimport { Slot, type AsChildProps } from './Slot';\n\n/* -------------------------------------------------------------------------------------------------\n * BubbleContext\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleVariant = 'user' | 'assistant' | 'system'\n\ninterface BubbleContextValue {\n  variant?: BubbleVariant\n}\n\nconst BubbleContext = createContext<BubbleContextValue | undefined>(undefined);\n\nfunction useBubbleContext() {\n  const context = useContext(BubbleContext);\n  if (!context) {\n    throw new Error('Bubble components must be used within Bubble.Root');\n  }\n  return context;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleRootProps = AsChildProps<HTMLAttributes<HTMLDivElement>> & {\n  /** Bubble variant (affects data attribute for styling) */\n  variant?: BubbleVariant\n}\n\nconst BubbleRoot = forwardRef<HTMLDivElement, BubbleRootProps>((props, ref) => {\n  const { asChild, variant, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'div';\n\n  return (\n    <BubbleContext.Provider value={{ variant }}>\n      <Comp ref={ref} data-bubble-variant={variant} {...domProps}>\n        {children}\n      </Comp>\n    </BubbleContext.Provider>\n  );\n});\n\nBubbleRoot.displayName = 'Bubble.Root';\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Content\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleContentProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleContent = forwardRef<HTMLDivElement, BubbleContentProps>((props, ref) => {\n  const { asChild, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'div';\n\n  return (\n    <Comp ref={ref} data-bubble-part=\"content\" {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nBubbleContent.displayName = 'Bubble.Content';\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Header\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleHeaderProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleHeader = forwardRef<HTMLDivElement, BubbleHeaderProps>((props, ref) => {\n  const { asChild, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'div';\n\n  return (\n    <Comp ref={ref} data-bubble-part=\"header\" {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nBubbleHeader.displayName = 'Bubble.Header';\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Footer\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleFooterProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleFooter = forwardRef<HTMLDivElement, BubbleFooterProps>((props, ref) => {\n  const { asChild, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'div';\n\n  return (\n    <Comp ref={ref} data-bubble-part=\"footer\" {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nBubbleFooter.displayName = 'Bubble.Footer';\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Metadata\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleMetadataProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleMetadata = forwardRef<HTMLDivElement, BubbleMetadataProps>((props, ref) => {\n  const { asChild, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'div';\n\n  return (\n    <Comp ref={ref} data-bubble-part=\"metadata\" {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nBubbleMetadata.displayName = 'Bubble.Metadata';\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Bubble = {\n  Root: BubbleRoot,\n  Content: BubbleContent,\n  Header: BubbleHeader,\n  Footer: BubbleFooter,\n  Metadata: BubbleMetadata,\n};\n\nexport { useBubbleContext };\nexport type {\n  BubbleRootProps,\n  BubbleContentProps,\n  BubbleHeaderProps,\n  BubbleFooterProps,\n  BubbleMetadataProps,\n  BubbleVariant,\n};\n","/**\n * ActionButton Primitive\n * Compound component for icon buttons with tooltips\n */\n\nimport {\n  createContext,\n  useContext,\n  useState,\n  forwardRef,\n  type ButtonHTMLAttributes,\n  type HTMLAttributes,\n} from 'react';\nimport { Slot, type AsChildProps } from './Slot';\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButtonContext\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ActionButtonContextValue {\n  isHovered: boolean\n  isFocused: boolean\n  isPressed: boolean\n  isDisabled: boolean\n}\n\nconst ActionButtonContext = createContext<ActionButtonContextValue | undefined>(undefined);\n\nfunction useActionButtonContext() {\n  const context = useContext(ActionButtonContext);\n  if (!context) {\n    throw new Error('ActionButton components must be used within ActionButton.Root');\n  }\n  return context;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonRootProps = AsChildProps<ButtonHTMLAttributes<HTMLButtonElement>>\n\nconst ActionButtonRoot = forwardRef<HTMLButtonElement, ActionButtonRootProps>((props, ref) => {\n  const { asChild, disabled, children, onMouseEnter, onMouseLeave, onFocus, onBlur, onMouseDown, onMouseUp, ...domProps } = props;\n  const Comp = asChild ? Slot : 'button';\n\n  const [isHovered, setIsHovered] = useState(false);\n  const [isFocused, setIsFocused] = useState(false);\n  const [isPressed, setIsPressed] = useState(false);\n\n  const handleMouseEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n    setIsHovered(true);\n    onMouseEnter?.(e);\n  };\n\n  const handleMouseLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n    setIsHovered(false);\n    setIsPressed(false);\n    onMouseLeave?.(e);\n  };\n\n  const handleFocus = (e: React.FocusEvent<HTMLButtonElement>) => {\n    setIsFocused(true);\n    onFocus?.(e);\n  };\n\n  const handleBlur = (e: React.FocusEvent<HTMLButtonElement>) => {\n    setIsFocused(false);\n    onBlur?.(e);\n  };\n\n  const handleMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n    setIsPressed(true);\n    onMouseDown?.(e);\n  };\n\n  const handleMouseUp = (e: React.MouseEvent<HTMLButtonElement>) => {\n    setIsPressed(false);\n    onMouseUp?.(e);\n  };\n\n  return (\n    <ActionButtonContext.Provider\n      value={{\n        isHovered,\n        isFocused,\n        isPressed,\n        isDisabled: !!disabled,\n      }}\n    >\n      <Comp\n        ref={ref}\n        type=\"button\"\n        disabled={disabled}\n        onMouseEnter={handleMouseEnter}\n        onMouseLeave={handleMouseLeave}\n        onFocus={handleFocus}\n        onBlur={handleBlur}\n        onMouseDown={handleMouseDown}\n        onMouseUp={handleMouseUp}\n        {...domProps}\n      >\n        {children}\n      </Comp>\n    </ActionButtonContext.Provider>\n  );\n});\n\nActionButtonRoot.displayName = 'ActionButton.Root';\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Icon\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonIconProps = AsChildProps<HTMLAttributes<HTMLSpanElement>>\n\nconst ActionButtonIcon = forwardRef<HTMLSpanElement, ActionButtonIconProps>((props, ref) => {\n  const { asChild, children, ...domProps } = props;\n  const Comp = asChild ? Slot : 'span';\n\n  return (\n    <Comp ref={ref} aria-hidden=\"true\" {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nActionButtonIcon.displayName = 'ActionButton.Icon';\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Label\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonLabelProps = AsChildProps<HTMLAttributes<HTMLSpanElement>> & {\n  /** Visually hidden but accessible to screen readers */\n  srOnly?: boolean\n}\n\nconst ActionButtonLabel = forwardRef<HTMLSpanElement, ActionButtonLabelProps>((props, ref) => {\n  const { asChild, srOnly = false, children, className, ...domProps } = props;\n  const Comp = asChild ? Slot : 'span';\n\n  const srOnlyClass = srOnly\n    ? 'absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0'\n    : '';\n\n  return (\n    <Comp ref={ref} className={[srOnlyClass, className].filter(Boolean).join(' ')} {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nActionButtonLabel.displayName = 'ActionButton.Label';\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Tooltip\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonTooltipProps = AsChildProps<HTMLAttributes<HTMLSpanElement>> & {\n  /** Position relative to button */\n  position?: 'top' | 'bottom' | 'left' | 'right'\n  /** Only show when hovered */\n  showOnHover?: boolean\n}\n\nconst ActionButtonTooltip = forwardRef<HTMLSpanElement, ActionButtonTooltipProps>((props, ref) => {\n  const { asChild, position = 'top', showOnHover = true, children, ...domProps } = props;\n  const context = useActionButtonContext();\n  const Comp = asChild ? Slot : 'span';\n\n  // If showOnHover is true, only render when hovered or focused\n  if (showOnHover && !context.isHovered && !context.isFocused) {\n    return null;\n  }\n\n  return (\n    <Comp ref={ref} role=\"tooltip\" data-tooltip-position={position} {...domProps}>\n      {children}\n    </Comp>\n  );\n});\n\nActionButtonTooltip.displayName = 'ActionButton.Tooltip';\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const ActionButton = {\n  Root: ActionButtonRoot,\n  Icon: ActionButtonIcon,\n  Label: ActionButtonLabel,\n  Tooltip: ActionButtonTooltip,\n};\n\nexport { useActionButtonContext };\nexport type {\n  ActionButtonRootProps,\n  ActionButtonIconProps,\n  ActionButtonLabelProps,\n  ActionButtonTooltipProps,\n};\n","import { useState, useRef, useCallback } from 'react';\nimport type { StreamingHook } from '../types';\n\n/**\n * useStreaming provides SSE (Server-Sent Events) streaming utilities with cancellation support.\n *\n * Usage:\n * const { isStreaming, processStream, cancel, reset } = useStreaming()\n *\n * // Process async generator stream\n * await processStream(messageStream, (chunk) => {\n *   console.log('Received:', chunk)\n * })\n *\n * // Cancel ongoing stream\n * cancel()\n *\n * // Reset state after stream completion\n * reset()\n */\nexport function useStreaming(): StreamingHook {\n  const [isStreaming, setIsStreaming] = useState(false);\n  const abortControllerRef = useRef<AbortController | null>(null);\n\n  const processStream = useCallback(\n    async <T,>(\n      generator: AsyncGenerator<T>,\n      onChunk: (chunk: T) => void,\n      signal?: AbortSignal\n    ): Promise<void> => {\n      setIsStreaming(true);\n\n      // Create abort controller if not provided\n      const controller = new AbortController();\n      abortControllerRef.current = controller;\n\n      // Listen to external signal if provided\n      const onExternalAbort = signal ? () => { controller.abort(); } : undefined;\n      if (signal && onExternalAbort) {\n        signal.addEventListener('abort', onExternalAbort);\n      }\n\n      try {\n        for await (const chunk of generator) {\n          // Check if stream was cancelled\n          if (controller.signal.aborted) {\n            break;\n          }\n\n          onChunk(chunk);\n        }\n      } catch (error) {\n        // Stream was cancelled or errored\n        if (controller.signal.aborted) {\n          // Cancellation is expected, don't throw\n          return;\n        }\n        throw error;\n      } finally {\n        if (signal && onExternalAbort) {\n          signal.removeEventListener('abort', onExternalAbort);\n        }\n        setIsStreaming(false);\n        abortControllerRef.current = null;\n      }\n    },\n    []\n  );\n\n  const cancel = useCallback(() => {\n    if (abortControllerRef.current) {\n      abortControllerRef.current.abort();\n    }\n    setIsStreaming(false);\n  }, []);\n\n  const reset = useCallback(() => {\n    abortControllerRef.current = null;\n    setIsStreaming(false);\n  }, []);\n\n  return {\n    isStreaming,\n    processStream,\n    cancel,\n    reset\n  };\n}\n","/**\n * useStreaming hook\n * BiChat-specific streaming hook that composes on top of applet-core's useStreaming.\n * Adds content accumulation, error state, and chunk type dispatch.\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport { useStreaming as useCoreStreaming } from '../../applet-core/hooks/useStreaming';\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 [error, setError] = useState<Error | null>(null);\n  const optionsRef = useRef(options);\n  optionsRef.current = options;\n\n  const core = useCoreStreaming();\n  const coreRef = useRef(core);\n  coreRef.current = core;\n\n  const processStream = useCallback(\n    async (stream: AsyncGenerator<StreamChunk>, signal?: AbortSignal) => {\n      setError(null);\n      setContent('');\n\n      try {\n        await coreRef.current.processStream<StreamChunk>(\n          stream,\n          (chunk) => {\n            if ((chunk.type === 'chunk' || chunk.type === 'content') && chunk.content) {\n              setContent((prev) => {\n                const newContent = prev + chunk.content;\n                optionsRef.current.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              optionsRef.current.onError?.(errorMsg);\n            } else if (chunk.type === 'done') {\n              optionsRef.current.onDone?.();\n            }\n          },\n          signal\n        );\n      } catch (err) {\n        const errorObj = err instanceof Error ? err : new Error('Unknown error');\n        setError(errorObj);\n        optionsRef.current.onError?.(errorObj.message);\n      }\n    },\n    []\n  );\n\n  const cancel = useCallback(() => {\n    coreRef.current.cancel();\n  }, []);\n\n  const reset = useCallback(() => {\n    setContent('');\n    setError(null);\n    coreRef.current.reset();\n  }, []);\n\n  return {\n    content,\n    isStreaming: core.isStreaming,\n    error,\n    processStream,\n    cancel,\n    reset,\n  };\n}\n","/**\n * useActiveRuns — live map of per-session generation status.\n *\n * Subscribes to the data source's `subscribeActiveRuns` channel\n * (`GET /bi-chat/stream/active-runs`) and maintains a\n * sessionId → status dictionary so the sidebar can render a status\n * dot next to each session card without polling /stream/status per\n * session.\n *\n * The hook is a no-op when:\n * - the data source does not implement subscribeActiveRuns (older\n *   backends without the active-run index);\n * - `enabled` is false (e.g. the user is offline).\n */\n\nimport { useEffect, useRef, useState, useCallback } from 'react';\nimport type { ActiveRunDelivery, ChatDataSource } from '../types';\n\nexport interface ActiveRunSnapshot {\n  runId: string;\n  status: ActiveRunDelivery['status'];\n  updatedAt: number;\n}\n\nexport interface UseActiveRunsOptions {\n  enabled?: boolean;\n  /** Optional hook for raw SSE errors. */\n  onError?: (event: Event) => void;\n  /**\n   * Keep terminal-status entries in the map for this many milliseconds\n   * before pruning them. Default 0 preserves the previous behaviour\n   * (synchronous delete). Useful when consumers want to render a\n   * \"completed\" pulse animation before the dot disappears.\n   */\n  retainTerminalMs?: number;\n  /**\n   * How long to wait for an initial snapshot batch before declaring\n   * the hook `ready` when the server has zero active runs.\n   * Default 250ms.\n   */\n  emptyStateTimeoutMs?: number;\n}\n\nexport interface UseActiveRunsResult {\n  /** sessionId → current live status. Terminal statuses are emitted then the entry is removed. */\n  runs: Record<string, ActiveRunSnapshot>;\n  /** True once the initial HGETALL snapshot is delivered. */\n  ready: boolean;\n  /** Convenience: undefined when not active. */\n  status: (sessionId: string) => ActiveRunDelivery['status'] | undefined;\n}\n\nconst TERMINAL = new Set<ActiveRunDelivery['status']>([\n  'completed',\n  'cancelled',\n  'failed',\n]);\n\nexport function useActiveRuns(\n  dataSource: Pick<ChatDataSource, 'subscribeActiveRuns'>,\n  options: UseActiveRunsOptions = {}\n): UseActiveRunsResult {\n  const [runs, setRuns] = useState<Record<string, ActiveRunSnapshot>>({});\n  const [ready, setReady] = useState(false);\n  const onErrorRef = useRef(options.onError);\n  onErrorRef.current = options.onError;\n\n  const enabled = options.enabled ?? true;\n  const retainTerminalMs = options.retainTerminalMs ?? 0;\n  const emptyStateTimeoutMs = options.emptyStateTimeoutMs ?? 250;\n\n  useEffect(() => {\n    if (!enabled) {return;}\n    if (!dataSource.subscribeActiveRuns) {return;}\n\n    const controller = new AbortController();\n    // Collect snapshot rows into a staging object so we only flip\n    // `ready` once at the end of the initial batch. Each SSE\n    // \"snapshot\" event is a single row; the server never emits a\n    // delimiter, so we use a microtask coalescer instead.\n    let stagingTimer: ReturnType<typeof setTimeout> | undefined;\n    const staging: Record<string, ActiveRunSnapshot> = {};\n    let sawSnapshotRow = false;\n    // Pending terminal-removal timers keyed by sessionId so unmount\n    // can clear them and repeat terminals for the same session don't\n    // leak timers.\n    const pendingTerminalTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n    const flushSnapshot = () => {\n      setRuns((prev) => ({ ...prev, ...staging }));\n      setReady(true);\n      stagingTimer = undefined;\n    };\n\n    const subscription = dataSource.subscribeActiveRuns({\n      signal: controller.signal,\n      onError: (evt) => onErrorRef.current?.(evt),\n      onEvent: (evt) => {\n        if (evt.event === 'snapshot') {\n          sawSnapshotRow = true;\n          // If a terminal-removal timer is pending for this sessionId\n          // (e.g. the previous run completed and we're inside the\n          // retention window), cancel it. A fresh snapshot — typically\n          // delivered after native EventSource reconnect or when the\n          // user restarts a run — must NOT be wiped by a stale prune.\n          const pending = pendingTerminalTimers.get(evt.sessionId);\n          if (pending !== undefined) {\n            clearTimeout(pending);\n            pendingTerminalTimers.delete(evt.sessionId);\n          }\n          staging[evt.sessionId] = {\n            runId: evt.runId,\n            status: evt.status,\n            updatedAt: evt.updatedAt,\n          };\n          if (stagingTimer === undefined) {\n            stagingTimer = setTimeout(flushSnapshot, 16);\n          }\n          return;\n        }\n        // update: apply immediately.\n        if (TERMINAL.has(evt.status)) {\n          if (retainTerminalMs <= 0) {\n            // Legacy synchronous delete path.\n            setRuns((prev) => {\n              if (!(evt.sessionId in prev)) {return prev;}\n              const next = { ...prev };\n              delete next[evt.sessionId];\n              return next;\n            });\n            return;\n          }\n          // Retain the entry with its terminal status so the consumer\n          // can render a completion pulse, then prune after the\n          // retention window.\n          setRuns((prev) => ({\n            ...prev,\n            [evt.sessionId]: {\n              runId: evt.runId,\n              status: evt.status,\n              updatedAt: evt.updatedAt,\n            },\n          }));\n          const existing = pendingTerminalTimers.get(evt.sessionId);\n          if (existing !== undefined) {clearTimeout(existing);}\n          const handle = setTimeout(() => {\n            pendingTerminalTimers.delete(evt.sessionId);\n            setRuns((prev) => {\n              if (!(evt.sessionId in prev)) {return prev;}\n              const next = { ...prev };\n              delete next[evt.sessionId];\n              return next;\n            });\n          }, retainTerminalMs);\n          pendingTerminalTimers.set(evt.sessionId, handle);\n          return;\n        }\n        // Non-terminal update: write through and cancel any pending\n        // prune for this session (run restarted before the retention\n        // timer fired).\n        const pending = pendingTerminalTimers.get(evt.sessionId);\n        if (pending !== undefined) {\n          clearTimeout(pending);\n          pendingTerminalTimers.delete(evt.sessionId);\n        }\n        setRuns((prev) => ({\n          ...prev,\n          [evt.sessionId]: {\n            runId: evt.runId,\n            status: evt.status,\n            updatedAt: evt.updatedAt,\n          },\n        }));\n      },\n    });\n\n    // The subscription promise rejects on initial-connect failures\n    // (401/503 before the grace window elapses). Route that through\n    // onError instead of leaking an unhandled rejection to the global\n    // scope — callers expect a single failure surface.\n    subscription?.catch((err: unknown) => {\n      if (controller.signal.aborted) {return;}\n      const surface =\n        err instanceof Event ? err : new Event('error');\n      onErrorRef.current?.(surface);\n    });\n\n    // If the server has zero active runs on connect it never emits a\n    // snapshot row; mark ready after a brief idle so consumers don't\n    // spin forever.\n    const readyTimeout = setTimeout(() => {\n      if (!sawSnapshotRow) {setReady(true);}\n    }, emptyStateTimeoutMs);\n\n    return () => {\n      controller.abort();\n      if (stagingTimer !== undefined) {clearTimeout(stagingTimer);}\n      clearTimeout(readyTimeout);\n      for (const handle of pendingTerminalTimers.values()) {\n        clearTimeout(handle);\n      }\n      pendingTerminalTimers.clear();\n    };\n  }, [dataSource, enabled, retainTerminalMs, emptyStateTimeoutMs]);\n\n  const status = useCallback(\n    (sessionId: string) => runs[sessionId]?.status,\n    [runs]\n  );\n\n  return { runs, ready, status };\n}\n","/**\n * useImageGallery Hook\n * Manages image modal/gallery state and navigation\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { ImageAttachment } from '../types';\n\nexport interface UseImageGalleryOptions {\n  /** Initial images to display */\n  images?: ImageAttachment[]\n  /** Wrap navigation at boundaries (default: false) */\n  wrap?: boolean\n  /** Callback when modal opens */\n  onOpen?: (index: number) => void\n  /** Callback when modal closes */\n  onClose?: () => void\n  /** Callback when navigation occurs */\n  onNavigate?: (index: number, direction: 'prev' | 'next') => void\n}\n\nexport interface UseImageGalleryReturn {\n  /** Whether the gallery modal is open */\n  isOpen: boolean\n  /** Current image index */\n  currentIndex: number\n  /** Current image (or undefined if none) */\n  currentImage: ImageAttachment | undefined\n  /** All images in the gallery */\n  images: ImageAttachment[]\n  /** Whether there's a previous image */\n  hasPrev: boolean\n  /** Whether there's a next image */\n  hasNext: boolean\n  /** Open gallery at specific index */\n  open: (index: number, newImages?: ImageAttachment[]) => void\n  /** Close the gallery */\n  close: () => void\n  /** Navigate to previous image */\n  prev: () => void\n  /** Navigate to next image */\n  next: () => void\n  /** Navigate to specific index */\n  goTo: (index: number) => void\n  /** Set images without opening */\n  setImages: (images: ImageAttachment[]) => void\n}\n\n/**\n * Hook for managing image gallery/modal state\n *\n * @example\n * ```tsx\n * const gallery = useImageGallery({ images: attachments })\n *\n * // Open gallery\n * <button onClick={() => gallery.open(0)}>View Images</button>\n *\n * // Render gallery\n * {gallery.isOpen && (\n *   <ImageModal\n *     image={gallery.currentImage}\n *     onClose={gallery.close}\n *     onPrev={gallery.prev}\n *     onNext={gallery.next}\n *     hasPrev={gallery.hasPrev}\n *     hasNext={gallery.hasNext}\n *   />\n * )}\n * ```\n */\nexport function useImageGallery(options: UseImageGalleryOptions = {}): UseImageGalleryReturn {\n  const { images: initialImages = [], wrap = false, onOpen, onClose, onNavigate } = options;\n\n  const [isOpen, setIsOpen] = useState(false);\n  const [currentIndex, setCurrentIndex] = useState(0);\n  const [images, setImages] = useState<ImageAttachment[]>(initialImages);\n\n  const currentImage = useMemo(() => images[currentIndex], [images, currentIndex]);\n\n  const hasPrev = useMemo(() => {\n    if (wrap) {return images.length > 1;}\n    return currentIndex > 0;\n  }, [currentIndex, images.length, wrap]);\n\n  const hasNext = useMemo(() => {\n    if (wrap) {return images.length > 1;}\n    return currentIndex < images.length - 1;\n  }, [currentIndex, images.length, wrap]);\n\n  const open = useCallback(\n    (index: number, newImages?: ImageAttachment[]) => {\n      if (newImages) {\n        setImages(newImages);\n      }\n      const targetImages = newImages || images;\n      // Handle empty images array - don't compute negative index\n      if (targetImages.length === 0) {\n        setCurrentIndex(0);\n        setIsOpen(true);\n        return;\n      }\n      const safeIndex = Math.max(0, Math.min(index, targetImages.length - 1));\n      setCurrentIndex(safeIndex);\n      setIsOpen(true);\n      onOpen?.(safeIndex);\n    },\n    [images, onOpen]\n  );\n\n  const close = useCallback(() => {\n    setIsOpen(false);\n    onClose?.();\n  }, [onClose]);\n\n  const prev = useCallback(() => {\n    if (images.length < 2) {return;}\n    if (!hasPrev && !wrap) {return;}\n\n    setCurrentIndex((current) => {\n      const newIndex = wrap\n        ? (current - 1 + images.length) % images.length\n        : Math.max(0, current - 1);\n      onNavigate?.(newIndex, 'prev');\n      return newIndex;\n    });\n  }, [hasPrev, wrap, images.length, onNavigate]);\n\n  const next = useCallback(() => {\n    if (images.length < 2) {return;}\n    if (!hasNext && !wrap) {return;}\n\n    setCurrentIndex((current) => {\n      const newIndex = wrap ? (current + 1) % images.length : Math.min(images.length - 1, current + 1);\n      onNavigate?.(newIndex, 'next');\n      return newIndex;\n    });\n  }, [hasNext, wrap, images.length, onNavigate]);\n\n  const goTo = useCallback(\n    (index: number) => {\n      const safeIndex = Math.max(0, Math.min(index, images.length - 1));\n      setCurrentIndex(safeIndex);\n    },\n    [images.length]\n  );\n\n  const setImagesHandler = useCallback((newImages: ImageAttachment[]) => {\n    setImages(newImages);\n    // Reset index if it's out of bounds (handle empty array case)\n    if (newImages.length === 0) {\n      setCurrentIndex(0);\n    } else {\n      setCurrentIndex((current) => Math.min(current, newImages.length - 1));\n    }\n  }, []);\n\n  return {\n    isOpen,\n    currentIndex,\n    currentImage,\n    images,\n    hasPrev,\n    hasNext,\n    open,\n    close,\n    prev,\n    next,\n    goTo,\n    setImages: setImagesHandler,\n  };\n}\n","/**\n * useAutoScroll Hook\n * Manages auto-scroll behavior for chat containers\n */\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\n\nexport interface UseAutoScrollOptions {\n  /** Threshold in pixels from bottom to consider \"at bottom\" (default: 100) */\n  threshold?: number\n  /** Smooth scroll behavior (default: true) */\n  smooth?: boolean\n  /** Callback when scroll position changes */\n  onScroll?: (isAtBottom: boolean) => void\n}\n\nexport interface UseAutoScrollReturn {\n  /** Ref to attach to the scrollable container */\n  containerRef: React.RefObject<HTMLDivElement>\n  /** Whether the container is scrolled to the bottom */\n  isAtBottom: boolean\n  /** Whether auto-scroll should be active */\n  shouldAutoScroll: boolean\n  /** Manually scroll to bottom */\n  scrollToBottom: (smooth?: boolean) => void\n  /** Enable/disable auto-scroll */\n  setAutoScroll: (enabled: boolean) => void\n  /** Handle scroll event (attach to container if not using ref) */\n  handleScroll: (e: React.UIEvent<HTMLDivElement>) => void\n}\n\n/**\n * Hook for managing auto-scroll behavior in chat containers\n *\n * @example\n * ```tsx\n * const scroll = useAutoScroll({ threshold: 50 })\n *\n * // Attach to container\n * <div ref={scroll.containerRef} onScroll={scroll.handleScroll}>\n *   {messages.map(msg => <Message key={msg.id} />)}\n * </div>\n *\n * // Scroll button\n * {!scroll.isAtBottom && (\n *   <button onClick={() => scroll.scrollToBottom()}>\n *     Scroll to bottom\n *   </button>\n * )}\n * ```\n */\nexport function useAutoScroll(options: UseAutoScrollOptions = {}): UseAutoScrollReturn {\n  const { threshold = 100, smooth = true, onScroll } = options;\n\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [isAtBottom, setIsAtBottom] = useState(true);\n  const [shouldAutoScroll, setShouldAutoScroll] = useState(true);\n\n  const checkIsAtBottom = useCallback(\n    (container: HTMLElement): boolean => {\n      const { scrollTop, scrollHeight, clientHeight } = container;\n      return scrollHeight - scrollTop - clientHeight <= threshold;\n    },\n    [threshold]\n  );\n\n  const handleScroll = useCallback(\n    (e: React.UIEvent<HTMLDivElement>) => {\n      const container = e.currentTarget;\n      const atBottom = checkIsAtBottom(container);\n      setIsAtBottom(atBottom);\n      setShouldAutoScroll(atBottom);\n      onScroll?.(atBottom);\n    },\n    [checkIsAtBottom, onScroll]\n  );\n\n  const scrollToBottom = useCallback(\n    (useSmooth?: boolean) => {\n      const container = containerRef.current;\n      if (!container) {return;}\n\n      const shouldSmooth = useSmooth ?? smooth;\n      container.scrollTo({\n        top: container.scrollHeight,\n        behavior: shouldSmooth ? 'smooth' : 'auto',\n      });\n      setIsAtBottom(true);\n      setShouldAutoScroll(true);\n    },\n    [smooth]\n  );\n\n  const setAutoScroll = useCallback((enabled: boolean) => {\n    setShouldAutoScroll(enabled);\n    if (enabled) {\n      // Scroll to bottom immediately when enabling\n      const container = containerRef.current;\n      if (container) {\n        container.scrollTo({\n          top: container.scrollHeight,\n          behavior: 'auto',\n        });\n        setIsAtBottom(true);\n      }\n    }\n  }, []);\n\n  // Auto-scroll when content changes (using MutationObserver)\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container) {return;}\n\n    let rafId: number | null = null;\n    const observer = new MutationObserver(() => {\n      if (shouldAutoScroll) {\n        if (rafId === null) {\n          rafId = requestAnimationFrame(() => {\n            container.scrollTo({\n              top: container.scrollHeight,\n              behavior: 'instant',\n            });\n            rafId = null;\n          });\n        }\n      }\n    });\n\n    observer.observe(container, {\n      childList: true,\n      subtree: true,\n      characterData: true,\n    });\n\n    return () => {\n      observer.disconnect();\n      if (rafId !== null) {\n        cancelAnimationFrame(rafId);\n      }\n    };\n  }, [shouldAutoScroll]);\n\n  return {\n    containerRef,\n    isAtBottom,\n    shouldAutoScroll,\n    scrollToBottom,\n    setAutoScroll,\n    handleScroll,\n  };\n}\n","/**\n * useMessageActions Hook\n * Provides copy, regenerate, and edit functionality for messages\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nexport interface UseMessageActionsOptions {\n  /** Callback when copy succeeds */\n  onCopy?: (content: string) => void\n  /** Callback when copy fails */\n  onCopyError?: (error: Error) => void\n  /** Callback when regenerate is triggered */\n  onRegenerate?: () => void | Promise<void>\n  /** Callback when edit is triggered */\n  onEdit?: (content: string) => void | Promise<void>\n  /** Duration to show \"copied\" state in ms (default: 2000) */\n  copiedDuration?: number\n}\n\nexport interface UseMessageActionsReturn {\n  /** Whether content was recently copied */\n  isCopied: boolean\n  /** Whether regenerate is in progress */\n  isRegenerating: boolean\n  /** Whether edit is in progress */\n  isEditing: boolean\n  /** Copy content to clipboard */\n  copy: (content: string) => Promise<void>\n  /** Trigger regenerate action */\n  regenerate: () => Promise<void>\n  /** Trigger edit action */\n  edit: (content: string) => Promise<void>\n  /** Reset all states */\n  reset: () => void\n}\n\n/**\n * Hook for managing message actions (copy, regenerate, edit)\n *\n * @example\n * ```tsx\n * const actions = useMessageActions({\n *   onRegenerate: () => chatContext.regenerateMessage(messageId),\n *   onEdit: (content) => chatContext.editMessage(messageId, content),\n *   onCopy: () => toast.success('Copied!'),\n * })\n *\n * <button onClick={() => actions.copy(message.content)}>\n *   {actions.isCopied ? 'Copied!' : 'Copy'}\n * </button>\n *\n * <button onClick={actions.regenerate} disabled={actions.isRegenerating}>\n *   {actions.isRegenerating ? 'Regenerating...' : 'Regenerate'}\n * </button>\n * ```\n */\nexport function useMessageActions(options: UseMessageActionsOptions = {}): UseMessageActionsReturn {\n  const { onCopy, onCopyError, onRegenerate, onEdit, copiedDuration = 2000 } = options;\n\n  const [isCopied, setIsCopied] = useState(false);\n  const [isRegenerating, setIsRegenerating] = useState(false);\n  const [isEditing, setIsEditing] = useState(false);\n\n  const copiedTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  useEffect(() => {\n    return () => {\n      if (copiedTimeoutRef.current) {\n        clearTimeout(copiedTimeoutRef.current);\n        copiedTimeoutRef.current = null;\n      }\n    };\n  }, []);\n\n  const copy = useCallback(\n    async (content: string) => {\n      try {\n        await navigator.clipboard.writeText(content);\n        setIsCopied(true);\n        onCopy?.(content);\n\n        // Clear existing timeout\n        if (copiedTimeoutRef.current) {\n          clearTimeout(copiedTimeoutRef.current);\n        }\n\n        // Reset copied state after duration\n        copiedTimeoutRef.current = setTimeout(() => {\n          setIsCopied(false);\n          copiedTimeoutRef.current = null;\n        }, copiedDuration);\n      } catch (error) {\n        const err = error instanceof Error ? error : new Error('Failed to copy');\n        onCopyError?.(err);\n        throw err;\n      }\n    },\n    [onCopy, onCopyError, copiedDuration]\n  );\n\n  const regenerate = useCallback(async () => {\n    if (!onRegenerate) {return;}\n    if (isRegenerating) {return;}\n\n    setIsRegenerating(true);\n    try {\n      await onRegenerate();\n    } finally {\n      setIsRegenerating(false);\n    }\n  }, [onRegenerate, isRegenerating]);\n\n  const edit = useCallback(\n    async (content: string) => {\n      if (!onEdit) {return;}\n      if (isEditing) {return;}\n\n      setIsEditing(true);\n      try {\n        await onEdit(content);\n      } finally {\n        setIsEditing(false);\n      }\n    },\n    [onEdit, isEditing]\n  );\n\n  const reset = useCallback(() => {\n    setIsCopied(false);\n    setIsRegenerating(false);\n    setIsEditing(false);\n    if (copiedTimeoutRef.current) {\n      clearTimeout(copiedTimeoutRef.current);\n      copiedTimeoutRef.current = null;\n    }\n  }, []);\n\n  return {\n    isCopied,\n    isRegenerating,\n    isEditing,\n    copy,\n    regenerate,\n    edit,\n    reset,\n  };\n}\n","/**\n * useAttachments Hook\n * Manages file upload state, validation, and preview\n */\n\nimport { useState, useCallback, useMemo, useRef } from 'react';\nimport type { Attachment } from '../types';\nimport { convertToBase64, createDataUrl, validateAttachmentFile } from '../utils/fileUtils';\n\nexport interface FileValidationError {\n  file: File\n  reason: 'size' | 'type' | 'count' | 'custom'\n  message: string\n}\n\nexport interface UseAttachmentsOptions {\n  /** Maximum number of files (default: 10) */\n  maxFiles?: number\n  /** Maximum file size in bytes (default: 20MB) */\n  maxFileSize?: number\n  /** Allowed MIME types (default: attachment allowlist) */\n  allowedTypes?: string[]\n  /** Custom validation function */\n  validate?: (file: File) => string | null\n  /** Callback when files are added */\n  onAdd?: (files: Attachment[]) => void\n  /** Callback when a file is removed */\n  onRemove?: (file: Attachment) => void\n  /** Callback when validation fails */\n  onError?: (errors: FileValidationError[]) => void\n}\n\nexport interface UseAttachmentsReturn {\n  /** Current attachments */\n  files: Attachment[]\n  /** Validation errors from last operation */\n  errors: FileValidationError[]\n  /** Whether files are being processed */\n  isProcessing: boolean\n  /** Whether max file limit is reached */\n  isMaxReached: boolean\n  /** Number of remaining slots */\n  remainingSlots: number\n  /** Add files (validates and processes) */\n  add: (files: FileList | File[]) => Promise<void>\n  /** Remove a specific file */\n  remove: (fileOrId: Attachment | string) => void\n  /** Clear all files */\n  clear: () => void\n  /** Clear errors */\n  clearErrors: () => void\n  /** Set files directly (for controlled mode) */\n  setFiles: (files: Attachment[]) => void\n}\n\nconst DEFAULT_MAX_FILES = 10;\nconst DEFAULT_MAX_FILE_SIZE = 20 * 1024 * 1024; // 20MB\nconst DEFAULT_ALLOWED_TYPES: string[] = [];\n\n/**\n * Hook for managing file attachments\n *\n * @example\n * ```tsx\n * const attachments = useAttachments({\n *   maxFiles: 5,\n *   maxFileSize: 5 * 1024 * 1024, // 5MB\n *   onError: (errors) => errors.forEach(e => toast.error(e.message)),\n * })\n *\n * <input\n *   type=\"file\"\n *   multiple\n *   accept=\"image/*\"\n *   onChange={(e) => attachments.add(e.target.files)}\n * />\n *\n * {attachments.files.map(file => (\n *   <AttachmentPreview\n *     key={file.id}\n *     attachment={file}\n *     onRemove={() => attachments.remove(file)}\n *   />\n * ))}\n *\n * {attachments.errors.length > 0 && (\n *   <ErrorList errors={attachments.errors} />\n * )}\n * ```\n */\nexport function useAttachments(options: UseAttachmentsOptions = {}): UseAttachmentsReturn {\n  const {\n    maxFiles = DEFAULT_MAX_FILES,\n    maxFileSize = DEFAULT_MAX_FILE_SIZE,\n    allowedTypes = DEFAULT_ALLOWED_TYPES,\n    validate,\n    onAdd,\n    onRemove,\n    onError,\n  } = options;\n\n  const [files, setFiles] = useState<Attachment[]>([]);\n  const [errors, setErrors] = useState<FileValidationError[]>([]);\n  const [isProcessing, setIsProcessing] = useState(false);\n  const removedRef = useRef<Attachment | null>(null);\n\n  const isMaxReached = useMemo(() => files.length >= maxFiles, [files.length, maxFiles]);\n  const remainingSlots = useMemo(() => Math.max(0, maxFiles - files.length), [files.length, maxFiles]);\n\n  const validateFile = useCallback(\n    (file: File, currentCount: number): FileValidationError | null => {\n      // Check count\n      if (currentCount >= maxFiles) {\n        return {\n          file,\n          reason: 'count',\n          message: `Maximum ${maxFiles} files allowed`,\n        };\n      }\n\n      if (allowedTypes.length > 0) {\n        if (!allowedTypes.includes(file.type)) {\n          return {\n            file,\n            reason: 'type',\n            message: `File type \"${file.type || 'unknown'}\" not allowed`,\n          };\n        }\n        if (file.size > maxFileSize) {\n          const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(1);\n          return {\n            file,\n            reason: 'size',\n            message: `File \"${file.name}\" exceeds ${maxSizeMB}MB limit`,\n          };\n        }\n      } else {\n        try {\n          validateAttachmentFile(file, maxFileSize);\n        } catch (err) {\n          const message = err instanceof Error ? err.message : `File \"${file.name}\" is not allowed`;\n          const reason: FileValidationError['reason'] = message.includes('large') ? 'size' : 'type';\n          return {\n            file,\n            reason,\n            message,\n          };\n        }\n      }\n\n      // Custom validation\n      if (validate) {\n        const customError = validate(file);\n        if (customError) {\n          return {\n            file,\n            reason: 'custom',\n            message: customError,\n          };\n        }\n      }\n\n      return null;\n    },\n    [maxFiles, maxFileSize, allowedTypes, validate]\n  );\n\n  const add = useCallback(\n    async (newFiles: FileList | File[]) => {\n      if (isProcessing) {\n        const fileArray = Array.from(newFiles);\n        if (fileArray.length > 0) {\n          const processingErrors = fileArray.map((file) => ({\n            file,\n            reason: 'custom' as const,\n            message: 'Please wait for the current files to finish processing.',\n          }));\n          setErrors(processingErrors);\n          onError?.(processingErrors);\n        }\n        return;\n      }\n\n      setIsProcessing(true);\n      const fileArray = Array.from(newFiles);\n      const validationErrors: FileValidationError[] = [];\n      const validFiles: Attachment[] = [];\n      let currentCount = files.length;\n\n      for (const file of fileArray) {\n        const error = validateFile(file, currentCount);\n        if (error) {\n          validationErrors.push(error);\n          continue;\n        }\n\n        // Create attachment object\n        const attachment: Attachment = {\n          clientKey: crypto.randomUUID(),\n          filename: file.name,\n          mimeType: file.type,\n          sizeBytes: file.size,\n        };\n\n        try {\n          const base64Data = await convertToBase64(file);\n          attachment.base64Data = base64Data;\n          if (file.type.startsWith('image/')) {\n            attachment.preview = createDataUrl(base64Data, file.type);\n          }\n        } catch {\n          // Continue without content if conversion fails.\n        }\n\n        validFiles.push(attachment);\n        currentCount++;\n      }\n\n      if (validationErrors.length > 0) {\n        setErrors(validationErrors);\n        onError?.(validationErrors);\n      }\n\n      if (validFiles.length > 0) {\n        setFiles((prev) => [...prev, ...validFiles]);\n        onAdd?.(validFiles);\n      }\n\n      setIsProcessing(false);\n    },\n    [files.length, validateFile, onAdd, onError, isProcessing]\n  );\n\n  const remove = useCallback(\n    (fileOrId: Attachment | string) => {\n      const id = typeof fileOrId === 'string' ? fileOrId : fileOrId.id;\n      setFiles((prev) => {\n        const removed = prev.find((f) => f.id === id) ?? null;\n        const next = prev.filter((f) => f.id !== id);\n        removedRef.current = removed;\n        return next;\n      });\n\n      const removed = removedRef.current;\n      if (removed) {\n        onRemove?.(removed);\n        removedRef.current = null;\n      }\n    },\n    [onRemove]\n  );\n\n  const clear = useCallback(() => {\n    setFiles([]);\n    setErrors([]);\n  }, []);\n\n  const clearErrors = useCallback(() => {\n    setErrors([]);\n  }, []);\n\n  const setFilesHandler = useCallback((newFiles: Attachment[]) => {\n    setFiles(newFiles);\n  }, []);\n\n  return {\n    files,\n    errors,\n    isProcessing,\n    isMaxReached,\n    remainingSlots,\n    add,\n    remove,\n    clear,\n    clearErrors,\n    setFiles: setFilesHandler,\n  };\n}\n","/**\n * useMarkdownCopy Hook\n * Manages copy-to-clipboard state for code blocks in markdown\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\nexport interface UseMarkdownCopyOptions {\n  /** Duration to show \"copied\" state in ms (default: 2000) */\n  copiedDuration?: number\n  /** Callback when copy succeeds */\n  onCopy?: (content: string, language?: string) => void\n  /** Callback when copy fails */\n  onError?: (error: Error) => void\n}\n\nexport interface UseMarkdownCopyReturn {\n  /** Map of copied states by block ID */\n  copiedStates: Map<string, boolean>\n  /** Check if a specific block is in copied state */\n  isCopied: (blockId: string) => boolean\n  /** Copy content with block ID tracking */\n  copy: (blockId: string, content: string, language?: string) => Promise<void>\n  /** Reset copied state for a specific block */\n  reset: (blockId: string) => void\n  /** Reset all copied states */\n  resetAll: () => void\n}\n\n/**\n * Hook for managing copy states for multiple code blocks\n *\n * @example\n * ```tsx\n * const markdownCopy = useMarkdownCopy({\n *   onCopy: (content, lang) => console.log(`Copied ${lang} code`),\n * })\n *\n * function CodeBlock({ id, code, language }) {\n *   return (\n *     <div>\n *       <pre>{code}</pre>\n *       <button onClick={() => markdownCopy.copy(id, code, language)}>\n *         {markdownCopy.isCopied(id) ? 'Copied!' : 'Copy'}\n *       </button>\n *     </div>\n *   )\n * }\n * ```\n */\nexport function useMarkdownCopy(options: UseMarkdownCopyOptions = {}): UseMarkdownCopyReturn {\n  const { copiedDuration = 2000, onCopy, onError } = options;\n\n  const [copiedStates, setCopiedStates] = useState<Map<string, boolean>>(new Map());\n  const timeoutsRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n  useEffect(() => {\n    const timeouts = timeoutsRef.current;\n    return () => {\n      timeouts.forEach((timeout) => clearTimeout(timeout));\n      timeouts.clear();\n    };\n  }, []);\n\n  const isCopied = useCallback(\n    (blockId: string): boolean => {\n      return copiedStates.get(blockId) ?? false;\n    },\n    [copiedStates]\n  );\n\n  const copy = useCallback(\n    async (blockId: string, content: string, language?: string) => {\n      try {\n        await navigator.clipboard.writeText(content);\n\n        // Set copied state\n        setCopiedStates((prev) => {\n          const next = new Map(prev);\n          next.set(blockId, true);\n          return next;\n        });\n\n        onCopy?.(content, language);\n\n        // Clear existing timeout for this block\n        const existingTimeout = timeoutsRef.current.get(blockId);\n        if (existingTimeout) {\n          clearTimeout(existingTimeout);\n        }\n\n        // Set timeout to reset copied state\n        const timeout = setTimeout(() => {\n          setCopiedStates((prev) => {\n            const next = new Map(prev);\n            next.set(blockId, false);\n            return next;\n          });\n          timeoutsRef.current.delete(blockId);\n        }, copiedDuration);\n\n        timeoutsRef.current.set(blockId, timeout);\n      } catch (error) {\n        const err = error instanceof Error ? error : new Error('Failed to copy');\n        onError?.(err);\n        throw err;\n      }\n    },\n    [copiedDuration, onCopy, onError]\n  );\n\n  const reset = useCallback((blockId: string) => {\n    setCopiedStates((prev) => {\n      const next = new Map(prev);\n      next.set(blockId, false);\n      return next;\n    });\n\n    const timeout = timeoutsRef.current.get(blockId);\n    if (timeout) {\n      clearTimeout(timeout);\n      timeoutsRef.current.delete(blockId);\n    }\n  }, []);\n\n  const resetAll = useCallback(() => {\n    setCopiedStates(new Map());\n\n    // Clear all timeouts\n    timeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n    timeoutsRef.current.clear();\n  }, []);\n\n  return {\n    copiedStates,\n    isCopied,\n    copy,\n    reset,\n    resetAll,\n  };\n}\n","/**\n * useScrollToBottom Hook\n * Manages scroll-to-bottom functionality with smart auto-scroll\n * Only scrolls if user is near the bottom (within threshold)\n */\n\nimport { useRef, useCallback, useState, useEffect } from 'react';\n\nconst SCROLL_THRESHOLD = 100; // pixels from bottom to consider \"near bottom\"\n\nexport interface UseScrollToBottomReturn {\n  /**\n   * Ref to attach to the messages container\n   */\n  containerRef: React.RefObject<HTMLDivElement>\n\n  /**\n   * Whether to show the scroll-to-bottom button\n   */\n  showScrollButton: boolean\n\n  /**\n   * Function to scroll to bottom\n   */\n  scrollToBottom: () => void\n}\n\n/**\n * Hook for managing scroll-to-bottom behavior\n * Automatically scrolls if user is near the bottom\n * Shows button only when scrolled up significantly\n */\nexport function useScrollToBottom(items: unknown[]): UseScrollToBottomReturn {\n  const containerRef = useRef<HTMLDivElement>(null);\n  const [showScrollButton, setShowScrollButton] = useState(false);\n  const isNearBottomRef = useRef(true);\n\n  /**\n   * Scroll to bottom smoothly\n   */\n  const scrollToBottom = useCallback(() => {\n    if (containerRef.current) {\n      containerRef.current.scroll({\n        top: containerRef.current.scrollHeight,\n        behavior: 'smooth',\n      });\n      isNearBottomRef.current = true;\n      setShowScrollButton(false);\n    }\n  }, []);\n\n  /**\n   * Handle scroll events to detect when user is near bottom\n   */\n  const handleScroll = useCallback(() => {\n    if (!containerRef.current) {return;}\n\n    const element = containerRef.current;\n    const { scrollTop, scrollHeight, clientHeight } = element;\n\n    // Calculate how far from bottom\n    const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n    const isNearBottom = distanceFromBottom < SCROLL_THRESHOLD;\n\n    isNearBottomRef.current = isNearBottom;\n    setShowScrollButton(!isNearBottom && scrollHeight > clientHeight);\n  }, []);\n\n  /**\n   * Auto-scroll when new items arrive (if near bottom)\n   */\n  useEffect(() => {\n    if (isNearBottomRef.current) {\n      // Use requestAnimationFrame for smooth scrolling\n      const timer = setTimeout(() => {\n        scrollToBottom();\n      }, 0);\n      return () => clearTimeout(timer);\n    }\n    return undefined;\n  }, [items, scrollToBottom]);\n\n  /**\n   * Add scroll listener to container\n   */\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container) {return;}\n\n    container.addEventListener('scroll', handleScroll, { passive: true });\n\n    // Initial check - defer to avoid synchronous setState in effect\n    const timerId = setTimeout(handleScroll, 0);\n\n    return () => {\n      container.removeEventListener('scroll', handleScroll);\n      clearTimeout(timerId);\n    };\n  }, [handleScroll]);\n\n  return {\n    containerRef,\n    showScrollButton,\n    scrollToBottom,\n  };\n}\n","/**\n * Builds HttpDataSourceConfig from window.__APPLET_CONTEXT__.\n * For use with createHttpDataSource when the app is embedded via the applet framework.\n *\n * Expects the host to inject context with:\n * - config.rpcUIEndpoint, config.streamEndpoint\n * - session.csrfToken (or window.__CSRF_TOKEN__)\n */\n\nimport { useMemo } from 'react';\nimport type { HttpDataSourceConfig } from '../data/HttpDataSource';\nimport type { IotaContext } from '../types/iota';\n\n/**\n * Returns HttpDataSourceConfig derived from window.__APPLET_CONTEXT__.\n * Use with createHttpDataSource() for RPC and SSE endpoints.\n *\n * @throws Error if window.__APPLET_CONTEXT__ is not available\n */\nexport function useHttpDataSourceConfigFromApplet(\n  options?: { rpcTimeoutMs?: number; streamConnectTimeoutMs?: number }\n): HttpDataSourceConfig {\n  return useMemo(() => {\n    const ctx = typeof window !== 'undefined' ? (window as Window & { __APPLET_CONTEXT__?: IotaContext }).__APPLET_CONTEXT__ : undefined;\n    if (!ctx) {\n      throw new Error(\n        'Applet context not found. Ensure window.__APPLET_CONTEXT__ is injected by the backend.'\n      );\n    }\n\n    const rpcEndpoint = ctx.config?.rpcUIEndpoint ?? '/rpc';\n    const streamEndpoint = ctx.config?.streamEndpoint ?? '/stream';\n    const csrfToken =\n      ctx.session?.csrfToken ??\n      (typeof window !== 'undefined' ? (window as Window & { __CSRF_TOKEN__?: string }).__CSRF_TOKEN__ : undefined) ??\n      '';\n\n    const isDev = typeof (import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV === 'boolean'\n      && (import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV;\n    if (!csrfToken && isDev) {\n      console.warn(\n        '[useHttpDataSourceConfigFromApplet] CSRF token is empty — requests may be rejected by the server.'\n      );\n    }\n\n    return {\n      baseUrl: '',\n      rpcEndpoint,\n      streamEndpoint,\n      csrfToken,\n      rpcTimeoutMs: options?.rpcTimeoutMs ?? 120_000,\n      streamConnectTimeoutMs: options?.streamConnectTimeoutMs,\n    };\n  }, [options?.rpcTimeoutMs, options?.streamConnectTimeoutMs]);\n}\n","/**\n * Router adapter for BiChat sidebar and archived list.\n * Consumes a navigate function and location (pathname) and returns\n * activeSessionId plus callbacks for use with SDK Sidebar and ArchivedChatList.\n *\n * Router-agnostic: pass useNavigate()/useLocation() from react-router-dom\n * or equivalent from your router.\n */\n\nimport { useMemo, useCallback } from 'react';\n\nexport interface UseBichatRouterParams {\n  /** Navigate to a path (e.g. from useNavigate()) */\n  navigate: (path: string) => void;\n  /** Current pathname (e.g. location.pathname from useLocation()) */\n  pathname: string;\n  /** Optional: close mobile sidebar after navigation (e.g. closeMobile from useSidebarState) */\n  onNavigate?: () => void;\n}\n\nexport interface UseBichatRouterReturn {\n  /** Session ID extracted from pathname (e.g. /session/:id -> id) */\n  activeSessionId: string | undefined;\n  /** Navigate to session or home when sessionId is empty */\n  onSessionSelect: (sessionId: string) => void;\n  /** Navigate to new chat (home) */\n  onNewChat: () => void;\n  /** Navigate to archived list */\n  onArchivedView: () => void;\n  /** Navigate back (e.g. to home) */\n  onBack: () => void;\n  /** Navigate to all-chats view */\n  onAllChatsView: () => void;\n  /** Current sidebar tab derived from URL */\n  sidebarTab: 'my-chats' | 'all-chats';\n  /** Handler to change sidebar tab (navigates to appropriate URL) */\n  onSidebarTabChange: (tab: 'my-chats' | 'all-chats') => void;\n}\n\nconst SESSION_PATH_REGEX = /\\/session\\/([^/]+)/;\n\n/**\n * Derives BiChat navigation callbacks and activeSessionId from router state.\n * Use with SDK Sidebar (onSessionSelect, onNewChat, onArchivedView, activeSessionId)\n * and ArchivedChatList (onBack, onSessionSelect).\n */\nexport function useBichatRouter({\n  navigate,\n  pathname,\n  onNavigate,\n}: UseBichatRouterParams): UseBichatRouterReturn {\n  const isAllChats = pathname.startsWith('/all-chats');\n\n  const activeSessionId = useMemo(\n    () => pathname.match(SESSION_PATH_REGEX)?.[1],\n    [pathname]\n  );\n\n  const sidebarTab = useMemo<'my-chats' | 'all-chats'>(\n    () => (isAllChats ? 'all-chats' : 'my-chats'),\n    [isAllChats]\n  );\n\n  const maybeClose = useCallback(() => {\n    onNavigate?.();\n  }, [onNavigate]);\n\n  const onSessionSelect = useCallback(\n    (sessionId: string) => {\n      if (sessionId) {\n        const prefix = isAllChats ? '/all-chats' : '';\n        navigate(`${prefix}/session/${sessionId}`);\n      } else {\n        navigate(isAllChats ? '/all-chats' : '/');\n      }\n      maybeClose();\n    },\n    [navigate, maybeClose, isAllChats]\n  );\n\n  const onNewChat = useCallback(() => {\n    navigate(isAllChats ? '/all-chats' : '/');\n    maybeClose();\n  }, [navigate, maybeClose, isAllChats]);\n\n  const onArchivedView = useCallback(() => {\n    navigate('/archived');\n    maybeClose();\n  }, [navigate, maybeClose]);\n\n  const onAllChatsView = useCallback(() => {\n    navigate('/all-chats');\n    maybeClose();\n  }, [navigate, maybeClose]);\n\n  const onBack = useCallback(() => {\n    navigate('/');\n    maybeClose();\n  }, [navigate, maybeClose]);\n\n  const onSidebarTabChange = useCallback(\n    (tab: 'my-chats' | 'all-chats') => {\n      if (tab === 'all-chats') {\n        navigate('/all-chats');\n      } else {\n        navigate('/');\n      }\n      maybeClose();\n    },\n    [navigate, maybeClose]\n  );\n\n  return {\n    activeSessionId,\n    onSessionSelect,\n    onNewChat,\n    onArchivedView,\n    onBack,\n    onAllChatsView,\n    sidebarTab,\n    onSidebarTabChange,\n  };\n}\n","/**\n * Configuration context provider for BiChat.\n *\n * @deprecated Use `IotaContextProvider` with its new optional `context` prop\n * instead. `ConfigProvider` and `BiChatConfig` are kept for backwards\n * compatibility but will be removed in a future major version.\n */\n\nimport { createContext, useContext, ReactNode } from 'react';\n\n/** @deprecated Use `IotaContextProvider` with its `context` prop instead. */\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    rpc: 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 * @deprecated Use `IotaContextProvider` with its `context` prop instead.\n *\n * ConfigProvider component — provides configuration to the BiChat library.\n *\n * @param config - Configuration object (preferred method)\n * @param useGlobalConfig - If true, falls back to window.__APPLET_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    interface GlobalAppletContext {\n      user?: { id?: string; email?: string; firstName?: string; lastName?: string; permissions?: string[] }\n      tenant?: { id?: string; name?: string }\n      locale?: { language?: string; translations?: Record<string, string> }\n      config?: { rpcUIEndpoint?: string; streamEndpoint?: string }\n    }\n    const w = window as unknown as Record<string, unknown>;\n    const globalContext = w.__APPLET_CONTEXT__ as GlobalAppletContext | undefined;\n    const globalCSRF = w.__CSRF_TOKEN__ as string | undefined;\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          rpc: globalContext.config?.rpcUIEndpoint || '/rpc',\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 * Predefined theme configurations\n */\n\nimport { Theme } from './types';\n\nexport const lightTheme: Theme = {\n  name: 'light',\n  colors: {\n    background: '#f9fafb',       // --bichat-color-bg (gray-50)\n    surface: '#ffffff',           // --bichat-color-surface\n    primary: '#2563eb',           // --bichat-color-accent (primary-600)\n    secondary: '#6b7280',         // gray-500\n    text: '#111827',              // --bichat-color-text (gray-900)\n    textMuted: '#6b7280',         // --bichat-color-text-muted (gray-500)\n    border: '#e5e7eb',            // --bichat-color-border (gray-200)\n    error: '#ef4444',             // --bichat-color-error-500\n    success: '#22c55e',           // --bichat-color-success-500\n    warning: '#f59e0b',           // --bichat-color-warning-500\n    userBubble: '#2563eb',        // --bichat-color-user-bubble-bg (primary-600)\n    assistantBubble: '#ffffff',   // --bichat-color-assistant-bubble-bg (surface)\n    userText: '#ffffff',          // --bichat-color-user-bubble-text\n    assistantText: '#111827',     // --bichat-color-assistant-bubble-text (gray-900)\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',        // --bichat-color-bg dark (gray-900)\n    surface: '#1f2937',           // --bichat-color-surface dark (gray-800)\n    primary: '#60a5fa',           // primary-400 (lighter for dark mode contrast)\n    secondary: '#9ca3af',         // gray-400\n    text: '#f3f4f6',              // --bichat-color-text dark (gray-100)\n    textMuted: '#9ca3af',         // --bichat-color-text-muted dark (gray-400)\n    border: '#374151',            // --bichat-color-border dark (gray-700)\n    error: '#f87171',             // red-400\n    success: '#34d399',           // emerald-400\n    warning: '#fbbf24',           // amber-400\n    userBubble: '#1d4ed8',        // --bichat-color-user-bubble-bg dark (primary-700)\n    assistantBubble: '#1f2937',   // --bichat-color-assistant-bubble-bg dark (gray-800)\n    userText: '#f3f4f6',          // gray-100\n    assistantText: '#f3f4f6',     // gray-100\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 * Type mapping and sanitization functions for converting RPC payloads\n * to domain types used by the BiChat UI.\n *\n * All functions are pure and side-effect-free (except console.warn for\n * malformed payloads).\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource modules.\n */\n\nimport type { Session as RPCSession } from \"./rpc.generated\";\nimport type { PendingQuestion as RPCPendingQuestion } from \"./rpc.generated\";\nimport type {\n  Session,\n  SessionUser,\n  SessionAccess,\n  ConversationTurn,\n  Artifact as DownloadArtifact,\n  SessionArtifact,\n  PendingQuestion,\n  Question,\n  Attachment,\n  AssistantTurn,\n  RenderTableData,\n} from \"../types\";\nimport { MessageRole } from \"../types\";\nimport {\n  parseChartDataFromSpec,\n  parseChartDataFromJsonString,\n  isRecord,\n} from \"../utils/chartSpec\";\nimport {\n  parseRenderTableDataFromJsonString,\n  parseRenderTableDataFromMetadata,\n} from \"../utils/tableSpec\";\n\n// ---------------------------------------------------------------------------\n// Internal helper types\n// ---------------------------------------------------------------------------\n\nexport interface RPCArtifact {\n  id: string;\n  sessionId: string;\n  messageId?: string;\n  uploadId?: number | null;\n  type: string;\n  name: string;\n  description?: string;\n  mimeType?: string;\n  url?: string;\n  sizeBytes: number;\n  metadata?: Record<string, unknown>;\n  createdAt: string;\n}\n\n// ---------------------------------------------------------------------------\n// Logging helpers\n// ---------------------------------------------------------------------------\n\nexport function warnMalformedSessionPayload(\n  message: string,\n  details?: Record<string, unknown>,\n): void {\n  console.warn(`[BiChat] ${message}`, details || {});\n}\n\n// ---------------------------------------------------------------------------\n// Primitive readers\n// ---------------------------------------------------------------------------\n\nfunction readString(value: unknown, fallback = \"\"): string {\n  return typeof value === \"string\" ? value : fallback;\n}\n\nfunction readNonEmptyString(value: unknown): string | null {\n  if (typeof value !== \"string\") {\n    return null;\n  }\n  const trimmed = value.trim();\n  return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction readFiniteNumber(value: unknown, fallback = 0): number {\n  return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction readOptionalFiniteNumber(value: unknown): number | undefined {\n  return typeof value === \"number\" && Number.isFinite(value)\n    ? value\n    : undefined;\n}\n\nfunction extractFilenameFromURL(value: unknown): string | null {\n  const raw = readNonEmptyString(value);\n  if (!raw) {\n    return null;\n  }\n\n  try {\n    const parsed = new URL(raw);\n    const path = parsed.pathname;\n    if (!path) {\n      return null;\n    }\n    const segments = path.split(\"/\").filter(Boolean);\n    if (segments.length === 0) {\n      return null;\n    }\n    const candidate = decodeURIComponent(segments[segments.length - 1]);\n    return readNonEmptyString(candidate);\n  } catch {\n    // Relative path fallback: extract last segment without URL parsing\n    try {\n      const segments = raw.split(\"/\").filter(Boolean);\n      if (segments.length === 0) {\n        return null;\n      }\n      const candidate = decodeURIComponent(segments[segments.length - 1]);\n      return readNonEmptyString(candidate);\n    } catch {\n      return null;\n    }\n  }\n}\n\nfunction resolveArtifactName(artifact: RPCArtifact): string {\n  const explicit = readNonEmptyString(artifact.name);\n  if (explicit) {\n    return explicit;\n  }\n\n  const fromURL = extractFilenameFromURL(artifact.url);\n  if (fromURL) {\n    return fromURL;\n  }\n\n  const type = readNonEmptyString(artifact.type) || \"artifact\";\n  const label = type.replace(/_/g, \" \");\n  if (label === \"artifact\" || label.endsWith(\" artifact\")) {\n    return label;\n  }\n  return `${label} artifact`;\n}\n\n// ---------------------------------------------------------------------------\n// Session mappers\n// ---------------------------------------------------------------------------\n\nfunction mapSessionUser(rawUser: unknown): SessionUser | undefined {\n  if (!isRecord(rawUser)) {\n    return undefined;\n  }\n\n  const rawId = rawUser.id;\n  const id =\n    readNonEmptyString(rawId) ??\n    (typeof rawId === \"number\" && Number.isFinite(rawId)\n      ? String(rawId)\n      : null);\n  if (!id) {\n    return undefined;\n  }\n\n  const firstName = readString(rawUser.firstName);\n  const lastName = readString(rawUser.lastName);\n  const initials =\n    readNonEmptyString(rawUser.initials) ||\n    `${firstName.charAt(0)}${lastName.charAt(0)}`.trim().toUpperCase() ||\n    \"U\";\n\n  return {\n    id,\n    firstName,\n    lastName,\n    initials,\n  };\n}\n\nfunction mapSessionAccess(rawAccess: unknown): SessionAccess | undefined {\n  if (!isRecord(rawAccess)) {\n    return undefined;\n  }\n  const role = readString(rawAccess.role).toLowerCase();\n  const source = readString(rawAccess.source).toLowerCase();\n\n  const normalizedRole: SessionAccess[\"role\"] =\n    role === \"owner\" ||\n    role === \"editor\" ||\n    role === \"viewer\" ||\n    role === \"read_all\"\n      ? role\n      : \"none\";\n  const normalizedSource: SessionAccess[\"source\"] =\n    source === \"owner\" || source === \"member\" || source === \"permission\"\n      ? source\n      : \"none\";\n  const canRead = rawAccess.canRead === true || rawAccess.canRead === \"true\";\n  const canWrite = rawAccess.canWrite === true || rawAccess.canWrite === \"true\";\n  const canManageMembers =\n    rawAccess.canManageMembers === true ||\n    rawAccess.canManageMembers === \"true\";\n\n  if (\n    normalizedRole === \"none\" &&\n    normalizedSource === \"none\" &&\n    !canRead &&\n    !canWrite &&\n    !canManageMembers\n  ) {\n    return undefined;\n  }\n\n  return {\n    role: normalizedRole,\n    source: normalizedSource,\n    canRead,\n    canWrite,\n    canManageMembers,\n  };\n}\n\nexport function toSession(session: RPCSession): Session {\n  return {\n    id: readString(session.id),\n    title: readString(session.title),\n    status: session.status === \"archived\" ? \"archived\" : \"active\",\n    pinned: Boolean(session.pinned),\n    createdAt: readString(session.createdAt),\n    updatedAt: readString(session.updatedAt),\n    owner: mapSessionUser(session.owner),\n    isGroup: Boolean(session.isGroup),\n    memberCount:\n      typeof session.memberCount === \"number\" ? session.memberCount : undefined,\n    access: mapSessionAccess(session.access),\n  };\n}\n\nexport function toSessionArtifact(artifact: RPCArtifact): SessionArtifact {\n  const rawCreatedAt = readNonEmptyString(artifact.createdAt);\n  if (!rawCreatedAt) {\n    warnMalformedSessionPayload(\n      \"Artifact missing createdAt; defaulting to epoch\",\n      { id: artifact.id },\n    );\n  }\n  const createdAt = rawCreatedAt ?? \"1970-01-01T00:00:00.000Z\";\n\n  return {\n    id: readString(artifact.id),\n    sessionId: readString(artifact.sessionId),\n    messageId: readNonEmptyString(artifact.messageId) || undefined,\n    uploadId: readOptionalFiniteNumber(artifact.uploadId),\n    type: readNonEmptyString(artifact.type) || \"other\",\n    name: resolveArtifactName(artifact),\n    description: readNonEmptyString(artifact.description) || undefined,\n    mimeType: readNonEmptyString(artifact.mimeType) || undefined,\n    url: readNonEmptyString(artifact.url) || undefined,\n    sizeBytes: Math.max(0, readFiniteNumber(artifact.sizeBytes)),\n    metadata: isRecord(artifact.metadata) ? artifact.metadata : undefined,\n    createdAt,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Normalizers\n// ---------------------------------------------------------------------------\n\nfunction normalizeQuestionType(\n  rawType: unknown,\n): \"SINGLE_CHOICE\" | \"MULTIPLE_CHOICE\" {\n  const normalized = readString(rawType)\n    .trim()\n    .toUpperCase()\n    .replace(/[\\s-]+/g, \"_\");\n  return normalized === \"MULTIPLE_CHOICE\" ? \"MULTIPLE_CHOICE\" : \"SINGLE_CHOICE\";\n}\n\nfunction normalizePendingQuestionStatus(\n  rawStatus: unknown,\n): PendingQuestion[\"status\"] {\n  const normalized = readString(rawStatus).trim().toUpperCase();\n  switch (normalized) {\n    case \"ANSWER_SUBMITTED\":\n    case \"REJECT_SUBMITTED\":\n    case \"ANSWER_RESUME_FAILED\":\n    case \"REJECT_RESUME_FAILED\":\n    case \"ANSWERED\":\n    case \"REJECTED\":\n    case \"CANCELLED\":\n      return normalized;\n    default:\n      return \"PENDING\";\n  }\n}\n\nfunction normalizeMessageRole(rawRole: unknown): MessageRole {\n  const normalized = readString(rawRole).trim().toLowerCase();\n  if (normalized === MessageRole.User) {\n    return MessageRole.User;\n  }\n  if (normalized === MessageRole.System) {\n    return MessageRole.System;\n  }\n  if (normalized === MessageRole.Tool) {\n    return MessageRole.Tool;\n  }\n  return MessageRole.Assistant;\n}\n\n// ---------------------------------------------------------------------------\n// Attachment sanitizers\n// ---------------------------------------------------------------------------\n\nfunction sanitizeAttachment(\n  rawAttachment: unknown,\n  turnId: string,\n  index: number,\n): Attachment | null {\n  if (!isRecord(rawAttachment)) {\n    warnMalformedSessionPayload(\"Dropped malformed attachment entry\", {\n      turnId,\n      index,\n    });\n    return null;\n  }\n\n  const filename = readString(rawAttachment.filename, \"attachment\");\n  const mimeType = readString(\n    rawAttachment.mimeType,\n    \"application/octet-stream\",\n  );\n  const id = readNonEmptyString(rawAttachment.id) || undefined;\n  const clientKey =\n    readNonEmptyString(rawAttachment.clientKey) ||\n    id ||\n    `${turnId}-attachment-${index}`;\n\n  return {\n    id,\n    clientKey,\n    filename,\n    mimeType,\n    sizeBytes: readFiniteNumber(rawAttachment.sizeBytes),\n    uploadId: readOptionalFiniteNumber(rawAttachment.uploadId),\n    base64Data: readNonEmptyString(rawAttachment.base64Data) || undefined,\n    url: readNonEmptyString(rawAttachment.url) || undefined,\n    preview: readNonEmptyString(rawAttachment.preview) || undefined,\n  };\n}\n\nfunction sanitizeUserAttachments(\n  rawAttachments: unknown,\n  turnId: string,\n): Attachment[] {\n  if (!Array.isArray(rawAttachments)) {\n    return [];\n  }\n  const result: Attachment[] = [];\n  for (let i = 0; i < rawAttachments.length; i++) {\n    const sanitized = sanitizeAttachment(rawAttachments[i], turnId, i);\n    if (sanitized) {\n      result.push(sanitized);\n    }\n  }\n  return result;\n}\n\nfunction sanitizeAssistantArtifacts(\n  rawArtifacts: unknown,\n  turnId: string,\n): DownloadArtifact[] {\n  if (!Array.isArray(rawArtifacts)) {\n    return [];\n  }\n  const artifacts: DownloadArtifact[] = [];\n  for (let i = 0; i < rawArtifacts.length; i++) {\n    const raw = rawArtifacts[i];\n    if (!isRecord(raw)) {\n      warnMalformedSessionPayload(\"Dropped malformed assistant artifact\", {\n        turnId,\n        index: i,\n      });\n      continue;\n    }\n    const type = readString(raw.type).toLowerCase();\n    if (type !== \"excel\" && type !== \"pdf\") {\n      continue;\n    }\n    const url = readNonEmptyString(raw.url);\n    if (!url) {\n      warnMalformedSessionPayload(\"Dropped assistant artifact without url\", {\n        turnId,\n        index: i,\n      });\n      continue;\n    }\n    artifacts.push({\n      type,\n      filename: readString(raw.filename, \"download\"),\n      url,\n      sizeReadable: readNonEmptyString(raw.sizeReadable) || undefined,\n      rowCount:\n        typeof raw.rowCount === \"number\" && Number.isFinite(raw.rowCount)\n          ? raw.rowCount\n          : undefined,\n      description: readNonEmptyString(raw.description) || undefined,\n    });\n  }\n  return artifacts;\n}\n\n// ---------------------------------------------------------------------------\n// Assistant turn sanitizer\n// ---------------------------------------------------------------------------\n\nfunction sanitizeAssistantTurn(\n  rawAssistantTurn: unknown,\n  fallbackCreatedAt: string,\n  turnId: string,\n): AssistantTurn | undefined {\n  if (rawAssistantTurn == null) {\n    return undefined;\n  }\n  if (!isRecord(rawAssistantTurn)) {\n    warnMalformedSessionPayload(\"Dropped malformed assistant turn payload\", {\n      turnId,\n    });\n    return undefined;\n  }\n\n  const assistantID = readNonEmptyString(rawAssistantTurn.id);\n  if (!assistantID) {\n    warnMalformedSessionPayload(\"Dropped assistant turn without id\", {\n      turnId,\n    });\n    return undefined;\n  }\n\n  const citations = Array.isArray(rawAssistantTurn.citations)\n    ? rawAssistantTurn.citations\n        .filter((item) => isRecord(item))\n        .map((item, index) => ({\n          id: readString(item.id, `${assistantID}-citation-${index}`),\n          type: readString(item.type),\n          title: readString(item.title),\n          url: readString(item.url),\n          startIndex: readFiniteNumber(item.startIndex),\n          endIndex: readFiniteNumber(item.endIndex),\n          excerpt: readNonEmptyString(item.excerpt) || undefined,\n        }))\n    : [];\n\n  const toolCalls = Array.isArray(rawAssistantTurn.toolCalls)\n    ? rawAssistantTurn.toolCalls\n        .filter((item) => isRecord(item))\n        .map((item, index) => ({\n          id: readString(item.id, `${assistantID}-tool-${index}`),\n          name: readString(item.name),\n          arguments: readString(item.arguments),\n          result: readNonEmptyString(item.result) || undefined,\n          error: readNonEmptyString(item.error) || undefined,\n          durationMs: readFiniteNumber(item.durationMs),\n        }))\n    : [];\n\n  const codeOutputs = Array.isArray(rawAssistantTurn.codeOutputs)\n    ? rawAssistantTurn.codeOutputs\n        .filter((item) => isRecord(item))\n        .map((item) => ({\n          type: ((): \"image\" | \"text\" | \"error\" => {\n            const normalizedType = readString(item.type, \"text\").toLowerCase();\n            if (normalizedType === \"image\" || normalizedType === \"error\") {\n              return normalizedType;\n            }\n            return \"text\";\n          })(),\n          content: readString(item.content),\n          filename: readNonEmptyString(item.filename) || undefined,\n          mimeType: readNonEmptyString(item.mimeType) || undefined,\n          sizeBytes: readOptionalFiniteNumber(item.sizeBytes),\n        }))\n    : [];\n\n  const debugTrace = isRecord(rawAssistantTurn.debug)\n    ? {\n        schemaVersion:\n          readNonEmptyString(rawAssistantTurn.debug.schemaVersion) || undefined,\n        startedAt:\n          readNonEmptyString(rawAssistantTurn.debug.startedAt) || undefined,\n        completedAt:\n          readNonEmptyString(rawAssistantTurn.debug.completedAt) || undefined,\n        generationMs: readOptionalFiniteNumber(\n          rawAssistantTurn.debug.generationMs,\n        ),\n        traceId:\n          readNonEmptyString(rawAssistantTurn.debug.traceId) || undefined,\n        traceUrl:\n          readNonEmptyString(rawAssistantTurn.debug.traceUrl) || undefined,\n        sessionId:\n          readNonEmptyString(rawAssistantTurn.debug.sessionId) || undefined,\n        thinking:\n          readNonEmptyString(rawAssistantTurn.debug.thinking) || undefined,\n        observationReason:\n          readNonEmptyString(rawAssistantTurn.debug.observationReason) ||\n          undefined,\n        usage: isRecord(rawAssistantTurn.debug.usage)\n          ? {\n              promptTokens: readFiniteNumber(\n                rawAssistantTurn.debug.usage.promptTokens,\n              ),\n              completionTokens: readFiniteNumber(\n                rawAssistantTurn.debug.usage.completionTokens,\n              ),\n              totalTokens: readFiniteNumber(\n                rawAssistantTurn.debug.usage.totalTokens,\n              ),\n              cachedTokens: readOptionalFiniteNumber(\n                rawAssistantTurn.debug.usage.cachedTokens,\n              ),\n              cost: readOptionalFiniteNumber(rawAssistantTurn.debug.usage.cost),\n            }\n          : undefined,\n        tools: Array.isArray(rawAssistantTurn.debug.tools)\n          ? rawAssistantTurn.debug.tools\n              .filter((tool) => isRecord(tool))\n              .map((tool) => ({\n                callId: readNonEmptyString(tool.callId) || undefined,\n                name: readString(tool.name),\n                arguments: readNonEmptyString(tool.arguments) || undefined,\n                result: readNonEmptyString(tool.result) || undefined,\n                error: readNonEmptyString(tool.error) || undefined,\n                durationMs: readOptionalFiniteNumber(tool.durationMs),\n              }))\n          : [],\n        attempts: Array.isArray(rawAssistantTurn.debug.attempts)\n          ? rawAssistantTurn.debug.attempts\n              .filter((attempt) => isRecord(attempt))\n              .map((attempt) => ({\n                id: readNonEmptyString(attempt.id) || undefined,\n                requestId: readNonEmptyString(attempt.requestId) || undefined,\n                model: readNonEmptyString(attempt.model) || undefined,\n                provider: readNonEmptyString(attempt.provider) || undefined,\n                finishReason:\n                  readNonEmptyString(attempt.finishReason) || undefined,\n                promptTokens: readOptionalFiniteNumber(attempt.promptTokens),\n                completionTokens: readOptionalFiniteNumber(\n                  attempt.completionTokens,\n                ),\n                totalTokens: readOptionalFiniteNumber(attempt.totalTokens),\n                cachedTokens: readOptionalFiniteNumber(attempt.cachedTokens),\n                cost: readOptionalFiniteNumber(attempt.cost),\n                latencyMs: readOptionalFiniteNumber(attempt.latencyMs),\n                input: readNonEmptyString(attempt.input) || undefined,\n                output: readNonEmptyString(attempt.output) || undefined,\n                thinking: readNonEmptyString(attempt.thinking) || undefined,\n                observationReason:\n                  readNonEmptyString(attempt.observationReason) || undefined,\n                startedAt: readNonEmptyString(attempt.startedAt) || undefined,\n                completedAt:\n                  readNonEmptyString(attempt.completedAt) || undefined,\n                toolCalls: Array.isArray(attempt.toolCalls)\n                  ? attempt.toolCalls\n                      .filter((tool) => isRecord(tool))\n                      .map((tool) => ({\n                        callId: readNonEmptyString(tool.callId) || undefined,\n                        name: readString(tool.name),\n                        arguments:\n                          readNonEmptyString(tool.arguments) || undefined,\n                        result: readNonEmptyString(tool.result) || undefined,\n                        error: readNonEmptyString(tool.error) || undefined,\n                        durationMs: readOptionalFiniteNumber(tool.durationMs),\n                      }))\n                  : [],\n              }))\n          : [],\n        spans: Array.isArray(rawAssistantTurn.debug.spans)\n          ? rawAssistantTurn.debug.spans\n              .filter((span) => isRecord(span))\n              .map((span) => ({\n                id: readNonEmptyString(span.id) || undefined,\n                parentId: readNonEmptyString(span.parentId) || undefined,\n                generationId:\n                  readNonEmptyString(span.generationId) || undefined,\n                name: readNonEmptyString(span.name) || undefined,\n                type: readNonEmptyString(span.type) || undefined,\n                status: readNonEmptyString(span.status) || undefined,\n                level: readNonEmptyString(span.level) || undefined,\n                callId: readNonEmptyString(span.callId) || undefined,\n                toolName: readNonEmptyString(span.toolName) || undefined,\n                input: readNonEmptyString(span.input) || undefined,\n                output: readNonEmptyString(span.output) || undefined,\n                error: readNonEmptyString(span.error) || undefined,\n                durationMs: readOptionalFiniteNumber(span.durationMs),\n                startedAt: readNonEmptyString(span.startedAt) || undefined,\n                completedAt: readNonEmptyString(span.completedAt) || undefined,\n                attributes: isRecord(span.attributes)\n                  ? span.attributes\n                  : undefined,\n              }))\n          : [],\n        events: Array.isArray(rawAssistantTurn.debug.events)\n          ? rawAssistantTurn.debug.events\n              .filter((item) => isRecord(item))\n              .map((item) => ({\n                id: readNonEmptyString(item.id) || undefined,\n                name: readNonEmptyString(item.name) || undefined,\n                type: readNonEmptyString(item.type) || undefined,\n                level: readNonEmptyString(item.level) || undefined,\n                message: readNonEmptyString(item.message) || undefined,\n                reason: readNonEmptyString(item.reason) || undefined,\n                spanId: readNonEmptyString(item.spanId) || undefined,\n                generationId:\n                  readNonEmptyString(item.generationId) || undefined,\n                timestamp: readNonEmptyString(item.timestamp) || undefined,\n                attributes: isRecord(item.attributes)\n                  ? item.attributes\n                  : undefined,\n              }))\n          : [],\n      }\n    : undefined;\n\n  return {\n    id: assistantID,\n    role: normalizeMessageRole(rawAssistantTurn.role),\n    content: readString(rawAssistantTurn.content),\n    explanation: readNonEmptyString(rawAssistantTurn.explanation) || undefined,\n    citations,\n    toolCalls,\n    charts: undefined,\n    renderTables: undefined,\n    artifacts: sanitizeAssistantArtifacts(rawAssistantTurn.artifacts, turnId),\n    codeOutputs,\n    lifecycle: \"complete\",\n    debug: debugTrace,\n    createdAt: readString(rawAssistantTurn.createdAt, fallbackCreatedAt),\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Conversation turn sanitizer\n// ---------------------------------------------------------------------------\n\nfunction sanitizeConversationTurn(\n  rawTurn: unknown,\n  index: number,\n  fallbackSessionID: string,\n): ConversationTurn | null {\n  if (!isRecord(rawTurn)) {\n    warnMalformedSessionPayload(\n      \"Dropped malformed turn payload (not an object)\",\n      { index },\n    );\n    return null;\n  }\n\n  if (!isRecord(rawTurn.userTurn)) {\n    warnMalformedSessionPayload(\n      \"Dropped malformed turn payload (missing user turn)\",\n      { index },\n    );\n    return null;\n  }\n\n  const userTurnID = readNonEmptyString(rawTurn.userTurn.id);\n  if (!userTurnID) {\n    warnMalformedSessionPayload(\n      \"Dropped malformed turn payload (missing user turn id)\",\n      { index },\n    );\n    return null;\n  }\n\n  const turnID = readString(rawTurn.id, userTurnID);\n  const createdAt = readString(\n    rawTurn.createdAt,\n    readString(rawTurn.userTurn.createdAt, new Date().toISOString()),\n  );\n\n  return {\n    id: turnID,\n    sessionId: readString(rawTurn.sessionId, fallbackSessionID),\n    userTurn: {\n      id: userTurnID,\n      content: readString(rawTurn.userTurn.content),\n      attachments: sanitizeUserAttachments(\n        rawTurn.userTurn.attachments,\n        turnID,\n      ),\n      author: mapSessionUser(rawTurn.userTurn.author),\n      createdAt: readString(rawTurn.userTurn.createdAt, createdAt),\n    },\n    assistantTurn: sanitizeAssistantTurn(\n      rawTurn.assistantTurn,\n      createdAt,\n      turnID,\n    ),\n    createdAt,\n  };\n}\n\nexport function sanitizeConversationTurns(\n  rawTurns: unknown,\n  sessionID: string,\n): ConversationTurn[] {\n  if (!Array.isArray(rawTurns)) {\n    warnMalformedSessionPayload(\n      \"Session payload contained non-array turns field\",\n      { sessionID },\n    );\n    return [];\n  }\n\n  const turns: ConversationTurn[] = [];\n  let dropped = 0;\n  for (let i = 0; i < rawTurns.length; i++) {\n    const sanitizedTurn = sanitizeConversationTurn(rawTurns[i], i, sessionID);\n    if (sanitizedTurn) {\n      turns.push(sanitizedTurn);\n    } else {\n      dropped++;\n    }\n  }\n\n  if (dropped > 0) {\n    warnMalformedSessionPayload(\n      \"Dropped malformed turns from session payload\",\n      {\n        sessionID,\n        dropped,\n        total: rawTurns.length,\n      },\n    );\n  }\n\n  return turns;\n}\n\n// ---------------------------------------------------------------------------\n// Pending question sanitizer\n// ---------------------------------------------------------------------------\n\nexport function sanitizePendingQuestion(\n  rawPendingQuestion: RPCPendingQuestion | null | undefined,\n  sessionID: string,\n): PendingQuestion | null {\n  if (!rawPendingQuestion) {\n    return null;\n  }\n\n  const checkpointID = readNonEmptyString(rawPendingQuestion.checkpointId);\n  if (!checkpointID) {\n    warnMalformedSessionPayload(\n      \"Dropped malformed pendingQuestion without checkpointId\",\n      { sessionID },\n    );\n    return null;\n  }\n\n  if (!Array.isArray(rawPendingQuestion.questions)) {\n    warnMalformedSessionPayload(\n      \"Pending question had non-array questions payload\",\n      {\n        sessionID,\n        checkpointID,\n      },\n    );\n  }\n\n  const questions: Question[] = Array.isArray(rawPendingQuestion.questions)\n    ? rawPendingQuestion.questions\n        .filter((question) => {\n          if (!question || !isRecord(question)) {\n            warnMalformedSessionPayload(\n              \"Dropped malformed question from pendingQuestion\",\n              {\n                sessionID,\n                checkpointID,\n              },\n            );\n            return false;\n          }\n          return true;\n        })\n        .map((question, index) => {\n          const questionID = readString(\n            question.id,\n            `${checkpointID}-q-${index}`,\n          );\n          const options = Array.isArray(question.options)\n            ? question.options\n                .filter((option) => {\n                  if (!option || !isRecord(option)) {\n                    warnMalformedSessionPayload(\n                      \"Dropped malformed pendingQuestion option\",\n                      {\n                        sessionID,\n                        checkpointID,\n                        questionID,\n                      },\n                    );\n                    return false;\n                  }\n                  return true;\n                })\n                .map((option, optionIndex) => {\n                  const label = readString(option.label);\n                  const id = readString(\n                    option.id,\n                    `${questionID}-opt-${optionIndex}`,\n                  );\n                  return {\n                    id,\n                    label,\n                    value: id,\n                  };\n                })\n            : [];\n\n          return {\n            id: questionID,\n            text: readString(question.text),\n            type: normalizeQuestionType(question.type),\n            options,\n          };\n        })\n    : [];\n\n  return {\n    id: checkpointID,\n    turnId: readString(rawPendingQuestion.turnId),\n    agentName: readNonEmptyString(rawPendingQuestion.agentName) || undefined,\n    questions,\n    status: normalizePendingQuestionStatus(rawPendingQuestion.status),\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Artifact helpers\n// ---------------------------------------------------------------------------\n\nfunction formatSizeReadable(bytes: number): string | undefined {\n  if (!Number.isFinite(bytes) || bytes <= 0) {\n    return undefined;\n  }\n\n  const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n  let value = bytes;\n  let idx = 0;\n  while (value >= 1024 && idx < units.length - 1) {\n    value /= 1024;\n    idx++;\n  }\n  const precision = idx === 0 ? 0 : value >= 10 ? 1 : 2;\n  return `${value.toFixed(precision)} ${units[idx]}`;\n}\n\nfunction parseRowCount(metadata?: Record<string, unknown>): number | undefined {\n  if (!metadata) {\n    return undefined;\n  }\n  const raw =\n    metadata.row_count ??\n    metadata.rowCount ??\n    metadata.total_rows ??\n    metadata.totalRows;\n  if (typeof raw === \"number\" && Number.isSafeInteger(raw) && raw >= 0) {\n    return raw;\n  }\n  if (typeof raw === \"string\") {\n    const trimmed = raw.trim();\n    if (!/^\\d+$/.test(trimmed)) {\n      return undefined;\n    }\n    const parsed = Number(trimmed);\n    if (Number.isSafeInteger(parsed)) {\n      return parsed;\n    }\n  }\n  return undefined;\n}\n\nfunction inferDownloadType(\n  artifact: SessionArtifact,\n): DownloadArtifact[\"type\"] | null {\n  const mime = artifact.mimeType?.toLowerCase() || \"\";\n  const name = artifact.name?.toLowerCase() || \"\";\n  const cleanURL = artifact.url?.split(\"?\")[0].toLowerCase() || \"\";\n\n  const isPDF =\n    mime.includes(\"pdf\") || name.endsWith(\".pdf\") || cleanURL.endsWith(\".pdf\");\n  if (isPDF) {\n    return \"pdf\";\n  }\n\n  const isExcel =\n    mime.includes(\"spreadsheet\") ||\n    mime.includes(\"excel\") ||\n    name.endsWith(\".xlsx\") ||\n    name.endsWith(\".xls\") ||\n    cleanURL.endsWith(\".xlsx\") ||\n    cleanURL.endsWith(\".xls\");\n  if (isExcel) {\n    return \"excel\";\n  }\n\n  return null;\n}\n\nfunction extractFilename(artifact: SessionArtifact): string {\n  const name = artifact.name?.trim();\n  if (name) {\n    return name;\n  }\n\n  const urlPath = artifact.url?.split(\"?\")[0] || \"\";\n  const fromURL = urlPath.split(\"/\").filter(Boolean).pop();\n  if (fromURL) {\n    return fromURL;\n  }\n\n  return \"download\";\n}\n\nfunction toDownloadArtifact(\n  artifact: SessionArtifact,\n): DownloadArtifact | null {\n  if (!artifact.url) {\n    return null;\n  }\n  const type = inferDownloadType(artifact);\n  if (!type) {\n    return null;\n  }\n\n  return {\n    type,\n    filename: extractFilename(artifact),\n    url: artifact.url,\n    sizeReadable: formatSizeReadable(artifact.sizeBytes),\n    rowCount: parseRowCount(artifact.metadata),\n    description: artifact.description,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Tool-call extraction helpers\n// ---------------------------------------------------------------------------\n\nfunction cloneChartData(\n  chart: import(\"../types\").ChartData,\n): import(\"../types\").ChartData {\n  return {\n    ...chart,\n    series:\n      chart.series?.map((s) => ({ ...s, data: [...(s.data ?? [])] })) ?? [],\n    labels: chart.labels ? [...chart.labels] : undefined,\n    colors: chart.colors ? [...chart.colors] : undefined,\n    options:\n      chart.options &&\n      typeof chart.options === \"object\" &&\n      !Array.isArray(chart.options)\n        ? JSON.parse(JSON.stringify(chart.options))\n        : chart.options,\n  };\n}\n\nfunction extractChartsFromToolCalls(\n  toolCalls?: Array<{ name: string; result?: string }>,\n): import(\"../types\").ChartData[] {\n  if (!toolCalls) {\n    return [];\n  }\n  const charts: import(\"../types\").ChartData[] = [];\n  for (const tc of toolCalls) {\n    if (tc.name === \"draw_chart\" && tc.result) {\n      const parsed = parseChartDataFromJsonString(tc.result);\n      if (parsed) {\n        charts.push(cloneChartData(parsed));\n      }\n    }\n  }\n  return charts;\n}\n\nfunction cloneRenderTableData(table: RenderTableData): RenderTableData {\n  return {\n    ...table,\n    columns: [...(table.columns ?? [])],\n    headers: [...(table.headers ?? [])],\n    rows: table.rows?.map((row) => [...row]) ?? [],\n  };\n}\n\nfunction extractRenderTablesFromToolCalls(\n  toolCalls?: Array<{ id: string; name: string; result?: string }>,\n): RenderTableData[] {\n  if (!toolCalls) {\n    return [];\n  }\n\n  const tables: RenderTableData[] = [];\n  for (const tc of toolCalls) {\n    if (tc.name !== \"render_table\" || !tc.result) {\n      continue;\n    }\n    const parsed = parseRenderTableDataFromJsonString(tc.result, tc.id);\n    if (parsed) {\n      tables.push(cloneRenderTableData(parsed));\n    }\n  }\n\n  return tables;\n}\n\nconst EXPORT_TOOL_NAMES: Record<string, DownloadArtifact[\"type\"]> = {\n  export_query_to_excel: \"excel\",\n  export_data_to_excel: \"excel\",\n  export_to_pdf: \"pdf\",\n};\n\nfunction extractDownloadArtifactsFromToolCalls(\n  toolCalls?: Array<{ name: string; result?: string }>,\n): DownloadArtifact[] {\n  if (!toolCalls) {\n    return [];\n  }\n  const artifacts: DownloadArtifact[] = [];\n  for (const tc of toolCalls) {\n    const type = EXPORT_TOOL_NAMES[tc.name];\n    if (!type || !tc.result) {\n      continue;\n    }\n\n    let parsed: unknown;\n    try {\n      parsed = JSON.parse(tc.result);\n    } catch {\n      continue;\n    }\n    if (!isRecord(parsed) || typeof parsed.url !== \"string\" || !parsed.url) {\n      continue;\n    }\n\n    const filename =\n      typeof parsed.filename === \"string\" && parsed.filename\n        ? parsed.filename\n        : parsed.url.split(\"/\").pop() || \"download\";\n\n    const sizeKB =\n      typeof parsed.file_size_kb === \"number\" ? parsed.file_size_kb : undefined;\n    const sizeBytes =\n      typeof parsed.size === \"number\"\n        ? parsed.size\n        : sizeKB != null\n          ? sizeKB * 1024\n          : undefined;\n\n    artifacts.push({\n      type,\n      filename,\n      url: parsed.url,\n      sizeReadable:\n        sizeBytes != null ? formatSizeReadable(sizeBytes) : undefined,\n      rowCount: parseRowCount(parsed as Record<string, unknown>),\n      description:\n        typeof parsed.description === \"string\" ? parsed.description : undefined,\n    });\n  }\n  return artifacts;\n}\n\n// ---------------------------------------------------------------------------\n// Turn normalization\n// ---------------------------------------------------------------------------\n\nfunction normalizeAssistantTurn(\n  turn: Partial<AssistantTurn> & {\n    id: string;\n    content: string;\n    createdAt: string;\n  },\n): AssistantTurn {\n  const existingArtifacts = turn.artifacts || [];\n  const fromToolCalls = extractDownloadArtifactsFromToolCalls(turn.toolCalls);\n  const renderTables =\n    turn.renderTables || extractRenderTablesFromToolCalls(turn.toolCalls);\n  // Merge: add tool-call artifacts that aren't already present (by URL + filename)\n  const merged = [...existingArtifacts];\n  for (const a of fromToolCalls) {\n    if (!merged.some((e) => e.url === a.url && e.filename === a.filename)) {\n      merged.push(a);\n    }\n  }\n\n  const chartsRaw = turn.charts?.length\n    ? turn.charts\n    : extractChartsFromToolCalls(turn.toolCalls);\n  const charts = chartsRaw?.map(cloneChartData) ?? [];\n  const renderTablesCloned = renderTables.map(cloneRenderTableData);\n\n  return {\n    ...turn,\n    role: (turn.role as MessageRole) || MessageRole.Assistant,\n    charts: charts.length ? charts : undefined,\n    renderTables: renderTablesCloned,\n    citations: turn.citations || [],\n    artifacts: merged,\n    codeOutputs: turn.codeOutputs || [],\n    lifecycle: turn.lifecycle || \"complete\",\n  };\n}\n\nexport function normalizeTurns(raw: ConversationTurn[]): ConversationTurn[] {\n  return raw.map((turn) => {\n    if (!turn.assistantTurn) {\n      return turn;\n    }\n    return {\n      ...turn,\n      assistantTurn: normalizeAssistantTurn(turn.assistantTurn),\n    };\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Attach artifacts to turns\n// ---------------------------------------------------------------------------\n\nfunction toMillis(value: string): number {\n  const parsed = Date.parse(value);\n  return Number.isFinite(parsed) ? parsed : Number.NaN;\n}\n\nexport function attachArtifactsToTurns(\n  turns: ConversationTurn[],\n  artifacts: SessionArtifact[],\n): ConversationTurn[] {\n  if (artifacts.length === 0) {\n    return turns;\n  }\n\n  const downloadArtifacts = artifacts\n    .map((raw) => ({ raw, mapped: toDownloadArtifact(raw) }))\n    .filter(\n      (entry): entry is { raw: SessionArtifact; mapped: DownloadArtifact } =>\n        entry.mapped !== null,\n    )\n    .sort((a, b) => toMillis(a.raw.createdAt) - toMillis(b.raw.createdAt));\n\n  const chartArtifacts = artifacts\n    .filter((a) => a.type === \"chart\")\n    .sort((a, b) => toMillis(a.createdAt) - toMillis(b.createdAt));\n\n  const tableArtifacts = artifacts\n    .filter((a) => a.type === \"table\")\n    .sort((a, b) => toMillis(a.createdAt) - toMillis(b.createdAt));\n\n  if (\n    downloadArtifacts.length === 0 &&\n    chartArtifacts.length === 0 &&\n    tableArtifacts.length === 0\n  ) {\n    return turns;\n  }\n\n  const nextTurns = turns.map((turn) => {\n    if (!turn.assistantTurn) {\n      return turn;\n    }\n    return {\n      ...turn,\n      assistantTurn: {\n        ...turn.assistantTurn,\n        artifacts: [...(turn.assistantTurn.artifacts || [])],\n        charts: turn.assistantTurn.charts\n          ? [...turn.assistantTurn.charts]\n          : undefined,\n        renderTables: turn.assistantTurn.renderTables\n          ? [...turn.assistantTurn.renderTables]\n          : undefined,\n      },\n    };\n  });\n\n  const turnIndexByMessageID = new Map<string, number>();\n\n  nextTurns.forEach((turn, index) => {\n    turnIndexByMessageID.set(turn.userTurn.id, index);\n\n    const assistantTurn = turn.assistantTurn;\n    if (!assistantTurn) {\n      return;\n    }\n    turnIndexByMessageID.set(assistantTurn.id, index);\n  });\n\n  for (const entry of downloadArtifacts) {\n    const messageID = entry.raw.messageId;\n    // Only attach artifacts that are explicitly linked to a message.\n    // Orphan artifacts (uploaded via the artifacts panel) have no messageId\n    // and should not appear on any message.\n    if (!messageID) {\n      continue;\n    }\n    const targetIndex = turnIndexByMessageID.get(messageID);\n    if (targetIndex === undefined) {\n      continue;\n    }\n\n    const assistantTurn = nextTurns[targetIndex]?.assistantTurn;\n    if (!assistantTurn) {\n      continue;\n    }\n\n    const exists = assistantTurn.artifacts.some(\n      (existing) =>\n        existing.url === entry.mapped.url &&\n        existing.filename === entry.mapped.filename,\n    );\n    if (!exists) {\n      assistantTurn.artifacts.push(entry.mapped);\n    }\n  }\n\n  for (const raw of chartArtifacts) {\n    const messageID = raw.messageId;\n    if (!messageID) {\n      continue;\n    }\n    const targetIndex = turnIndexByMessageID.get(messageID);\n    if (targetIndex === undefined) {\n      continue;\n    }\n\n    const assistantTurn = nextTurns[targetIndex]?.assistantTurn;\n    if (!assistantTurn) {\n      continue;\n    }\n\n    const metadata = raw.metadata;\n    if (!metadata || typeof metadata !== \"object\" || metadata === null) {\n      continue;\n    }\n    const spec =\n      metadata.spec &&\n      typeof metadata.spec === \"object\" &&\n      metadata.spec !== null\n        ? (metadata.spec as Record<string, unknown>)\n        : (metadata as Record<string, unknown>);\n\n    const chart = parseChartDataFromSpec(spec, raw.name);\n    if (chart) {\n      if (!assistantTurn.charts) {\n        assistantTurn.charts = [];\n      }\n      assistantTurn.charts.push(cloneChartData(chart));\n    }\n  }\n\n  for (const raw of tableArtifacts) {\n    const messageID = raw.messageId;\n    if (!messageID) {\n      continue;\n    }\n    const targetIndex = turnIndexByMessageID.get(messageID);\n    if (targetIndex === undefined) {\n      continue;\n    }\n\n    const assistantTurn = nextTurns[targetIndex]?.assistantTurn;\n    if (!assistantTurn) {\n      continue;\n    }\n\n    if (assistantTurn.renderTables === undefined) {\n      assistantTurn.renderTables = extractRenderTablesFromToolCalls(\n        assistantTurn.toolCalls,\n      );\n    }\n    const existing = assistantTurn.renderTables;\n\n    const metadata = raw.metadata;\n    if (!metadata || typeof metadata !== \"object\" || metadata === null) {\n      continue;\n    }\n    const tableData = parseRenderTableDataFromMetadata(\n      metadata as Record<string, unknown>,\n      raw.id,\n    );\n    if (!tableData) {\n      continue;\n    }\n\n    const dedupeKey = (t: RenderTableData) =>\n      `${t.query}|${t.columns.join(\",\")}`;\n    const key = dedupeKey(tableData);\n    if (existing.some((t) => dedupeKey(t) === key)) {\n      continue;\n    }\n    assistantTurn.renderTables = [...existing, cloneRenderTableData(tableData)];\n  }\n\n  return nextTurns;\n}\n","/**\n * Session lifecycle management: create, list, get, delete, archive, pin, rename.\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource.\n */\n\nimport { AppletRPCException } from '../../applet-host';\nimport type { BichatRPC } from './rpc.generated';\nimport type {\n  Session,\n  SessionMember,\n  SessionUser,\n  SessionListResult,\n  SessionArtifact,\n  ConversationTurn,\n  PendingQuestion,\n  AsyncRunAccepted,\n} from '../types';\nimport {\n  toSession,\n  sanitizeConversationTurns,\n  sanitizePendingQuestion,\n  normalizeTurns,\n  attachArtifactsToTurns,\n  warnMalformedSessionPayload,\n} from './mappers';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SessionState {\n  session: Session\n  turns: ConversationTurn[]\n  pendingQuestion?: PendingQuestion | null\n}\n\ntype RPCCaller = <TMethod extends keyof BichatRPC & string>(\n  method: TMethod,\n  params: BichatRPC[TMethod]['params']\n) => Promise<BichatRPC[TMethod]['result']>\n\ntype FetchSessionArtifactsFn = (\n  sessionId: string,\n  options?: { limit?: number; offset?: number }\n) => Promise<{ artifacts: SessionArtifact[]; hasMore?: boolean; nextOffset?: number }>\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isSessionNotFoundError(err: unknown): boolean {\n  if (!(err instanceof AppletRPCException)) {return false;}\n  return err.code === 'not_found' || err.code === 'session_not_found';\n}\n\n// ---------------------------------------------------------------------------\n// Session CRUD functions\n// ---------------------------------------------------------------------------\n\nexport async function createSession(callRPC: RPCCaller): Promise<Session> {\n  const data = await callRPC('bichat.session.create', { title: '' });\n  return toSession(data.session);\n}\n\nexport async function fetchSession(\n  id: string,\n  callRPC: RPCCaller,\n  fetchArtifacts: FetchSessionArtifactsFn,\n): Promise<SessionState | null> {\n  try {\n    const [data, artifactsData] = await Promise.all([\n      callRPC('bichat.session.get', { id }),\n      fetchArtifacts(id, { limit: 200, offset: 0 }).catch((err) => {\n        console.warn('Failed to fetch session artifacts:', err);\n        return { artifacts: [] as SessionArtifact[], hasMore: false, nextOffset: 0 };\n      }),\n    ]);\n\n    const sanitizedTurns = sanitizeConversationTurns(data.turns, id);\n    const turns = attachArtifactsToTurns(\n      normalizeTurns(sanitizedTurns),\n      artifactsData.artifacts || []\n    );\n    const pendingQuestion = sanitizePendingQuestion(data.pendingQuestion, id);\n\n    if (data.pendingQuestion && pendingQuestion && pendingQuestion.questions.length === 0) {\n      warnMalformedSessionPayload('Pending question normalized to zero renderable questions', {\n        sessionID: id,\n        checkpointID: pendingQuestion.id,\n      });\n    }\n\n    return {\n      session: toSession(data.session),\n      turns,\n      pendingQuestion,\n    };\n  } catch (err) {\n    if (isSessionNotFoundError(err)) {\n      return null;\n    }\n    console.error('Failed to fetch session:', err);\n    throw err instanceof Error ? err : new Error('Failed to fetch session');\n  }\n}\n\nexport async function listSessions(\n  callRPC: RPCCaller,\n  options?: {\n    limit?: number\n    offset?: number\n    includeArchived?: boolean\n  }\n): Promise<SessionListResult> {\n  const data = await callRPC('bichat.session.list', {\n    limit: options?.limit ?? 200,\n    offset: options?.offset ?? 0,\n    includeArchived: options?.includeArchived ?? false,\n  });\n  return {\n    sessions: data.sessions.map(toSession),\n    total: typeof data.total === 'number' ? data.total : data.sessions.length,\n    hasMore: typeof data.hasMore === 'boolean' ? data.hasMore : false,\n  };\n}\n\nexport async function archiveSession(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n  const data = await callRPC('bichat.session.archive', { id: sessionId });\n  return toSession(data.session);\n}\n\nexport async function unarchiveSession(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n  const data = await callRPC('bichat.session.unarchive', { id: sessionId });\n  return toSession(data.session);\n}\n\nexport async function pinSession(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n  const data = await callRPC('bichat.session.pin', { id: sessionId });\n  return toSession(data.session);\n}\n\nexport async function unpinSession(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n  const data = await callRPC('bichat.session.unpin', { id: sessionId });\n  return toSession(data.session);\n}\n\nexport async function deleteSession(callRPC: RPCCaller, sessionId: string): Promise<void> {\n  await callRPC('bichat.session.delete', { id: sessionId });\n}\n\nexport async function renameSession(callRPC: RPCCaller, sessionId: string, title: string): Promise<Session> {\n  const data = await callRPC('bichat.session.updateTitle', { id: sessionId, title });\n  return toSession(data.session);\n}\n\nexport async function regenerateSessionTitle(callRPC: RPCCaller, sessionId: string): Promise<Session> {\n  const data = await callRPC('bichat.session.regenerateTitle', { id: sessionId });\n  return toSession(data.session);\n}\n\nexport async function clearSessionHistory(callRPC: RPCCaller, sessionId: string): Promise<{\n  success: boolean\n  deletedMessages: number\n  deletedArtifacts: number\n}> {\n  return callRPC('bichat.session.clear', { id: sessionId });\n}\n\nexport async function compactSessionHistory(callRPC: RPCCaller, sessionId: string): Promise<AsyncRunAccepted> {\n  const result = await callRPC('bichat.session.compact', { id: sessionId });\n  if (!result.accepted) {\n    throw new Error('Session compact request was not accepted');\n  }\n  if (result.operation !== 'session_compact') {\n    throw new Error(`Unexpected async operation: ${result.operation}`);\n  }\n  if (!result.sessionId || !result.runId) {\n    throw new Error('Missing async run metadata');\n  }\n  return {\n    accepted: true,\n    operation: result.operation,\n    sessionId: result.sessionId,\n    runId: result.runId,\n    startedAt: result.startedAt,\n  };\n}\n\nexport async function listUsers(callRPC: RPCCaller): Promise<SessionUser[]> {\n  const data = await callRPC('bichat.user.list', {});\n  return data.users.map((user) => ({\n    id: String(user.id),\n    firstName: user.firstName || '',\n    lastName: user.lastName || '',\n    initials: user.initials || '',\n  }));\n}\n\nexport async function listAllSessions(\n  callRPC: RPCCaller,\n  options?: {\n    limit?: number\n    offset?: number\n    includeArchived?: boolean\n    userId?: string | null\n  }\n): Promise<{\n  sessions: Session[]\n  total: number\n  hasMore: boolean\n}> {\n  const data = await callRPC('bichat.session.listAll', {\n    limit: options?.limit ?? 50,\n    offset: options?.offset ?? 0,\n    includeArchived: options?.includeArchived ?? false,\n    userId: options?.userId ?? null,\n  });\n\n  return {\n    sessions: data.sessions.map(toSession),\n    total: typeof data.total === 'number' ? data.total : data.sessions.length,\n    hasMore: Boolean(data.hasMore),\n  };\n}\n\nexport async function listSessionMembers(callRPC: RPCCaller, sessionId: string): Promise<SessionMember[]> {\n  const data = await callRPC('bichat.session.members.list', { sessionId });\n  return data.members.map((member) => ({\n    user: {\n      id: String(member.user.id),\n      firstName: member.user.firstName,\n      lastName: member.user.lastName,\n      initials: member.user.initials,\n    },\n    role: (() => {\n      const normalizedRole = (member.role || '').toLowerCase();\n      if (normalizedRole === 'owner') {return 'owner';}\n      if (normalizedRole === 'editor') {return 'editor';}\n      return 'viewer';\n    })(),\n    createdAt: member.createdAt,\n    updatedAt: member.updatedAt,\n  }));\n}\n\nexport async function addSessionMember(\n  callRPC: RPCCaller,\n  sessionId: string,\n  userId: string,\n  role: 'editor' | 'viewer',\n): Promise<void> {\n  await callRPC('bichat.session.members.add', {\n    sessionId,\n    userId,\n    role: role.toUpperCase(),\n  });\n}\n\nexport async function updateSessionMemberRole(\n  callRPC: RPCCaller,\n  sessionId: string,\n  userId: string,\n  role: 'editor' | 'viewer',\n): Promise<void> {\n  await callRPC('bichat.session.members.updateRole', {\n    sessionId,\n    userId,\n    role: role.toUpperCase(),\n  });\n}\n\nexport async function removeSessionMember(callRPC: RPCCaller, sessionId: string, userId: string): Promise<void> {\n  await callRPC('bichat.session.members.remove', { sessionId, userId });\n}\n","/**\n * SSE stream parser for consuming Server-Sent Events.\n */\n\nimport type { StreamChunk, StreamEvent } from '../types';\n\nexport interface SSEEvent {\n  type: string\n  content?: string\n  error?: string\n  sessionId?: string\n  toolName?: string\n  toolCallId?: string\n  durationMs?: number\n  success?: boolean\n  [key: string]: unknown\n}\n\n/**\n * Helper function to process SSE data lines and parse JSON events.\n */\nfunction* processDataLines(lines: string[]): Generator<SSEEvent, void, unknown> {\n  for (const line of lines) {\n    if (line.startsWith(':')) {continue;}\n\n    if (line.startsWith('data: ')) {\n      const jsonStr = line.slice(6);\n      if (jsonStr === '[DONE]') {continue;}\n\n      try {\n        const parsed = JSON.parse(jsonStr) as SSEEvent;\n        yield parsed;\n      } catch (err) {\n        console.error('SSE parse error:', err, 'Data:', jsonStr);\n        // Yield error event so consumer can react appropriately\n        yield {\n          type: 'error',\n          error: 'Failed to parse SSE event',\n        };\n      }\n    }\n  }\n}\n\n/**\n * Parses an SSE stream and yields parsed JSON events.\n */\nexport async function* parseSSEStream(\n  reader: ReadableStreamDefaultReader<Uint8Array>\n): AsyncGenerator<SSEEvent, void, unknown> {\n  const decoder = new TextDecoder();\n  let buffer = '';\n\n  try {\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) {break;}\n\n      buffer += decoder.decode(value, { stream: true });\n      const events = buffer.split('\\n\\n');\n      buffer = events.pop() || '';\n\n      for (const event of events) {\n        if (!event.trim()) {continue;}\n        yield* processDataLines(event.split('\\n'));\n      }\n    }\n\n    // Process any remaining data in buffer\n    if (buffer.trim()) {\n      yield* processDataLines(buffer.split('\\n'));\n    }\n  } finally {\n    reader.releaseLock();\n  }\n}\n\n/**\n * Terminal event types that signal end of stream.\n */\nconst TERMINAL_TYPES = new Set(['done', 'error']);\n\n/**\n * Parses BiChat SSE stream with normalization and terminal event guarantee.\n *\n * Guarantees that the generator always yields a terminal event (`done` or\n * `error`) as its last item — even when the underlying stream closes silently\n * without one.\n */\nexport async function* parseBichatStream(\n  reader: ReadableStreamDefaultReader<Uint8Array>\n): AsyncGenerator<StreamChunk, void, unknown> {\n  let yieldedTerminal = false;\n\n  for await (const event of parseSSEStream(reader)) {\n    if (event.type === 'ping') {\n      continue;\n    }\n    const parsed = event as StreamChunk;\n\n    // Infer type if missing\n    const inferredType = parsed.type || (parsed.content ? 'content' : 'error');\n\n    const normalized: StreamChunk = {\n      ...parsed,\n      type: inferredType,\n    };\n\n    if (TERMINAL_TYPES.has(inferredType)) {\n      yieldedTerminal = true;\n    }\n\n    yield normalized;\n  }\n\n  // Guarantee: always emit a terminal event\n  if (!yieldedTerminal) {\n    yield { type: 'done' };\n  }\n}\n\n/**\n * Type-safe version of `parseBichatStream` that yields `StreamEvent`\n * discriminated union members instead of the flat `StreamChunk`.\n *\n * Use this in new code for proper type narrowing on `event.type`.\n */\nexport async function* parseBichatStreamEvents(\n  reader: ReadableStreamDefaultReader<Uint8Array>\n): AsyncGenerator<StreamEvent, void, unknown> {\n  for await (const chunk of parseBichatStream(reader)) {\n    const event = toStreamEvent(chunk);\n    if (event) {yield event;}\n  }\n}\n\n/**\n * Convert a flat StreamChunk into a discriminated StreamEvent.\n * Returns null for chunks that can't be meaningfully mapped.\n */\nfunction toStreamEvent(chunk: StreamChunk): StreamEvent | null {\n  switch (chunk.type) {\n    case 'chunk':\n    case 'content':\n      return { type: 'content', content: chunk.content ?? '' };\n    case 'thinking':\n      return { type: 'thinking', content: chunk.content ?? '' };\n    case 'tool_start':\n      return chunk.tool ? { type: 'tool_start', tool: chunk.tool } : null;\n    case 'tool_end':\n      return chunk.tool ? { type: 'tool_end', tool: chunk.tool } : null;\n    case 'usage':\n      return chunk.usage ? { type: 'usage', usage: chunk.usage } : null;\n    case 'user_message':\n      return chunk.sessionId ? { type: 'user_message', sessionId: chunk.sessionId } : null;\n    case 'interrupt':\n      return chunk.interrupt\n        ? { type: 'interrupt', interrupt: chunk.interrupt, sessionId: chunk.sessionId }\n        : null;\n    case 'text_block_end':\n      // seq defaults to 0 so consumers can always key on it even when\n      // the server mints the first block implicitly.\n      return { type: 'text_block_end', seq: chunk.textBlockSeq ?? 0 };\n    case 'done':\n      return { type: 'done', sessionId: chunk.sessionId, generationMs: chunk.generationMs };\n    case 'error':\n      return { type: 'error', error: chunk.error ?? 'Unknown error' };\n    default:\n      return null;\n  }\n}\n","/**\n * Hand-mirrored copy of the backend's pkg/httpdto.StreamEventType\n * constant set. Used by subscribeRunEvents / subscribeActiveRuns /\n * openManagedEventSource to register addEventListener handlers that\n * match every `event:` label the server emits.\n *\n * Drift between this file and the Go definition is caught by\n * eventNames.test.ts — the test reads the sibling Go source at test\n * time and diffs the constant set. When the Go file is absent (CI\n * without the SDK sidecar checkout) the drift guard self-skips.\n */\n\nexport const STREAM_EVENT_TYPES = [\n  'chunk',\n  'content',\n  'thinking',\n  'tool_start',\n  'tool_end',\n  'text_block_end',\n  'snapshot',\n  'interrupt',\n  'citation',\n  'usage',\n  'ping',\n  'stream_started',\n  'done',\n  'cancelled',\n  'error',\n  'failed',\n] as const;\n\nexport type StreamEventType = typeof STREAM_EVENT_TYPES[number];\n\n/**\n * Subset of {@link STREAM_EVENT_TYPES} that terminates a run from the\n * client's perspective. Callers should close the EventSource and\n * settle their promise on any of these.\n */\nexport const TERMINAL_STREAM_EVENT_TYPES = [\n  'done',\n  'cancelled',\n  'error',\n  'failed',\n] as const satisfies readonly StreamEventType[];\n\nexport type TerminalStreamEventType = typeof TERMINAL_STREAM_EVENT_TYPES[number];\n\n/**\n * Narrow + type-guard helper. Returns true when `name` is one of the\n * terminal stream event types. The guard narrows precisely to the\n * terminal subset — callers receiving `true` get {@link TerminalStreamEventType},\n * not the full {@link StreamEventType} union.\n */\nexport function isTerminalEvent(name: string): name is TerminalStreamEventType {\n  return (TERMINAL_STREAM_EVENT_TYPES as readonly string[]).includes(name);\n}\n","/**\n * openManagedEventSource — shared EventSource primitive.\n *\n * Centralises the listener wiring, AbortSignal handling, and the\n * 500ms initial-connect grace used by subscribeRunEvents and\n * subscribeActiveRuns. Future fan-out helpers can adopt this instead\n * of duplicating the EventSource boilerplate.\n *\n * Behaviour:\n * - Registers an addEventListener for every name in `events`. The\n *   callback receives the event name and the JSON-parsed payload.\n * - On JSON parse failure, the callback is invoked with\n *   `{ __unparseable: true, raw: <string> }` so the caller can log or\n *   surface a synthetic error. The subscription stays open; native\n *   EventSource reconnect handles transient flaps.\n * - Initial-connect grace: when `onerror` fires before any event is\n *   received AND within `connectGraceMs` of construction, the\n *   returned promise rejects with either the caller-provided error\n *   (via `onConnectError`) or a generic Error. After the grace\n *   window expires, `onerror` is non-fatal — the browser reconnects\n *   silently.\n * - AbortSignal close: closing the source resolves the promise.\n *   Already-aborted signals short-circuit before construction.\n */\n\nexport interface UnparseableEventPayload {\n  __unparseable: true;\n  raw: string;\n}\n\nexport interface OpenManagedEventSourceOptions {\n  url: string;\n  /** Every named event to subscribe to via addEventListener. */\n  events: readonly string[];\n  /**\n   * Called for each event received. `data` is either the JSON-parsed\n   * payload or a sentinel `{ __unparseable: true, raw }` when the\n   * payload could not be parsed.\n   */\n  onMessage: (name: string, data: unknown) => void;\n  /** Optional hook for raw EventSource errors (all flaps, not just initial). */\n  onError?: (e: Event) => void;\n  /** Close the source and resolve the promise when the signal aborts. */\n  signal?: AbortSignal;\n  /** Forwarded to the EventSource constructor. Defaults to true. */\n  withCredentials?: boolean;\n  /** Initial-connect grace window in ms. Default 500. Set 0 to disable the probe. */\n  connectGraceMs?: number;\n  /**\n   * Maps the raw onerror Event into a rejection Error. Called only\n   * when the error fires within the grace window and before any event\n   * has been received. Defaults to a plain Error.\n   */\n  onConnectError?: (e: Event) => Error;\n}\n\nexport function openManagedEventSource(\n  opts: OpenManagedEventSourceOptions,\n): Promise<void> {\n  const graceMs = opts.connectGraceMs ?? 500;\n  return new Promise<void>((resolve, reject) => {\n    const startedAt = Date.now();\n    const es = new EventSource(opts.url, {\n      withCredentials: opts.withCredentials ?? true,\n    });\n    let settled = false;\n    let sawEvent = false;\n\n    const settle = (err?: Error) => {\n      if (settled) {return;}\n      settled = true;\n      es.close();\n      if (err) {\n        reject(err);\n      } else {\n        resolve();\n      }\n    };\n\n    if (opts.signal) {\n      if (opts.signal.aborted) {\n        settle();\n        return;\n      }\n      opts.signal.addEventListener('abort', () => settle(), { once: true });\n    }\n\n    const forward = (name: string) => (evt: MessageEvent) => {\n      sawEvent = true;\n      let parsed: unknown;\n      try {\n        parsed = JSON.parse(evt.data);\n      } catch {\n        parsed = { __unparseable: true, raw: String(evt.data) } as UnparseableEventPayload;\n      }\n      try {\n        opts.onMessage(name, parsed);\n      } catch {\n        // Caller errors are non-fatal — EventSource stays open.\n      }\n    };\n\n    for (const name of opts.events) {\n      es.addEventListener(name, forward(name) as EventListener);\n    }\n\n    es.onerror = (evt) => {\n      opts.onError?.(evt);\n      if (graceMs > 0 && !sawEvent && Date.now() - startedAt < graceMs) {\n        const err = opts.onConnectError\n          ? opts.onConnectError(evt)\n          : new Error('EventSource failed to connect before first event');\n        settle(err);\n      }\n      // Otherwise let native reconnect handle the flap.\n    };\n  });\n}\n","/**\n * Attachment file processing and upload logic.\n *\n * Handles MIME detection from file signatures, filename normalization,\n * base64/URL decoding, and upload to the core upload endpoint.\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource.\n */\n\nimport type { Attachment } from '../types';\nimport { isRecord } from '../utils/chartSpec';\nimport { validateAttachmentFile } from '../utils/fileUtils';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CoreUploadResponse {\n  id: number\n  url: string\n  path: string\n  name: string\n  mimetype: string\n  size: number\n}\n\ntype AttachmentLifecycleEvent =\n  | 'attachment_decode_start' | 'attachment_decode_success' | 'attachment_decode_fail'\n  | 'attachment_upload_start' | 'attachment_upload_success' | 'attachment_upload_fail'\n  | 'stream_send_with_upload_ids'\n\n// ---------------------------------------------------------------------------\n// MIME detection constants\n// ---------------------------------------------------------------------------\n\nconst MIME_TO_EXTENSION: Record<string, string> = {\n  'image/jpeg': 'jpg',\n  'image/png': 'png',\n  'image/gif': 'gif',\n  'application/pdf': 'pdf',\n};\n\nconst SAFE_AUTOCORRECT_MIME_TYPES = new Set(Object.keys(MIME_TO_EXTENSION));\n\n// ---------------------------------------------------------------------------\n// MIME detection from file signature\n// ---------------------------------------------------------------------------\n\nfunction detectMimeFromSignature(bytes: Uint8Array): string | undefined {\n  if (bytes.length >= 8) {\n    const isPng =\n      bytes[0] === 0x89 &&\n      bytes[1] === 0x50 &&\n      bytes[2] === 0x4e &&\n      bytes[3] === 0x47 &&\n      bytes[4] === 0x0d &&\n      bytes[5] === 0x0a &&\n      bytes[6] === 0x1a &&\n      bytes[7] === 0x0a;\n    if (isPng) {return 'image/png';}\n  }\n\n  if (bytes.length >= 3) {\n    const isJpeg = bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff;\n    if (isJpeg) {return 'image/jpeg';}\n  }\n\n  if (bytes.length >= 6) {\n    const isGif =\n      bytes[0] === 0x47 &&\n      bytes[1] === 0x49 &&\n      bytes[2] === 0x46 &&\n      bytes[3] === 0x38 &&\n      (bytes[4] === 0x37 || bytes[4] === 0x39) &&\n      bytes[5] === 0x61;\n    if (isGif) {return 'image/gif';}\n  }\n\n  if (bytes.length >= 4) {\n    const isPdf =\n      bytes[0] === 0x25 && bytes[1] === 0x50 && bytes[2] === 0x44 && bytes[3] === 0x46;\n    if (isPdf) {return 'application/pdf';}\n  }\n\n  return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Filename normalization\n// ---------------------------------------------------------------------------\n\nfunction normalizeFilenameForMime(filename: string, mimeType: string): string {\n  const expectedExt = MIME_TO_EXTENSION[mimeType];\n  if (!expectedExt) {return filename;}\n\n  const lower = filename.toLowerCase();\n  if (mimeType === 'image/jpeg' && (lower.endsWith('.jpg') || lower.endsWith('.jpeg'))) {\n    return filename;\n  }\n  if (lower.endsWith(`.${expectedExt}`)) {\n    return filename;\n  }\n\n  const dotIndex = filename.lastIndexOf('.');\n  const baseName = dotIndex > 0 ? filename.slice(0, dotIndex) : filename;\n  return `${baseName}.${expectedExt}`;\n}\n\n// ---------------------------------------------------------------------------\n// Lifecycle logging\n// ---------------------------------------------------------------------------\n\nfunction logAttachmentLifecycle(\n  event: AttachmentLifecycleEvent,\n  details: Record<string, unknown>\n): void {\n  const payload = {\n    source: 'HttpDataSource',\n    event,\n    ...details,\n  };\n\n  if (event.endsWith('_fail')) {\n    console.warn('[bichat.attachments]', payload);\n    return;\n  }\n  // Non-failure lifecycle events: no console output (ESLint allows only warn/error)\n}\n\n// ---------------------------------------------------------------------------\n// File normalization (MIME correction, extension fix)\n// ---------------------------------------------------------------------------\n\nasync function normalizeAttachmentFile(attachment: Attachment, file: File): Promise<File> {\n  const signatureBytes = new Uint8Array(await file.slice(0, 16).arrayBuffer());\n  const detectedMimeType = detectMimeFromSignature(signatureBytes);\n  const declaredMimeType = (attachment.mimeType || file.type || '').trim().toLowerCase();\n\n  let resolvedMimeType = declaredMimeType || detectedMimeType || 'application/octet-stream';\n  let correctedFromDeclared = false;\n\n  if (detectedMimeType && declaredMimeType && detectedMimeType !== declaredMimeType) {\n    const safeToCorrect =\n      SAFE_AUTOCORRECT_MIME_TYPES.has(detectedMimeType) &&\n      SAFE_AUTOCORRECT_MIME_TYPES.has(declaredMimeType);\n\n    if (!safeToCorrect) {\n      throw new Error(\n        `Attachment \"${attachment.filename}\" MIME mismatch: declared \"${declaredMimeType}\", detected \"${detectedMimeType}\"`\n      );\n    }\n\n    resolvedMimeType = detectedMimeType;\n    correctedFromDeclared = true;\n  } else if (detectedMimeType && !declaredMimeType) {\n    resolvedMimeType = detectedMimeType;\n  }\n\n  const normalizedName = normalizeFilenameForMime(attachment.filename, resolvedMimeType);\n  const normalized = new File([file], normalizedName, {\n    type: resolvedMimeType,\n    lastModified: file.lastModified,\n  });\n\n  logAttachmentLifecycle('attachment_decode_success', {\n    attachmentKey: attachment.clientKey,\n    filename: attachment.filename,\n    normalizedFilename: normalized.name,\n    declaredMimeType: declaredMimeType || undefined,\n    detectedMimeType,\n    resolvedMimeType,\n    correctedFromDeclared,\n    sizeBytes: normalized.size,\n  });\n\n  return normalized;\n}\n\n// ---------------------------------------------------------------------------\n// Convert Attachment to File (from base64 or URL)\n// ---------------------------------------------------------------------------\n\nasync function attachmentToFile(attachment: Attachment): Promise<File> {\n  if (attachment.base64Data && attachment.base64Data.trim().length > 0) {\n    try {\n      const base64Data = attachment.base64Data.trim();\n      const dataUrl = base64Data.startsWith('data:')\n        ? base64Data\n        : `data:${attachment.mimeType || 'application/octet-stream'};base64,${base64Data}`;\n      const blob = await fetch(dataUrl).then((response) => response.blob());\n      return new File([blob], attachment.filename, {\n        type: attachment.mimeType || blob.type || 'application/octet-stream',\n      });\n    } catch (err) {\n      const message = err instanceof Error ? err.message : 'Unknown decode error';\n      throw new Error(`Attachment \"${attachment.filename}\" decode failed: ${message}`);\n    }\n  }\n\n  if (attachment.url) {\n    let parsed: URL;\n    try {\n      parsed = new URL(attachment.url, window.location?.origin ?? 'https://localhost');\n      if (!['http:', 'https:'].includes(parsed.protocol)) {\n        throw new Error(`Attachment \"${attachment.filename}\" URL has disallowed protocol: ${parsed.protocol}`);\n      }\n    } catch (err) {\n      if (err instanceof Error && err.message.includes('Attachment')) {throw err;}\n      throw new Error(`Attachment \"${attachment.filename}\" has invalid or malformed URL`);\n    }\n    const response = await fetch(parsed.href);\n    if (!response.ok) {\n      throw new Error(`Attachment \"${attachment.filename}\" decode failed: source HTTP ${response.status}`);\n    }\n    const blob = await response.blob();\n    return new File([blob], attachment.filename, {\n      type: attachment.mimeType || blob.type || 'application/octet-stream',\n    });\n  }\n\n  throw new Error(`Attachment \"${attachment.filename}\" has no uploadable data`);\n}\n\n// ---------------------------------------------------------------------------\n// Upload a single file\n// ---------------------------------------------------------------------------\n\nexport async function uploadFile(\n  file: File,\n  baseUrl: string,\n  uploadEndpoint: string,\n  createUploadHeaders: () => Headers,\n): Promise<CoreUploadResponse> {\n  const formData = new FormData();\n  formData.append('file', file);\n\n  const response = await fetch(`${baseUrl}${uploadEndpoint}`, {\n    method: 'POST',\n    headers: createUploadHeaders(),\n    body: formData,\n  });\n\n  let payload: unknown = null;\n  try {\n    payload = await response.json();\n  } catch {\n    payload = null;\n  }\n\n  if (!response.ok) {\n    const errorMessage = isRecord(payload) && typeof payload.error === 'string'\n      ? payload.error\n      : `Upload failed: HTTP ${response.status}`;\n    throw new Error(errorMessage);\n  }\n\n  if (!isRecord(payload) || typeof payload.id !== 'number' || payload.id <= 0) {\n    throw new Error('Upload failed: invalid response payload');\n  }\n\n  return {\n    id: payload.id,\n    url: typeof payload.url === 'string' ? payload.url : '',\n    path: typeof payload.path === 'string' ? payload.path : '',\n    name: typeof payload.name === 'string' ? payload.name : file.name,\n    mimetype: typeof payload.mimetype === 'string' ? payload.mimetype : file.type,\n    size: typeof payload.size === 'number' && Number.isFinite(payload.size) ? payload.size : file.size,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Assert upload references are valid\n// ---------------------------------------------------------------------------\n\nexport function assertUploadReferences(uploads: CoreUploadResponse[]): Array<{ uploadId: number }> {\n  return uploads.map((upload, index) => {\n    if (typeof upload.id !== 'number' || !Number.isFinite(upload.id) || upload.id <= 0) {\n      throw new Error(`Attachment upload reference is invalid at index ${index}`);\n    }\n    return { uploadId: upload.id };\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Ensure attachment is uploaded (reuse existing uploadId or upload new)\n// ---------------------------------------------------------------------------\n\nexport async function ensureAttachmentUpload(\n  attachment: Attachment,\n  context: { sessionId: string; attachmentIndex: number },\n  uploadFileFn: (file: File) => Promise<CoreUploadResponse>,\n): Promise<CoreUploadResponse> {\n  if (typeof attachment.uploadId === 'number' && attachment.uploadId > 0) {\n    logAttachmentLifecycle('attachment_upload_success', {\n      sessionId: context.sessionId,\n      attachmentIndex: context.attachmentIndex,\n      attachmentKey: attachment.clientKey,\n      filename: attachment.filename,\n      uploadId: attachment.uploadId,\n      reusedUploadId: true,\n    });\n    return {\n      id: attachment.uploadId,\n      url: attachment.url || '',\n      path: '',\n      name: attachment.filename,\n      mimetype: attachment.mimeType,\n      size: attachment.sizeBytes,\n    };\n  }\n\n  logAttachmentLifecycle('attachment_decode_start', {\n    sessionId: context.sessionId,\n    attachmentIndex: context.attachmentIndex,\n    attachmentKey: attachment.clientKey,\n    filename: attachment.filename,\n    hasBase64Data: Boolean(attachment.base64Data && attachment.base64Data.trim().length > 0),\n    hasURL: Boolean(attachment.url),\n  });\n\n  let file: File;\n  try {\n    const rawFile = await attachmentToFile(attachment);\n    file = await normalizeAttachmentFile(attachment, rawFile);\n    validateAttachmentFile(file);\n  } catch (err) {\n    const message = err instanceof Error ? err.message : 'Unknown attachment decode/validation error';\n    logAttachmentLifecycle('attachment_decode_fail', {\n      sessionId: context.sessionId,\n      attachmentIndex: context.attachmentIndex,\n      attachmentKey: attachment.clientKey,\n      filename: attachment.filename,\n      error: message,\n    });\n    throw new Error(message);\n  }\n\n  logAttachmentLifecycle('attachment_upload_start', {\n    sessionId: context.sessionId,\n    attachmentIndex: context.attachmentIndex,\n    attachmentKey: attachment.clientKey,\n    filename: file.name,\n    mimeType: file.type,\n    sizeBytes: file.size,\n  });\n\n  try {\n    const upload = await uploadFileFn(file);\n    // TODO: Refactor to return updated attachment instead of mutating; callers currently rely on this in-place update.\n    attachment.uploadId = upload.id;\n    attachment.mimeType = upload.mimetype || file.type;\n    attachment.filename = upload.name || file.name;\n    attachment.sizeBytes = upload.size || file.size;\n    logAttachmentLifecycle('attachment_upload_success', {\n      sessionId: context.sessionId,\n      attachmentIndex: context.attachmentIndex,\n      attachmentKey: attachment.clientKey,\n      filename: attachment.filename,\n      uploadId: upload.id,\n      reusedUploadId: false,\n    });\n    return upload;\n  } catch (err) {\n    const message = err instanceof Error ? err.message : 'Unknown upload error';\n    logAttachmentLifecycle('attachment_upload_fail', {\n      sessionId: context.sessionId,\n      attachmentIndex: context.attachmentIndex,\n      attachmentKey: attachment.clientKey,\n      filename: file.name,\n      error: message,\n    });\n    throw new Error(`Attachment \"${attachment.filename}\" upload failed: ${message}`);\n  }\n}\n","/**\n * Message sending, SSE streaming, and HITL question handling.\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource.\n */\n\nimport type { BichatRPC } from './rpc.generated';\nimport type {\n  ActiveRunDelivery,\n  Attachment,\n  StreamChunk,\n  StreamStatus,\n  QuestionAnswers,\n  SendMessageOptions,\n  AsyncRunAccepted,\n} from '../types';\nimport { parseBichatStream } from '../utils/sseParser';\nimport {\n  STREAM_EVENT_TYPES,\n  isTerminalEvent,\n} from '../utils/eventNames';\nimport { openManagedEventSource } from './openManagedEventSource';\nimport {\n  ensureAttachmentUpload,\n  assertUploadReferences,\n  type CoreUploadResponse,\n} from './AttachmentUploader';\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\n/**\n * Thrown by {@link subscribeRunEvents} when the underlying EventSource\n * emits `onerror` before the first event arrives within the\n * initial-connect grace window. Distinguishes boundary failures\n * (401 / 404 / 503) from transient mid-run flaps, which the browser's\n * native auto-reconnect continues to handle silently.\n */\nexport class RunEventsConnectError extends Error {\n  readonly cause?: Event;\n  constructor(message: string, cause?: Event) {\n    super(message);\n    this.name = 'RunEventsConnectError';\n    this.cause = cause;\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface Result<T> {\n  success: boolean\n  data?: T\n  error?: string\n}\n\ntype RPCCaller = <TMethod extends keyof BichatRPC & string>(\n  method: TMethod,\n  params: BichatRPC[TMethod]['params']\n) => Promise<BichatRPC[TMethod]['result']>\n\ntype AttachmentLifecycleLogger = (\n  event: 'stream_send_with_upload_ids',\n  details: Record<string, unknown>\n) => void\n\nexport interface MessageTransportDeps {\n  callRPC: RPCCaller\n  baseUrl: string\n  streamEndpoint: string\n  rpcTimeoutMs: number\n  streamConnectTimeoutMs?: number\n  createHeaders: (additionalHeaders?: Record<string, string>) => Headers\n  uploadFileFn: (file: File) => Promise<CoreUploadResponse>\n  logAttachmentLifecycle: AttachmentLifecycleLogger\n}\n\n// ---------------------------------------------------------------------------\n// Request-id generation\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a UUID-ish idempotency key for a single send. Prefers\n * crypto.randomUUID when available (every evergreen browser + Node\n * 16.7+); falls back to a Math.random-based v4 string so the feature\n * still works in constrained WebViews.\n *\n * The resulting id is returned inline in the POST /stream body as\n * `requestId` so the backend's SetNX dedupe can collapse duplicates.\n *\n * Backend contract:\n * - Dedupe window is 30 minutes on SetNX (see SDK stream handler).\n * - UUID v4 is expected — the backend parses the value as\n *   `uuid.UUID` via the Go stdlib, so malformed ids are rejected\n *   at the boundary.\n * - A double-click or cross-tab retry that sends the same\n *   `requestId` converges on the same run; the second call returns\n *   the existing run's `runId` instead of spawning a duplicate.\n */\nfunction generateRequestId(): string {\n  if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n  // RFC 4122 v4 fallback. Not cryptographically strong, but sufficient\n  // for idempotency keys that live < 30 min.\n  const bytes = new Uint8Array(16);\n  for (let i = 0; i < bytes.length; i++) {\n    bytes[i] = Math.floor(Math.random() * 256);\n  }\n  bytes[6] = (bytes[6] & 0x0f) | 0x40;\n  bytes[8] = (bytes[8] & 0x3f) | 0x80;\n  const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Stream sending\n// ---------------------------------------------------------------------------\n\nexport async function* sendMessage(\n  deps: MessageTransportDeps,\n  sessionId: string,\n  content: string,\n  attachments: Attachment[] = [],\n  signal?: AbortSignal,\n  options?: SendMessageOptions\n): AsyncGenerator<StreamChunk> {\n  // Create new abort controller for this stream\n  const abortController = new AbortController();\n\n  // Link external signal if provided, with cleanup\n  let onExternalAbort: (() => void) | undefined;\n  if (signal) {\n    onExternalAbort = () => { abortController.abort(); };\n    signal.addEventListener('abort', onExternalAbort);\n  }\n\n  const url = `${deps.baseUrl}${deps.streamEndpoint}`;\n\n  let connectionTimeoutID: ReturnType<typeof setTimeout> | undefined;\n  let connectionTimedOut = false;\n  try {\n    const uploads = await Promise.all(\n      attachments.map((attachment, attachmentIndex) =>\n        ensureAttachmentUpload(\n          attachment,\n          { sessionId, attachmentIndex },\n          deps.uploadFileFn,\n        )\n      )\n    );\n    const streamAttachments = assertUploadReferences(uploads);\n    deps.logAttachmentLifecycle('stream_send_with_upload_ids', {\n      sessionId,\n      attachmentCount: streamAttachments.length,\n    });\n    // Idempotency: one request_id per send, client-generated unless\n    // the caller provided a deterministic one (e.g. retry flow). The\n    // backend dedupes duplicates within a ~30 min window so a double\n    // click / tab-level retry converges on the same run. Falls back to\n    // a stable pseudo-id on environments that lack crypto.randomUUID.\n    const requestId = options?.requestId ?? generateRequestId();\n    const payload: Record<string, unknown> = {\n      sessionId,\n      content,\n      debugMode: options?.debugMode ?? false,\n      replaceFromMessageId: options?.replaceFromMessageID,\n      attachments: streamAttachments,\n      requestId,\n    };\n    if (options?.reasoningEffort) {\n      payload.reasoningEffort = options.reasoningEffort;\n    }\n    if (options?.model) {\n      payload.model = options.model;\n    }\n\n    const timeoutMs = deps.streamConnectTimeoutMs ?? 0;\n    if (timeoutMs > 0) {\n      connectionTimeoutID = setTimeout(() => {\n        connectionTimedOut = true;\n        abortController.abort();\n      }, timeoutMs);\n    }\n\n    const response = await fetch(url, {\n      method: 'POST',\n      headers: deps.createHeaders(),\n      body: JSON.stringify(payload),\n      signal: abortController.signal,\n    });\n    if (connectionTimeoutID !== undefined) {\n      clearTimeout(connectionTimeoutID);\n      connectionTimeoutID = undefined;\n    }\n\n    if (!response.ok) {\n      throw new Error(`Stream request failed: HTTP ${response.status}`);\n    }\n\n    if (!response.body) {\n      throw new Error('Response body is null');\n    }\n\n    const reader = response.body.getReader();\n\n    for await (const chunk of parseBichatStream(reader)) {\n      yield chunk;\n\n      if (chunk.type === 'done' || chunk.type === 'error') {\n        return;\n      }\n    }\n  } catch (err) {\n    if (err instanceof Error) {\n      if (err.name === 'AbortError') {\n        // A connection timeout is a genuine failure — surface it as an error\n        // chunk. A user-initiated stop or a provider unmount, however, must\n        // stay an AbortError so the machine takes its soft-cancel path (restore\n        // input, no error banner) instead of treating the send as failed and\n        // discarding the turn. Re-throw to preserve the error's identity;\n        // yielding an error chunk here would flatten it into a generic Error.\n        if (connectionTimedOut) {\n          yield {\n            type: 'error',\n            error: `Stream request timed out after ${deps.streamConnectTimeoutMs}ms`,\n          };\n        } else {\n          throw err;\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    if (connectionTimeoutID !== undefined) {\n      clearTimeout(connectionTimeoutID);\n    }\n    if (signal && onExternalAbort) {\n      signal.removeEventListener('abort', onExternalAbort);\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Stop stream (explicit stop — backend discards partial assistant message)\n// ---------------------------------------------------------------------------\n\nfunction buildStreamUrl(\n  deps: Pick<MessageTransportDeps, 'baseUrl' | 'streamEndpoint'>,\n  path: string\n): string {\n  const base = deps.baseUrl.replace(/\\/+$/, '');\n  const streamPath = deps.streamEndpoint.replace(/\\/$/, '');\n  return `${base}${streamPath}${path}`;\n}\n\nconst DEFAULT_STOP_STREAM_TIMEOUT_MS = 5000;\n\nexport async function stopStream(\n  deps: Pick<MessageTransportDeps, 'baseUrl' | 'streamEndpoint' | 'createHeaders'> & { timeoutMs?: number },\n  sessionId: string\n): Promise<void> {\n  const timeoutMs = deps.timeoutMs ?? DEFAULT_STOP_STREAM_TIMEOUT_MS;\n  const controller = new AbortController();\n  const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n  try {\n    const stopUrl = buildStreamUrl(deps, '/stop');\n    const response = await fetch(stopUrl, {\n      method: 'POST',\n      headers: deps.createHeaders(),\n      body: JSON.stringify({ sessionId }),\n      signal: controller.signal,\n    });\n    if (!response.ok) {\n      console.warn('Stop stream request failed:', response.status);\n    }\n  } catch (err) {\n    if (err instanceof Error && err.name === 'AbortError') {\n      console.warn('Stop stream request timed out');\n    } else {\n      throw err;\n    }\n  } finally {\n    clearTimeout(timeoutId);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Stream status and resume (refresh-safe)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STREAM_STATUS_TIMEOUT_MS = 5000;\n\ntype StreamStatusResumeDeps = Pick<\n  MessageTransportDeps,\n  'baseUrl' | 'streamEndpoint' | 'createHeaders'\n> & { timeoutMs?: number; connectTimeoutMs?: number }\n\nexport async function getStreamStatus(\n  deps: StreamStatusResumeDeps,\n  sessionId: string\n): Promise<StreamStatus | null> {\n  const timeoutMs = deps.timeoutMs ?? DEFAULT_STREAM_STATUS_TIMEOUT_MS;\n  const controller = new AbortController();\n  const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n  try {\n    const url = buildStreamUrl(deps, `/status?sessionId=${encodeURIComponent(sessionId)}`);\n    const response = await fetch(url, {\n      method: 'GET',\n      headers: deps.createHeaders(),\n      signal: controller.signal,\n    });\n    if (!response.ok) {\n      if (response.status === 404) {\n        return null;\n      }\n      console.warn('Stream status request failed:', response.status);\n      return null;\n    }\n    const data = (await response.json()) as StreamStatus;\n    return data;\n  } catch (err) {\n    if (err instanceof Error && err.name === 'AbortError') {\n      return null;\n    }\n    throw err;\n  } finally {\n    clearTimeout(timeoutId);\n  }\n}\n\nexport async function resumeStream(\n  deps: StreamStatusResumeDeps,\n  sessionId: string,\n  runId: string,\n  onChunk: (chunk: StreamChunk) => void,\n  signal?: AbortSignal\n): Promise<void> {\n  const url = buildStreamUrl(deps, '/resume');\n  const controller = new AbortController();\n  let timeoutId: ReturnType<typeof setTimeout> | undefined;\n  const timeoutMs = deps.connectTimeoutMs;\n  if (timeoutMs != null && timeoutMs > 0) {\n    timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n  }\n  if (signal) {\n    signal.addEventListener('abort', () => controller.abort());\n  }\n  try {\n    const response = await fetch(url, {\n      method: 'POST',\n      headers: deps.createHeaders(),\n      body: JSON.stringify({ sessionId, runId }),\n      signal: controller.signal,\n    });\n    if (!response.ok) {\n      throw new Error(`Resume stream failed: HTTP ${response.status}`);\n    }\n    if (timeoutId !== undefined) {\n      clearTimeout(timeoutId);\n      timeoutId = undefined;\n    }\n    if (!response.body) {\n      throw new Error('Resume response body is null');\n    }\n    const reader = response.body.getReader();\n    for await (const chunk of parseBichatStream(reader)) {\n      onChunk(chunk);\n      if (chunk.type === 'done' || chunk.type === 'error') {\n        return;\n      }\n    }\n  } finally {\n    if (timeoutId !== undefined) {\n      clearTimeout(timeoutId);\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Cursor-based event tail (Last-Event-ID reconnect)\n// ---------------------------------------------------------------------------\n\ntype StreamEventsDeps = Pick<\n  MessageTransportDeps,\n  'baseUrl' | 'streamEndpoint'\n>\n\nexport interface SubscribeRunEventsOptions {\n  /** When set, start from the last seen event id instead of a full replay. */\n  lastEventId?: string;\n  /** Fires for every chunk (content / tool / snapshot / done / error / …). */\n  onChunk: (chunk: StreamChunk) => void;\n  /** Optional hook for raw SSE errors (connection blips, parse failures). */\n  onError?: (event: Event) => void;\n  /** AbortSignal closes the underlying EventSource. */\n  signal?: AbortSignal;\n}\n\n/**\n * Open a native EventSource against GET /stream/events for a run. The\n * browser handles reconnect + Last-Event-ID automatically on transient\n * network drops; we forward each SSE event onto onChunk and resolve the\n * returned promise when a terminal event (done / error) arrives or the\n * caller aborts.\n *\n * Kept separate from sendMessage so the applet can connect to a run\n * that was started by another tab (shared request_id) or that the\n * current session already had in flight (tab reopen, device switch).\n */\nexport function subscribeRunEvents(\n  deps: StreamEventsDeps,\n  sessionId: string,\n  runId: string,\n  options: SubscribeRunEventsOptions\n): Promise<void> {\n  const base = buildStreamUrl(deps, '/events');\n  const qs = new URLSearchParams({ sessionId, runId });\n  const url = `${base}?${qs.toString()}`;\n\n  // EventSource ignores custom headers in most browsers, so we leave\n  // auth to the cookie that backs the session. Last-Event-ID is only\n  // honoured by native reconnects — when the caller explicitly\n  // supplies one (first connect after a known cursor) we append it as\n  // a query parameter the server reads as a fallback. Native\n  // reconnect adds the real `Last-Event-ID` header for subsequent\n  // drops.\n  const withCursor = options.lastEventId\n    ? `${url}&${new URLSearchParams({ lastEventId: options.lastEventId }).toString()}`\n    : url;\n\n  // Track whether the caller has already received a terminal chunk —\n  // openManagedEventSource only closes on abort or initial-connect\n  // error, so we drive the settle handshake through AbortController.\n  const settleController = new AbortController();\n  if (options.signal) {\n    if (options.signal.aborted) {\n      settleController.abort();\n    } else {\n      options.signal.addEventListener('abort', () => settleController.abort(), {\n        once: true,\n      });\n    }\n  }\n\n  return openManagedEventSource({\n    url: withCursor,\n    events: STREAM_EVENT_TYPES,\n    withCredentials: true,\n    signal: settleController.signal,\n    onError: options.onError,\n    onConnectError: (evt) =>\n      new RunEventsConnectError(\n        'EventSource failed to connect before first event',\n        evt,\n      ),\n    onMessage: (name, data) => {\n      if (\n        typeof data === 'object' &&\n        data !== null &&\n        (data as { __unparseable?: boolean }).__unparseable\n      ) {\n        // Surface parse failures as synthetic error chunks but keep\n        // the stream open — native EventSource reconnects on transient\n        // flaps.\n        options.onChunk({\n          type: 'error',\n          error: `Failed to parse event: ${(data as { raw: string }).raw}`,\n        });\n        return;\n      }\n      // Some server payloads omit `type` because it duplicates the SSE\n      // event name; back-fill it so downstream consumers can rely on\n      // StreamChunk.type being populated.\n      const parsed = data as Partial<StreamChunk> & Record<string, unknown>;\n      if (!parsed.type) {\n        parsed.type = name as StreamChunk['type'];\n      }\n      options.onChunk(parsed as StreamChunk);\n      if (isTerminalEvent(name) || isTerminalEvent(String(parsed.type))) {\n        settleController.abort();\n      }\n    },\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Active-run sidebar fan-out (per-tenant status SSE)\n// ---------------------------------------------------------------------------\n\nexport interface SubscribeActiveRunsOptions {\n  onEvent: (event: ActiveRunDelivery) => void;\n  onError?: (event: Event) => void;\n  signal?: AbortSignal;\n}\n\n/**\n * Open an EventSource to the per-tenant active-run feed. Emits one\n * \"snapshot\" row per currently-running session on connect then live\n * \"update\" deltas as runs transition. Used by the chat list to render\n * a status dot without polling each session.\n *\n * Never resolves on its own — the caller should abort via the signal\n * when the component unmounts; the returned promise only settles on\n * signal abort or initial-connect failure.\n */\nexport function subscribeActiveRuns(\n  deps: StreamEventsDeps,\n  options: SubscribeActiveRunsOptions\n): Promise<void> {\n  const url = buildStreamUrl(deps, '/active-runs');\n  return openManagedEventSource({\n    url,\n    events: ['snapshot', 'update'],\n    withCredentials: true,\n    signal: options.signal,\n    onError: options.onError,\n    onMessage: (name, data) => {\n      if (\n        typeof data !== 'object' ||\n        data === null ||\n        (data as { __unparseable?: boolean }).__unparseable\n      ) {\n        // Server contract guarantees JSON; silently skip malformed\n        // frames rather than surfacing them as fake entries.\n        return;\n      }\n      const body = data as Omit<ActiveRunDelivery, 'event'>;\n      options.onEvent({ event: name as ActiveRunDelivery['event'], ...body });\n    },\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Question submission / rejection\n// ---------------------------------------------------------------------------\n\nexport async function submitQuestionAnswers(\n  callRPC: RPCCaller,\n  sessionId: string,\n  questionId: string,\n  answers: QuestionAnswers\n): Promise<Result<AsyncRunAccepted>> {\n  try {\n    // Convert QuestionAnswers to flat map[string]string for RPC\n    const flatAnswers: Record<string, string> = {};\n    for (const [qId, answerData] of Object.entries(answers)) {\n      if (answerData.customText) {\n        flatAnswers[qId] = answerData.customText;\n      } else if (answerData.options.length > 0) {\n        flatAnswers[qId] = answerData.options.join(', ');\n      }\n    }\n    const result = await callRPC('bichat.question.submit', {\n      sessionId,\n      checkpointId: questionId,\n      answers: flatAnswers,\n    });\n    return {\n      success: true,\n      data: normalizeAsyncRunAccepted(result),\n    };\n  } catch (err) {\n    return { success: false, error: err instanceof Error ? err.message : 'Unknown error' };\n  }\n}\n\nexport async function rejectPendingQuestion(\n  callRPC: RPCCaller,\n  sessionId: string\n): Promise<Result<AsyncRunAccepted>> {\n  try {\n    const result = await callRPC('bichat.question.reject', { sessionId });\n    return { success: true, data: normalizeAsyncRunAccepted(result) };\n  } catch (err) {\n    return { success: false, error: err instanceof Error ? err.message : 'Unknown error' };\n  }\n}\n\nfunction isAsyncRunOperation(value: string): value is AsyncRunAccepted['operation'] {\n  return value === 'question_submit' || value === 'question_reject' || value === 'session_compact';\n}\n\nfunction normalizeAsyncRunAccepted(input: {\n  accepted: boolean\n  operation: string\n  sessionId: string\n  runId: string\n  startedAt: number\n}): AsyncRunAccepted {\n  if (!input.accepted) {\n    throw new Error('Async run request was not accepted');\n  }\n  if (!isAsyncRunOperation(input.operation)) {\n    throw new Error(`Unexpected async operation: ${input.operation}`);\n  }\n  if (!input.sessionId || !input.runId) {\n    throw new Error('Missing async run metadata');\n  }\n  return {\n    accepted: true,\n    operation: input.operation,\n    sessionId: input.sessionId,\n    runId: input.runId,\n    startedAt: input.startedAt,\n  };\n}\n","/**\n * Session artifact CRUD: fetch, upload, rename, delete artifacts.\n *\n * @internal — Not part of the public API. Consumed by HttpDataSource.\n */\n\nimport type { BichatRPC } from './rpc.generated';\nimport type { SessionArtifact } from '../types';\nimport { validateAttachmentFile, validateFileCount } from '../utils/fileUtils';\nimport { toSessionArtifact, type RPCArtifact } from './mappers';\nimport type { CoreUploadResponse } from './AttachmentUploader';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype RPCCaller = <TMethod extends keyof BichatRPC & string>(\n  method: TMethod,\n  params: BichatRPC[TMethod]['params']\n) => Promise<BichatRPC[TMethod]['result']>\n\n// ---------------------------------------------------------------------------\n// Artifact operations\n// ---------------------------------------------------------------------------\n\nexport async function fetchSessionArtifacts(\n  callRPC: RPCCaller,\n  sessionId: string,\n  options?: { limit?: number; offset?: number }\n): Promise<{ artifacts: SessionArtifact[]; hasMore?: boolean; nextOffset?: number }> {\n  const limit = options?.limit ?? 50;\n  const offset = options?.offset ?? 0;\n  const data = await callRPC('bichat.session.artifacts', {\n    sessionId,\n    limit,\n    offset,\n  });\n\n  const artifacts = (data.artifacts || []).map((artifact) => toSessionArtifact(artifact));\n  const hasMore =\n    typeof data.hasMore === 'boolean'\n      ? data.hasMore\n      : artifacts.length >= limit;\n  const nextOffset =\n    typeof data.nextOffset === 'number'\n      ? data.nextOffset\n      : offset + artifacts.length;\n\n  return {\n    artifacts,\n    hasMore,\n    nextOffset,\n  };\n}\n\nexport async function uploadSessionArtifacts(\n  callRPC: RPCCaller,\n  sessionId: string,\n  files: File[],\n  uploadFileFn: (file: File) => Promise<CoreUploadResponse>,\n): Promise<{ artifacts: SessionArtifact[] }> {\n  if (!Array.isArray(files) || files.length === 0) {\n    return { artifacts: [] };\n  }\n\n  validateFileCount(0, files.length, 10);\n  files.forEach((file) => validateAttachmentFile(file));\n  const uploads = await Promise.all(files.map((file) => uploadFileFn(file)));\n\n  const data = await callRPC('bichat.session.uploadArtifacts', {\n    sessionId,\n    attachments: uploads.map((upload) => ({\n      id: String(upload.id),\n      filename: upload.name,\n      uploadId: upload.id,\n      mimeType: upload.mimetype || 'application/octet-stream',\n      sizeBytes: upload.size,\n      url: upload.url,\n    })),\n  });\n\n  return {\n    artifacts: (data.artifacts || []).map((artifact) => toSessionArtifact(artifact)),\n  };\n}\n\nexport async function renameSessionArtifact(\n  callRPC: RPCCaller,\n  artifactId: string,\n  name: string,\n  description: string = ''\n): Promise<SessionArtifact> {\n  const data = await callRPC('bichat.artifact.update', {\n    id: artifactId,\n    name,\n    description,\n  });\n  return toSessionArtifact(data.artifact as RPCArtifact);\n}\n\nexport async function deleteSessionArtifact(\n  callRPC: RPCCaller,\n  artifactId: string\n): Promise<void> {\n  await callRPC('bichat.artifact.delete', { id: artifactId });\n}\n","/**\n * Built-in HTTP data source with SSE streaming and AbortController\n * Implements ChatDataSource interface with real HTTP/RPC calls\n *\n * Uses turn-based architecture - fetches ConversationTurns instead of flat messages.\n *\n * This file is a thin facade that delegates to focused internal modules:\n *   - SessionManager.ts  — session CRUD (create, list, get, delete, archive, pin)\n *   - MessageTransport.ts — send messages, stream responses, HITL questions\n *   - ArtifactManager.ts  — artifact fetch, upload, rename, delete\n *   - AttachmentUploader.ts — file decode, normalize, upload\n *   - mappers.ts          — RPC-to-domain type mapping and sanitization\n */\n\nimport { createAppletRPCClient } from '../../applet-host';\nimport type { BichatRPC } from './rpc.generated';\nimport type {\n  ChatDataSource,\n  Session,\n  SessionMember,\n  SessionListResult,\n  SessionUser,\n  SessionArtifact,\n  Attachment,\n  StreamChunk,\n  StreamStatus,\n  QuestionAnswers,\n  SendMessageOptions,\n  AsyncRunAccepted,\n} from '../types';\n\nimport * as Sessions from './SessionManager';\nimport type { SessionState } from './SessionManager';\nimport * as Messages from './MessageTransport';\nimport * as Artifacts from './ArtifactManager';\nimport { uploadFile } from './AttachmentUploader';\n\nexport interface HttpDataSourceConfig {\n  baseUrl: string\n  rpcEndpoint: string\n  streamEndpoint?: string\n  uploadEndpoint?: string\n  csrfToken?: string | (() => string)\n  headers?: Record<string, string>\n  rpcTimeoutMs?: number\n  streamConnectTimeoutMs?: number\n}\n\nexport class HttpDataSource implements ChatDataSource {\n  private config: HttpDataSourceConfig;\n  private abortController: AbortController | null = null;\n  private rpc: ReturnType<typeof createAppletRPCClient>;\n\n  constructor(config: HttpDataSourceConfig) {\n    this.config = {\n      streamEndpoint: '/stream',\n      uploadEndpoint: '/api/uploads',\n      ...config,\n      rpcTimeoutMs: typeof config.rpcTimeoutMs === 'number' ? config.rpcTimeoutMs : 120000,\n      streamConnectTimeoutMs: typeof config.streamConnectTimeoutMs === 'number'\n        ? config.streamConnectTimeoutMs\n        : undefined,\n    };\n    this.rpc = createAppletRPCClient({\n      endpoint: `${this.config.baseUrl}${this.config.rpcEndpoint}`,\n      timeoutMs: this.config.rpcTimeoutMs,\n    });\n  }\n\n  // -------------------------------------------------------------------------\n  // Internal helpers\n  // -------------------------------------------------------------------------\n\n  private getCSRFToken(): string {\n    if (!this.config.csrfToken) {return '';}\n    return typeof this.config.csrfToken === 'function'\n      ? this.config.csrfToken()\n      : this.config.csrfToken;\n  }\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    const csrfToken = this.getCSRFToken();\n    if (csrfToken) {headers.set('X-CSRF-Token', csrfToken);}\n    return headers;\n  }\n\n  private createUploadHeaders(additionalHeaders?: Record<string, string>): Headers {\n    const headers = new Headers({\n      ...this.config.headers,\n      ...additionalHeaders,\n    });\n    const csrfToken = this.getCSRFToken();\n    if (csrfToken) {headers.set('X-CSRF-Token', csrfToken);}\n    headers.delete('Content-Type');\n    return headers;\n  }\n\n  private callRPC<TMethod extends keyof BichatRPC & string>(\n    method: TMethod,\n    params: BichatRPC[TMethod]['params']\n  ): Promise<BichatRPC[TMethod]['result']> {\n    return this.rpc.callTyped<BichatRPC, TMethod>(method, params);\n  }\n\n  private boundCallRPC = <TMethod extends keyof BichatRPC & string>(\n    method: TMethod,\n    params: BichatRPC[TMethod]['params']\n  ): Promise<BichatRPC[TMethod]['result']> => {\n    return this.callRPC(method, params);\n  };\n\n  private boundUploadFile = (file: File) => {\n    return uploadFile(\n      file,\n      this.config.baseUrl,\n      this.config.uploadEndpoint!,\n      () => this.createUploadHeaders(),\n    );\n  };\n\n  // -------------------------------------------------------------------------\n  // Session management (delegates to SessionManager)\n  // -------------------------------------------------------------------------\n\n  async createSession(): Promise<Session> {\n    return Sessions.createSession(this.boundCallRPC);\n  }\n\n  async fetchSession(id: string): Promise<SessionState | null> {\n    return Sessions.fetchSession(\n      id,\n      this.boundCallRPC,\n      (sessionId, options) => this.fetchSessionArtifacts(sessionId, options),\n    );\n  }\n\n  async listSessions(options?: {\n    limit?: number\n    offset?: number\n    includeArchived?: boolean\n  }): Promise<SessionListResult> {\n    return Sessions.listSessions(this.boundCallRPC, options);\n  }\n\n  async archiveSession(sessionId: string): Promise<Session> {\n    return Sessions.archiveSession(this.boundCallRPC, sessionId);\n  }\n\n  async unarchiveSession(sessionId: string): Promise<Session> {\n    return Sessions.unarchiveSession(this.boundCallRPC, sessionId);\n  }\n\n  async pinSession(sessionId: string): Promise<Session> {\n    return Sessions.pinSession(this.boundCallRPC, sessionId);\n  }\n\n  async unpinSession(sessionId: string): Promise<Session> {\n    return Sessions.unpinSession(this.boundCallRPC, sessionId);\n  }\n\n  async deleteSession(sessionId: string): Promise<void> {\n    return Sessions.deleteSession(this.boundCallRPC, sessionId);\n  }\n\n  async renameSession(sessionId: string, title: string): Promise<Session> {\n    return Sessions.renameSession(this.boundCallRPC, sessionId, title);\n  }\n\n  async regenerateSessionTitle(sessionId: string): Promise<Session> {\n    return Sessions.regenerateSessionTitle(this.boundCallRPC, sessionId);\n  }\n\n  async clearSessionHistory(sessionId: string): Promise<{\n    success: boolean\n    deletedMessages: number\n    deletedArtifacts: number\n  }> {\n    return Sessions.clearSessionHistory(this.boundCallRPC, sessionId);\n  }\n\n  async compactSessionHistory(sessionId: string): Promise<AsyncRunAccepted> {\n    return Sessions.compactSessionHistory(this.boundCallRPC, sessionId);\n  }\n\n  async listUsers(): Promise<SessionUser[]> {\n    return Sessions.listUsers(this.boundCallRPC);\n  }\n\n  async listAllSessions(options?: {\n    limit?: number\n    offset?: number\n    includeArchived?: boolean\n    userId?: string | null\n  }): Promise<{\n    sessions: Session[]\n    total: number\n    hasMore: boolean\n  }> {\n    return Sessions.listAllSessions(this.boundCallRPC, options);\n  }\n\n  async listSessionMembers(sessionId: string): Promise<SessionMember[]> {\n    return Sessions.listSessionMembers(this.boundCallRPC, sessionId);\n  }\n\n  async addSessionMember(sessionId: string, userId: string, role: 'editor' | 'viewer'): Promise<void> {\n    return Sessions.addSessionMember(this.boundCallRPC, sessionId, userId, role);\n  }\n\n  async updateSessionMemberRole(sessionId: string, userId: string, role: 'editor' | 'viewer'): Promise<void> {\n    return Sessions.updateSessionMemberRole(this.boundCallRPC, sessionId, userId, role);\n  }\n\n  async removeSessionMember(sessionId: string, userId: string): Promise<void> {\n    return Sessions.removeSessionMember(this.boundCallRPC, sessionId, userId);\n  }\n\n  // -------------------------------------------------------------------------\n  // Message transport (delegates to MessageTransport)\n  // -------------------------------------------------------------------------\n\n  async stopGeneration(sessionId: string): Promise<void> {\n    this.cancelStream();\n    await Messages.stopStream(\n      {\n        baseUrl: this.config.baseUrl,\n        streamEndpoint: this.config.streamEndpoint!,\n        createHeaders: (h) => this.createHeaders(h),\n      },\n      sessionId\n    );\n  }\n\n  async getStreamStatus(sessionId: string): Promise<StreamStatus | null> {\n    return Messages.getStreamStatus(\n      {\n        baseUrl: this.config.baseUrl,\n        streamEndpoint: this.config.streamEndpoint!,\n        createHeaders: (h) => this.createHeaders(h),\n        timeoutMs: this.config.rpcTimeoutMs,\n      },\n      sessionId\n    );\n  }\n\n  async resumeStream(\n    sessionId: string,\n    runId: string,\n    onChunk: (chunk: StreamChunk) => void,\n    signal?: AbortSignal\n  ): Promise<void> {\n    await Messages.resumeStream(\n      {\n        baseUrl: this.config.baseUrl,\n        streamEndpoint: this.config.streamEndpoint!,\n        createHeaders: (h) => this.createHeaders(h),\n        connectTimeoutMs: this.config.streamConnectTimeoutMs,\n      },\n      sessionId,\n      runId,\n      onChunk,\n      signal\n    );\n  }\n\n  /**\n   * Open a native EventSource against GET /stream/events for the given\n   * run. Used by components that want browser-native auto-reconnect\n   * with Last-Event-ID (tab close, wifi drop, device switch). Prefer\n   * over resumeStream when tailing an already-running generation that\n   * another tab started.\n   */\n  subscribeRunEvents(\n    sessionId: string,\n    runId: string,\n    options: Messages.SubscribeRunEventsOptions\n  ): Promise<void> {\n    return Messages.subscribeRunEvents(\n      {\n        baseUrl: this.config.baseUrl,\n        streamEndpoint: this.config.streamEndpoint!,\n      },\n      sessionId,\n      runId,\n      options\n    );\n  }\n\n  /**\n   * Subscribe to the per-tenant active-run fan-out\n   * (GET /stream/active-runs). Never resolves until the caller aborts\n   * via the signal; use from a top-level component (sidebar container)\n   * that mounts for the lifetime of the chat app.\n   */\n  subscribeActiveRuns(\n    options: Messages.SubscribeActiveRunsOptions\n  ): Promise<void> {\n    return Messages.subscribeActiveRuns(\n      {\n        baseUrl: this.config.baseUrl,\n        streamEndpoint: this.config.streamEndpoint!,\n      },\n      options\n    );\n  }\n\n  async *sendMessage(\n    sessionId: string,\n    content: string,\n    attachments: Attachment[] = [],\n    signal?: AbortSignal,\n    options?: SendMessageOptions\n  ): AsyncGenerator<StreamChunk> {\n    this.abortController = new AbortController();\n\n    // Link external signal to our internal controller\n    let onExternalAbort: (() => void) | undefined;\n    if (signal) {\n      onExternalAbort = () => { this.abortController?.abort(); };\n      signal.addEventListener('abort', onExternalAbort);\n    }\n\n    try {\n      const innerSignal = this.abortController.signal;\n      yield* Messages.sendMessage(\n        {\n          callRPC: this.boundCallRPC,\n          baseUrl: this.config.baseUrl,\n          streamEndpoint: this.config.streamEndpoint!,\n          rpcTimeoutMs: this.config.rpcTimeoutMs!,\n          streamConnectTimeoutMs: this.config.streamConnectTimeoutMs,\n          createHeaders: (additional) => this.createHeaders(additional),\n          uploadFileFn: this.boundUploadFile,\n          logAttachmentLifecycle: () => {\n            // lifecycle events handled inside AttachmentUploader\n          },\n        },\n        sessionId,\n        content,\n        attachments,\n        innerSignal,\n        options\n      );\n    } finally {\n      if (signal && onExternalAbort) {\n        signal.removeEventListener('abort', onExternalAbort);\n      }\n      this.abortController = null;\n    }\n  }\n\n  cancelStream(): void {\n    if (this.abortController) {\n      this.abortController.abort();\n      this.abortController = null;\n    }\n  }\n\n  async submitQuestionAnswers(\n    sessionId: string,\n    questionId: string,\n    answers: QuestionAnswers\n  ): Promise<{\n    success: boolean\n    data?: AsyncRunAccepted\n    error?: string\n  }> {\n    return Messages.submitQuestionAnswers(this.boundCallRPC, sessionId, questionId, answers);\n  }\n\n  async rejectPendingQuestion(sessionId: string): Promise<{ success: boolean; data?: AsyncRunAccepted; error?: string }> {\n    return Messages.rejectPendingQuestion(this.boundCallRPC, sessionId);\n  }\n\n  // -------------------------------------------------------------------------\n  // Artifact management (delegates to ArtifactManager)\n  // -------------------------------------------------------------------------\n\n  async fetchSessionArtifacts(\n    sessionId: string,\n    options?: { limit?: number; offset?: number }\n  ): Promise<{ artifacts: SessionArtifact[]; hasMore?: boolean; nextOffset?: number }> {\n    return Artifacts.fetchSessionArtifacts(this.boundCallRPC, sessionId, options);\n  }\n\n  async uploadSessionArtifacts(\n    sessionId: string,\n    files: File[]\n  ): Promise<{ artifacts: SessionArtifact[] }> {\n    return Artifacts.uploadSessionArtifacts(\n      this.boundCallRPC,\n      sessionId,\n      files,\n      this.boundUploadFile,\n    );\n  }\n\n  async renameSessionArtifact(\n    artifactId: string,\n    name: string,\n    description: string = ''\n  ): Promise<SessionArtifact> {\n    return Artifacts.renameSessionArtifact(this.boundCallRPC, artifactId, name, description);\n  }\n\n  async deleteSessionArtifact(artifactId: string): Promise<void> {\n    return Artifacts.deleteSessionArtifact(this.boundCallRPC, artifactId);\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","/**\n * Utilities for splitting accumulated assistant content into the distinct\n * text blocks the server emitted.\n *\n * Background: the executor interleaves text with tool calls within one\n * turn — `text → tool_call → text → tool_call → final_text`. Before the\n * backend emitted `text_block_end` markers (iota-uz/iota-sdk#732 M1),\n * all text segments collapsed into one paragraph on the client. Now the\n * server emits a `text_block_end` event before each tool_start and at\n * snapshot time carries byte offsets in `partialMetadata.text_block_offsets`.\n *\n * `splitIntoTextBlocks` is the client-side inverse: given the\n * accumulated content string and the ordered list of byte offsets that\n * mark segment ends, return one entry per segment. The trailing un-closed\n * segment (if any) is included as the last entry.\n */\n\nexport interface AssistantTextBlock {\n  /** Zero-based index matching the seq carried on text_block_end events. */\n  seq: number;\n  /** Markdown source for this segment. */\n  content: string;\n}\n\n/**\n * Split an accumulated assistant content string into blocks using byte\n * offsets emitted by the server. Offsets are EXCLUSIVE end markers —\n * i.e. `offsets[0]` is the length of block 0.\n *\n * - When `offsets` is empty or undefined, returns a single block with\n *   the full content.\n * - When offsets are provided but content is shorter than the last\n *   offset (e.g. stale metadata), offsets beyond the content length are\n *   clamped so no crash propagates up.\n * - Trailing content after the last offset is included as an extra\n *   block (the un-closed segment during streaming / the final segment\n *   after the last tool call).\n */\nexport function splitIntoTextBlocks(\n  content: string,\n  offsets?: ReadonlyArray<number> | null\n): AssistantTextBlock[] {\n  if (!content) {\n    return [];\n  }\n  if (!offsets || offsets.length === 0) {\n    return [{ seq: 0, content }];\n  }\n\n  const sanitized = [...offsets]\n    .map((n) => Math.max(0, Math.min(Math.floor(n), content.length)))\n    .sort((a, b) => a - b);\n\n  const blocks: AssistantTextBlock[] = [];\n  let cursor = 0;\n  for (let i = 0; i < sanitized.length; i++) {\n    const end = sanitized[i];\n    if (end <= cursor) {\n      continue;\n    }\n    const slice = content.slice(cursor, end);\n    if (slice) {\n      blocks.push({ seq: blocks.length, content: slice });\n    }\n    cursor = end;\n  }\n  if (cursor < content.length) {\n    blocks.push({ seq: blocks.length, content: content.slice(cursor) });\n  }\n  return blocks;\n}\n\n/**\n * Normalise partialMetadata.text_block_offsets from a StreamSnapshotPayload\n * into a number[]. Guards against malformed server data (non-array,\n * non-numeric entries) so UI code never has to think about shapes.\n */\nexport function readTextBlockOffsets(\n  partialMetadata?: Record<string, unknown> | null\n): number[] {\n  if (!partialMetadata) {\n    return [];\n  }\n  const raw = partialMetadata[\"text_block_offsets\"];\n  if (!Array.isArray(raw)) {\n    return [];\n  }\n  const out: number[] = [];\n  for (const entry of raw) {\n    if (typeof entry === \"number\" && Number.isFinite(entry) && entry >= 0) {\n      out.push(Math.floor(entry));\n    }\n  }\n  return out;\n}\n"]}