@vertesia/ui 0.24.0-dev.202601221707
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +105 -0
- package/lib/esm/core/components/Avatar.js +31 -0
- package/lib/esm/core/components/Avatar.js.map +1 -0
- package/lib/esm/core/components/Badge.js +62 -0
- package/lib/esm/core/components/Badge.js.map +1 -0
- package/lib/esm/core/components/Button.js +32 -0
- package/lib/esm/core/components/Button.js.map +1 -0
- package/lib/esm/core/components/Center.js +6 -0
- package/lib/esm/core/components/Center.js.map +1 -0
- package/lib/esm/core/components/ComboBox.js +356 -0
- package/lib/esm/core/components/ComboBox.js.map +1 -0
- package/lib/esm/core/components/ConfirmModal.js +10 -0
- package/lib/esm/core/components/ConfirmModal.js.map +1 -0
- package/lib/esm/core/components/DeleteModal.js +28 -0
- package/lib/esm/core/components/DeleteModal.js.map +1 -0
- package/lib/esm/core/components/Divider.js +6 -0
- package/lib/esm/core/components/Divider.js.map +1 -0
- package/lib/esm/core/components/Dropdown.js +16 -0
- package/lib/esm/core/components/Dropdown.js.map +1 -0
- package/lib/esm/core/components/DropdownList.js +9 -0
- package/lib/esm/core/components/DropdownList.js.map +1 -0
- package/lib/esm/core/components/EmptyCollection.js +7 -0
- package/lib/esm/core/components/EmptyCollection.js.map +1 -0
- package/lib/esm/core/components/FileUpload.js +119 -0
- package/lib/esm/core/components/FileUpload.js.map +1 -0
- package/lib/esm/core/components/FormItem.js +9 -0
- package/lib/esm/core/components/FormItem.js.map +1 -0
- package/lib/esm/core/components/InputList.js +61 -0
- package/lib/esm/core/components/InputList.js.map +1 -0
- package/lib/esm/core/components/Link.js +13 -0
- package/lib/esm/core/components/Link.js.map +1 -0
- package/lib/esm/core/components/MenuList.js +20 -0
- package/lib/esm/core/components/MenuList.js.map +1 -0
- package/lib/esm/core/components/MessageBox.js +66 -0
- package/lib/esm/core/components/MessageBox.js.map +1 -0
- package/lib/esm/core/components/Modal.js +26 -0
- package/lib/esm/core/components/Modal.js.map +1 -0
- package/lib/esm/core/components/NumberInput.js +43 -0
- package/lib/esm/core/components/NumberInput.js.map +1 -0
- package/lib/esm/core/components/Overlay.js +57 -0
- package/lib/esm/core/components/Overlay.js.map +1 -0
- package/lib/esm/core/components/Panel.js +8 -0
- package/lib/esm/core/components/Panel.js.map +1 -0
- package/lib/esm/core/components/Portal.js +28 -0
- package/lib/esm/core/components/Portal.js.map +1 -0
- package/lib/esm/core/components/RadioGroup.js +34 -0
- package/lib/esm/core/components/RadioGroup.js.map +1 -0
- package/lib/esm/core/components/SelectBox.js +67 -0
- package/lib/esm/core/components/SelectBox.js.map +1 -0
- package/lib/esm/core/components/SelectList.js +52 -0
- package/lib/esm/core/components/SelectList.js.map +1 -0
- package/lib/esm/core/components/SelectStack.js +8 -0
- package/lib/esm/core/components/SelectStack.js.map +1 -0
- package/lib/esm/core/components/SidePanel.js +33 -0
- package/lib/esm/core/components/SidePanel.js.map +1 -0
- package/lib/esm/core/components/Spinner.js +18 -0
- package/lib/esm/core/components/Spinner.js.map +1 -0
- package/lib/esm/core/components/Switch.js +12 -0
- package/lib/esm/core/components/Switch.js.map +1 -0
- package/lib/esm/core/components/TagsInput.js +194 -0
- package/lib/esm/core/components/TagsInput.js.map +1 -0
- package/lib/esm/core/components/index.js +36 -0
- package/lib/esm/core/components/index.js.map +1 -0
- package/lib/esm/core/components/libs/utils.js +6 -0
- package/lib/esm/core/components/libs/utils.js.map +1 -0
- package/lib/esm/core/components/libs/visuallyHidden.js +16 -0
- package/lib/esm/core/components/libs/visuallyHidden.js.map +1 -0
- package/lib/esm/core/components/popup/Popup.js +60 -0
- package/lib/esm/core/components/popup/Popup.js.map +1 -0
- package/lib/esm/core/components/popup/PopupController.js +149 -0
- package/lib/esm/core/components/popup/PopupController.js.map +1 -0
- package/lib/esm/core/components/popup/index.js +4 -0
- package/lib/esm/core/components/popup/index.js.map +1 -0
- package/lib/esm/core/components/popup/position.js +221 -0
- package/lib/esm/core/components/popup/position.js.map +1 -0
- package/lib/esm/core/components/popup/utils.js +74 -0
- package/lib/esm/core/components/popup/utils.js.map +1 -0
- package/lib/esm/core/components/shadcn/breadcrumb.js +51 -0
- package/lib/esm/core/components/shadcn/breadcrumb.js.map +1 -0
- package/lib/esm/core/components/shadcn/button.js +76 -0
- package/lib/esm/core/components/shadcn/button.js.map +1 -0
- package/lib/esm/core/components/shadcn/calendar.js +13 -0
- package/lib/esm/core/components/shadcn/calendar.js.map +1 -0
- package/lib/esm/core/components/shadcn/card.js +17 -0
- package/lib/esm/core/components/shadcn/card.js.map +1 -0
- package/lib/esm/core/components/shadcn/checkbox.js +9 -0
- package/lib/esm/core/components/shadcn/checkbox.js.map +1 -0
- package/lib/esm/core/components/shadcn/command.js +29 -0
- package/lib/esm/core/components/shadcn/command.js.map +1 -0
- package/lib/esm/core/components/shadcn/dialog.js +74 -0
- package/lib/esm/core/components/shadcn/dialog.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/DynamicLabel.js +38 -0
- package/lib/esm/core/components/shadcn/filters/DynamicLabel.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/animateChangeInHeight.js +23 -0
- package/lib/esm/core/components/shadcn/filters/animateChangeInHeight.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/DateCombobox.js +129 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/DateCombobox.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/SelectCombobox.js +46 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/SelectCombobox.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/StringListCombobox.js +23 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/StringListCombobox.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/TextCombobox.js +28 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/TextCombobox.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/comboBox.js +5 -0
- package/lib/esm/core/components/shadcn/filters/comboBox/comboBox.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/filter/SelectFilter.js +98 -0
- package/lib/esm/core/components/shadcn/filters/filter/SelectFilter.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/filter/StringListFilter.js +24 -0
- package/lib/esm/core/components/shadcn/filters/filter/StringListFilter.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/filter/TextFilter.js +21 -0
- package/lib/esm/core/components/shadcn/filters/filter/TextFilter.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/filter/dateFilter.js +161 -0
- package/lib/esm/core/components/shadcn/filters/filter/dateFilter.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/filter-styles.js +88 -0
- package/lib/esm/core/components/shadcn/filters/filter-styles.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/filterBar.js +242 -0
- package/lib/esm/core/components/shadcn/filters/filterBar.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/filters.js +57 -0
- package/lib/esm/core/components/shadcn/filters/filters.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/index.js +6 -0
- package/lib/esm/core/components/shadcn/filters/index.js.map +1 -0
- package/lib/esm/core/components/shadcn/filters/types.js +10 -0
- package/lib/esm/core/components/shadcn/filters/types.js.map +1 -0
- package/lib/esm/core/components/shadcn/heading.js +17 -0
- package/lib/esm/core/components/shadcn/heading.js.map +1 -0
- package/lib/esm/core/components/shadcn/index.js +23 -0
- package/lib/esm/core/components/shadcn/index.js.map +1 -0
- package/lib/esm/core/components/shadcn/input.js +41 -0
- package/lib/esm/core/components/shadcn/input.js.map +1 -0
- package/lib/esm/core/components/shadcn/label.js +10 -0
- package/lib/esm/core/components/shadcn/label.js.map +1 -0
- package/lib/esm/core/components/shadcn/popover.js +50 -0
- package/lib/esm/core/components/shadcn/popover.js.map +1 -0
- package/lib/esm/core/components/shadcn/resizeable.js +15 -0
- package/lib/esm/core/components/shadcn/resizeable.js.map +1 -0
- package/lib/esm/core/components/shadcn/selectBox.js +152 -0
- package/lib/esm/core/components/shadcn/selectBox.js.map +1 -0
- package/lib/esm/core/components/shadcn/separator.js +8 -0
- package/lib/esm/core/components/shadcn/separator.js.map +1 -0
- package/lib/esm/core/components/shadcn/tabs.js +132 -0
- package/lib/esm/core/components/shadcn/tabs.js.map +1 -0
- package/lib/esm/core/components/shadcn/text.js +30 -0
- package/lib/esm/core/components/shadcn/text.js.map +1 -0
- package/lib/esm/core/components/shadcn/textarea.js +7 -0
- package/lib/esm/core/components/shadcn/textarea.js.map +1 -0
- package/lib/esm/core/components/shadcn/theme/ThemeProvider.js +39 -0
- package/lib/esm/core/components/shadcn/theme/ThemeProvider.js.map +1 -0
- package/lib/esm/core/components/shadcn/theme/ThemeSwitcher.js +13 -0
- package/lib/esm/core/components/shadcn/theme/ThemeSwitcher.js.map +1 -0
- package/lib/esm/core/components/shadcn/tooltip.js +14 -0
- package/lib/esm/core/components/shadcn/tooltip.js.map +1 -0
- package/lib/esm/core/components/styles.js +10 -0
- package/lib/esm/core/components/styles.js.map +1 -0
- package/lib/esm/core/components/table/index.js +24 -0
- package/lib/esm/core/components/table/index.js.map +1 -0
- package/lib/esm/core/components/tabs/Tabs.js +78 -0
- package/lib/esm/core/components/tabs/Tabs.js.map +1 -0
- package/lib/esm/core/components/tabs/TabsContext.js +7 -0
- package/lib/esm/core/components/tabs/TabsContext.js.map +1 -0
- package/lib/esm/core/components/tabs/index.js +3 -0
- package/lib/esm/core/components/tabs/index.js.map +1 -0
- package/lib/esm/core/components/toast/NotificationPanel.js +43 -0
- package/lib/esm/core/components/toast/NotificationPanel.js.map +1 -0
- package/lib/esm/core/components/toast/ToastContext.js +7 -0
- package/lib/esm/core/components/toast/ToastContext.js.map +1 -0
- package/lib/esm/core/components/toast/ToastProps.js +2 -0
- package/lib/esm/core/components/toast/ToastProps.js.map +1 -0
- package/lib/esm/core/components/toast/ToastProvider.js +13 -0
- package/lib/esm/core/components/toast/ToastProvider.js.map +1 -0
- package/lib/esm/core/components/toast/index.js +3 -0
- package/lib/esm/core/components/toast/index.js.map +1 -0
- package/lib/esm/core/hooks/CompositeState.js +256 -0
- package/lib/esm/core/hooks/CompositeState.js.map +1 -0
- package/lib/esm/core/hooks/PortalContainerProvider.js +44 -0
- package/lib/esm/core/hooks/PortalContainerProvider.js.map +1 -0
- package/lib/esm/core/hooks/SharedState.js +64 -0
- package/lib/esm/core/hooks/SharedState.js.map +1 -0
- package/lib/esm/core/hooks/index.js +16 -0
- package/lib/esm/core/hooks/index.js.map +1 -0
- package/lib/esm/core/hooks/useClickOutside.js +29 -0
- package/lib/esm/core/hooks/useClickOutside.js.map +1 -0
- package/lib/esm/core/hooks/useCopyToClipboard.js +23 -0
- package/lib/esm/core/hooks/useCopyToClipboard.js.map +1 -0
- package/lib/esm/core/hooks/useDarkMode.js +11 -0
- package/lib/esm/core/hooks/useDarkMode.js.map +1 -0
- package/lib/esm/core/hooks/useDebounce.js +14 -0
- package/lib/esm/core/hooks/useDebounce.js.map +1 -0
- package/lib/esm/core/hooks/useEventSource.js +31 -0
- package/lib/esm/core/hooks/useEventSource.js.map +1 -0
- package/lib/esm/core/hooks/useFetch.js +40 -0
- package/lib/esm/core/hooks/useFetch.js.map +1 -0
- package/lib/esm/core/hooks/useFlag.js +13 -0
- package/lib/esm/core/hooks/useFlag.js.map +1 -0
- package/lib/esm/core/hooks/useIntersectionObserver.js +34 -0
- package/lib/esm/core/hooks/useIntersectionObserver.js.map +1 -0
- package/lib/esm/core/hooks/useIsFistRendering.js +14 -0
- package/lib/esm/core/hooks/useIsFistRendering.js.map +1 -0
- package/lib/esm/core/hooks/useSafeLayoutEffect.js +4 -0
- package/lib/esm/core/hooks/useSafeLayoutEffect.js.map +1 -0
- package/lib/esm/core/hooks/useScrollableSearch.js +92 -0
- package/lib/esm/core/hooks/useScrollableSearch.js.map +1 -0
- package/lib/esm/core/hooks/useSharedValue.js +21 -0
- package/lib/esm/core/hooks/useSharedValue.js.map +1 -0
- package/lib/esm/core/index.js +4 -0
- package/lib/esm/core/index.js.map +1 -0
- package/lib/esm/core/utils/cn.js +6 -0
- package/lib/esm/core/utils/cn.js.map +1 -0
- package/lib/esm/core/utils/index.js +2 -0
- package/lib/esm/core/utils/index.js.map +1 -0
- package/lib/esm/env/index.js +75 -0
- package/lib/esm/env/index.js.map +1 -0
- package/lib/esm/features/activity-doc/ActivityDoc.js +71 -0
- package/lib/esm/features/activity-doc/ActivityDoc.js.map +1 -0
- package/lib/esm/features/activity-doc/index.js +2 -0
- package/lib/esm/features/activity-doc/index.js.map +1 -0
- package/lib/esm/features/agent/PayloadBuilder.js +269 -0
- package/lib/esm/features/agent/PayloadBuilder.js.map +1 -0
- package/lib/esm/features/agent/chat/AgentChart.js +246 -0
- package/lib/esm/features/agent/chat/AgentChart.js.map +1 -0
- package/lib/esm/features/agent/chat/AnimatedThinkingDots.js +207 -0
- package/lib/esm/features/agent/chat/AnimatedThinkingDots.js.map +1 -0
- package/lib/esm/features/agent/chat/AskUserWidget.js +113 -0
- package/lib/esm/features/agent/chat/AskUserWidget.js.map +1 -0
- package/lib/esm/features/agent/chat/ImageLightbox.js +33 -0
- package/lib/esm/features/agent/chat/ImageLightbox.js.map +1 -0
- package/lib/esm/features/agent/chat/JumpingDots.js +6 -0
- package/lib/esm/features/agent/chat/JumpingDots.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentConversation.js +888 -0
- package/lib/esm/features/agent/chat/ModernAgentConversation.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +273 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js +88 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js +62 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/Header.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js +29 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js +95 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js +197 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js +245 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessagesContainer.js +20 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/MessagesContainer.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js +63 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/PlanPanel.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/SlideInPanel.js +23 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/SlideInPanel.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingMessages.js +52 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingMessages.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js +82 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/StackedMessages.js +13 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/StackedMessages.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/StreamingMessage.js +214 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/StreamingMessage.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +302 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +105 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js.map +1 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/utils.js +412 -0
- package/lib/esm/features/agent/chat/ModernAgentOutput/utils.js.map +1 -0
- package/lib/esm/features/agent/chat/SkillWidgetProvider.js +90 -0
- package/lib/esm/features/agent/chat/SkillWidgetProvider.js.map +1 -0
- package/lib/esm/features/agent/chat/SlidingThinkingIndicator.js +266 -0
- package/lib/esm/features/agent/chat/SlidingThinkingIndicator.js.map +1 -0
- package/lib/esm/features/agent/chat/VegaLiteChart.js +778 -0
- package/lib/esm/features/agent/chat/VegaLiteChart.js.map +1 -0
- package/lib/esm/features/agent/chat/WaitingMessages.js +60 -0
- package/lib/esm/features/agent/chat/WaitingMessages.js.map +1 -0
- package/lib/esm/features/agent/chat/index.js +17 -0
- package/lib/esm/features/agent/chat/index.js.map +1 -0
- package/lib/esm/features/agent/chat/useArtifactUrlCache.js +62 -0
- package/lib/esm/features/agent/chat/useArtifactUrlCache.js.map +1 -0
- package/lib/esm/features/agent/createChartTool.js +632 -0
- package/lib/esm/features/agent/createChartTool.js.map +1 -0
- package/lib/esm/features/agent/examples.js +295 -0
- package/lib/esm/features/agent/examples.js.map +1 -0
- package/lib/esm/features/agent/index.js +5 -0
- package/lib/esm/features/agent/index.js.map +1 -0
- package/lib/esm/features/agent/visualization.js +165 -0
- package/lib/esm/features/agent/visualization.js.map +1 -0
- package/lib/esm/features/errors/PanelErrorBoundary.js +11 -0
- package/lib/esm/features/errors/PanelErrorBoundary.js.map +1 -0
- package/lib/esm/features/errors/RowErrorBoundary.js +9 -0
- package/lib/esm/features/errors/RowErrorBoundary.js.map +1 -0
- package/lib/esm/features/errors/VertesiaErrorBoundary.js +15 -0
- package/lib/esm/features/errors/VertesiaErrorBoundary.js.map +1 -0
- package/lib/esm/features/errors/WidgetErrorBoundary.js +11 -0
- package/lib/esm/features/errors/WidgetErrorBoundary.js.map +1 -0
- package/lib/esm/features/errors/index.js +5 -0
- package/lib/esm/features/errors/index.js.map +1 -0
- package/lib/esm/features/facets/CollectionsFacetsNav.js +89 -0
- package/lib/esm/features/facets/CollectionsFacetsNav.js.map +1 -0
- package/lib/esm/features/facets/DocumentsFacetsNav.js +147 -0
- package/lib/esm/features/facets/DocumentsFacetsNav.js.map +1 -0
- package/lib/esm/features/facets/EnvironmentFacet.js +39 -0
- package/lib/esm/features/facets/EnvironmentFacet.js.map +1 -0
- package/lib/esm/features/facets/InteractionsFacetsNav.js +88 -0
- package/lib/esm/features/facets/InteractionsFacetsNav.js.map +1 -0
- package/lib/esm/features/facets/PromptsFacetsNav.js +80 -0
- package/lib/esm/features/facets/PromptsFacetsNav.js.map +1 -0
- package/lib/esm/features/facets/RunsFacetsNav.js +157 -0
- package/lib/esm/features/facets/RunsFacetsNav.js.map +1 -0
- package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js +100 -0
- package/lib/esm/features/facets/WorkflowExecutionsFacetsNav.js.map +1 -0
- package/lib/esm/features/facets/index.js +15 -0
- package/lib/esm/features/facets/index.js.map +1 -0
- package/lib/esm/features/facets/utils/SearchInterface.js +2 -0
- package/lib/esm/features/facets/utils/SearchInterface.js.map +1 -0
- package/lib/esm/features/facets/utils/StringFacet.js +12 -0
- package/lib/esm/features/facets/utils/StringFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/StringListFacet.js +11 -0
- package/lib/esm/features/facets/utils/StringListFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/TypeFacet.js +42 -0
- package/lib/esm/features/facets/utils/TypeFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/VEnvironmentFacet.js +25 -0
- package/lib/esm/features/facets/utils/VEnvironmentFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/VInteractionFacet.js +45 -0
- package/lib/esm/features/facets/utils/VInteractionFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/VStringFacet.js +20 -0
- package/lib/esm/features/facets/utils/VStringFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/VTypeFacet.js +61 -0
- package/lib/esm/features/facets/utils/VTypeFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/VUserFacet.js +31 -0
- package/lib/esm/features/facets/utils/VUserFacet.js.map +1 -0
- package/lib/esm/features/facets/utils/utils.js +7 -0
- package/lib/esm/features/facets/utils/utils.js.map +1 -0
- package/lib/esm/features/index.js +12 -0
- package/lib/esm/features/index.js.map +1 -0
- package/lib/esm/features/layout/GenericPageNavHeader.js +74 -0
- package/lib/esm/features/layout/GenericPageNavHeader.js.map +1 -0
- package/lib/esm/features/layout/NotFoundView.js +5 -0
- package/lib/esm/features/layout/NotFoundView.js.map +1 -0
- package/lib/esm/features/layout/index.js +3 -0
- package/lib/esm/features/layout/index.js.map +1 -0
- package/lib/esm/features/magic-pdf/AnnotatedImageSlider.js +268 -0
- package/lib/esm/features/magic-pdf/AnnotatedImageSlider.js.map +1 -0
- package/lib/esm/features/magic-pdf/DownloadPopover.js +28 -0
- package/lib/esm/features/magic-pdf/DownloadPopover.js.map +1 -0
- package/lib/esm/features/magic-pdf/ExtractedContentView.js +77 -0
- package/lib/esm/features/magic-pdf/ExtractedContentView.js.map +1 -0
- package/lib/esm/features/magic-pdf/MagicPdfProvider.js +242 -0
- package/lib/esm/features/magic-pdf/MagicPdfProvider.js.map +1 -0
- package/lib/esm/features/magic-pdf/MagicPdfView.js +61 -0
- package/lib/esm/features/magic-pdf/MagicPdfView.js.map +1 -0
- package/lib/esm/features/magic-pdf/index.js +2 -0
- package/lib/esm/features/magic-pdf/index.js.map +1 -0
- package/lib/esm/features/magic-pdf/types.js +2 -0
- package/lib/esm/features/magic-pdf/types.js.map +1 -0
- package/lib/esm/features/pdf-viewer/PdfPageRenderer.js +261 -0
- package/lib/esm/features/pdf-viewer/PdfPageRenderer.js.map +1 -0
- package/lib/esm/features/pdf-viewer/PdfPageSlider.js +276 -0
- package/lib/esm/features/pdf-viewer/PdfPageSlider.js.map +1 -0
- package/lib/esm/features/pdf-viewer/SimplePdfViewer.js +71 -0
- package/lib/esm/features/pdf-viewer/SimplePdfViewer.js.map +1 -0
- package/lib/esm/features/pdf-viewer/index.js +4 -0
- package/lib/esm/features/pdf-viewer/index.js.map +1 -0
- package/lib/esm/features/permissions/SecureButton.js +13 -0
- package/lib/esm/features/permissions/SecureButton.js.map +1 -0
- package/lib/esm/features/permissions/SecureSidebarItem.js +14 -0
- package/lib/esm/features/permissions/SecureSidebarItem.js.map +1 -0
- package/lib/esm/features/permissions/UserPermissionsProvider.js +87 -0
- package/lib/esm/features/permissions/UserPermissionsProvider.js.map +1 -0
- package/lib/esm/features/permissions/helpers.js +12 -0
- package/lib/esm/features/permissions/helpers.js.map +1 -0
- package/lib/esm/features/permissions/index.js +5 -0
- package/lib/esm/features/permissions/index.js.map +1 -0
- package/lib/esm/features/store/collections/BrowseCollectionView.js +40 -0
- package/lib/esm/features/store/collections/BrowseCollectionView.js.map +1 -0
- package/lib/esm/features/store/collections/CollectionsTable.js +64 -0
- package/lib/esm/features/store/collections/CollectionsTable.js.map +1 -0
- package/lib/esm/features/store/collections/CreateCollection.js +87 -0
- package/lib/esm/features/store/collections/CreateCollection.js.map +1 -0
- package/lib/esm/features/store/collections/EditCollectionView.js +183 -0
- package/lib/esm/features/store/collections/EditCollectionView.js.map +1 -0
- package/lib/esm/features/store/collections/SelectCollection.js +119 -0
- package/lib/esm/features/store/collections/SelectCollection.js.map +1 -0
- package/lib/esm/features/store/collections/SharedPropsEditor.js +39 -0
- package/lib/esm/features/store/collections/SharedPropsEditor.js.map +1 -0
- package/lib/esm/features/store/collections/SyncMemberHeadsToggle.js +35 -0
- package/lib/esm/features/store/collections/SyncMemberHeadsToggle.js.map +1 -0
- package/lib/esm/features/store/collections/index.js +8 -0
- package/lib/esm/features/store/collections/index.js.map +1 -0
- package/lib/esm/features/store/index.js +4 -0
- package/lib/esm/features/store/index.js.map +1 -0
- package/lib/esm/features/store/objects/DocumentPreviewPanel.js +147 -0
- package/lib/esm/features/store/objects/DocumentPreviewPanel.js.map +1 -0
- package/lib/esm/features/store/objects/DocumentSearchResults.js +204 -0
- package/lib/esm/features/store/objects/DocumentSearchResults.js.map +1 -0
- package/lib/esm/features/store/objects/DocumentSelectionProvider.js +81 -0
- package/lib/esm/features/store/objects/DocumentSelectionProvider.js.map +1 -0
- package/lib/esm/features/store/objects/DocumentTable.js +278 -0
- package/lib/esm/features/store/objects/DocumentTable.js.map +1 -0
- package/lib/esm/features/store/objects/ExportPropertiesModal.js +31 -0
- package/lib/esm/features/store/objects/ExportPropertiesModal.js.map +1 -0
- package/lib/esm/features/store/objects/components/ContentDispositionButton.js +31 -0
- package/lib/esm/features/store/objects/components/ContentDispositionButton.js.map +1 -0
- package/lib/esm/features/store/objects/components/ContentOverview.js +629 -0
- package/lib/esm/features/store/objects/components/ContentOverview.js.map +1 -0
- package/lib/esm/features/store/objects/components/DocumentIcon.js +33 -0
- package/lib/esm/features/store/objects/components/DocumentIcon.js.map +1 -0
- package/lib/esm/features/store/objects/components/DocumentInput.js +51 -0
- package/lib/esm/features/store/objects/components/DocumentInput.js.map +1 -0
- package/lib/esm/features/store/objects/components/PropertiesEditorModal.js +171 -0
- package/lib/esm/features/store/objects/components/PropertiesEditorModal.js.map +1 -0
- package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js +53 -0
- package/lib/esm/features/store/objects/components/SaveVersionConfirmModal.js.map +1 -0
- package/lib/esm/features/store/objects/components/SelectDocument.js +55 -0
- package/lib/esm/features/store/objects/components/SelectDocument.js.map +1 -0
- package/lib/esm/features/store/objects/components/SelectDocumentModal.js +7 -0
- package/lib/esm/features/store/objects/components/SelectDocumentModal.js.map +1 -0
- package/lib/esm/features/store/objects/components/VectorSearchWidget.js +90 -0
- package/lib/esm/features/store/objects/components/VectorSearchWidget.js.map +1 -0
- package/lib/esm/features/store/objects/components/index.js +10 -0
- package/lib/esm/features/store/objects/components/index.js.map +1 -0
- package/lib/esm/features/store/objects/components/useContentPanelHooks.js +169 -0
- package/lib/esm/features/store/objects/components/useContentPanelHooks.js.map +1 -0
- package/lib/esm/features/store/objects/components/useDownloadObject.js +21 -0
- package/lib/esm/features/store/objects/components/useDownloadObject.js.map +1 -0
- package/lib/esm/features/store/objects/index.js +11 -0
- package/lib/esm/features/store/objects/index.js.map +1 -0
- package/lib/esm/features/store/objects/layout/DocumentTableColumn.js +86 -0
- package/lib/esm/features/store/objects/layout/DocumentTableColumn.js.map +1 -0
- package/lib/esm/features/store/objects/layout/documentLayout.js +15 -0
- package/lib/esm/features/store/objects/layout/documentLayout.js.map +1 -0
- package/lib/esm/features/store/objects/layout/index.js +3 -0
- package/lib/esm/features/store/objects/layout/index.js.map +1 -0
- package/lib/esm/features/store/objects/layout/renderers.js +157 -0
- package/lib/esm/features/store/objects/layout/renderers.js.map +1 -0
- package/lib/esm/features/store/objects/search/DocumentSearchContext.js +175 -0
- package/lib/esm/features/store/objects/search/DocumentSearchContext.js.map +1 -0
- package/lib/esm/features/store/objects/search/DocumentSearchProvider.js +39 -0
- package/lib/esm/features/store/objects/search/DocumentSearchProvider.js.map +1 -0
- package/lib/esm/features/store/objects/search/index.js +3 -0
- package/lib/esm/features/store/objects/search/index.js.map +1 -0
- package/lib/esm/features/store/objects/selection/ObjectsActionContext.js +150 -0
- package/lib/esm/features/store/objects/selection/ObjectsActionContext.js.map +1 -0
- package/lib/esm/features/store/objects/selection/ObjectsActionSpec.js +2 -0
- package/lib/esm/features/store/objects/selection/ObjectsActionSpec.js.map +1 -0
- package/lib/esm/features/store/objects/selection/SelectionActions.js +69 -0
- package/lib/esm/features/store/objects/selection/SelectionActions.js.map +1 -0
- package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js +81 -0
- package/lib/esm/features/store/objects/selection/actions/AddToCollectionAction.js.map +1 -0
- package/lib/esm/features/store/objects/selection/actions/ChangeTypeAction.js +53 -0
- package/lib/esm/features/store/objects/selection/actions/ChangeTypeAction.js.map +1 -0
- package/lib/esm/features/store/objects/selection/actions/ConfirmAction.js +30 -0
- package/lib/esm/features/store/objects/selection/actions/ConfirmAction.js.map +1 -0
- package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js +84 -0
- package/lib/esm/features/store/objects/selection/actions/DeleteObjectsAction.js.map +1 -0
- package/lib/esm/features/store/objects/selection/actions/ExportPropertiesAction.js +106 -0
- package/lib/esm/features/store/objects/selection/actions/ExportPropertiesAction.js.map +1 -0
- package/lib/esm/features/store/objects/selection/actions/RemoveFromCollectionAction.js +64 -0
- package/lib/esm/features/store/objects/selection/actions/RemoveFromCollectionAction.js.map +1 -0
- package/lib/esm/features/store/objects/selection/actions/StartWorkflowComponent.js +72 -0
- package/lib/esm/features/store/objects/selection/actions/StartWorkflowComponent.js.map +1 -0
- package/lib/esm/features/store/objects/selection/actions/index.js +8 -0
- package/lib/esm/features/store/objects/selection/actions/index.js.map +1 -0
- package/lib/esm/features/store/objects/selection/index.js +5 -0
- package/lib/esm/features/store/objects/selection/index.js.map +1 -0
- package/lib/esm/features/store/objects/upload/DocumentUploadModal.js +519 -0
- package/lib/esm/features/store/objects/upload/DocumentUploadModal.js.map +1 -0
- package/lib/esm/features/store/objects/upload/index.js +4 -0
- package/lib/esm/features/store/objects/upload/index.js.map +1 -0
- package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js +195 -0
- package/lib/esm/features/store/objects/upload/useSmartFileUploadProcessing.js.map +1 -0
- package/lib/esm/features/store/objects/upload/useUploadHandler.js +230 -0
- package/lib/esm/features/store/objects/upload/useUploadHandler.js.map +1 -0
- package/lib/esm/features/store/types/ContentObjectTypesSearch.js +81 -0
- package/lib/esm/features/store/types/ContentObjectTypesSearch.js.map +1 -0
- package/lib/esm/features/store/types/ContentObjectTypesTable.js +11 -0
- package/lib/esm/features/store/types/ContentObjectTypesTable.js.map +1 -0
- package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js +26 -0
- package/lib/esm/features/store/types/CreateOrUpdateTypeModal.js.map +1 -0
- package/lib/esm/features/store/types/ObjectSchemaEditor.js +103 -0
- package/lib/esm/features/store/types/ObjectSchemaEditor.js.map +1 -0
- package/lib/esm/features/store/types/SelectContentType.js +43 -0
- package/lib/esm/features/store/types/SelectContentType.js.map +1 -0
- package/lib/esm/features/store/types/SelectContentTypeModal.js +28 -0
- package/lib/esm/features/store/types/SelectContentTypeModal.js.map +1 -0
- package/lib/esm/features/store/types/TableLayoutEditor.js +78 -0
- package/lib/esm/features/store/types/TableLayoutEditor.js.map +1 -0
- package/lib/esm/features/store/types/index.js +9 -0
- package/lib/esm/features/store/types/index.js.map +1 -0
- package/lib/esm/features/store/types/search/ObjectTypeSearchContext.js +98 -0
- package/lib/esm/features/store/types/search/ObjectTypeSearchContext.js.map +1 -0
- package/lib/esm/features/store/types/search/ObjectTypeSearchProvider.js +15 -0
- package/lib/esm/features/store/types/search/ObjectTypeSearchProvider.js.map +1 -0
- package/lib/esm/features/store/types/search/index.js +3 -0
- package/lib/esm/features/store/types/search/index.js.map +1 -0
- package/lib/esm/features/user/UserAvatar.js +18 -0
- package/lib/esm/features/user/UserAvatar.js.map +1 -0
- package/lib/esm/features/user/UserInfo.js +121 -0
- package/lib/esm/features/user/UserInfo.js.map +1 -0
- package/lib/esm/features/user/index.js +3 -0
- package/lib/esm/features/user/index.js.map +1 -0
- package/lib/esm/features/utils/index.js +6 -0
- package/lib/esm/features/utils/index.js.map +1 -0
- package/lib/esm/features/utils/mimeType.js +17 -0
- package/lib/esm/features/utils/mimeType.js.map +1 -0
- package/lib/esm/features/utils/print.js +181 -0
- package/lib/esm/features/utils/print.js.map +1 -0
- package/lib/esm/features/utils/rendition.js +67 -0
- package/lib/esm/features/utils/rendition.js.map +1 -0
- package/lib/esm/features/utils/text.js +10 -0
- package/lib/esm/features/utils/text.js.map +1 -0
- package/lib/esm/features/utils/workflowStatus.js +43 -0
- package/lib/esm/features/utils/workflowStatus.js.map +1 -0
- package/lib/esm/layout/AppLayout.js +46 -0
- package/lib/esm/layout/AppLayout.js.map +1 -0
- package/lib/esm/layout/FullHeightLayout.js +18 -0
- package/lib/esm/layout/FullHeightLayout.js.map +1 -0
- package/lib/esm/layout/Navbar.js +40 -0
- package/lib/esm/layout/Navbar.js.map +1 -0
- package/lib/esm/layout/Sidebar.js +45 -0
- package/lib/esm/layout/Sidebar.js.map +1 -0
- package/lib/esm/layout/SidebarContext.js +10 -0
- package/lib/esm/layout/SidebarContext.js.map +1 -0
- package/lib/esm/layout/TitleBar.js +5 -0
- package/lib/esm/layout/TitleBar.js.map +1 -0
- package/lib/esm/layout/index.js +7 -0
- package/lib/esm/layout/index.js.map +1 -0
- package/lib/esm/router/FixLinks.js +23 -0
- package/lib/esm/router/FixLinks.js.map +1 -0
- package/lib/esm/router/HistoryNavigator.js +192 -0
- package/lib/esm/router/HistoryNavigator.js.map +1 -0
- package/lib/esm/router/Nav.js +26 -0
- package/lib/esm/router/Nav.js.map +1 -0
- package/lib/esm/router/NestedNavigationContext.js +19 -0
- package/lib/esm/router/NestedNavigationContext.js.map +1 -0
- package/lib/esm/router/NestedRouterProvider.js +44 -0
- package/lib/esm/router/NestedRouterProvider.js.map +1 -0
- package/lib/esm/router/PathMatcher.js +159 -0
- package/lib/esm/router/PathMatcher.js.map +1 -0
- package/lib/esm/router/PathWithParams.js +34 -0
- package/lib/esm/router/PathWithParams.js.map +1 -0
- package/lib/esm/router/Route404.js +18 -0
- package/lib/esm/router/Route404.js.map +1 -0
- package/lib/esm/router/RouteComponent.js +32 -0
- package/lib/esm/router/RouteComponent.js.map +1 -0
- package/lib/esm/router/Router.js +161 -0
- package/lib/esm/router/Router.js.map +1 -0
- package/lib/esm/router/RouterProvider.js +41 -0
- package/lib/esm/router/RouterProvider.js.map +1 -0
- package/lib/esm/router/index.js +11 -0
- package/lib/esm/router/index.js.map +1 -0
- package/lib/esm/router/path.js +140 -0
- package/lib/esm/router/path.js.map +1 -0
- package/lib/esm/session/TypeRegistry.js +24 -0
- package/lib/esm/session/TypeRegistry.js.map +1 -0
- package/lib/esm/session/UserSession.js +192 -0
- package/lib/esm/session/UserSession.js.map +1 -0
- package/lib/esm/session/UserSessionProvider.js +179 -0
- package/lib/esm/session/UserSessionProvider.js.map +1 -0
- package/lib/esm/session/auth/composable.js +255 -0
- package/lib/esm/session/auth/composable.js.map +1 -0
- package/lib/esm/session/auth/firebase.js +158 -0
- package/lib/esm/session/auth/firebase.js.map +1 -0
- package/lib/esm/session/auth/useAuthState.js +46 -0
- package/lib/esm/session/auth/useAuthState.js.map +1 -0
- package/lib/esm/session/auth/useCurrentTenant.js +63 -0
- package/lib/esm/session/auth/useCurrentTenant.js.map +1 -0
- package/lib/esm/session/constants.js +3 -0
- package/lib/esm/session/constants.js.map +1 -0
- package/lib/esm/session/index.js +9 -0
- package/lib/esm/session/index.js.map +1 -0
- package/lib/esm/session/useUXTracking.js +29 -0
- package/lib/esm/session/useUXTracking.js.map +1 -0
- package/lib/esm/shell/SplashScreen.js +26 -0
- package/lib/esm/shell/SplashScreen.js.map +1 -0
- package/lib/esm/shell/VertesiaShell.js +10 -0
- package/lib/esm/shell/VertesiaShell.js.map +1 -0
- package/lib/esm/shell/apps/AppInstallationProvider.js +13 -0
- package/lib/esm/shell/apps/AppInstallationProvider.js.map +1 -0
- package/lib/esm/shell/apps/AppProjectSelector.js +36 -0
- package/lib/esm/shell/apps/AppProjectSelector.js.map +1 -0
- package/lib/esm/shell/apps/StandaloneApp.js +87 -0
- package/lib/esm/shell/apps/StandaloneApp.js.map +1 -0
- package/lib/esm/shell/apps/index.js +4 -0
- package/lib/esm/shell/apps/index.js.map +1 -0
- package/lib/esm/shell/index.js +8 -0
- package/lib/esm/shell/index.js.map +1 -0
- package/lib/esm/shell/login/EnterpriseSigninButton.js +84 -0
- package/lib/esm/shell/login/EnterpriseSigninButton.js.map +1 -0
- package/lib/esm/shell/login/GitHubSignInButton.js +24 -0
- package/lib/esm/shell/login/GitHubSignInButton.js.map +1 -0
- package/lib/esm/shell/login/GoogleSignInButton.js +25 -0
- package/lib/esm/shell/login/GoogleSignInButton.js.map +1 -0
- package/lib/esm/shell/login/InviteAcceptModal.js +62 -0
- package/lib/esm/shell/login/InviteAcceptModal.js.map +1 -0
- package/lib/esm/shell/login/MicrosoftSigninButton.js +19 -0
- package/lib/esm/shell/login/MicrosoftSigninButton.js.map +1 -0
- package/lib/esm/shell/login/PreviewIcon.js +23 -0
- package/lib/esm/shell/login/PreviewIcon.js.map +1 -0
- package/lib/esm/shell/login/SignInModal.js +9 -0
- package/lib/esm/shell/login/SignInModal.js.map +1 -0
- package/lib/esm/shell/login/SigninScreen.js +64 -0
- package/lib/esm/shell/login/SigninScreen.js.map +1 -0
- package/lib/esm/shell/login/SignupForm.js +91 -0
- package/lib/esm/shell/login/SignupForm.js.map +1 -0
- package/lib/esm/shell/login/TerminalLogin.js +208 -0
- package/lib/esm/shell/login/TerminalLogin.js.map +1 -0
- package/lib/esm/shell/login/UserInfo.js +41 -0
- package/lib/esm/shell/login/UserInfo.js.map +1 -0
- package/lib/esm/shell/login/UserSessionMenu.js +37 -0
- package/lib/esm/shell/login/UserSessionMenu.js.map +1 -0
- package/lib/esm/shell/utils.js +6 -0
- package/lib/esm/shell/utils.js.map +1 -0
- package/lib/esm/widgets/Progress.js +5 -0
- package/lib/esm/widgets/Progress.js.map +1 -0
- package/lib/esm/widgets/SvgIcon.js +36 -0
- package/lib/esm/widgets/SvgIcon.js.map +1 -0
- package/lib/esm/widgets/codemirror/CodeMirrorEditor.js +103 -0
- package/lib/esm/widgets/codemirror/CodeMirrorEditor.js.map +1 -0
- package/lib/esm/widgets/codemirror/CodemirrorStateSingleton.js +33 -0
- package/lib/esm/widgets/codemirror/CodemirrorStateSingleton.js.map +1 -0
- package/lib/esm/widgets/codemirror/MonacoEditor.js +128 -0
- package/lib/esm/widgets/codemirror/MonacoEditor.js.map +1 -0
- package/lib/esm/widgets/codemirror/index.js +3 -0
- package/lib/esm/widgets/codemirror/index.js.map +1 -0
- package/lib/esm/widgets/form/Form.js +100 -0
- package/lib/esm/widgets/form/Form.js.map +1 -0
- package/lib/esm/widgets/form/FormContext.js +31 -0
- package/lib/esm/widgets/form/FormContext.js.map +1 -0
- package/lib/esm/widgets/form/ManagedObject.js +287 -0
- package/lib/esm/widgets/form/ManagedObject.js.map +1 -0
- package/lib/esm/widgets/form/fields.js +12 -0
- package/lib/esm/widgets/form/fields.js.map +1 -0
- package/lib/esm/widgets/form/index.js +7 -0
- package/lib/esm/widgets/form/index.js.map +1 -0
- package/lib/esm/widgets/form/inputs.js +38 -0
- package/lib/esm/widgets/form/inputs.js.map +1 -0
- package/lib/esm/widgets/form/schema.js +197 -0
- package/lib/esm/widgets/form/schema.js.map +1 -0
- package/lib/esm/widgets/index.js +12 -0
- package/lib/esm/widgets/index.js.map +1 -0
- package/lib/esm/widgets/json-view/JSONCode.js +157 -0
- package/lib/esm/widgets/json-view/JSONCode.js.map +1 -0
- package/lib/esm/widgets/json-view/JSONDisplay.js +10 -0
- package/lib/esm/widgets/json-view/JSONDisplay.js.map +1 -0
- package/lib/esm/widgets/json-view/JSONView.js +106 -0
- package/lib/esm/widgets/json-view/JSONView.js.map +1 -0
- package/lib/esm/widgets/json-view/index.js +4 -0
- package/lib/esm/widgets/json-view/index.js.map +1 -0
- package/lib/esm/widgets/json-view/types.js +2 -0
- package/lib/esm/widgets/json-view/types.js.map +1 -0
- package/lib/esm/widgets/markdown/CodeBlockRendering.js +38 -0
- package/lib/esm/widgets/markdown/CodeBlockRendering.js.map +1 -0
- package/lib/esm/widgets/markdown/MarkdownRenderer.js +424 -0
- package/lib/esm/widgets/markdown/MarkdownRenderer.js.map +1 -0
- package/lib/esm/widgets/markdown/MermaidDiagram.js +71 -0
- package/lib/esm/widgets/markdown/MermaidDiagram.js.map +1 -0
- package/lib/esm/widgets/markdown/index.js +3 -0
- package/lib/esm/widgets/markdown/index.js.map +1 -0
- package/lib/esm/widgets/popover/Popover.js +73 -0
- package/lib/esm/widgets/popover/Popover.js.map +1 -0
- package/lib/esm/widgets/popover/context.js +7 -0
- package/lib/esm/widgets/popover/context.js.map +1 -0
- package/lib/esm/widgets/popover/index.js +3 -0
- package/lib/esm/widgets/popover/index.js.map +1 -0
- package/lib/esm/widgets/popover/slots.js +22 -0
- package/lib/esm/widgets/popover/slots.js.map +1 -0
- package/lib/esm/widgets/properties/PropertiesView.js +8 -0
- package/lib/esm/widgets/properties/PropertiesView.js.map +1 -0
- package/lib/esm/widgets/properties/index.js +2 -0
- package/lib/esm/widgets/properties/index.js.map +1 -0
- package/lib/esm/widgets/schema-editor/ManagedSchema.js +300 -0
- package/lib/esm/widgets/schema-editor/ManagedSchema.js.map +1 -0
- package/lib/esm/widgets/schema-editor/editor/Editable.js +110 -0
- package/lib/esm/widgets/schema-editor/editor/Editable.js.map +1 -0
- package/lib/esm/widgets/schema-editor/editor/EditableSchemaProperty.js +8 -0
- package/lib/esm/widgets/schema-editor/editor/EditableSchemaProperty.js.map +1 -0
- package/lib/esm/widgets/schema-editor/editor/PropertyEditor.js +81 -0
- package/lib/esm/widgets/schema-editor/editor/PropertyEditor.js.map +1 -0
- package/lib/esm/widgets/schema-editor/editor/PropertyViewer.js +7 -0
- package/lib/esm/widgets/schema-editor/editor/PropertyViewer.js.map +1 -0
- package/lib/esm/widgets/schema-editor/editor/SchemaContext.js +9 -0
- package/lib/esm/widgets/schema-editor/editor/SchemaContext.js.map +1 -0
- package/lib/esm/widgets/schema-editor/editor/SchemaEditor.js +84 -0
- package/lib/esm/widgets/schema-editor/editor/SchemaEditor.js.map +1 -0
- package/lib/esm/widgets/schema-editor/index.js +7 -0
- package/lib/esm/widgets/schema-editor/index.js.map +1 -0
- package/lib/esm/widgets/schema-editor/json-schema4-utils.js +188 -0
- package/lib/esm/widgets/schema-editor/json-schema4-utils.js.map +1 -0
- package/lib/esm/widgets/schema-editor/type-signature.js +30 -0
- package/lib/esm/widgets/schema-editor/type-signature.js.map +1 -0
- package/lib/esm/widgets/upload/DropZone.js +175 -0
- package/lib/esm/widgets/upload/DropZone.js.map +1 -0
- package/lib/esm/widgets/upload/UploadResultCategory.js +19 -0
- package/lib/esm/widgets/upload/UploadResultCategory.js.map +1 -0
- package/lib/esm/widgets/upload/UploadSummary.js +30 -0
- package/lib/esm/widgets/upload/UploadSummary.js.map +1 -0
- package/lib/esm/widgets/upload/index.js +4 -0
- package/lib/esm/widgets/upload/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/Attributes/index.js +11 -0
- package/lib/esm/widgets/xml-viewer/components/Attributes/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/CDataTag/index.js +8 -0
- package/lib/esm/widgets/xml-viewer/components/CDataTag/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/CollapseIcon/index.js +11 -0
- package/lib/esm/widgets/xml-viewer/components/CollapseIcon/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/CommentTag/index.js +11 -0
- package/lib/esm/widgets/xml-viewer/components/CommentTag/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/DeclarationTag/index.js +9 -0
- package/lib/esm/widgets/xml-viewer/components/DeclarationTag/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/Elements/index.js +36 -0
- package/lib/esm/widgets/xml-viewer/components/Elements/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/InvalidXml/index.js +5 -0
- package/lib/esm/widgets/xml-viewer/components/InvalidXml/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/Tag/index.js +13 -0
- package/lib/esm/widgets/xml-viewer/components/Tag/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/TextElement/index.js +13 -0
- package/lib/esm/widgets/xml-viewer/components/TextElement/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/XMLViewer.js +39 -0
- package/lib/esm/widgets/xml-viewer/components/XMLViewer.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/components/types.js +2 -0
- package/lib/esm/widgets/xml-viewer/components/types.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/constants/index.js +27 -0
- package/lib/esm/widgets/xml-viewer/constants/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/context/xml-viewer-context.js +10 -0
- package/lib/esm/widgets/xml-viewer/context/xml-viewer-context.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/helpers/index.js +40 -0
- package/lib/esm/widgets/xml-viewer/helpers/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/hooks/useCollapsible.js +22 -0
- package/lib/esm/widgets/xml-viewer/hooks/useCollapsible.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/hooks/useXMLViewer.js +31 -0
- package/lib/esm/widgets/xml-viewer/hooks/useXMLViewer.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/index.js +3 -0
- package/lib/esm/widgets/xml-viewer/index.js.map +1 -0
- package/lib/esm/widgets/xml-viewer/types/index.js +2 -0
- package/lib/esm/widgets/xml-viewer/types/index.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/types/core/components/Avatar.d.ts +16 -0
- package/lib/types/core/components/Avatar.d.ts.map +1 -0
- package/lib/types/core/components/Badge.d.ts +21 -0
- package/lib/types/core/components/Badge.d.ts.map +1 -0
- package/lib/types/core/components/Button.d.ts +14 -0
- package/lib/types/core/components/Button.d.ts.map +1 -0
- package/lib/types/core/components/Center.d.ts +8 -0
- package/lib/types/core/components/Center.d.ts.map +1 -0
- package/lib/types/core/components/ComboBox.d.ts +124 -0
- package/lib/types/core/components/ComboBox.d.ts.map +1 -0
- package/lib/types/core/components/ConfirmModal.d.ts +11 -0
- package/lib/types/core/components/ConfirmModal.d.ts.map +1 -0
- package/lib/types/core/components/DeleteModal.d.ts +11 -0
- package/lib/types/core/components/DeleteModal.d.ts.map +1 -0
- package/lib/types/core/components/Divider.d.ts +6 -0
- package/lib/types/core/components/Divider.d.ts.map +1 -0
- package/lib/types/core/components/Dropdown.d.ts +15 -0
- package/lib/types/core/components/Dropdown.d.ts.map +1 -0
- package/lib/types/core/components/DropdownList.d.ts +13 -0
- package/lib/types/core/components/DropdownList.d.ts.map +1 -0
- package/lib/types/core/components/EmptyCollection.d.ts +9 -0
- package/lib/types/core/components/EmptyCollection.d.ts.map +1 -0
- package/lib/types/core/components/FileUpload.d.ts +29 -0
- package/lib/types/core/components/FileUpload.d.ts.map +1 -0
- package/lib/types/core/components/FormItem.d.ts +13 -0
- package/lib/types/core/components/FormItem.d.ts.map +1 -0
- package/lib/types/core/components/InputList.d.ts +12 -0
- package/lib/types/core/components/InputList.d.ts.map +1 -0
- package/lib/types/core/components/Link.d.ts +7 -0
- package/lib/types/core/components/Link.d.ts.map +1 -0
- package/lib/types/core/components/MenuList.d.ts +14 -0
- package/lib/types/core/components/MenuList.d.ts.map +1 -0
- package/lib/types/core/components/MessageBox.d.ts +36 -0
- package/lib/types/core/components/MessageBox.d.ts.map +1 -0
- package/lib/types/core/components/Modal.d.ts +30 -0
- package/lib/types/core/components/Modal.d.ts.map +1 -0
- package/lib/types/core/components/NumberInput.d.ts +16 -0
- package/lib/types/core/components/NumberInput.d.ts.map +1 -0
- package/lib/types/core/components/Overlay.d.ts +25 -0
- package/lib/types/core/components/Overlay.d.ts.map +1 -0
- package/lib/types/core/components/Panel.d.ts +11 -0
- package/lib/types/core/components/Panel.d.ts.map +1 -0
- package/lib/types/core/components/Portal.d.ts +6 -0
- package/lib/types/core/components/Portal.d.ts.map +1 -0
- package/lib/types/core/components/RadioGroup.d.ts +26 -0
- package/lib/types/core/components/RadioGroup.d.ts.map +1 -0
- package/lib/types/core/components/SelectBox.d.ts +36 -0
- package/lib/types/core/components/SelectBox.d.ts.map +1 -0
- package/lib/types/core/components/SelectList.d.ts +19 -0
- package/lib/types/core/components/SelectList.d.ts.map +1 -0
- package/lib/types/core/components/SelectStack.d.ts +13 -0
- package/lib/types/core/components/SelectStack.d.ts.map +1 -0
- package/lib/types/core/components/SidePanel.d.ts +11 -0
- package/lib/types/core/components/SidePanel.d.ts.map +1 -0
- package/lib/types/core/components/Spinner.d.ts +7 -0
- package/lib/types/core/components/Spinner.d.ts.map +1 -0
- package/lib/types/core/components/Switch.d.ts +11 -0
- package/lib/types/core/components/Switch.d.ts.map +1 -0
- package/lib/types/core/components/TagsInput.d.ts +16 -0
- package/lib/types/core/components/TagsInput.d.ts.map +1 -0
- package/lib/types/core/components/index.d.ts +40 -0
- package/lib/types/core/components/index.d.ts.map +1 -0
- package/lib/types/core/components/libs/utils.d.ts +3 -0
- package/lib/types/core/components/libs/utils.d.ts.map +1 -0
- package/lib/types/core/components/libs/visuallyHidden.d.ts +7 -0
- package/lib/types/core/components/libs/visuallyHidden.d.ts.map +1 -0
- package/lib/types/core/components/popup/Popup.d.ts +26 -0
- package/lib/types/core/components/popup/Popup.d.ts.map +1 -0
- package/lib/types/core/components/popup/PopupController.d.ts +41 -0
- package/lib/types/core/components/popup/PopupController.d.ts.map +1 -0
- package/lib/types/core/components/popup/index.d.ts +4 -0
- package/lib/types/core/components/popup/index.d.ts.map +1 -0
- package/lib/types/core/components/popup/position.d.ts +59 -0
- package/lib/types/core/components/popup/position.d.ts.map +1 -0
- package/lib/types/core/components/popup/utils.d.ts +30 -0
- package/lib/types/core/components/popup/utils.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/breadcrumb.d.ts +15 -0
- package/lib/types/core/components/shadcn/breadcrumb.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/button.d.ts +27 -0
- package/lib/types/core/components/shadcn/button.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/calendar.d.ts +11 -0
- package/lib/types/core/components/shadcn/calendar.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/card.d.ts +9 -0
- package/lib/types/core/components/shadcn/card.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/checkbox.d.ts +5 -0
- package/lib/types/core/components/shadcn/checkbox.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/command.d.ts +17 -0
- package/lib/types/core/components/shadcn/command.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/dialog.d.ts +38 -0
- package/lib/types/core/components/shadcn/dialog.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/DynamicLabel.d.ts +9 -0
- package/lib/types/core/components/shadcn/filters/DynamicLabel.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/animateChangeInHeight.d.ts +7 -0
- package/lib/types/core/components/shadcn/filters/animateChangeInHeight.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/comboBox/DateCombobox.d.ts +6 -0
- package/lib/types/core/components/shadcn/filters/comboBox/DateCombobox.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/comboBox/SelectCombobox.d.ts +9 -0
- package/lib/types/core/components/shadcn/filters/comboBox/SelectCombobox.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/comboBox/StringListCombobox.d.ts +6 -0
- package/lib/types/core/components/shadcn/filters/comboBox/StringListCombobox.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/comboBox/TextCombobox.d.ts +6 -0
- package/lib/types/core/components/shadcn/filters/comboBox/TextCombobox.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/comboBox/comboBox.d.ts +5 -0
- package/lib/types/core/components/shadcn/filters/comboBox/comboBox.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/filter/SelectFilter.d.ts +12 -0
- package/lib/types/core/components/shadcn/filters/filter/SelectFilter.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/filter/StringListFilter.d.ts +11 -0
- package/lib/types/core/components/shadcn/filters/filter/StringListFilter.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/filter/TextFilter.d.ts +13 -0
- package/lib/types/core/components/shadcn/filters/filter/TextFilter.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/filter/dateFilter.d.ts +14 -0
- package/lib/types/core/components/shadcn/filters/filter/dateFilter.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/filter-styles.d.ts +2 -0
- package/lib/types/core/components/shadcn/filters/filter-styles.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/filterBar.d.ts +20 -0
- package/lib/types/core/components/shadcn/filters/filterBar.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/filters.d.ts +10 -0
- package/lib/types/core/components/shadcn/filters/filters.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/index.d.ts +6 -0
- package/lib/types/core/components/shadcn/filters/index.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/filters/types.d.ts +35 -0
- package/lib/types/core/components/shadcn/filters/types.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/heading.d.ts +6 -0
- package/lib/types/core/components/shadcn/heading.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/index.d.ts +23 -0
- package/lib/types/core/components/shadcn/index.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/input.d.ts +17 -0
- package/lib/types/core/components/shadcn/input.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/label.d.ts +10 -0
- package/lib/types/core/components/shadcn/label.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/popover.d.ts +24 -0
- package/lib/types/core/components/shadcn/popover.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/resizeable.d.ts +9 -0
- package/lib/types/core/components/shadcn/resizeable.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/selectBox.d.ts +36 -0
- package/lib/types/core/components/shadcn/selectBox.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/separator.d.ts +6 -0
- package/lib/types/core/components/shadcn/separator.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/tabs.d.ts +36 -0
- package/lib/types/core/components/shadcn/tabs.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/text.d.ts +11 -0
- package/lib/types/core/components/shadcn/text.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/textarea.d.ts +4 -0
- package/lib/types/core/components/shadcn/textarea.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/theme/ThemeProvider.d.ts +15 -0
- package/lib/types/core/components/shadcn/theme/ThemeProvider.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/theme/ThemeSwitcher.d.ts +10 -0
- package/lib/types/core/components/shadcn/theme/ThemeSwitcher.d.ts.map +1 -0
- package/lib/types/core/components/shadcn/tooltip.d.ts +21 -0
- package/lib/types/core/components/shadcn/tooltip.d.ts.map +1 -0
- package/lib/types/core/components/styles.d.ts +7 -0
- package/lib/types/core/components/styles.d.ts.map +1 -0
- package/lib/types/core/components/table/index.d.ts +19 -0
- package/lib/types/core/components/table/index.d.ts.map +1 -0
- package/lib/types/core/components/tabs/Tabs.d.ts +25 -0
- package/lib/types/core/components/tabs/Tabs.d.ts.map +1 -0
- package/lib/types/core/components/tabs/TabsContext.d.ts +17 -0
- package/lib/types/core/components/tabs/TabsContext.d.ts.map +1 -0
- package/lib/types/core/components/tabs/index.d.ts +3 -0
- package/lib/types/core/components/tabs/index.d.ts.map +1 -0
- package/lib/types/core/components/toast/NotificationPanel.d.ts +8 -0
- package/lib/types/core/components/toast/NotificationPanel.d.ts.map +1 -0
- package/lib/types/core/components/toast/ToastContext.d.ts +6 -0
- package/lib/types/core/components/toast/ToastContext.d.ts.map +1 -0
- package/lib/types/core/components/toast/ToastProps.d.ts +7 -0
- package/lib/types/core/components/toast/ToastProps.d.ts.map +1 -0
- package/lib/types/core/components/toast/ToastProvider.d.ts +6 -0
- package/lib/types/core/components/toast/ToastProvider.d.ts.map +1 -0
- package/lib/types/core/components/toast/index.d.ts +3 -0
- package/lib/types/core/components/toast/index.d.ts.map +1 -0
- package/lib/types/core/hooks/CompositeState.d.ts +137 -0
- package/lib/types/core/hooks/CompositeState.d.ts.map +1 -0
- package/lib/types/core/hooks/PortalContainerProvider.d.ts +7 -0
- package/lib/types/core/hooks/PortalContainerProvider.d.ts.map +1 -0
- package/lib/types/core/hooks/SharedState.d.ts +10 -0
- package/lib/types/core/hooks/SharedState.d.ts.map +1 -0
- package/lib/types/core/hooks/index.d.ts +16 -0
- package/lib/types/core/hooks/index.d.ts.map +1 -0
- package/lib/types/core/hooks/useClickOutside.d.ts +8 -0
- package/lib/types/core/hooks/useClickOutside.d.ts.map +1 -0
- package/lib/types/core/hooks/useCopyToClipboard.d.ts +5 -0
- package/lib/types/core/hooks/useCopyToClipboard.d.ts.map +1 -0
- package/lib/types/core/hooks/useDarkMode.d.ts +2 -0
- package/lib/types/core/hooks/useDarkMode.d.ts.map +1 -0
- package/lib/types/core/hooks/useDebounce.d.ts +2 -0
- package/lib/types/core/hooks/useDebounce.d.ts.map +1 -0
- package/lib/types/core/hooks/useEventSource.d.ts +2 -0
- package/lib/types/core/hooks/useEventSource.d.ts.map +1 -0
- package/lib/types/core/hooks/useFetch.d.ts +24 -0
- package/lib/types/core/hooks/useFetch.d.ts.map +1 -0
- package/lib/types/core/hooks/useFlag.d.ts +9 -0
- package/lib/types/core/hooks/useFlag.d.ts.map +1 -0
- package/lib/types/core/hooks/useIntersectionObserver.d.ts +14 -0
- package/lib/types/core/hooks/useIntersectionObserver.d.ts.map +1 -0
- package/lib/types/core/hooks/useIsFistRendering.d.ts +2 -0
- package/lib/types/core/hooks/useIsFistRendering.d.ts.map +1 -0
- package/lib/types/core/hooks/useSafeLayoutEffect.d.ts +4 -0
- package/lib/types/core/hooks/useSafeLayoutEffect.d.ts.map +1 -0
- package/lib/types/core/hooks/useScrollableSearch.d.ts +82 -0
- package/lib/types/core/hooks/useScrollableSearch.d.ts.map +1 -0
- package/lib/types/core/hooks/useSharedValue.d.ts +12 -0
- package/lib/types/core/hooks/useSharedValue.d.ts.map +1 -0
- package/lib/types/core/index.d.ts +4 -0
- package/lib/types/core/index.d.ts.map +1 -0
- package/lib/types/core/utils/cn.d.ts +3 -0
- package/lib/types/core/utils/cn.d.ts.map +1 -0
- package/lib/types/core/utils/index.d.ts +2 -0
- package/lib/types/core/utils/index.d.ts.map +1 -0
- package/lib/types/env/index.d.ts +76 -0
- package/lib/types/env/index.d.ts.map +1 -0
- package/lib/types/features/activity-doc/ActivityDoc.d.ts +14 -0
- package/lib/types/features/activity-doc/ActivityDoc.d.ts.map +1 -0
- package/lib/types/features/activity-doc/index.d.ts +2 -0
- package/lib/types/features/activity-doc/index.d.ts.map +1 -0
- package/lib/types/features/agent/PayloadBuilder.d.ts +68 -0
- package/lib/types/features/agent/PayloadBuilder.d.ts.map +1 -0
- package/lib/types/features/agent/chat/AgentChart.d.ts +75 -0
- package/lib/types/features/agent/chat/AgentChart.d.ts.map +1 -0
- package/lib/types/features/agent/chat/AnimatedThinkingDots.d.ts +38 -0
- package/lib/types/features/agent/chat/AnimatedThinkingDots.d.ts.map +1 -0
- package/lib/types/features/agent/chat/AskUserWidget.d.ts +84 -0
- package/lib/types/features/agent/chat/AskUserWidget.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ImageLightbox.d.ts +18 -0
- package/lib/types/features/agent/chat/ImageLightbox.d.ts.map +1 -0
- package/lib/types/features/agent/chat/JumpingDots.d.ts +7 -0
- package/lib/types/features/agent/chat/JumpingDots.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentConversation.d.ts +56 -0
- package/lib/types/features/agent/chat/ModernAgentConversation.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts +29 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/BatchProgressPanel.d.ts +10 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/BatchProgressPanel.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts +25 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/Header.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.d.ts +11 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts +18 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +61 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/MessageItem.d.ts +30 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/MessagesContainer.d.ts +15 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/MessagesContainer.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/PlanPanel.d.ts +9 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/PlanPanel.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/SlideInPanel.d.ts +11 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/SlideInPanel.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/SlidingMessages.d.ts +8 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/SlidingMessages.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.d.ts +10 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/StackedMessages.d.ts +8 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/StackedMessages.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/StreamingMessage.d.ts +26 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/StreamingMessage.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts +12 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/WorkstreamTabs.d.ts +22 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/WorkstreamTabs.d.ts.map +1 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/utils.d.ts +107 -0
- package/lib/types/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -0
- package/lib/types/features/agent/chat/SkillWidgetProvider.d.ts +11 -0
- package/lib/types/features/agent/chat/SkillWidgetProvider.d.ts.map +1 -0
- package/lib/types/features/agent/chat/SlidingThinkingIndicator.d.ts +18 -0
- package/lib/types/features/agent/chat/SlidingThinkingIndicator.d.ts.map +1 -0
- package/lib/types/features/agent/chat/VegaLiteChart.d.ts +18 -0
- package/lib/types/features/agent/chat/VegaLiteChart.d.ts.map +1 -0
- package/lib/types/features/agent/chat/WaitingMessages.d.ts +2 -0
- package/lib/types/features/agent/chat/WaitingMessages.d.ts.map +1 -0
- package/lib/types/features/agent/chat/index.d.ts +17 -0
- package/lib/types/features/agent/chat/index.d.ts.map +1 -0
- package/lib/types/features/agent/chat/useArtifactUrlCache.d.ts +28 -0
- package/lib/types/features/agent/chat/useArtifactUrlCache.d.ts.map +1 -0
- package/lib/types/features/agent/createChartTool.d.ts +178 -0
- package/lib/types/features/agent/createChartTool.d.ts.map +1 -0
- package/lib/types/features/agent/examples.d.ts +59 -0
- package/lib/types/features/agent/examples.d.ts.map +1 -0
- package/lib/types/features/agent/index.d.ts +5 -0
- package/lib/types/features/agent/index.d.ts.map +1 -0
- package/lib/types/features/agent/visualization.d.ts +95 -0
- package/lib/types/features/agent/visualization.d.ts.map +1 -0
- package/lib/types/features/errors/PanelErrorBoundary.d.ts +5 -0
- package/lib/types/features/errors/PanelErrorBoundary.d.ts.map +1 -0
- package/lib/types/features/errors/RowErrorBoundary.d.ts +8 -0
- package/lib/types/features/errors/RowErrorBoundary.d.ts.map +1 -0
- package/lib/types/features/errors/VertesiaErrorBoundary.d.ts +12 -0
- package/lib/types/features/errors/VertesiaErrorBoundary.d.ts.map +1 -0
- package/lib/types/features/errors/WidgetErrorBoundary.d.ts +5 -0
- package/lib/types/features/errors/WidgetErrorBoundary.d.ts.map +1 -0
- package/lib/types/features/errors/index.d.ts +5 -0
- package/lib/types/features/errors/index.d.ts.map +1 -0
- package/lib/types/features/facets/CollectionsFacetsNav.d.ts +14 -0
- package/lib/types/features/facets/CollectionsFacetsNav.d.ts.map +1 -0
- package/lib/types/features/facets/DocumentsFacetsNav.d.ts +17 -0
- package/lib/types/features/facets/DocumentsFacetsNav.d.ts.map +1 -0
- package/lib/types/features/facets/EnvironmentFacet.d.ts +10 -0
- package/lib/types/features/facets/EnvironmentFacet.d.ts.map +1 -0
- package/lib/types/features/facets/InteractionsFacetsNav.d.ts +14 -0
- package/lib/types/features/facets/InteractionsFacetsNav.d.ts.map +1 -0
- package/lib/types/features/facets/PromptsFacetsNav.d.ts +15 -0
- package/lib/types/features/facets/PromptsFacetsNav.d.ts.map +1 -0
- package/lib/types/features/facets/RunsFacetsNav.d.ts +20 -0
- package/lib/types/features/facets/RunsFacetsNav.d.ts.map +1 -0
- package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts +14 -0
- package/lib/types/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -0
- package/lib/types/features/facets/index.d.ts +15 -0
- package/lib/types/features/facets/index.d.ts.map +1 -0
- package/lib/types/features/facets/utils/SearchInterface.d.ts +14 -0
- package/lib/types/features/facets/utils/SearchInterface.d.ts.map +1 -0
- package/lib/types/features/facets/utils/StringFacet.d.ts +11 -0
- package/lib/types/features/facets/utils/StringFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/StringListFacet.d.ts +11 -0
- package/lib/types/features/facets/utils/StringListFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/TypeFacet.d.ts +16 -0
- package/lib/types/features/facets/utils/TypeFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VEnvironmentFacet.d.ts +12 -0
- package/lib/types/features/facets/utils/VEnvironmentFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VInteractionFacet.d.ts +15 -0
- package/lib/types/features/facets/utils/VInteractionFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VStringFacet.d.ts +21 -0
- package/lib/types/features/facets/utils/VStringFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VTypeFacet.d.ts +12 -0
- package/lib/types/features/facets/utils/VTypeFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/VUserFacet.d.ts +11 -0
- package/lib/types/features/facets/utils/VUserFacet.d.ts.map +1 -0
- package/lib/types/features/facets/utils/utils.d.ts +4 -0
- package/lib/types/features/facets/utils/utils.d.ts.map +1 -0
- package/lib/types/features/index.d.ts +12 -0
- package/lib/types/features/index.d.ts.map +1 -0
- package/lib/types/features/layout/GenericPageNavHeader.d.ts +14 -0
- package/lib/types/features/layout/GenericPageNavHeader.d.ts.map +1 -0
- package/lib/types/features/layout/NotFoundView.d.ts +5 -0
- package/lib/types/features/layout/NotFoundView.d.ts.map +1 -0
- package/lib/types/features/layout/index.d.ts +3 -0
- package/lib/types/features/layout/index.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/AnnotatedImageSlider.d.ts +13 -0
- package/lib/types/features/magic-pdf/AnnotatedImageSlider.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/DownloadPopover.d.ts +7 -0
- package/lib/types/features/magic-pdf/DownloadPopover.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/ExtractedContentView.d.ts +8 -0
- package/lib/types/features/magic-pdf/ExtractedContentView.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/MagicPdfProvider.d.ts +58 -0
- package/lib/types/features/magic-pdf/MagicPdfProvider.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/MagicPdfView.d.ts +7 -0
- package/lib/types/features/magic-pdf/MagicPdfView.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/index.d.ts +2 -0
- package/lib/types/features/magic-pdf/index.d.ts.map +1 -0
- package/lib/types/features/magic-pdf/types.d.ts +2 -0
- package/lib/types/features/magic-pdf/types.d.ts.map +1 -0
- package/lib/types/features/pdf-viewer/PdfPageRenderer.d.ts +83 -0
- package/lib/types/features/pdf-viewer/PdfPageRenderer.d.ts.map +1 -0
- package/lib/types/features/pdf-viewer/PdfPageSlider.d.ts +29 -0
- package/lib/types/features/pdf-viewer/PdfPageSlider.d.ts.map +1 -0
- package/lib/types/features/pdf-viewer/SimplePdfViewer.d.ts +19 -0
- package/lib/types/features/pdf-viewer/SimplePdfViewer.d.ts.map +1 -0
- package/lib/types/features/pdf-viewer/index.d.ts +4 -0
- package/lib/types/features/pdf-viewer/index.d.ts.map +1 -0
- package/lib/types/features/permissions/SecureButton.d.ts +8 -0
- package/lib/types/features/permissions/SecureButton.d.ts.map +1 -0
- package/lib/types/features/permissions/SecureSidebarItem.d.ts +8 -0
- package/lib/types/features/permissions/SecureSidebarItem.d.ts.map +1 -0
- package/lib/types/features/permissions/UserPermissionsProvider.d.ts +21 -0
- package/lib/types/features/permissions/UserPermissionsProvider.d.ts.map +1 -0
- package/lib/types/features/permissions/helpers.d.ts +5 -0
- package/lib/types/features/permissions/helpers.d.ts.map +1 -0
- package/lib/types/features/permissions/index.d.ts +5 -0
- package/lib/types/features/permissions/index.d.ts.map +1 -0
- package/lib/types/features/store/collections/BrowseCollectionView.d.ts +7 -0
- package/lib/types/features/store/collections/BrowseCollectionView.d.ts.map +1 -0
- package/lib/types/features/store/collections/CollectionsTable.d.ts +6 -0
- package/lib/types/features/store/collections/CollectionsTable.d.ts.map +1 -0
- package/lib/types/features/store/collections/CreateCollection.d.ts +13 -0
- package/lib/types/features/store/collections/CreateCollection.d.ts.map +1 -0
- package/lib/types/features/store/collections/EditCollectionView.d.ts +8 -0
- package/lib/types/features/store/collections/EditCollectionView.d.ts.map +1 -0
- package/lib/types/features/store/collections/SelectCollection.d.ts +20 -0
- package/lib/types/features/store/collections/SelectCollection.d.ts.map +1 -0
- package/lib/types/features/store/collections/SharedPropsEditor.d.ts +7 -0
- package/lib/types/features/store/collections/SharedPropsEditor.d.ts.map +1 -0
- package/lib/types/features/store/collections/SyncMemberHeadsToggle.d.ts +7 -0
- package/lib/types/features/store/collections/SyncMemberHeadsToggle.d.ts.map +1 -0
- package/lib/types/features/store/collections/index.d.ts +8 -0
- package/lib/types/features/store/collections/index.d.ts.map +1 -0
- package/lib/types/features/store/index.d.ts +4 -0
- package/lib/types/features/store/index.d.ts.map +1 -0
- package/lib/types/features/store/objects/DocumentPreviewPanel.d.ts +8 -0
- package/lib/types/features/store/objects/DocumentPreviewPanel.d.ts.map +1 -0
- package/lib/types/features/store/objects/DocumentSearchResults.d.ts +20 -0
- package/lib/types/features/store/objects/DocumentSearchResults.d.ts.map +1 -0
- package/lib/types/features/store/objects/DocumentSelectionProvider.d.ts +33 -0
- package/lib/types/features/store/objects/DocumentSelectionProvider.d.ts.map +1 -0
- package/lib/types/features/store/objects/DocumentTable.d.ts +25 -0
- package/lib/types/features/store/objects/DocumentTable.d.ts.map +1 -0
- package/lib/types/features/store/objects/ExportPropertiesModal.d.ts +12 -0
- package/lib/types/features/store/objects/ExportPropertiesModal.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/ContentDispositionButton.d.ts +9 -0
- package/lib/types/features/store/objects/components/ContentDispositionButton.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/ContentOverview.d.ts +9 -0
- package/lib/types/features/store/objects/components/ContentOverview.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/DocumentIcon.d.ts +18 -0
- package/lib/types/features/store/objects/components/DocumentIcon.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/DocumentInput.d.ts +8 -0
- package/lib/types/features/store/objects/components/DocumentInput.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/PropertiesEditorModal.d.ts +9 -0
- package/lib/types/features/store/objects/components/PropertiesEditorModal.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/SaveVersionConfirmModal.d.ts +9 -0
- package/lib/types/features/store/objects/components/SaveVersionConfirmModal.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/SelectDocument.d.ts +9 -0
- package/lib/types/features/store/objects/components/SelectDocument.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/SelectDocumentModal.d.ts +9 -0
- package/lib/types/features/store/objects/components/SelectDocumentModal.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/VectorSearchWidget.d.ts +12 -0
- package/lib/types/features/store/objects/components/VectorSearchWidget.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/index.d.ts +10 -0
- package/lib/types/features/store/objects/components/index.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/useContentPanelHooks.d.ts +30 -0
- package/lib/types/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -0
- package/lib/types/features/store/objects/components/useDownloadObject.d.ts +4 -0
- package/lib/types/features/store/objects/components/useDownloadObject.d.ts.map +1 -0
- package/lib/types/features/store/objects/index.d.ts +11 -0
- package/lib/types/features/store/objects/index.d.ts.map +1 -0
- package/lib/types/features/store/objects/layout/DocumentTableColumn.d.ts +18 -0
- package/lib/types/features/store/objects/layout/DocumentTableColumn.d.ts.map +1 -0
- package/lib/types/features/store/objects/layout/documentLayout.d.ts +20 -0
- package/lib/types/features/store/objects/layout/documentLayout.d.ts.map +1 -0
- package/lib/types/features/store/objects/layout/index.d.ts +3 -0
- package/lib/types/features/store/objects/layout/index.d.ts.map +1 -0
- package/lib/types/features/store/objects/layout/renderers.d.ts +3 -0
- package/lib/types/features/store/objects/layout/renderers.d.ts.map +1 -0
- package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts +52 -0
- package/lib/types/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -0
- package/lib/types/features/store/objects/search/DocumentSearchProvider.d.ts +14 -0
- package/lib/types/features/store/objects/search/DocumentSearchProvider.d.ts.map +1 -0
- package/lib/types/features/store/objects/search/index.d.ts +3 -0
- package/lib/types/features/store/objects/search/index.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/ObjectsActionContext.d.ts +26 -0
- package/lib/types/features/store/objects/selection/ObjectsActionContext.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/ObjectsActionSpec.d.ts +28 -0
- package/lib/types/features/store/objects/selection/ObjectsActionSpec.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/SelectionActions.d.ts +6 -0
- package/lib/types/features/store/objects/selection/SelectionActions.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/actions/AddToCollectionAction.d.ts +4 -0
- package/lib/types/features/store/objects/selection/actions/AddToCollectionAction.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/actions/ChangeTypeAction.d.ts +4 -0
- package/lib/types/features/store/objects/selection/actions/ChangeTypeAction.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/actions/ConfirmAction.d.ts +16 -0
- package/lib/types/features/store/objects/selection/actions/ConfirmAction.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/actions/DeleteObjectsAction.d.ts +5 -0
- package/lib/types/features/store/objects/selection/actions/DeleteObjectsAction.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/actions/ExportPropertiesAction.d.ts +4 -0
- package/lib/types/features/store/objects/selection/actions/ExportPropertiesAction.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/actions/RemoveFromCollectionAction.d.ts +4 -0
- package/lib/types/features/store/objects/selection/actions/RemoveFromCollectionAction.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/actions/StartWorkflowComponent.d.ts +4 -0
- package/lib/types/features/store/objects/selection/actions/StartWorkflowComponent.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/actions/index.d.ts +8 -0
- package/lib/types/features/store/objects/selection/actions/index.d.ts.map +1 -0
- package/lib/types/features/store/objects/selection/index.d.ts +5 -0
- package/lib/types/features/store/objects/selection/index.d.ts.map +1 -0
- package/lib/types/features/store/objects/upload/DocumentUploadModal.d.ts +39 -0
- package/lib/types/features/store/objects/upload/DocumentUploadModal.d.ts.map +1 -0
- package/lib/types/features/store/objects/upload/index.d.ts +4 -0
- package/lib/types/features/store/objects/upload/index.d.ts.map +1 -0
- package/lib/types/features/store/objects/upload/useSmartFileUploadProcessing.d.ts +30 -0
- package/lib/types/features/store/objects/upload/useSmartFileUploadProcessing.d.ts.map +1 -0
- package/lib/types/features/store/objects/upload/useUploadHandler.d.ts +50 -0
- package/lib/types/features/store/objects/upload/useUploadHandler.d.ts.map +1 -0
- package/lib/types/features/store/types/ContentObjectTypesSearch.d.ts +6 -0
- package/lib/types/features/store/types/ContentObjectTypesSearch.d.ts.map +1 -0
- package/lib/types/features/store/types/ContentObjectTypesTable.d.ts +8 -0
- package/lib/types/features/store/types/ContentObjectTypesTable.d.ts.map +1 -0
- package/lib/types/features/store/types/CreateOrUpdateTypeModal.d.ts +15 -0
- package/lib/types/features/store/types/CreateOrUpdateTypeModal.d.ts.map +1 -0
- package/lib/types/features/store/types/ObjectSchemaEditor.d.ts +8 -0
- package/lib/types/features/store/types/ObjectSchemaEditor.d.ts.map +1 -0
- package/lib/types/features/store/types/SelectContentType.d.ts +11 -0
- package/lib/types/features/store/types/SelectContentType.d.ts.map +1 -0
- package/lib/types/features/store/types/SelectContentTypeModal.d.ts +33 -0
- package/lib/types/features/store/types/SelectContentTypeModal.d.ts.map +1 -0
- package/lib/types/features/store/types/TableLayoutEditor.d.ts +9 -0
- package/lib/types/features/store/types/TableLayoutEditor.d.ts.map +1 -0
- package/lib/types/features/store/types/index.d.ts +9 -0
- package/lib/types/features/store/types/index.d.ts.map +1 -0
- package/lib/types/features/store/types/search/ObjectTypeSearchContext.d.ts +36 -0
- package/lib/types/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -0
- package/lib/types/features/store/types/search/ObjectTypeSearchProvider.d.ts +11 -0
- package/lib/types/features/store/types/search/ObjectTypeSearchProvider.d.ts.map +1 -0
- package/lib/types/features/store/types/search/index.d.ts +3 -0
- package/lib/types/features/store/types/search/index.d.ts.map +1 -0
- package/lib/types/features/user/UserAvatar.d.ts +9 -0
- package/lib/types/features/user/UserAvatar.d.ts.map +1 -0
- package/lib/types/features/user/UserInfo.d.ts +48 -0
- package/lib/types/features/user/UserInfo.d.ts.map +1 -0
- package/lib/types/features/user/index.d.ts +3 -0
- package/lib/types/features/user/index.d.ts.map +1 -0
- package/lib/types/features/utils/index.d.ts +6 -0
- package/lib/types/features/utils/index.d.ts.map +1 -0
- package/lib/types/features/utils/mimeType.d.ts +6 -0
- package/lib/types/features/utils/mimeType.d.ts.map +1 -0
- package/lib/types/features/utils/print.d.ts +10 -0
- package/lib/types/features/utils/print.d.ts.map +1 -0
- package/lib/types/features/utils/rendition.d.ts +4 -0
- package/lib/types/features/utils/rendition.d.ts.map +1 -0
- package/lib/types/features/utils/text.d.ts +3 -0
- package/lib/types/features/utils/text.d.ts.map +1 -0
- package/lib/types/features/utils/workflowStatus.d.ts +10 -0
- package/lib/types/features/utils/workflowStatus.d.ts.map +1 -0
- package/lib/types/layout/AppLayout.d.ts +13 -0
- package/lib/types/layout/AppLayout.d.ts.map +1 -0
- package/lib/types/layout/FullHeightLayout.d.ts +27 -0
- package/lib/types/layout/FullHeightLayout.d.ts.map +1 -0
- package/lib/types/layout/Navbar.d.ts +33 -0
- package/lib/types/layout/Navbar.d.ts.map +1 -0
- package/lib/types/layout/Sidebar.d.ts +31 -0
- package/lib/types/layout/Sidebar.d.ts.map +1 -0
- package/lib/types/layout/SidebarContext.d.ts +9 -0
- package/lib/types/layout/SidebarContext.d.ts.map +1 -0
- package/lib/types/layout/TitleBar.d.ts +6 -0
- package/lib/types/layout/TitleBar.d.ts.map +1 -0
- package/lib/types/layout/index.d.ts +7 -0
- package/lib/types/layout/index.d.ts.map +1 -0
- package/lib/types/router/FixLinks.d.ts +7 -0
- package/lib/types/router/FixLinks.d.ts.map +1 -0
- package/lib/types/router/HistoryNavigator.d.ts +59 -0
- package/lib/types/router/HistoryNavigator.d.ts.map +1 -0
- package/lib/types/router/Nav.d.ts +30 -0
- package/lib/types/router/Nav.d.ts.map +1 -0
- package/lib/types/router/NestedNavigationContext.d.ts +9 -0
- package/lib/types/router/NestedNavigationContext.d.ts.map +1 -0
- package/lib/types/router/NestedRouterProvider.d.ts +14 -0
- package/lib/types/router/NestedRouterProvider.d.ts.map +1 -0
- package/lib/types/router/PathMatcher.d.ts +36 -0
- package/lib/types/router/PathMatcher.d.ts.map +1 -0
- package/lib/types/router/PathWithParams.d.ts +9 -0
- package/lib/types/router/PathWithParams.d.ts.map +1 -0
- package/lib/types/router/Route404.d.ts +4 -0
- package/lib/types/router/Route404.d.ts.map +1 -0
- package/lib/types/router/RouteComponent.d.ts +6 -0
- package/lib/types/router/RouteComponent.d.ts.map +1 -0
- package/lib/types/router/Router.d.ts +74 -0
- package/lib/types/router/Router.d.ts.map +1 -0
- package/lib/types/router/RouterProvider.d.ts +15 -0
- package/lib/types/router/RouterProvider.d.ts.map +1 -0
- package/lib/types/router/index.d.ts +11 -0
- package/lib/types/router/index.d.ts.map +1 -0
- package/lib/types/router/path.d.ts +8 -0
- package/lib/types/router/path.d.ts.map +1 -0
- package/lib/types/session/TypeRegistry.d.ts +10 -0
- package/lib/types/session/TypeRegistry.d.ts.map +1 -0
- package/lib/types/session/UserSession.d.ts +40 -0
- package/lib/types/session/UserSession.d.ts.map +1 -0
- package/lib/types/session/UserSessionProvider.d.ts +7 -0
- package/lib/types/session/UserSessionProvider.d.ts.map +1 -0
- package/lib/types/session/auth/composable.d.ts +26 -0
- package/lib/types/session/auth/composable.d.ts.map +1 -0
- package/lib/types/session/auth/firebase.d.ts +10 -0
- package/lib/types/session/auth/firebase.d.ts.map +1 -0
- package/lib/types/session/auth/useAuthState.d.ts +10 -0
- package/lib/types/session/auth/useAuthState.d.ts.map +1 -0
- package/lib/types/session/auth/useCurrentTenant.d.ts +15 -0
- package/lib/types/session/auth/useCurrentTenant.d.ts.map +1 -0
- package/lib/types/session/constants.d.ts +3 -0
- package/lib/types/session/constants.d.ts.map +1 -0
- package/lib/types/session/index.d.ts +9 -0
- package/lib/types/session/index.d.ts.map +1 -0
- package/lib/types/session/useUXTracking.d.ts +6 -0
- package/lib/types/session/useUXTracking.d.ts.map +1 -0
- package/lib/types/shell/SplashScreen.d.ts +7 -0
- package/lib/types/shell/SplashScreen.d.ts.map +1 -0
- package/lib/types/shell/VertesiaShell.d.ts +10 -0
- package/lib/types/shell/VertesiaShell.d.ts.map +1 -0
- package/lib/types/shell/apps/AppInstallationProvider.d.ts +12 -0
- package/lib/types/shell/apps/AppInstallationProvider.d.ts.map +1 -0
- package/lib/types/shell/apps/AppProjectSelector.d.ts +12 -0
- package/lib/types/shell/apps/AppProjectSelector.d.ts.map +1 -0
- package/lib/types/shell/apps/StandaloneApp.d.ts +23 -0
- package/lib/types/shell/apps/StandaloneApp.d.ts.map +1 -0
- package/lib/types/shell/apps/index.d.ts +4 -0
- package/lib/types/shell/apps/index.d.ts.map +1 -0
- package/lib/types/shell/index.d.ts +8 -0
- package/lib/types/shell/index.d.ts.map +1 -0
- package/lib/types/shell/login/EnterpriseSigninButton.d.ts +6 -0
- package/lib/types/shell/login/EnterpriseSigninButton.d.ts.map +1 -0
- package/lib/types/shell/login/GitHubSignInButton.d.ts +6 -0
- package/lib/types/shell/login/GitHubSignInButton.d.ts.map +1 -0
- package/lib/types/shell/login/GoogleSignInButton.d.ts +6 -0
- package/lib/types/shell/login/GoogleSignInButton.d.ts.map +1 -0
- package/lib/types/shell/login/InviteAcceptModal.d.ts +2 -0
- package/lib/types/shell/login/InviteAcceptModal.d.ts.map +1 -0
- package/lib/types/shell/login/MicrosoftSigninButton.d.ts +6 -0
- package/lib/types/shell/login/MicrosoftSigninButton.d.ts.map +1 -0
- package/lib/types/shell/login/PreviewIcon.d.ts +6 -0
- package/lib/types/shell/login/PreviewIcon.d.ts.map +1 -0
- package/lib/types/shell/login/SignInModal.d.ts +7 -0
- package/lib/types/shell/login/SignInModal.d.ts.map +1 -0
- package/lib/types/shell/login/SigninScreen.d.ts +9 -0
- package/lib/types/shell/login/SigninScreen.d.ts.map +1 -0
- package/lib/types/shell/login/SignupForm.d.ts +8 -0
- package/lib/types/shell/login/SignupForm.d.ts.map +1 -0
- package/lib/types/shell/login/TerminalLogin.d.ts +2 -0
- package/lib/types/shell/login/TerminalLogin.d.ts.map +1 -0
- package/lib/types/shell/login/UserInfo.d.ts +6 -0
- package/lib/types/shell/login/UserInfo.d.ts.map +1 -0
- package/lib/types/shell/login/UserSessionMenu.d.ts +9 -0
- package/lib/types/shell/login/UserSessionMenu.d.ts.map +1 -0
- package/lib/types/shell/utils.d.ts +2 -0
- package/lib/types/shell/utils.d.ts.map +1 -0
- package/lib/types/widgets/Progress.d.ts +6 -0
- package/lib/types/widgets/Progress.d.ts.map +1 -0
- package/lib/types/widgets/SvgIcon.d.ts +7 -0
- package/lib/types/widgets/SvgIcon.d.ts.map +1 -0
- package/lib/types/widgets/codemirror/CodeMirrorEditor.d.ts +24 -0
- package/lib/types/widgets/codemirror/CodeMirrorEditor.d.ts.map +1 -0
- package/lib/types/widgets/codemirror/CodemirrorStateSingleton.d.ts +15 -0
- package/lib/types/widgets/codemirror/CodemirrorStateSingleton.d.ts.map +1 -0
- package/lib/types/widgets/codemirror/MonacoEditor.d.ts +38 -0
- package/lib/types/widgets/codemirror/MonacoEditor.d.ts.map +1 -0
- package/lib/types/widgets/codemirror/index.d.ts +5 -0
- package/lib/types/widgets/codemirror/index.d.ts.map +1 -0
- package/lib/types/widgets/form/Form.d.ts +22 -0
- package/lib/types/widgets/form/Form.d.ts.map +1 -0
- package/lib/types/widgets/form/FormContext.d.ts +20 -0
- package/lib/types/widgets/form/FormContext.d.ts.map +1 -0
- package/lib/types/widgets/form/ManagedObject.d.ts +82 -0
- package/lib/types/widgets/form/ManagedObject.d.ts.map +1 -0
- package/lib/types/widgets/form/fields.d.ts +16 -0
- package/lib/types/widgets/form/fields.d.ts.map +1 -0
- package/lib/types/widgets/form/index.d.ts +7 -0
- package/lib/types/widgets/form/index.d.ts.map +1 -0
- package/lib/types/widgets/form/inputs.d.ts +8 -0
- package/lib/types/widgets/form/inputs.d.ts.map +1 -0
- package/lib/types/widgets/form/schema.d.ts +47 -0
- package/lib/types/widgets/form/schema.d.ts.map +1 -0
- package/lib/types/widgets/index.d.ts +12 -0
- package/lib/types/widgets/index.d.ts.map +1 -0
- package/lib/types/widgets/json-view/JSONCode.d.ts +22 -0
- package/lib/types/widgets/json-view/JSONCode.d.ts.map +1 -0
- package/lib/types/widgets/json-view/JSONDisplay.d.ts +8 -0
- package/lib/types/widgets/json-view/JSONDisplay.d.ts.map +1 -0
- package/lib/types/widgets/json-view/JSONView.d.ts +7 -0
- package/lib/types/widgets/json-view/JSONView.d.ts.map +1 -0
- package/lib/types/widgets/json-view/index.d.ts +5 -0
- package/lib/types/widgets/json-view/index.d.ts.map +1 -0
- package/lib/types/widgets/json-view/types.d.ts +8 -0
- package/lib/types/widgets/json-view/types.d.ts.map +1 -0
- package/lib/types/widgets/markdown/CodeBlockRendering.d.ts +22 -0
- package/lib/types/widgets/markdown/CodeBlockRendering.d.ts.map +1 -0
- package/lib/types/widgets/markdown/MarkdownRenderer.d.ts +26 -0
- package/lib/types/widgets/markdown/MarkdownRenderer.d.ts.map +1 -0
- package/lib/types/widgets/markdown/MermaidDiagram.d.ts +23 -0
- package/lib/types/widgets/markdown/MermaidDiagram.d.ts.map +1 -0
- package/lib/types/widgets/markdown/index.d.ts +3 -0
- package/lib/types/widgets/markdown/index.d.ts.map +1 -0
- package/lib/types/widgets/popover/Popover.d.ts +38 -0
- package/lib/types/widgets/popover/Popover.d.ts.map +1 -0
- package/lib/types/widgets/popover/context.d.ts +8 -0
- package/lib/types/widgets/popover/context.d.ts.map +1 -0
- package/lib/types/widgets/popover/index.d.ts +3 -0
- package/lib/types/widgets/popover/index.d.ts.map +1 -0
- package/lib/types/widgets/popover/slots.d.ts +5 -0
- package/lib/types/widgets/popover/slots.d.ts.map +1 -0
- package/lib/types/widgets/properties/PropertiesView.d.ts +11 -0
- package/lib/types/widgets/properties/PropertiesView.d.ts.map +1 -0
- package/lib/types/widgets/properties/index.d.ts +2 -0
- package/lib/types/widgets/properties/index.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/ManagedSchema.d.ts +75 -0
- package/lib/types/widgets/schema-editor/ManagedSchema.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/editor/Editable.d.ts +40 -0
- package/lib/types/widgets/schema-editor/editor/Editable.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/editor/EditableSchemaProperty.d.ts +8 -0
- package/lib/types/widgets/schema-editor/editor/EditableSchemaProperty.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/editor/PropertyEditor.d.ts +5 -0
- package/lib/types/widgets/schema-editor/editor/PropertyEditor.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/editor/PropertyViewer.d.ts +4 -0
- package/lib/types/widgets/schema-editor/editor/PropertyViewer.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/editor/SchemaContext.d.ts +3 -0
- package/lib/types/widgets/schema-editor/editor/SchemaContext.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/editor/SchemaEditor.d.ts +9 -0
- package/lib/types/widgets/schema-editor/editor/SchemaEditor.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/index.d.ts +7 -0
- package/lib/types/widgets/schema-editor/index.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/json-schema4-utils.d.ts +16 -0
- package/lib/types/widgets/schema-editor/json-schema4-utils.d.ts.map +1 -0
- package/lib/types/widgets/schema-editor/type-signature.d.ts +19 -0
- package/lib/types/widgets/schema-editor/type-signature.d.ts.map +1 -0
- package/lib/types/widgets/upload/DropZone.d.ts +41 -0
- package/lib/types/widgets/upload/DropZone.d.ts.map +1 -0
- package/lib/types/widgets/upload/UploadResultCategory.d.ts +26 -0
- package/lib/types/widgets/upload/UploadResultCategory.d.ts.map +1 -0
- package/lib/types/widgets/upload/UploadSummary.d.ts +38 -0
- package/lib/types/widgets/upload/UploadSummary.d.ts.map +1 -0
- package/lib/types/widgets/upload/index.d.ts +4 -0
- package/lib/types/widgets/upload/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/Attributes/index.d.ts +6 -0
- package/lib/types/widgets/xml-viewer/components/Attributes/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/CDataTag/index.d.ts +8 -0
- package/lib/types/widgets/xml-viewer/components/CDataTag/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/CollapseIcon/index.d.ts +5 -0
- package/lib/types/widgets/xml-viewer/components/CollapseIcon/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/CommentTag/index.d.ts +9 -0
- package/lib/types/widgets/xml-viewer/components/CommentTag/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/DeclarationTag/index.d.ts +8 -0
- package/lib/types/widgets/xml-viewer/components/DeclarationTag/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/Elements/index.d.ts +8 -0
- package/lib/types/widgets/xml-viewer/components/Elements/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/InvalidXml/index.d.ts +2 -0
- package/lib/types/widgets/xml-viewer/components/InvalidXml/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/Tag/index.d.ts +13 -0
- package/lib/types/widgets/xml-viewer/components/Tag/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/TextElement/index.d.ts +8 -0
- package/lib/types/widgets/xml-viewer/components/TextElement/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/XMLViewer.d.ts +3 -0
- package/lib/types/widgets/xml-viewer/components/XMLViewer.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/components/types.d.ts +104 -0
- package/lib/types/widgets/xml-viewer/components/types.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/constants/index.d.ts +27 -0
- package/lib/types/widgets/xml-viewer/constants/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/context/xml-viewer-context.d.ts +4 -0
- package/lib/types/widgets/xml-viewer/context/xml-viewer-context.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/helpers/index.d.ts +13 -0
- package/lib/types/widgets/xml-viewer/helpers/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/hooks/useCollapsible.d.ts +15 -0
- package/lib/types/widgets/xml-viewer/hooks/useCollapsible.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/hooks/useXMLViewer.d.ts +10 -0
- package/lib/types/widgets/xml-viewer/hooks/useXMLViewer.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/index.d.ts +3 -0
- package/lib/types/widgets/xml-viewer/index.d.ts.map +1 -0
- package/lib/types/widgets/xml-viewer/types/index.d.ts +16 -0
- package/lib/types/widgets/xml-viewer/types/index.d.ts.map +1 -0
- package/lib/vertesia-ui-core.js +2 -0
- package/lib/vertesia-ui-core.js.map +1 -0
- package/lib/vertesia-ui-env.js +2 -0
- package/lib/vertesia-ui-env.js.map +1 -0
- package/lib/vertesia-ui-features.js +2 -0
- package/lib/vertesia-ui-features.js.map +1 -0
- package/lib/vertesia-ui-layout.js +2 -0
- package/lib/vertesia-ui-layout.js.map +1 -0
- package/lib/vertesia-ui-router.js +2 -0
- package/lib/vertesia-ui-router.js.map +1 -0
- package/lib/vertesia-ui-session.js +2 -0
- package/lib/vertesia-ui-session.js.map +1 -0
- package/lib/vertesia-ui-shell.js +2 -0
- package/lib/vertesia-ui-shell.js.map +1 -0
- package/lib/vertesia-ui-widgets.js +2 -0
- package/lib/vertesia-ui-widgets.js.map +1 -0
- package/llms.txt +494 -0
- package/package.json +189 -0
- package/src/core/components/Avatar.tsx +67 -0
- package/src/core/components/Badge.tsx +118 -0
- package/src/core/components/Button.tsx +63 -0
- package/src/core/components/Center.tsx +12 -0
- package/src/core/components/ComboBox.tsx +488 -0
- package/src/core/components/ConfirmModal.tsx +51 -0
- package/src/core/components/DeleteModal.tsx +45 -0
- package/src/core/components/Divider.tsx +11 -0
- package/src/core/components/Dropdown.tsx +63 -0
- package/src/core/components/DropdownList.tsx +72 -0
- package/src/core/components/EmptyCollection.tsx +41 -0
- package/src/core/components/FileUpload.tsx +196 -0
- package/src/core/components/FormItem.tsx +36 -0
- package/src/core/components/InputList.tsx +112 -0
- package/src/core/components/Link.tsx +16 -0
- package/src/core/components/MenuList.tsx +41 -0
- package/src/core/components/MessageBox.tsx +101 -0
- package/src/core/components/Modal.tsx +144 -0
- package/src/core/components/NumberInput.tsx +64 -0
- package/src/core/components/Overlay.tsx +129 -0
- package/src/core/components/Panel.tsx +34 -0
- package/src/core/components/Portal.tsx +33 -0
- package/src/core/components/RadioGroup.tsx +100 -0
- package/src/core/components/SelectBox.tsx +188 -0
- package/src/core/components/SelectList.tsx +95 -0
- package/src/core/components/SelectStack.tsx +63 -0
- package/src/core/components/SidePanel.tsx +114 -0
- package/src/core/components/Spinner.tsx +33 -0
- package/src/core/components/Switch.tsx +30 -0
- package/src/core/components/TagsInput.tsx +388 -0
- package/src/core/components/index.ts +41 -0
- package/src/core/components/libs/utils.tsx +6 -0
- package/src/core/components/libs/visuallyHidden.tsx +25 -0
- package/src/core/components/popup/Popup.tsx +94 -0
- package/src/core/components/popup/PopupController.ts +182 -0
- package/src/core/components/popup/index.ts +3 -0
- package/src/core/components/popup/position.ts +277 -0
- package/src/core/components/popup/utils.ts +82 -0
- package/src/core/components/shadcn/breadcrumb.tsx +193 -0
- package/src/core/components/shadcn/button.tsx +156 -0
- package/src/core/components/shadcn/calendar.tsx +29 -0
- package/src/core/components/shadcn/card.tsx +76 -0
- package/src/core/components/shadcn/checkbox.tsx +28 -0
- package/src/core/components/shadcn/command.tsx +176 -0
- package/src/core/components/shadcn/dialog.tsx +266 -0
- package/src/core/components/shadcn/filters/DynamicLabel.tsx +44 -0
- package/src/core/components/shadcn/filters/animateChangeInHeight.tsx +41 -0
- package/src/core/components/shadcn/filters/comboBox/DateCombobox.tsx +211 -0
- package/src/core/components/shadcn/filters/comboBox/SelectCombobox.tsx +145 -0
- package/src/core/components/shadcn/filters/comboBox/StringListCombobox.tsx +76 -0
- package/src/core/components/shadcn/filters/comboBox/TextCombobox.tsx +81 -0
- package/src/core/components/shadcn/filters/comboBox/comboBox.tsx +4 -0
- package/src/core/components/shadcn/filters/filter/SelectFilter.tsx +161 -0
- package/src/core/components/shadcn/filters/filter/StringListFilter.tsx +58 -0
- package/src/core/components/shadcn/filters/filter/TextFilter.tsx +69 -0
- package/src/core/components/shadcn/filters/filter/dateFilter.tsx +256 -0
- package/src/core/components/shadcn/filters/filter-styles.ts +87 -0
- package/src/core/components/shadcn/filters/filterBar.tsx +375 -0
- package/src/core/components/shadcn/filters/filters.tsx +141 -0
- package/src/core/components/shadcn/filters/index.ts +5 -0
- package/src/core/components/shadcn/filters/types.ts +38 -0
- package/src/core/components/shadcn/heading.tsx +23 -0
- package/src/core/components/shadcn/index.ts +23 -0
- package/src/core/components/shadcn/input.tsx +92 -0
- package/src/core/components/shadcn/label.tsx +31 -0
- package/src/core/components/shadcn/popover.tsx +115 -0
- package/src/core/components/shadcn/resizeable.tsx +54 -0
- package/src/core/components/shadcn/selectBox.tsx +337 -0
- package/src/core/components/shadcn/separator.tsx +31 -0
- package/src/core/components/shadcn/tabs.tsx +302 -0
- package/src/core/components/shadcn/text.tsx +33 -0
- package/src/core/components/shadcn/textarea.tsx +21 -0
- package/src/core/components/shadcn/theme/ThemeProvider.tsx +75 -0
- package/src/core/components/shadcn/theme/ThemeSwitcher.tsx +35 -0
- package/src/core/components/shadcn/tooltip.tsx +59 -0
- package/src/core/components/styles.ts +11 -0
- package/src/core/components/table/index.tsx +70 -0
- package/src/core/components/tabs/Tabs.tsx +132 -0
- package/src/core/components/tabs/TabsContext.ts +25 -0
- package/src/core/components/tabs/index.ts +2 -0
- package/src/core/components/toast/NotificationPanel.tsx +107 -0
- package/src/core/components/toast/ToastContext.ts +12 -0
- package/src/core/components/toast/ToastProps.ts +6 -0
- package/src/core/components/toast/ToastProvider.tsx +26 -0
- package/src/core/components/toast/index.ts +2 -0
- package/src/core/hooks/CompositeState.tsx +292 -0
- package/src/core/hooks/PortalContainerProvider.tsx +59 -0
- package/src/core/hooks/SharedState.tsx +69 -0
- package/src/core/hooks/index.ts +15 -0
- package/src/core/hooks/useClickOutside.tsx +29 -0
- package/src/core/hooks/useCopyToClipboard.tsx +28 -0
- package/src/core/hooks/useDarkMode.ts +11 -0
- package/src/core/hooks/useDebounce.tsx +15 -0
- package/src/core/hooks/useEventSource.ts +35 -0
- package/src/core/hooks/useFetch.ts +51 -0
- package/src/core/hooks/useFlag.tsx +13 -0
- package/src/core/hooks/useIntersectionObserver.tsx +40 -0
- package/src/core/hooks/useIsFistRendering.ts +17 -0
- package/src/core/hooks/useSafeLayoutEffect.ts +5 -0
- package/src/core/hooks/useScrollableSearch.tsx +193 -0
- package/src/core/hooks/useSharedValue.ts +22 -0
- package/src/core/index.ts +3 -0
- package/src/core/utils/cn.ts +6 -0
- package/src/core/utils/index.ts +1 -0
- package/src/env/index.ts +126 -0
- package/src/features/activity-doc/ActivityDoc.tsx +199 -0
- package/src/features/activity-doc/index.ts +1 -0
- package/src/features/agent/CHART_INSTRUCTIONS.md +228 -0
- package/src/features/agent/PayloadBuilder.tsx +319 -0
- package/src/features/agent/chat/AgentChart.tsx +702 -0
- package/src/features/agent/chat/AnimatedThinkingDots.tsx +350 -0
- package/src/features/agent/chat/AskUserWidget.tsx +362 -0
- package/src/features/agent/chat/ImageLightbox.tsx +99 -0
- package/src/features/agent/chat/JumpingDots.tsx +16 -0
- package/src/features/agent/chat/ModernAgentConversation.tsx +1465 -0
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +483 -0
- package/src/features/agent/chat/ModernAgentOutput/BatchProgressPanel.tsx +228 -0
- package/src/features/agent/chat/ModernAgentOutput/Header.tsx +231 -0
- package/src/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.tsx +66 -0
- package/src/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.tsx +271 -0
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +550 -0
- package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +512 -0
- package/src/features/agent/chat/ModernAgentOutput/MessagesContainer.tsx +63 -0
- package/src/features/agent/chat/ModernAgentOutput/PlanPanel.tsx +124 -0
- package/src/features/agent/chat/ModernAgentOutput/README-image-support.md +43 -0
- package/src/features/agent/chat/ModernAgentOutput/SlideInPanel.tsx +72 -0
- package/src/features/agent/chat/ModernAgentOutput/SlidingMessages.tsx +97 -0
- package/src/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.tsx +185 -0
- package/src/features/agent/chat/ModernAgentOutput/StackedMessages.tsx +33 -0
- package/src/features/agent/chat/ModernAgentOutput/StreamingMessage.tsx +323 -0
- package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +583 -0
- package/src/features/agent/chat/ModernAgentOutput/WorkstreamTabs.tsx +167 -0
- package/src/features/agent/chat/ModernAgentOutput/utils.ts +527 -0
- package/src/features/agent/chat/ModernAgentOutput/with-types.d.ts +15 -0
- package/src/features/agent/chat/SkillWidgetProvider.tsx +106 -0
- package/src/features/agent/chat/SlidingThinkingIndicator.tsx +459 -0
- package/src/features/agent/chat/VegaLiteChart.tsx +1081 -0
- package/src/features/agent/chat/WaitingMessages.ts +66 -0
- package/src/features/agent/chat/applyParameterValues.test.ts +258 -0
- package/src/features/agent/chat/index.ts +35 -0
- package/src/features/agent/chat/useArtifactUrlCache.tsx +92 -0
- package/src/features/agent/createChartTool.ts +643 -0
- package/src/features/agent/examples.ts +321 -0
- package/src/features/agent/index.ts +4 -0
- package/src/features/agent/visualization.ts +227 -0
- package/src/features/errors/PanelErrorBoundary.tsx +30 -0
- package/src/features/errors/RowErrorBoundary.tsx +28 -0
- package/src/features/errors/VertesiaErrorBoundary.tsx +28 -0
- package/src/features/errors/WidgetErrorBoundary.tsx +27 -0
- package/src/features/errors/index.ts +4 -0
- package/src/features/facets/CollectionsFacetsNav.tsx +119 -0
- package/src/features/facets/DocumentsFacetsNav.tsx +184 -0
- package/src/features/facets/EnvironmentFacet.tsx +53 -0
- package/src/features/facets/InteractionsFacetsNav.tsx +121 -0
- package/src/features/facets/PromptsFacetsNav.tsx +110 -0
- package/src/features/facets/RunsFacetsNav.tsx +209 -0
- package/src/features/facets/WorkflowExecutionsFacetsNav.tsx +134 -0
- package/src/features/facets/index.ts +16 -0
- package/src/features/facets/utils/SearchInterface.tsx +12 -0
- package/src/features/facets/utils/StringFacet.tsx +23 -0
- package/src/features/facets/utils/StringListFacet.tsx +22 -0
- package/src/features/facets/utils/TypeFacet.tsx +59 -0
- package/src/features/facets/utils/VEnvironmentFacet.tsx +43 -0
- package/src/features/facets/utils/VInteractionFacet.tsx +73 -0
- package/src/features/facets/utils/VStringFacet.tsx +41 -0
- package/src/features/facets/utils/VTypeFacet.tsx +81 -0
- package/src/features/facets/utils/VUserFacet.tsx +50 -0
- package/src/features/facets/utils/utils.tsx +9 -0
- package/src/features/index.ts +11 -0
- package/src/features/layout/GenericPageNavHeader.tsx +122 -0
- package/src/features/layout/NotFoundView.tsx +11 -0
- package/src/features/layout/index.ts +2 -0
- package/src/features/magic-pdf/AnnotatedImageSlider.tsx +482 -0
- package/src/features/magic-pdf/DownloadPopover.tsx +70 -0
- package/src/features/magic-pdf/ExtractedContentView.tsx +132 -0
- package/src/features/magic-pdf/MagicPdfProvider.tsx +297 -0
- package/src/features/magic-pdf/MagicPdfView.tsx +221 -0
- package/src/features/magic-pdf/index.ts +1 -0
- package/src/features/magic-pdf/types.ts +1 -0
- package/src/features/pdf-viewer/PdfPageRenderer.tsx +612 -0
- package/src/features/pdf-viewer/PdfPageSlider.tsx +473 -0
- package/src/features/pdf-viewer/SimplePdfViewer.tsx +142 -0
- package/src/features/pdf-viewer/index.ts +3 -0
- package/src/features/permissions/SecureButton.tsx +18 -0
- package/src/features/permissions/SecureSidebarItem.tsx +19 -0
- package/src/features/permissions/UserPermissionsProvider.tsx +103 -0
- package/src/features/permissions/helpers.ts +16 -0
- package/src/features/permissions/index.ts +4 -0
- package/src/features/store/collections/BrowseCollectionView.tsx +49 -0
- package/src/features/store/collections/CollectionsTable.tsx +125 -0
- package/src/features/store/collections/CreateCollection.tsx +140 -0
- package/src/features/store/collections/EditCollectionView.tsx +294 -0
- package/src/features/store/collections/SelectCollection.tsx +231 -0
- package/src/features/store/collections/SharedPropsEditor.tsx +60 -0
- package/src/features/store/collections/SyncMemberHeadsToggle.tsx +48 -0
- package/src/features/store/collections/index.ts +7 -0
- package/src/features/store/index.ts +3 -0
- package/src/features/store/objects/DocumentPreviewPanel.tsx +414 -0
- package/src/features/store/objects/DocumentSearchResults.tsx +382 -0
- package/src/features/store/objects/DocumentSelectionProvider.tsx +99 -0
- package/src/features/store/objects/DocumentTable.tsx +419 -0
- package/src/features/store/objects/ExportPropertiesModal.tsx +89 -0
- package/src/features/store/objects/components/ContentDispositionButton.tsx +45 -0
- package/src/features/store/objects/components/ContentOverview.tsx +1362 -0
- package/src/features/store/objects/components/DocumentIcon.tsx +134 -0
- package/src/features/store/objects/components/DocumentInput.tsx +89 -0
- package/src/features/store/objects/components/PropertiesEditorModal.tsx +257 -0
- package/src/features/store/objects/components/SaveVersionConfirmModal.tsx +146 -0
- package/src/features/store/objects/components/SelectDocument.tsx +109 -0
- package/src/features/store/objects/components/SelectDocumentModal.tsx +20 -0
- package/src/features/store/objects/components/VectorSearchWidget.tsx +143 -0
- package/src/features/store/objects/components/index.ts +9 -0
- package/src/features/store/objects/components/useContentPanelHooks.ts +185 -0
- package/src/features/store/objects/components/useDownloadObject.ts +29 -0
- package/src/features/store/objects/index.ts +10 -0
- package/src/features/store/objects/layout/DocumentTableColumn.tsx +99 -0
- package/src/features/store/objects/layout/documentLayout.tsx +69 -0
- package/src/features/store/objects/layout/index.ts +2 -0
- package/src/features/store/objects/layout/knowledge.md +239 -0
- package/src/features/store/objects/layout/renderers.tsx +185 -0
- package/src/features/store/objects/search/DocumentSearchContext.ts +215 -0
- package/src/features/store/objects/search/DocumentSearchProvider.tsx +50 -0
- package/src/features/store/objects/search/index.ts +2 -0
- package/src/features/store/objects/selection/ObjectsActionContext.tsx +197 -0
- package/src/features/store/objects/selection/ObjectsActionSpec.ts +31 -0
- package/src/features/store/objects/selection/SelectionActions.tsx +150 -0
- package/src/features/store/objects/selection/actions/AddToCollectionAction.tsx +137 -0
- package/src/features/store/objects/selection/actions/ChangeTypeAction.tsx +76 -0
- package/src/features/store/objects/selection/actions/ConfirmAction.tsx +46 -0
- package/src/features/store/objects/selection/actions/DeleteObjectsAction.tsx +97 -0
- package/src/features/store/objects/selection/actions/ExportPropertiesAction.tsx +117 -0
- package/src/features/store/objects/selection/actions/RemoveFromCollectionAction.tsx +77 -0
- package/src/features/store/objects/selection/actions/StartWorkflowComponent.tsx +122 -0
- package/src/features/store/objects/selection/actions/index.ts +7 -0
- package/src/features/store/objects/selection/index.ts +4 -0
- package/src/features/store/objects/upload/DocumentUploadModal.tsx +927 -0
- package/src/features/store/objects/upload/index.ts +3 -0
- package/src/features/store/objects/upload/useSmartFileUploadProcessing.ts +245 -0
- package/src/features/store/objects/upload/useUploadHandler.ts +325 -0
- package/src/features/store/types/ContentObjectTypesSearch.tsx +115 -0
- package/src/features/store/types/ContentObjectTypesTable.tsx +41 -0
- package/src/features/store/types/CreateOrUpdateTypeModal.tsx +63 -0
- package/src/features/store/types/ObjectSchemaEditor.tsx +141 -0
- package/src/features/store/types/SelectContentType.tsx +88 -0
- package/src/features/store/types/SelectContentTypeModal.tsx +142 -0
- package/src/features/store/types/TableLayoutEditor.tsx +104 -0
- package/src/features/store/types/index.ts +8 -0
- package/src/features/store/types/search/ObjectTypeSearchContext.tsx +119 -0
- package/src/features/store/types/search/ObjectTypeSearchProvider.tsx +24 -0
- package/src/features/store/types/search/index.ts +2 -0
- package/src/features/user/UserAvatar.tsx +34 -0
- package/src/features/user/UserInfo.tsx +282 -0
- package/src/features/user/index.ts +2 -0
- package/src/features/utils/index.ts +5 -0
- package/src/features/utils/mimeType.ts +18 -0
- package/src/features/utils/print.ts +189 -0
- package/src/features/utils/rendition.ts +97 -0
- package/src/features/utils/text.ts +10 -0
- package/src/features/utils/workflowStatus.ts +44 -0
- package/src/layout/AppLayout.tsx +132 -0
- package/src/layout/FullHeightLayout.tsx +74 -0
- package/src/layout/Navbar.tsx +127 -0
- package/src/layout/Sidebar.tsx +139 -0
- package/src/layout/SidebarContext.ts +17 -0
- package/src/layout/TitleBar.tsx +7 -0
- package/src/layout/index.ts +6 -0
- package/src/router/FixLinks.tsx +28 -0
- package/src/router/HistoryNavigator.ts +237 -0
- package/src/router/Nav.tsx +56 -0
- package/src/router/NestedNavigationContext.tsx +32 -0
- package/src/router/NestedRouterProvider.tsx +64 -0
- package/src/router/PathMatcher.ts +166 -0
- package/src/router/PathWithParams.ts +34 -0
- package/src/router/Route404.tsx +18 -0
- package/src/router/RouteComponent.tsx +41 -0
- package/src/router/Router.tsx +216 -0
- package/src/router/RouterProvider.tsx +55 -0
- package/src/router/index.ts +10 -0
- package/src/router/path.ts +154 -0
- package/src/session/TypeRegistry.ts +27 -0
- package/src/session/UserSession.ts +228 -0
- package/src/session/UserSessionProvider.tsx +189 -0
- package/src/session/auth/composable.ts +295 -0
- package/src/session/auth/firebase.ts +168 -0
- package/src/session/auth/useAuthState.ts +57 -0
- package/src/session/auth/useCurrentTenant.ts +73 -0
- package/src/session/constants.ts +2 -0
- package/src/session/index.ts +8 -0
- package/src/session/useUXTracking.tsx +38 -0
- package/src/shell/SplashScreen.tsx +74 -0
- package/src/shell/VertesiaShell.tsx +29 -0
- package/src/shell/apps/AppInstallationProvider.tsx +22 -0
- package/src/shell/apps/AppProjectSelector.tsx +58 -0
- package/src/shell/apps/StandaloneApp.tsx +174 -0
- package/src/shell/apps/index.ts +3 -0
- package/src/shell/index.tsx +7 -0
- package/src/shell/login/EnterpriseSigninButton.tsx +109 -0
- package/src/shell/login/GitHubSignInButton.tsx +40 -0
- package/src/shell/login/GoogleSignInButton.tsx +36 -0
- package/src/shell/login/InviteAcceptModal.tsx +94 -0
- package/src/shell/login/MicrosoftSigninButton.tsx +30 -0
- package/src/shell/login/PreviewIcon.tsx +29 -0
- package/src/shell/login/SignInModal.tsx +28 -0
- package/src/shell/login/SigninScreen.tsx +162 -0
- package/src/shell/login/SignupForm.tsx +179 -0
- package/src/shell/login/TerminalLogin.tsx +338 -0
- package/src/shell/login/UserInfo.tsx +78 -0
- package/src/shell/login/UserSessionMenu.tsx +92 -0
- package/src/shell/utils.tsx +7 -0
- package/src/vite-env.d.ts +2 -0
- package/src/widgets/Progress.tsx +10 -0
- package/src/widgets/SvgIcon.tsx +44 -0
- package/src/widgets/codemirror/CodeMirrorEditor.tsx +122 -0
- package/src/widgets/codemirror/CodemirrorStateSingleton.tsx +39 -0
- package/src/widgets/codemirror/MonacoEditor.tsx +200 -0
- package/src/widgets/codemirror/index.ts +6 -0
- package/src/widgets/form/Form.tsx +180 -0
- package/src/widgets/form/FormContext.ts +41 -0
- package/src/widgets/form/ManagedObject.ts +336 -0
- package/src/widgets/form/fields.tsx +36 -0
- package/src/widgets/form/index.ts +6 -0
- package/src/widgets/form/inputs.tsx +45 -0
- package/src/widgets/form/schema.ts +222 -0
- package/src/widgets/index.ts +11 -0
- package/src/widgets/json-view/JSONCode.tsx +176 -0
- package/src/widgets/json-view/JSONDisplay.tsx +24 -0
- package/src/widgets/json-view/JSONView.tsx +183 -0
- package/src/widgets/json-view/index.ts +4 -0
- package/src/widgets/json-view/types.ts +5 -0
- package/src/widgets/markdown/CodeBlockRendering.tsx +56 -0
- package/src/widgets/markdown/MarkdownRenderer.tsx +588 -0
- package/src/widgets/markdown/MermaidDiagram.tsx +115 -0
- package/src/widgets/markdown/index.ts +2 -0
- package/src/widgets/popover/Popover.tsx +171 -0
- package/src/widgets/popover/context.ts +15 -0
- package/src/widgets/popover/index.ts +2 -0
- package/src/widgets/popover/slots.ts +24 -0
- package/src/widgets/properties/PropertiesView.tsx +34 -0
- package/src/widgets/properties/index.ts +1 -0
- package/src/widgets/schema-editor/ManagedSchema.ts +337 -0
- package/src/widgets/schema-editor/editor/Editable.tsx +251 -0
- package/src/widgets/schema-editor/editor/EditableSchemaProperty.tsx +15 -0
- package/src/widgets/schema-editor/editor/PropertyEditor.tsx +150 -0
- package/src/widgets/schema-editor/editor/PropertyViewer.tsx +15 -0
- package/src/widgets/schema-editor/editor/SchemaContext.tsx +9 -0
- package/src/widgets/schema-editor/editor/SchemaEditor.test.ts +48 -0
- package/src/widgets/schema-editor/editor/SchemaEditor.tsx +161 -0
- package/src/widgets/schema-editor/index.ts +6 -0
- package/src/widgets/schema-editor/json-schema4-utils.ts +187 -0
- package/src/widgets/schema-editor/type-signature.ts +39 -0
- package/src/widgets/upload/DropZone.tsx +259 -0
- package/src/widgets/upload/UploadResultCategory.tsx +81 -0
- package/src/widgets/upload/UploadSummary.tsx +115 -0
- package/src/widgets/upload/index.ts +3 -0
- package/src/widgets/xml-viewer/components/Attributes/index.tsx +27 -0
- package/src/widgets/xml-viewer/components/CDataTag/index.tsx +21 -0
- package/src/widgets/xml-viewer/components/CollapseIcon/index.tsx +32 -0
- package/src/widgets/xml-viewer/components/CommentTag/index.tsx +30 -0
- package/src/widgets/xml-viewer/components/DeclarationTag/index.tsx +23 -0
- package/src/widgets/xml-viewer/components/Elements/index.tsx +83 -0
- package/src/widgets/xml-viewer/components/InvalidXml/index.tsx +3 -0
- package/src/widgets/xml-viewer/components/Tag/index.tsx +47 -0
- package/src/widgets/xml-viewer/components/TextElement/index.tsx +28 -0
- package/src/widgets/xml-viewer/components/XMLViewer.tsx +65 -0
- package/src/widgets/xml-viewer/components/types.ts +104 -0
- package/src/widgets/xml-viewer/constants/index.ts +28 -0
- package/src/widgets/xml-viewer/context/xml-viewer-context.ts +12 -0
- package/src/widgets/xml-viewer/helpers/index.ts +56 -0
- package/src/widgets/xml-viewer/hooks/useCollapsible.ts +28 -0
- package/src/widgets/xml-viewer/hooks/useXMLViewer.ts +34 -0
- package/src/widgets/xml-viewer/index.ts +2 -0
- package/src/widgets/xml-viewer/types/index.ts +21 -0
- package/tsconfig.dist.json +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertesia-ui-features.js","sources":["esm/features/activity-doc/ActivityDoc.js","esm/features/agent/chat/JumpingDots.js","esm/features/agent/chat/AnimatedThinkingDots.js","esm/features/agent/chat/ImageLightbox.js","esm/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js","esm/features/agent/chat/AskUserWidget.js","esm/features/agent/chat/WaitingMessages.js","esm/features/agent/chat/ModernAgentOutput/utils.js","esm/features/agent/chat/useArtifactUrlCache.js","esm/features/agent/chat/ModernAgentOutput/MessageItem.js","esm/features/agent/chat/ModernAgentOutput/StreamingMessage.js","esm/features/agent/chat/ModernAgentOutput/ToolCallGroup.js","esm/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js","esm/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js","esm/features/agent/PayloadBuilder.js","esm/features/agent/chat/ModernAgentOutput/Header.js","esm/features/store/objects/components/ContentDispositionButton.js","esm/features/utils/text.js","esm/features/utils/mimeType.js","esm/features/utils/rendition.js","esm/features/utils/print.js","esm/features/utils/workflowStatus.js","esm/features/store/objects/components/SaveVersionConfirmModal.js","esm/features/store/objects/components/PropertiesEditorModal.js","esm/features/pdf-viewer/PdfPageRenderer.js","esm/features/pdf-viewer/PdfPageSlider.js","esm/features/magic-pdf/MagicPdfProvider.js","esm/features/magic-pdf/AnnotatedImageSlider.js","esm/features/magic-pdf/DownloadPopover.js","esm/features/magic-pdf/ExtractedContentView.js","esm/features/magic-pdf/MagicPdfView.js","esm/features/pdf-viewer/SimplePdfViewer.js","esm/features/store/objects/components/useContentPanelHooks.js","esm/features/store/objects/components/ContentOverview.js","esm/features/store/objects/components/DocumentIcon.js","esm/features/facets/utils/utils.js","esm/features/facets/utils/StringFacet.js","esm/features/facets/utils/StringListFacet.js","esm/features/facets/utils/TypeFacet.js","esm/features/facets/utils/VStringFacet.js","esm/features/facets/utils/VTypeFacet.js","esm/features/user/UserInfo.js","esm/features/facets/utils/VUserFacet.js","esm/features/facets/EnvironmentFacet.js","esm/features/facets/RunsFacetsNav.js","esm/features/facets/utils/VInteractionFacet.js","esm/features/facets/utils/VEnvironmentFacet.js","esm/features/facets/WorkflowExecutionsFacetsNav.js","esm/features/facets/DocumentsFacetsNav.js","esm/features/facets/InteractionsFacetsNav.js","esm/features/facets/PromptsFacetsNav.js","esm/features/facets/CollectionsFacetsNav.js","esm/features/store/objects/DocumentSelectionProvider.js","esm/features/store/objects/layout/renderers.js","esm/features/store/objects/layout/DocumentTableColumn.js","esm/features/store/objects/layout/documentLayout.js","esm/features/store/objects/search/DocumentSearchContext.js","esm/features/store/objects/upload/useSmartFileUploadProcessing.js","esm/features/store/objects/upload/DocumentUploadModal.js","esm/features/store/objects/upload/useUploadHandler.js","esm/features/store/objects/DocumentTable.js","esm/features/store/objects/search/DocumentSearchProvider.js","esm/features/store/objects/components/SelectDocument.js","esm/features/store/objects/components/SelectDocumentModal.js","esm/features/store/objects/components/DocumentInput.js","esm/features/store/objects/components/useDownloadObject.js","esm/features/store/objects/DocumentPreviewPanel.js","esm/features/store/objects/components/VectorSearchWidget.js","esm/features/store/objects/DocumentSearchResults.js","esm/features/store/objects/ExportPropertiesModal.js","esm/features/store/collections/BrowseCollectionView.js","esm/features/store/types/SelectContentType.js","esm/features/store/collections/CreateCollection.js","esm/features/store/collections/CollectionsTable.js","esm/features/store/types/ContentObjectTypesTable.js","esm/features/store/types/search/ObjectTypeSearchContext.js","esm/features/store/types/CreateOrUpdateTypeModal.js","esm/features/store/types/ContentObjectTypesSearch.js","esm/features/store/types/ObjectSchemaEditor.js","esm/features/store/types/search/ObjectTypeSearchProvider.js","esm/features/store/types/SelectContentTypeModal.js","esm/features/store/types/TableLayoutEditor.js","esm/features/store/collections/EditCollectionView.js","esm/features/store/collections/SelectCollection.js","esm/features/store/collections/SharedPropsEditor.js","esm/features/store/collections/SyncMemberHeadsToggle.js","esm/features/store/objects/selection/actions/ChangeTypeAction.js","esm/features/store/objects/selection/actions/ConfirmAction.js","esm/features/store/objects/selection/actions/DeleteObjectsAction.js","esm/features/store/objects/selection/actions/ExportPropertiesAction.js","esm/features/store/objects/selection/actions/RemoveFromCollectionAction.js","esm/features/store/objects/selection/actions/StartWorkflowComponent.js","esm/features/store/objects/selection/ObjectsActionContext.js","esm/features/store/objects/selection/actions/AddToCollectionAction.js","esm/features/store/objects/selection/SelectionActions.js","esm/features/agent/chat/ModernAgentOutput/MessageInput.js","esm/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.js","esm/core/components/libs/utils.js","esm/session/UserSession.js","esm/features/agent/chat/VegaLiteChart.js","esm/features/agent/chat/AgentChart.js","esm/features/agent/chat/SkillWidgetProvider.js","esm/features/agent/chat/ModernAgentConversation.js","esm/features/agent/chat/ModernAgentOutput/StackedMessages.js","esm/features/agent/chat/ModernAgentOutput/MessagesContainer.js","esm/features/agent/visualization.js","esm/features/agent/createChartTool.js","esm/features/errors/VertesiaErrorBoundary.js","esm/features/errors/PanelErrorBoundary.js","esm/features/errors/RowErrorBoundary.js","esm/features/errors/WidgetErrorBoundary.js","esm/features/layout/GenericPageNavHeader.js","esm/features/layout/NotFoundView.js","esm/features/permissions/helpers.js","esm/features/permissions/UserPermissionsProvider.js","esm/features/permissions/SecureButton.js","esm/features/permissions/SecureSidebarItem.js","esm/features/user/UserAvatar.js"],"sourcesContent":["import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport clsx from \"clsx\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { useMemo, useState } from \"react\";\nfunction Badge({ children, secondary = false }) {\n const className = secondary ? \"bg-secondary text-primary\" : \"text-foreground bg-muted\";\n return _jsx(\"span\", { className: className, children: children });\n}\n/**\n * Resolve nested array inner type\n * @param innerType\n */\nfunction resolveInnerType(innerType) {\n if (!innerType) {\n return undefined;\n }\n else if (innerType.name === \"array\") {\n return resolveInnerType(innerType.innerType);\n }\n else {\n return innerType;\n }\n}\nfunction PropertySignature({ property }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-x-2\", children: [_jsx(\"div\", { className: \"font-semibold text-gray-600\", children: property.name }), property.optional && _jsx(Badge, { children: \"optional\" }), _jsx(Badge, { children: property.type.value })] }));\n}\nexport function ActivitiesDoc({ activities }) {\n return (_jsx(\"div\", { className: 'flex flex-col gap-y-4 divide-y divide-gray-200', children: activities.map(activity => _jsx(ActivityDoc, { activity: activity }, activity.name)) }));\n}\nfunction ActivitySectionTitle({ code, children }) {\n return (_jsxs(\"div\", { className: \"flex gap-2 items-center border-b border-b-gray-200 mb-2\", children: [_jsx(\"div\", { className: 'text-lg font-medium text-gray-900 py-2 ', children: children }), code && _jsx(\"div\", { children: _jsx(Badge, { children: code }) })] }));\n}\nexport function ActivityDoc({ activity, headingClass, headingRef }) {\n return (_jsxs(\"div\", { className: headingClass, id: activity.name, ref: headingRef, children: [_jsx(\"div\", { className: \"text-xl font-semibold pt-8\", children: activity.title }), _jsx(\"div\", { className: \"pb-4\", children: _jsx(Badge, { children: activity.name }) }), activity.doc &&\n _jsx(\"div\", { className: \"text-gray-700 pb-2\", children: activity.doc }), _jsxs(\"div\", { className: \"pb-4\", children: [_jsx(ActivitySectionTitle, { code: activity.paramsType, children: \"Parameters\" }), _jsx(\"div\", { className: \"divide-y divide-gray-100\", children: activity.params.map(prop => _jsx(PropertyDetails, { property: prop }, prop.name)) })] }), _jsxs(\"div\", { className: \"pb-4\", children: [_jsx(ActivitySectionTitle, { children: \"Returns\" }), _jsx(\"div\", { children: activity.returnType ? activity.returnType.value : \"void\" })] })] }));\n}\nfunction PropertyDetails({ property, className }) {\n const expandable = useMemo(() => {\n const type = resolveInnerType(property.type.innerType) ?? property.type;\n if (type.name === \"object\" && type.members) {\n return _jsx(ObjectMembersPanel, { members: type.members });\n }\n else if (type.name === 'enum' && type.enum) {\n return _jsx(EnumValuesPanel, { values: type.enum });\n }\n else {\n return null;\n }\n }, [property.type.innerType]);\n return (_jsxs(\"div\", { className: clsx(\"py-2\", className), children: [_jsx(PropertySignature, { property: property }), property.doc && _jsx(\"div\", { className: \"text-gray-700 text-sm pt-2\", children: property.doc }), expandable && _jsx(\"div\", { className: \"my-2 overflow-hidden\", children: expandable })] }));\n}\nfunction EnumValuesPanel({ values }) {\n return _jsx(\"div\", { className: \"flex flex-wrap items-center gap-2\", children: values.map((v, i) => _jsx(Badge, { secondary: true, children: v }, i)) });\n}\nfunction ObjectMembersPanel({ members }) {\n return _jsx(ExpandablePanel, { className: 'rounded-md border border-gray-200', button: (isOn) => (_jsxs(\"div\", { className: \"px-4 py-2 flex items-center gap-x-2 text-sm font-medium hover:text-blue-600\", children: [_jsx(ExpandIcon, { isOpen: isOn }), isOn ?\n _jsx(\"div\", { children: \"Hide child properties\" })\n :\n _jsx(\"div\", { children: \"Show child properties\" })] })), body: _jsx(NestedPropertiesDetails, { properties: members }) });\n}\nfunction NestedPropertiesDetails({ properties }) {\n return (_jsx(\"div\", { className: 'border-l-2 border-l-blue-200 flex flex-col divide-y divide-gray-100 border-t border-t-gray-200', children: properties.map(prop => _jsx(PropertyDetails, { property: prop, className: \"px-4 py-2\" }, prop.name)) }));\n}\nfunction ExpandablePanel({ button, body, className, isInitiallyOpen }) {\n const [isExpanded, setExpanded] = useState(isInitiallyOpen || false);\n return (_jsxs(\"div\", { className: clsx(isExpanded ? \"block\" : \"inline-block\", className), children: [_jsx(\"button\", { className: 'p-0 m-0 bg-transparent', onClick: () => setExpanded(!isExpanded), children: _jsx(AnimatePresence, { children: button(isExpanded) }) }), _jsx(AnimatePresence, { children: isExpanded && _jsx(motion.div, { className: 'overflow-hidden', initial: { height: 0, opacity: 0 }, animate: { height: 'auto', opacity: 1 }, exit: { height: 0, opacity: 0 }, transition: { duration: 0.3, ease: 'easeOut' }, children: body }) })] }));\n}\nfunction ExpandIcon({ isOpen }) {\n return (_jsx(AnimatePresence, { propagate: true, mode: \"wait\", children: _jsx(motion.div, { className: \"font-mono font-semibold text-gray-400 text-lg\", initial: { rotate: 0 }, animate: { rotate: isOpen ? 45 : 0 }, transition: { duration: 0.2 }, children: \"+\" }, \"closeIcon\") }));\n}\n//# sourceMappingURL=ActivityDoc.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from \"@vertesia/ui/core\";\nexport function JumpingDots({ className, inline = false }) {\n return (_jsxs(\"div\", { className: cn(\"flex items-center gap-1\", inline ? \"inline-flex\" : \"\", className), children: [_jsx(\"div\", { className: \"w-2 h-2 bg-blue-500 rounded-full animate-[jumping_1s_infinite_ease-in-out] hover:bg-blue-600\", style: { transform: 'translateY(0)', animationRange: '0px -8px' } }), _jsx(\"div\", { className: \"w-2 h-2 bg-blue-500 rounded-full animate-[jumping_1s_0.3s_infinite_ease-in-out] hover:bg-blue-600\", style: { transform: 'translateY(0)', animationRange: '0px -8px' } }), _jsx(\"div\", { className: \"w-2 h-2 bg-blue-500 rounded-full animate-[jumping_1s_0.6s_infinite_ease-in-out] hover:bg-blue-600\", style: { transform: 'translateY(0)', animationRange: '0px -8px' } })] }));\n}\n//# sourceMappingURL=JumpingDots.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from \"@vertesia/ui/core\";\nimport { useEffect, useState } from \"react\";\nexport function AnimatedThinkingDots({ className, inline = false, color = 'blue' }) {\n // Enhanced gradient colors based on the color prop\n const gradientColors = {\n blue: \"from-blue-400 to-indigo-500 dark:from-blue-500 dark:to-indigo-400\",\n purple: \"from-purple-400 to-violet-500 dark:from-purple-500 dark:to-violet-400\",\n teal: \"from-teal-400 to-emerald-500 dark:from-teal-500 dark:to-emerald-400\",\n green: \"from-green-400 to-emerald-500 dark:from-green-500 dark:to-emerald-400\",\n amber: \"from-amber-400 to-orange-500 dark:from-amber-500 dark:to-orange-400\"\n };\n const gradientClass = gradientColors[color];\n return (_jsxs(\"div\", { className: cn(\"flex items-center gap-1.5\", inline ? \"inline-flex\" : \"\", className), children: [_jsx(\"div\", { className: `w-2 h-2 bg-gradient-to-r ${gradientClass} rounded-full animate-[bounce_1.2s_ease-in-out_infinite]` }), _jsx(\"div\", { className: `w-2 h-2 bg-gradient-to-r ${gradientClass} rounded-full animate-[bounce_1.2s_ease-in-out_0.2s_infinite]` }), _jsx(\"div\", { className: `w-2 h-2 bg-gradient-to-r ${gradientClass} rounded-full animate-[bounce_1.2s_ease-in-out_0.4s_infinite]` })] }));\n}\nexport function PulsatingCircle({ className, size = 'md', color = 'blue' }) {\n // Enhanced size classes\n const sizeClasses = {\n sm: 'w-3 h-3',\n md: 'w-5 h-5',\n lg: 'w-7 h-7'\n };\n // Enhanced color mapping with gradients\n const colorClasses = {\n blue: 'bg-blue-500 dark:bg-blue-400',\n purple: 'bg-purple-500 dark:bg-purple-400',\n teal: 'bg-teal-500 dark:bg-teal-400',\n green: 'bg-green-500 dark:bg-green-400',\n amber: 'bg-amber-500 dark:bg-amber-400'\n };\n // Return enhanced implementation using smoother animations\n return (_jsxs(\"span\", { className: cn(\"relative flex\", className), children: [_jsx(\"span\", { className: cn(\"animate-ping absolute inline-flex h-full w-full rounded-full opacity-60\", colorClasses[color]) }), _jsx(\"span\", { className: cn(\"animate-pulse absolute inline-flex h-[80%] w-[80%] rounded-full opacity-80\", colorClasses[color]), style: {\n left: '10%',\n top: '10%',\n animationDuration: '2s'\n } }), _jsx(\"span\", { className: cn(\"relative inline-flex rounded-full\", colorClasses[color], sizeClasses[size]) })] }));\n}\nexport function TypedDots({ className, color = 'blue' }) {\n const [dots, setDots] = useState('.');\n const colorClasses = {\n blue: 'text-blue-600 dark:text-blue-400',\n purple: 'text-purple-600 dark:text-purple-400',\n teal: 'text-teal-600 dark:text-teal-400',\n green: 'text-green-600 dark:text-green-400',\n amber: 'text-amber-600 dark:text-amber-400'\n };\n useEffect(() => {\n const intervalId = setInterval(() => {\n setDots(prev => prev === '.' ? '..' :\n prev === '..' ? '...' : '.');\n }, 500);\n return () => clearInterval(intervalId);\n }, []);\n return _jsx(\"span\", { className: cn(colorClasses[color], \"font-bold\", className), children: dots });\n}\nexport function PulsingMessageLoader({ message, className, color = 'blue' }) {\n const colorClasses = {\n blue: {\n dot: 'bg-blue-500 dark:bg-blue-400',\n text: 'text-blue-700 dark:text-blue-300'\n },\n purple: {\n dot: 'bg-purple-500 dark:bg-purple-400',\n text: 'text-purple-700 dark:text-purple-300'\n },\n teal: {\n dot: 'bg-teal-500 dark:bg-teal-400',\n text: 'text-teal-700 dark:text-teal-300'\n },\n green: {\n dot: 'bg-green-500 dark:bg-green-400',\n text: 'text-green-700 dark:text-green-300'\n },\n amber: {\n dot: 'bg-amber-500 dark:bg-amber-400',\n text: 'text-amber-700 dark:text-amber-300'\n }\n };\n return (_jsxs(\"div\", { className: cn(\"flex items-center gap-2 py-1\", className), children: [_jsxs(\"div\", { className: \"flex space-x-1\", children: [_jsx(\"div\", { className: `w-1.5 h-1.5 ${colorClasses[color].dot} rounded-full animate-bounce` }), _jsx(\"div\", { className: `w-1.5 h-1.5 ${colorClasses[color].dot} rounded-full animate-bounce`, style: { animationDelay: '0.2s' } }), _jsx(\"div\", { className: `w-1.5 h-1.5 ${colorClasses[color].dot} rounded-full animate-bounce`, style: { animationDelay: '0.4s' } })] }), _jsx(\"div\", { className: `${colorClasses[color].text} font-medium text-xs`, children: message })] }));\n}\nexport function ThinkingBar({ className, color = 'blue', width = 'md', message }) {\n const [progress, setProgress] = useState(15);\n const [direction, setDirection] = useState('increasing');\n const [speed, setSpeed] = useState(0.4); // Lower initial speed for smoother motion\n // Width classes\n const widthClasses = {\n sm: 'w-24',\n md: 'w-32',\n lg: 'w-48',\n xl: 'w-64',\n full: 'w-full'\n };\n // Color classes\n const colorClasses = {\n blue: 'bg-blue-200 dark:bg-blue-900/30',\n purple: 'bg-purple-200 dark:bg-purple-900/30',\n teal: 'bg-teal-200 dark:bg-teal-900/30',\n green: 'bg-green-200 dark:bg-green-900/30',\n amber: 'bg-amber-200 dark:bg-amber-900/30'\n };\n const barColorClasses = {\n blue: 'bg-gradient-to-r from-blue-400 to-blue-500 dark:from-blue-500 dark:to-blue-400',\n purple: 'bg-gradient-to-r from-purple-400 to-purple-500 dark:from-purple-500 dark:to-purple-400',\n teal: 'bg-gradient-to-r from-teal-400 to-teal-500 dark:from-teal-500 dark:to-teal-400',\n green: 'bg-gradient-to-r from-green-400 to-green-500 dark:from-green-500 dark:to-green-400',\n amber: 'bg-gradient-to-r from-amber-400 to-amber-500 dark:from-amber-500 dark:to-amber-400'\n };\n const textColorClasses = {\n blue: 'text-blue-700 dark:text-blue-300',\n purple: 'text-purple-700 dark:text-purple-300',\n teal: 'text-teal-700 dark:text-teal-300',\n green: 'text-green-700 dark:text-green-300',\n amber: 'text-amber-700 dark:text-amber-300'\n };\n // Using requestAnimationFrame for smoother animation\n useEffect(() => {\n let animationFrameId;\n let lastUpdateTime = Date.now();\n const updateProgressBar = () => {\n const now = Date.now();\n const deltaTime = now - lastUpdateTime;\n lastUpdateTime = now;\n setProgress(prev => {\n // Calculate movement based on time delta for consistent animation speed\n // regardless of frame rate\n const timeBasedChange = speed * (deltaTime / 16); // Normalize to 60fps\n // Calculate next progress based on direction\n let next = direction === 'increasing'\n ? prev + timeBasedChange\n : prev - timeBasedChange;\n // Handle direction changes at boundaries with easing\n if (next >= 85) {\n setDirection('decreasing');\n // Randomize speed slightly, but keep it low for smoothness\n setSpeed(0.3 + Math.random() * 0.2);\n return 85; // Cap at exactly 85%\n }\n else if (next <= 15) {\n setDirection('increasing');\n // Randomize speed slightly, but keep it low for smoothness\n setSpeed(0.3 + Math.random() * 0.2);\n return 15; // Cap at exactly 15%\n }\n // Occasionally adjust speed slightly (less frequently) for subtle natural feeling\n if (Math.random() > 0.99) {\n setSpeed(prev => Math.max(0.2, Math.min(0.5, prev + (Math.random() * 0.1 - 0.05))));\n }\n return next;\n });\n animationFrameId = requestAnimationFrame(updateProgressBar);\n };\n animationFrameId = requestAnimationFrame(updateProgressBar);\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, [direction, speed]);\n return (_jsxs(\"div\", { className: cn(\"flex flex-col gap-1\", className), children: [message && (_jsx(\"div\", { className: `text-xs font-medium ${textColorClasses[color]} mb-1`, children: message })), _jsx(\"div\", { className: cn(\"h-1.5 rounded-full overflow-hidden shadow-inner\", colorClasses[color], widthClasses[width]), children: _jsx(\"div\", { className: cn(\"h-full rounded-full\", barColorClasses[color]), style: {\n width: `${progress}%`,\n transition: 'width 150ms cubic-bezier(0.4, 0.0, 0.2, 1)' // Material Design easing for smoothness\n } }) })] }));\n}\nexport function WavyThinking({ className, color = 'blue', size = 'md' }) {\n // State to store and update heights of bars\n const [barHeights, setBarHeights] = useState(Array(7).fill(50));\n // Size classes\n const sizeClasses = {\n sm: { width: 'w-16', height: 'h-4', barWidth: 'w-0.5', gap: 'gap-[2px]' },\n md: { width: 'w-20', height: 'h-5', barWidth: 'w-1', gap: 'gap-[3px]' },\n lg: { width: 'w-24', height: 'h-6', barWidth: 'w-1.5', gap: 'gap-1' }\n };\n // Enhanced color classes with gradients for more visual appeal\n const colorClasses = {\n blue: 'bg-gradient-to-b from-blue-400 to-blue-500 dark:from-blue-400 dark:to-blue-500',\n purple: 'bg-gradient-to-b from-purple-400 to-purple-500 dark:from-purple-400 dark:to-purple-500',\n teal: 'bg-gradient-to-b from-teal-400 to-teal-500 dark:from-teal-400 dark:to-teal-500',\n green: 'bg-gradient-to-b from-green-400 to-green-500 dark:from-green-400 dark:to-green-500',\n amber: 'bg-gradient-to-b from-amber-400 to-amber-500 dark:from-amber-400 dark:to-amber-500'\n };\n // Use requestAnimationFrame for smooth animation\n useEffect(() => {\n let animationFrameId;\n const speeds = [1.2, 1.0, 1.5, 0.8, 1.3, 0.9, 1.1]; // Different speeds for each bar\n const phases = [0, 0.5, 1, 1.5, 2, 2.5, 3]; // Different starting phases for each bar\n let time = 0;\n const animateBars = () => {\n time += 0.02; // Increment time for animation\n // Update each bar's height with smooth sine wave\n const newHeights = barHeights.map((_, index) => {\n // Calculate height using smooth sine wave with individual phase and speed\n // Scale to make sure it stays within 10% to 90% range\n return 10 + (Math.sin(time * speeds[index] + phases[index]) + 1) * 40;\n });\n setBarHeights(newHeights);\n animationFrameId = requestAnimationFrame(animateBars);\n };\n animationFrameId = requestAnimationFrame(animateBars);\n return () => {\n cancelAnimationFrame(animationFrameId);\n };\n }, []); // Empty dependency array means this runs once on mount\n return (_jsx(\"div\", { className: cn(\"flex items-end justify-center\", sizeClasses[size].width, sizeClasses[size].height, sizeClasses[size].gap, className), children: barHeights.map((height, i) => (_jsx(\"div\", { className: cn(sizeClasses[size].barWidth, \"rounded-full transform-gpu\", colorClasses[color]), style: {\n height: `${height}%`,\n transition: 'height 100ms cubic-bezier(0.4, 0.0, 0.2, 1)', // Smooth transition\n opacity: 0.9\n } }, i))) }));\n}\n//# sourceMappingURL=AnimatedThinkingDots.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState, createContext, useContext, useCallback } from \"react\";\nimport { X, ExternalLink } from \"lucide-react\";\nconst ImageLightboxContext = createContext(null);\nexport function useImageLightbox() {\n const ctx = useContext(ImageLightboxContext);\n if (!ctx) {\n // Return a fallback that opens in new tab if no provider\n return {\n openImage: (src) => window.open(src, \"_blank\"),\n closeImage: () => { },\n };\n }\n return ctx;\n}\nexport function ImageLightboxProvider({ children }) {\n const [image, setImage] = useState(null);\n const openImage = useCallback((src, alt) => {\n setImage({ src, alt });\n }, []);\n const closeImage = useCallback(() => {\n setImage(null);\n }, []);\n return (_jsxs(ImageLightboxContext.Provider, { value: { openImage, closeImage }, children: [children, image && (_jsx(\"div\", { className: \"fixed inset-0 z-[100] flex items-center justify-center bg-black/80 backdrop-blur-sm\", onClick: closeImage, children: _jsxs(\"div\", { className: \"relative max-w-[90vw] max-h-[90vh]\", children: [_jsx(\"img\", { src: image.src, alt: image.alt || \"Enlarged view\", className: \"max-w-full max-h-[90vh] object-contain rounded-lg shadow-2xl\" }), _jsx(\"button\", { className: \"absolute top-2 right-2 text-white bg-black/50 rounded-full p-2 hover:bg-black/70 transition-colors\", onClick: closeImage, title: \"Close\", children: _jsx(X, { className: \"size-6\" }) }), _jsx(\"a\", { href: image.src, target: \"_blank\", rel: \"noopener noreferrer\", className: \"absolute bottom-2 right-2 text-white bg-black/50 rounded-full p-2 hover:bg-black/70 transition-colors\", onClick: (e) => e.stopPropagation(), title: \"Open in new tab\", children: _jsx(ExternalLink, { className: \"size-5\" }) })] }) }))] }));\n}\nexport function LightboxImage({ src, alt, className }) {\n const { openImage } = useImageLightbox();\n return (_jsx(\"img\", { src: src, alt: alt, className: `cursor-pointer hover:opacity-90 transition-opacity ${className || \"\"}`, onClick: (e) => {\n e.stopPropagation();\n openImage(src, alt);\n } }));\n}\n//# sourceMappingURL=ImageLightbox.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, useToast } from \"@vertesia/ui/core\";\nimport dayjs from \"dayjs\";\nimport { CheckCircle, AlertCircle, ChevronDown, ChevronRight, CopyIcon, Layers, Loader2, } from \"lucide-react\";\nimport { useState, memo } from \"react\";\nimport { PulsatingCircle } from \"../AnimatedThinkingDots\";\nfunction BatchProgressPanelComponent({ message, batchData, isRunning = false }) {\n const [isExpanded, setIsExpanded] = useState(false);\n const toast = useToast();\n const { tool_name, total, completed, succeeded, failed, items, started_at, completed_at } = batchData;\n const progress = total > 0 ? (completed / total) * 100 : 0;\n const hasErrors = failed > 0;\n const isComplete = completed === total && !isRunning;\n // Determine overall status\n const getOverallStatus = () => {\n if (isRunning || !isComplete)\n return \"running\";\n if (failed === total)\n return \"error\";\n if (failed > 0)\n return \"warning\";\n return \"completed\";\n };\n const overallStatus = getOverallStatus();\n // Status indicator\n const renderStatusIndicator = () => {\n if (isRunning || !isComplete) {\n return _jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" });\n }\n if (overallStatus === \"completed\") {\n return _jsx(CheckCircle, { className: \"size-4 text-success\" });\n }\n if (overallStatus === \"error\" || overallStatus === \"warning\") {\n return _jsx(AlertCircle, { className: \"size-4 text-destructive\" });\n }\n return _jsx(Layers, { className: \"size-4 text-purple-600\" });\n };\n // Border color based on status\n const getBorderColor = () => {\n if (overallStatus === \"completed\")\n return \"border-l-success\";\n if (overallStatus === \"error\")\n return \"border-l-destructive\";\n if (overallStatus === \"warning\")\n return \"border-l-attention\";\n return \"border-l-blue-500\";\n };\n // Progress bar color\n const getProgressColor = () => {\n if (hasErrors)\n return \"bg-attention\";\n if (isComplete)\n return \"bg-success\";\n return \"bg-blue-500\";\n };\n const copyToClipboard = () => {\n const content = JSON.stringify(batchData, null, 2);\n navigator.clipboard.writeText(content).then(() => {\n toast({\n status: \"success\",\n title: \"Copied batch details to clipboard\",\n duration: 2000,\n });\n });\n };\n const duration = completed_at\n ? completed_at - started_at\n : Date.now() - started_at;\n const durationSec = (duration / 1000).toFixed(1);\n return (_jsxs(\"div\", { className: `border-l-4 ${getBorderColor()} shadow-md overflow-hidden bg-white dark:bg-gray-900 mb-5`, children: [_jsxs(\"div\", { className: \"flex items-center justify-between px-4 py-2 border-b border-gray-100/80 dark:border-gray-800/80 bg-blue-50/50 dark:bg-blue-900/10 cursor-pointer\", onClick: () => setIsExpanded(!isExpanded), children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [renderStatusIndicator(), _jsx(\"span\", { className: \"text-xs font-medium text-muted\", children: \"Batch\" }), _jsx(\"span\", { className: \"text-xs text-blue-600 dark:text-blue-400 font-medium\", children: tool_name }), _jsxs(\"span\", { className: \"text-xs text-muted\", children: [completed, \"/\", total] }), isExpanded ? (_jsx(ChevronDown, { className: \"size-3 text-muted\" })) : (_jsx(ChevronRight, { className: \"size-3 text-muted\" }))] }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsxs(\"span\", { className: \"text-xs text-muted\", children: [durationSec, \"s\"] }), _jsx(\"span\", { className: \"text-xs text-muted\", children: dayjs(started_at).format(\"HH:mm:ss\") }), _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: (e) => {\n e.stopPropagation();\n copyToClipboard();\n }, className: \"text-muted\", title: \"Copy batch details\", children: _jsx(CopyIcon, { className: \"size-3\" }) })] })] }), _jsx(\"div\", { className: \"px-4 py-2 bg-gray-50/50 dark:bg-gray-800/30\", children: _jsxs(\"div\", { className: \"flex items-center gap-3\", children: [_jsx(\"div\", { className: \"flex-1 h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\", children: _jsx(\"div\", { className: `h-full ${getProgressColor()} transition-all duration-300 ease-out`, style: { width: `${progress}%` } }) }), _jsxs(\"div\", { className: \"flex items-center gap-2 text-xs\", children: [succeeded > 0 && (_jsxs(\"span\", { className: \"text-success flex items-center gap-1\", children: [_jsx(CheckCircle, { className: \"size-3\" }), succeeded] })), failed > 0 && (_jsxs(\"span\", { className: \"text-destructive flex items-center gap-1\", children: [_jsx(AlertCircle, { className: \"size-3\" }), failed] })), isRunning && completed < total && (_jsxs(\"span\", { className: \"text-blue-500 flex items-center gap-1\", children: [_jsx(Loader2, { className: \"size-3 animate-spin\" }), total - completed] }))] })] }) }), isExpanded && items.length > 0 && (_jsx(\"div\", { className: \"max-h-64 overflow-y-auto\", children: items.map((item) => (_jsxs(\"div\", { className: \"flex items-center gap-2 px-4 py-1.5 text-xs border-b border-gray-100 dark:border-gray-800 last:border-b-0 hover:bg-gray-50 dark:hover:bg-gray-800/50\", children: [_jsxs(\"div\", { className: \"w-4 flex-shrink-0\", children: [item.status === \"success\" && (_jsx(CheckCircle, { className: \"size-3 text-success\" })), item.status === \"error\" && (_jsx(AlertCircle, { className: \"size-3 text-destructive\" })), item.status === \"running\" && (_jsx(Loader2, { className: \"size-3 text-blue-500 animate-spin\" })), item.status === \"pending\" && (_jsx(\"div\", { className: \"size-3 rounded-full border border-gray-300 dark:border-gray-600\" }))] }), _jsx(\"span\", { className: \"font-mono text-muted w-24 truncate flex-shrink-0\", title: item.id, children: item.id }), _jsx(\"span\", { className: \"text-muted truncate flex-1\", title: item.message, children: item.message || (item.status === \"pending\" ? \"Waiting...\" : \"\") }), item.duration_ms !== undefined && (_jsxs(\"span\", { className: \"text-muted flex-shrink-0\", children: [(item.duration_ms / 1000).toFixed(1), \"s\"] }))] }, item.id))) })), !isExpanded && message.message && (_jsx(\"div\", { className: \"px-4 py-2 text-xs text-muted\", children: message.message }))] }));\n}\n// Memoize to prevent unnecessary re-renders\nconst BatchProgressPanel = memo(BatchProgressPanelComponent, (prevProps, nextProps) => {\n if (prevProps.isRunning !== nextProps.isRunning)\n return false;\n if (prevProps.batchData.completed !== nextProps.batchData.completed)\n return false;\n if (prevProps.batchData.succeeded !== nextProps.batchData.succeeded)\n return false;\n if (prevProps.batchData.failed !== nextProps.batchData.failed)\n return false;\n return true;\n});\nexport default BatchProgressPanel;\n//# sourceMappingURL=BatchProgressPanel.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport React from \"react\";\nimport { Button, VTooltip } from \"@vertesia/ui/core\";\nimport { MessageSquare, CheckCircle, XCircle, AlertCircle, HelpCircle, Send } from \"lucide-react\";\nconst VARIANT_STYLES = {\n default: {\n border: \"border-l-attention\",\n bg: \"bg-amber-50 dark:bg-amber-900/20\",\n icon: \"text-attention\",\n },\n warning: {\n border: \"border-l-destructive\",\n bg: \"bg-red-50 dark:bg-red-900/20\",\n icon: \"text-destructive\",\n },\n info: {\n border: \"border-l-info\",\n bg: \"bg-blue-50 dark:bg-blue-900/20\",\n icon: \"text-info\",\n },\n success: {\n border: \"border-l-success\",\n bg: \"bg-green-50 dark:bg-green-900/20\",\n icon: \"text-success\",\n },\n};\nconst VARIANT_ICONS = {\n default: HelpCircle,\n warning: AlertCircle,\n info: MessageSquare,\n success: CheckCircle,\n};\n/**\n * AskUserWidget - A styled component for displaying agent prompts/questions to users\n *\n * Use this when the agent needs user input, confirmation, or selection from options.\n * Supports both option selection and free-form text input.\n */\nexport function AskUserWidget({ question, description, options, onSelect, onMultiSelect, onSubmit, allowFreeResponse = false, multiSelect = false, placeholder = \"Type your response...\", isLoading = false, icon, variant = \"default\", hideIcon = false, hideBorder = false, \n// Styling props\nclassName, cardClassName, headerClassName, iconClassName, questionClassName, descriptionClassName, optionsClassName, buttonClassName, inputContainerClassName, inputClassName, submitButtonClassName, }) {\n const [inputValue, setInputValue] = React.useState(\"\");\n const [selectedOptions, setSelectedOptions] = React.useState(new Set());\n const inputRef = React.useRef(null);\n const styles = VARIANT_STYLES[variant];\n const DefaultIcon = VARIANT_ICONS[variant];\n const toggleOption = (optionId) => {\n setSelectedOptions((prev) => {\n const next = new Set(prev);\n if (next.has(optionId)) {\n next.delete(optionId);\n }\n else {\n next.add(optionId);\n }\n return next;\n });\n };\n const handleMultiSubmit = () => {\n if (selectedOptions.size > 0 && onMultiSelect) {\n onMultiSelect(Array.from(selectedOptions));\n setSelectedOptions(new Set());\n }\n };\n const handleSubmit = () => {\n if (inputValue.trim() && onSubmit) {\n onSubmit(inputValue.trim());\n setInputValue(\"\");\n }\n };\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n const borderClass = hideBorder ? \"\" : `border-l-4 ${styles.border}`;\n return (_jsx(\"div\", { className: `my-4 ${className || \"\"}`, children: _jsxs(\"div\", { className: `${borderClass} ${styles.bg} rounded-r-lg shadow-sm ${cardClassName || \"\"}`, children: [_jsx(\"div\", { className: `px-4 py-3 ${headerClassName || \"\"}`, children: _jsxs(\"div\", { className: \"flex items-start gap-3\", children: [!hideIcon && (_jsx(\"div\", { className: `flex-shrink-0 mt-0.5 ${styles.icon} ${iconClassName || \"\"}`, children: icon || _jsx(DefaultIcon, { className: \"size-5\" }) })), _jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [_jsx(\"h4\", { className: `text-sm font-semibold text-gray-900 dark:text-gray-100 ${questionClassName || \"\"}`, children: question }), description && (_jsx(\"p\", { className: `mt-1 text-sm text-gray-600 dark:text-gray-400 ${descriptionClassName || \"\"}`, children: description }))] })] }) }), options && options.length > 0 && (_jsx(\"div\", { className: `px-4 pb-3 pt-1 ${optionsClassName || \"\"}`, children: multiSelect ? (\n /* Multi-select mode with checkboxes */\n _jsxs(\"div\", { className: \"space-y-2\", children: [options.map((option) => {\n const checkbox = (_jsxs(\"label\", { className: `flex items-center gap-3 px-3 py-2 rounded-md cursor-pointer transition-colors\n ${selectedOptions.has(option.id)\n ? \"bg-blue-50 dark:bg-blue-900/30 border border-blue-300 dark:border-blue-700\"\n : \"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700\"}\n ${isLoading ? \"opacity-50 cursor-not-allowed\" : \"\"}`, children: [_jsx(\"input\", { type: \"checkbox\", checked: selectedOptions.has(option.id), onChange: () => toggleOption(option.id), disabled: isLoading, className: \"w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700\" }), _jsxs(\"span\", { className: \"flex items-center gap-2 text-sm text-gray-900 dark:text-gray-100\", children: [option.icon, option.label] })] }));\n return option.description ? (_jsx(VTooltip, { description: option.description, placement: \"right\", asChild: true, children: checkbox }, option.id)) : (_jsx(React.Fragment, { children: checkbox }, option.id));\n }), _jsx(\"div\", { className: \"pt-2\", children: _jsxs(Button, { size: \"sm\", onClick: handleMultiSubmit, disabled: isLoading || selectedOptions.size === 0, className: \"flex items-center gap-2\", children: [_jsx(Send, { className: \"size-4\" }), \"Submit Selection\", selectedOptions.size > 0 ? ` (${selectedOptions.size})` : \"\"] }) })] })) : (\n /* Single-select mode with buttons */\n _jsx(\"div\", { className: \"flex flex-wrap gap-2\", children: options.map((option) => {\n const button = (_jsxs(Button, { variant: \"outline\", size: \"sm\", onClick: () => onSelect?.(option.id), disabled: isLoading, className: `flex items-center gap-2 ${buttonClassName || \"\"}`, children: [option.icon, option.label] }));\n return option.description ? (_jsx(VTooltip, { description: option.description, placement: \"top\", asChild: true, children: button }, option.id)) : (_jsx(React.Fragment, { children: button }, option.id));\n }) })) })), allowFreeResponse && (_jsx(\"div\", { className: `px-4 pb-3 pt-1 ${inputContainerClassName || \"\"}`, children: _jsxs(\"div\", { className: \"flex gap-2\", children: [_jsx(\"input\", { ref: inputRef, type: \"text\", value: inputValue, onChange: (e) => setInputValue(e.target.value), onKeyDown: handleKeyDown, placeholder: placeholder, disabled: isLoading, className: `flex-1 px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 focus:ring-2 focus:ring-blue-500 focus:border-transparent ${inputClassName || \"\"}` }), _jsx(Button, { size: \"sm\", onClick: handleSubmit, disabled: isLoading || !inputValue.trim(), className: submitButtonClassName, children: isLoading ? \"...\" : \"Send\" })] }) }))] }) }));\n}\nexport function ConfirmationWidget({ question, description, onConfirm, onCancel, confirmLabel = \"Yes\", cancelLabel = \"No\", isLoading = false, variant = \"default\", className, }) {\n return (_jsx(AskUserWidget, { question: question, description: description, variant: variant, isLoading: isLoading, className: className, options: [\n {\n id: \"confirm\",\n label: confirmLabel,\n icon: _jsx(CheckCircle, { className: \"size-4\" }),\n },\n {\n id: \"cancel\",\n label: cancelLabel,\n icon: _jsx(XCircle, { className: \"size-4\" }),\n },\n ], onSelect: (id) => {\n if (id === \"confirm\")\n onConfirm();\n else\n onCancel();\n } }));\n}\n//# sourceMappingURL=AskUserWidget.js.map","export const ThinkingMessages = [\n // Original messages\n \"Brewing some code magic...\",\n \"Doing the robot dance...\",\n \"Cooking up something good...\",\n \"Working my gears...\",\n // Tech-inspired messages\n \"Parsing the possibilities...\",\n \"Crunching the numbers...\",\n \"Connecting the digital dots...\",\n \"Processing at maximum capacity...\",\n \"Searching through my circuits...\",\n \"Running advanced algorithms...\",\n \"Computing optimal solutions...\",\n \"Loading brilliance.exe...\",\n \"Scanning the knowledge base...\",\n \"Optimizing response protocols...\",\n // Playful messages\n \"Having a quick brainstorm...\",\n \"Thinking cap firmly on...\",\n \"Pondering the digital universe...\",\n \"Consulting my silicon wisdom...\",\n \"Untangling the logic knots...\",\n \"Assembling clever responses...\",\n \"Mixing thoughtful ingredients...\",\n \"Polishing the perfect answer...\",\n \"Taking a momentary mind sprint...\",\n \"Connecting virtual synapses...\",\n // Food-themed messages\n \"Baking fresh ideas...\",\n \"Stirring the thought pot...\",\n \"Simmering solutions slowly...\",\n \"Whipping up a smart response...\",\n \"Adding a dash of intelligence...\",\n \"Preparing a gourmet answer...\",\n // Nature-themed messages\n \"Growing brilliant ideas...\",\n \"Cultivating the perfect response...\",\n \"Gathering digital nectar...\",\n \"Planting seeds of solutions...\",\n // Journey-themed messages\n \"Exploring the data landscape...\",\n \"Mapping the solution path...\",\n \"Navigating through possibilities...\",\n \"Charting the course to answers...\",\n \"Embarking on a thought expedition...\",\n // Creative-themed messages\n \"Sketching out concepts...\",\n \"Painting with digital brushstrokes...\",\n \"Composing my response symphony...\",\n \"Crafting precision answers...\",\n \"Weaving threads of information...\",\n // Time-themed messages\n \"Just a moment of processing...\",\n \"Taking a quick thinking break...\",\n \"Almost there, final touches...\",\n \"Putting the pieces together...\",\n \"Making progress, hold tight...\",\n];\n//# sourceMappingURL=WaitingMessages.js.map","import dayjs from \"dayjs\";\nimport { AgentMessageType } from \"@vertesia/common\";\nexport function insertMessageInTimeline(arr, m) {\n const t = typeof m.timestamp === \"number\" ? m.timestamp : new Date(m.timestamp).getTime();\n const idx = arr.findIndex((a) => {\n const at = typeof a.timestamp === \"number\" ? a.timestamp : new Date(a.timestamp).getTime();\n return at > t;\n });\n if (idx === -1)\n arr.push(m);\n else\n arr.splice(idx, 0, m);\n}\n/**\n * Check if a conversation is still in progress\n * This function checks the main workstream status to determine if the conversation is complete\n * For multi-workstream scenarios, we keep streaming until the main workstream is complete\n */\nexport const DONE_STATES = [\n AgentMessageType.COMPLETE,\n AgentMessageType.IDLE,\n AgentMessageType.REQUEST_INPUT,\n AgentMessageType.TERMINATED,\n];\nexport function isInProgress(messages) {\n if (!messages.length)\n return true;\n // First, group messages by workstream\n const workstreamMessages = new Map();\n messages.forEach((message) => {\n const workstreamId = getWorkstreamId(message);\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n }\n workstreamMessages.get(workstreamId).push(message);\n });\n // Log all workstreams we found for debugging\n console.log(\"[isInProgress] Workstreams found:\", Array.from(workstreamMessages.keys()));\n // If there's only one workstream and it's not \"main\", we should treat it as the main one\n // This handles cases where a conversation might not have an explicit main workstream\n if (workstreamMessages.size === 1 && !workstreamMessages.has(\"main\")) {\n const onlyWorkstreamId = workstreamMessages.keys().next().value || \"unknown\";\n console.log(`[isInProgress] Only one workstream found (${onlyWorkstreamId}), treating as main`);\n const onlyWorkstreamMsgs = workstreamMessages.get(onlyWorkstreamId);\n const lastMessage = onlyWorkstreamMsgs[onlyWorkstreamMsgs.length - 1];\n console.log(`[isInProgress] Last message type in only workstream: ${lastMessage.type}`);\n // Check if this single workstream is completed\n if (!DONE_STATES.includes(lastMessage.type)) {\n console.log(\"[isInProgress] Only workstream is still in progress\");\n return true;\n }\n console.log(\"[isInProgress] Only workstream is completed\");\n return false;\n }\n // Check the main workstream if it exists\n if (workstreamMessages.has(\"main\")) {\n const mainWorkstreamMsgs = workstreamMessages.get(\"main\");\n // If there are no messages in the main workstream, the conversation is still in progress\n if (mainWorkstreamMsgs.length === 0) {\n console.log(\"[isInProgress] Main workstream exists but has no messages, still in progress\");\n return true;\n }\n // Check if the main workstream is completed\n const lastMainMessage = mainWorkstreamMsgs[mainWorkstreamMsgs.length - 1];\n console.log(`[isInProgress] Last message type in main workstream: ${lastMainMessage.type}`);\n if (!DONE_STATES.includes(lastMainMessage.type)) {\n console.log(\"[isInProgress] Main workstream is still in progress\");\n return true;\n }\n console.log(\"[isInProgress] Main workstream is completed\");\n return false;\n }\n // If we get here, there are multiple workstreams but no \"main\" workstream\n // We'll keep the conversation active if any workstream is still active\n console.log(\"[isInProgress] Multiple workstreams but no main, checking if any are still active\");\n for (const [workstreamId, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n const lastMessage = msgs[msgs.length - 1];\n if (!DONE_STATES.includes(lastMessage.type)) {\n console.log(`[isInProgress] Workstream ${workstreamId} is still active`);\n return true;\n }\n }\n }\n console.log(\"[isInProgress] All workstreams are completed\");\n return false;\n}\nexport const formatRelative = (ts) => typeof ts === \"number\" ? dayjs(ts).fromNow() : dayjs(new Date(ts)).fromNow();\n/**\n * Extract the workstream ID from a message\n * @param message The agent message to analyze\n * @returns The workstream ID (defaults to 'main' if none found)\n */\nexport function getWorkstreamId(message) {\n // Only use the direct workstream_id property on the message\n if (message.workstream_id) {\n // For debugging COMPLETE messages\n if (message.type === AgentMessageType.COMPLETE) {\n console.log(\"[getWorkstreamId] COMPLETE message with workstream_id:\", message.workstream_id);\n }\n return message.workstream_id;\n }\n // For debugging COMPLETE messages without workstream_id\n if (message.type === AgentMessageType.COMPLETE) {\n console.log(\"[getWorkstreamId] COMPLETE message without workstream_id, defaulting to 'main'\");\n }\n // Default to 'main' workstream\n return \"main\";\n}\n/**\n * Get a map of workstream IDs to their completion status\n * @param messages List of agent messages\n * @returns Map of workstream IDs to completion status ('pending', 'in_progress', or 'completed')\n */\nexport function getWorkstreamStatusMap(messages) {\n const workstreamMessages = new Map();\n const statusMap = new Map();\n // Group messages by workstream\n messages.forEach((message) => {\n const workstreamId = getWorkstreamId(message);\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n // Initialize all workstreams as pending\n statusMap.set(workstreamId, \"pending\");\n }\n workstreamMessages.get(workstreamId).push(message);\n });\n // Log all workstreams found\n console.log(\"[getWorkstreamStatusMap] Found workstreams:\", Array.from(workstreamMessages.keys()));\n // Determine status based on last message type\n for (const [workstreamId, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n // Mark as in_progress by default if there are any messages\n statusMap.set(workstreamId, \"in_progress\");\n // Check if completed based on last message or any COMPLETE message\n const lastMessage = msgs[msgs.length - 1];\n // Check for any COMPLETE message in this workstream\n const hasCompleteMessage = msgs.some(msg => msg.type === AgentMessageType.COMPLETE &&\n (msg.workstream_id === workstreamId || (!msg.workstream_id && workstreamId === 'main')));\n if (hasCompleteMessage ||\n DONE_STATES.includes(lastMessage.type)) {\n console.log(`[getWorkstreamStatusMap] Marking workstream ${workstreamId} as completed`);\n statusMap.set(workstreamId, \"completed\");\n }\n else {\n console.log(`[getWorkstreamStatusMap] Workstream ${workstreamId} is in_progress`);\n }\n }\n }\n // Log final status map for debugging\n console.log(\"[getWorkstreamStatusMap] Final status map:\", Array.from(statusMap.entries()).map(([id, status]) => `${id}: ${status}`).join(', '));\n return statusMap;\n}\n// Helper function to get conversation URL - used by other components\nexport async function getConversationUrl(vertesia, workflowRunId) {\n return vertesia.files\n .getDownloadUrl(`agents/${workflowRunId}/conversation.json`)\n .then((r) => r.url);\n}\n/**\n * Check if a message is a tool call (THOUGHT with tool details)\n */\nexport function isToolCallMessage(message) {\n return message.type === AgentMessageType.THOUGHT && !!message.details?.tool;\n}\n/**\n * Get the tool_run_id from a message's details, if present\n */\nexport function getToolRunId(message) {\n return message.details?.tool_run_id;\n}\n/**\n * Get the tool_iteration from a message's details, if present\n * This is used to group parallel tool calls from the same iteration\n */\nexport function getToolIteration(message) {\n return message.details?.tool_iteration;\n}\n/**\n * Get the tool execution status from a message's details\n */\nexport function getToolStatus(message) {\n return message.details?.tool_status;\n}\n/**\n * Group consecutive tool call messages together for a cleaner display\n * Non-tool messages remain as single items\n *\n * @param messages Sorted array of messages\n * @returns Array of message groups\n */\nexport function groupConsecutiveToolCalls(messages) {\n const groups = [];\n let currentToolGroup = [];\n const flushToolGroup = () => {\n if (currentToolGroup.length > 0) {\n if (currentToolGroup.length === 1) {\n // Single tool call - no need to group\n groups.push({ type: 'single', message: currentToolGroup[0] });\n }\n else {\n // Multiple consecutive tool calls - group them\n groups.push({\n type: 'tool_group',\n messages: currentToolGroup,\n firstTimestamp: currentToolGroup[0].timestamp\n });\n }\n currentToolGroup = [];\n }\n };\n for (const message of messages) {\n if (isToolCallMessage(message)) {\n currentToolGroup.push(message);\n }\n else {\n // Flush any pending tool group before adding non-tool message\n flushToolGroup();\n groups.push({ type: 'single', message });\n }\n }\n // Flush any remaining tool group\n flushToolGroup();\n return groups;\n}\n/**\n * Helper to get timestamp as number\n */\nfunction getTimestampMs(timestamp) {\n return typeof timestamp === \"number\" ? timestamp : new Date(timestamp).getTime();\n}\n/**\n * Group messages with streaming messages interleaved in chronological order\n * Messages with the same tool_iteration are grouped together (parallel tool calls)\n * Messages with the same tool_run_id are grouped together (same tool execution)\n * Messages without either fall back to consecutive grouping\n *\n * @param messages Sorted array of messages\n * @param streamingMessages Map of streaming messages by ID\n * @param activeWorkstream Optional workstream filter\n * @returns Array of renderable groups with streaming interleaved\n */\nexport function groupMessagesWithStreaming(messages, streamingMessages, activeWorkstream) {\n // First pass: collect messages by tool_iteration (for parallel tool calls in same iteration)\n const iterationGroups = new Map();\n // Also collect messages by tool_run_id (for sub-messages within same tool)\n const toolRunGroups = new Map();\n // Messages without tool_iteration or tool_run_id will be processed separately\n const standaloneMessages = [];\n for (const message of messages) {\n if (isToolCallMessage(message)) {\n const toolIteration = getToolIteration(message);\n const toolRunId = getToolRunId(message);\n if (toolIteration !== undefined) {\n // Group by tool_iteration - this groups parallel tool calls together\n if (!iterationGroups.has(toolIteration)) {\n iterationGroups.set(toolIteration, {\n messages: [],\n firstTimestamp: getTimestampMs(message.timestamp)\n });\n }\n iterationGroups.get(toolIteration).messages.push(message);\n }\n else if (toolRunId) {\n // Fallback: group by tool_run_id if no iteration\n if (!toolRunGroups.has(toolRunId)) {\n toolRunGroups.set(toolRunId, {\n messages: [],\n firstTimestamp: getTimestampMs(message.timestamp)\n });\n }\n toolRunGroups.get(toolRunId).messages.push(message);\n }\n else {\n // No tool_iteration or tool_run_id - will use consecutive grouping\n standaloneMessages.push(message);\n }\n }\n else {\n standaloneMessages.push(message);\n }\n }\n const items = [];\n // Add iteration groups (parallel tool calls from same iteration)\n iterationGroups.forEach((group, iteration) => {\n items.push({\n kind: 'iteration_group',\n iteration,\n messages: group.messages,\n timestamp: group.firstTimestamp\n });\n });\n // Add tool_run groups as single items\n toolRunGroups.forEach((group, toolRunId) => {\n items.push({\n kind: 'tool_run',\n toolRunId,\n messages: group.messages,\n timestamp: group.firstTimestamp\n });\n });\n // Add standalone messages\n for (const message of standaloneMessages) {\n items.push({\n kind: 'message',\n message,\n timestamp: getTimestampMs(message.timestamp)\n });\n }\n // Add streaming messages (filter by workstream if specified)\n streamingMessages.forEach((data, streamingId) => {\n // Skip empty streaming messages\n if (!data.text)\n return;\n // Filter by workstream if specified\n if (activeWorkstream && activeWorkstream !== \"all\") {\n const streamWorkstream = data.workstreamId || \"main\";\n if (activeWorkstream !== streamWorkstream)\n return;\n }\n items.push({\n kind: 'streaming',\n streamingId,\n data,\n timestamp: data.startTimestamp\n });\n });\n // Sort by timestamp, but streaming always goes at the end\n items.sort((a, b) => {\n // Streaming messages always come last\n if (a.kind === 'streaming' && b.kind !== 'streaming')\n return 1;\n if (b.kind === 'streaming' && a.kind !== 'streaming')\n return -1;\n // Both streaming or both non-streaming: sort by timestamp\n return a.timestamp - b.timestamp;\n });\n // Build final groups with consecutive grouping for standalone tool messages\n const groups = [];\n let currentToolGroup = [];\n const flushToolGroup = () => {\n if (currentToolGroup.length > 0) {\n if (currentToolGroup.length === 1) {\n groups.push({ type: 'single', message: currentToolGroup[0] });\n }\n else {\n groups.push({\n type: 'tool_group',\n messages: currentToolGroup,\n firstTimestamp: getTimestampMs(currentToolGroup[0].timestamp)\n });\n }\n currentToolGroup = [];\n }\n };\n for (const item of items) {\n if (item.kind === 'streaming') {\n // Streaming breaks consecutive tool grouping\n flushToolGroup();\n groups.push({\n type: 'streaming',\n streamingId: item.streamingId,\n text: item.data.text,\n workstreamId: item.data.workstreamId,\n startTimestamp: item.data.startTimestamp,\n isComplete: item.data.isComplete\n });\n }\n else if (item.kind === 'iteration_group') {\n // Iteration group - parallel tool calls from same iteration\n flushToolGroup();\n // Sort messages within the group by timestamp\n const sortedMessages = [...item.messages].sort((a, b) => getTimestampMs(a.timestamp) - getTimestampMs(b.timestamp));\n // Get the latest status from the group\n const latestStatus = sortedMessages.reduce((status, msg) => getToolStatus(msg) || status, undefined);\n groups.push({\n type: 'tool_group',\n messages: sortedMessages,\n firstTimestamp: item.timestamp,\n toolStatus: latestStatus\n });\n }\n else if (item.kind === 'tool_run') {\n // Tool run group - already grouped by tool_run_id\n flushToolGroup();\n // Sort messages within the group by timestamp\n const sortedMessages = [...item.messages].sort((a, b) => getTimestampMs(a.timestamp) - getTimestampMs(b.timestamp));\n // Get the latest status from the group\n const latestStatus = sortedMessages.reduce((status, msg) => getToolStatus(msg) || status, undefined);\n groups.push({\n type: 'tool_group',\n messages: sortedMessages,\n firstTimestamp: item.timestamp,\n toolRunId: item.toolRunId,\n toolStatus: latestStatus\n });\n }\n else if (isToolCallMessage(item.message)) {\n // Standalone tool message - use consecutive grouping\n currentToolGroup.push(item.message);\n }\n else {\n // Non-tool message breaks grouping\n flushToolGroup();\n groups.push({ type: 'single', message: item.message });\n }\n }\n // Flush any remaining tool group\n flushToolGroup();\n return groups;\n}\n//# sourceMappingURL=utils.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport React, { createContext, useContext, useCallback, useRef } from \"react\";\nconst ArtifactUrlCacheContext = createContext(null);\n/**\n * Provider component that maintains a cache of resolved artifact URLs.\n * This prevents re-fetching the same artifact URL multiple times during re-renders.\n */\nexport function ArtifactUrlCacheProvider({ children }) {\n const cacheRef = useRef(new Map());\n const pendingRef = useRef(new Map());\n const getUrl = useCallback((key) => {\n return cacheRef.current.get(key);\n }, []);\n const setUrl = useCallback((key, url) => {\n cacheRef.current.set(key, url);\n }, []);\n const getOrFetch = useCallback(async (key, fetcher) => {\n // Return cached URL if available\n const cached = cacheRef.current.get(key);\n if (cached) {\n return cached;\n }\n // Return pending promise if a fetch is already in progress\n const pending = pendingRef.current.get(key);\n if (pending) {\n return pending;\n }\n // Start new fetch and cache the promise\n const promise = fetcher().then((url) => {\n cacheRef.current.set(key, url);\n pendingRef.current.delete(key);\n return url;\n }).catch((err) => {\n pendingRef.current.delete(key);\n throw err;\n });\n pendingRef.current.set(key, promise);\n return promise;\n }, []);\n const value = React.useMemo(() => ({ getUrl, setUrl, getOrFetch }), [getUrl, setUrl, getOrFetch]);\n return (_jsx(ArtifactUrlCacheContext.Provider, { value: value, children: children }));\n}\n/**\n * Hook to access the artifact URL cache.\n * Returns null if used outside of ArtifactUrlCacheProvider.\n */\nexport function useArtifactUrlCache() {\n return useContext(ArtifactUrlCacheContext);\n}\n/**\n * Generate a cache key for an artifact URL.\n */\nexport function getArtifactCacheKey(runId, path, disposition = \"inline\") {\n return `artifact:${runId}:${path}:${disposition}`;\n}\n/**\n * Generate a cache key for a file URL.\n */\nexport function getFileCacheKey(path) {\n return `file:${path}`;\n}\n//# sourceMappingURL=useArtifactUrlCache.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { AgentMessageType } from \"@vertesia/common\";\nimport { Badge, Button, useToast } from \"@vertesia/ui/core\";\nimport { NavLink } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { MarkdownRenderer } from \"@vertesia/ui/widgets\";\nimport dayjs from \"dayjs\";\nimport { AlertCircle, Bot, CheckCircle, Clock, CopyIcon, Info, Layers, MessageSquare, User } from \"lucide-react\";\nimport { useEffect, useState, useMemo, memo } from \"react\";\nimport { PulsatingCircle } from \"../AnimatedThinkingDots\";\nimport { AskUserWidget } from \"../AskUserWidget\";\nimport { useImageLightbox } from \"../ImageLightbox\";\nimport { ThinkingMessages } from \"../WaitingMessages\";\nimport { getWorkstreamId } from \"./utils\";\nimport { useArtifactUrlCache, getArtifactCacheKey } from \"../useArtifactUrlCache.js\";\n// PERFORMANCE: Move pure function outside component to avoid recreation on every render\n// Process content to enhance markdown detection for lists and thinking messages\nfunction processContentForMarkdown(content, messageType, originalMessage) {\n // If content is not a string, return it as is\n if (typeof content !== \"string\") {\n return content;\n }\n // Special handling for thought messages to ensure proper markdown formatting\n if (messageType === AgentMessageType.THOUGHT ||\n (typeof originalMessage === \"string\" &&\n (originalMessage.toLowerCase().includes(\"thinking about\") ||\n originalMessage.toLowerCase().includes(\"i'm thinking\") ||\n originalMessage.toLowerCase().includes(\"💭\")))) {\n let formattedContent = content;\n // Check for numbering patterns like \"1. First item 2. Second item\"\n if (/\\d+\\.\\s+.+/.test(formattedContent)) {\n // Format numbered lists by adding newlines between items\n formattedContent = formattedContent.replace(/(\\d+\\.\\s+.+?)(?=\\s+\\d+\\.\\s+|$)/g, \"$1\\n\\n\");\n // Make sure nested content under numbered items is properly indented\n formattedContent = formattedContent.replace(/(\\d+\\.\\s+.+\\n)([^\\d\\n][^:])/g, \"$1 $2\");\n }\n // Handle colon-prefixed items that should be on separate lines\n if (formattedContent.includes(\":\") && !formattedContent.includes(\"\\n\\n\")) {\n formattedContent = formattedContent.replace(/\\b(First|Next|Then|Finally|Lastly|Additionally|Step \\d+):\\s+/gi, \"\\n\\n$&\");\n }\n // Handle thinking points or list-like structures even without numbers\n if (formattedContent.includes(\" - \")) {\n formattedContent = formattedContent.replace(/\\s+-\\s+/g, \"\\n- \");\n }\n return formattedContent;\n }\n // Normal processing for non-thinking messages\n if (/\\d+\\.\\s+.+/.test(content) && !content.includes(\"\\n\\n\")) {\n // Add proper line breaks for numbered lists that aren't already properly formatted\n return content.replace(/(\\d+\\.\\s+.+?)(?=\\s+\\d+\\.\\s+|$)/g, \"$1\\n\\n\");\n }\n return content;\n}\n// Consolidated message styling - single source of truth\nconst MESSAGE_STYLES = {\n [AgentMessageType.ANSWER]: { borderColor: 'border-l-info', bgColor: 'bg-info', iconColor: 'text-info', sender: 'Agent', Icon: Bot },\n [AgentMessageType.COMPLETE]: { borderColor: 'border-l-success', bgColor: 'bg-success', iconColor: 'text-success', sender: 'Completed', Icon: CheckCircle },\n [AgentMessageType.IDLE]: { borderColor: 'border-l-info', bgColor: 'bg-info/50', iconColor: 'text-info', sender: 'Ready', Icon: Clock },\n [AgentMessageType.REQUEST_INPUT]: { borderColor: 'border-l-attention', bgColor: 'bg-attention', iconColor: 'text-attention', sender: 'Input', Icon: User },\n [AgentMessageType.QUESTION]: { borderColor: 'border-l-muted', bgColor: 'bg-muted', iconColor: 'text-muted', sender: 'User', Icon: User },\n [AgentMessageType.THOUGHT]: { borderColor: 'border-l-purple-500', bgColor: 'bg-purple-50/50 dark:bg-purple-900/10', iconColor: 'text-purple-600 dark:text-purple-400', sender: 'Agent', Icon: Bot },\n [AgentMessageType.ERROR]: { borderColor: 'border-l-destructive', bgColor: 'bg-destructive', iconColor: 'text-destructive', sender: 'Error', Icon: AlertCircle },\n [AgentMessageType.UPDATE]: { borderColor: 'border-l-success', bgColor: 'bg-success', iconColor: 'text-success', sender: 'Update', Icon: Info },\n [AgentMessageType.PLAN]: { borderColor: 'border-l-attention', bgColor: 'bg-attention', iconColor: 'text-attention', sender: 'Plan', Icon: MessageSquare },\n [AgentMessageType.TERMINATED]: { borderColor: 'border-l-muted', bgColor: 'bg-muted', iconColor: 'text-muted', sender: 'Terminated', Icon: CheckCircle },\n [AgentMessageType.WARNING]: { borderColor: 'border-l-attention', bgColor: 'bg-attention', iconColor: 'text-attention', sender: 'Warning', Icon: AlertCircle },\n [AgentMessageType.SYSTEM]: { borderColor: 'border-l-muted', bgColor: 'bg-muted', iconColor: 'text-muted', sender: 'System', Icon: Info },\n [AgentMessageType.STREAMING_CHUNK]: { borderColor: 'border-l-info', bgColor: 'bg-info', iconColor: 'text-info', sender: 'Agent', Icon: Bot },\n [AgentMessageType.BATCH_PROGRESS]: { borderColor: 'border-l-blue-500', bgColor: 'bg-blue-50/50 dark:bg-blue-900/10', iconColor: 'text-blue-600 dark:text-blue-400', sender: 'Batch', Icon: Layers },\n default: { borderColor: 'border-l-muted', bgColor: 'bg-muted', iconColor: 'text-muted', sender: 'Agent', Icon: Bot },\n};\nfunction MessageItemComponent({ message, showPulsatingCircle = false, onSendMessage, className, cardClassName, headerClassName, contentClassName, timestampClassName, senderClassName, iconClassName, detailsClassName, artifactsClassName, }) {\n const [showDetails, setShowDetails] = useState(false);\n const { client } = useUserSession();\n const toast = useToast();\n const urlCache = useArtifactUrlCache();\n const { openImage } = useImageLightbox();\n // Get styles from consolidated config\n const styles = MESSAGE_STYLES[message.type] || MESSAGE_STYLES.default;\n // PERFORMANCE: Memoize message content extraction - only recalculates when message changes\n const messageContent = useMemo(() => {\n let content = \"\";\n if (message.message) {\n // Check if message.message is an object\n if (typeof message.message === \"object\") {\n // Use JSONView for objects - we'll need to stringify it for now\n content = JSON.stringify(message.message, null, 2);\n }\n else if (message.message.trim) {\n content = message.message.trim();\n }\n else {\n // Fallback for other non-string, non-object cases\n content = String(message.message);\n }\n }\n // Replace %thinking_message% placeholder with a thinking message\n if (typeof content === \"string\" && content.includes(\"%thinking_message%\")) {\n // Get a random thinking message since we don't have access to thinkingMessageIndex here\n const randomIndex = Math.floor(Math.random() * ThinkingMessages.length);\n content = content.replace(/%thinking_message%/g, ThinkingMessages[randomIndex]);\n }\n return content;\n }, [message.message]);\n // PERFORMANCE: Memoize processed content - expensive regex operations only run when messageContent changes\n const processedContent = useMemo(() => {\n if (!messageContent)\n return \"\";\n return processContentForMarkdown(messageContent, message.type, typeof message.message === \"string\" ? message.message : undefined);\n }, [messageContent, message.type, message.message]);\n // Copy message content to clipboard\n const copyToClipboard = () => {\n const content = messageContent || \"\";\n const detailsContent = typeof message.details === \"string\"\n ? message.details\n : message.details\n ? JSON.stringify(message.details, null, 2)\n : \"\";\n const textToCopy = [content, detailsContent ? \"\\n\\nDetails:\\n\" + detailsContent : \"\"].join(\"\").trim();\n navigator.clipboard.writeText(textToCopy).then(() => {\n toast({\n status: \"success\",\n title: \"Copied to clipboard\",\n duration: 2000,\n });\n });\n };\n // Render content with markdown support - all messages now rendered as markdown\n const renderContent = (content) => {\n // Handle object content (JSON)\n if (typeof content === \"object\") {\n return (_jsx(\"pre\", { className: \"text-xs font-mono whitespace-pre-wrap overflow-x-auto bg-gray-100 dark:bg-gray-800 p-2 rounded text-gray-700 \", children: JSON.stringify(content, null, 2) }));\n }\n // Handle string content with markdown - content is already processed\n const runId = message.workflow_run_id;\n return (_jsx(\"div\", { className: \"vprose prose prose-slate dark:prose-invert prose-p:leading-relaxed prose-p:my-2 prose-headings:font-semibold prose-headings:tracking-tight prose-li:my-0.5 prose-ul:my-2 prose-ol:my-2 max-w-none text-[15px]\", children: _jsx(MarkdownRenderer, { artifactRunId: runId, onProposalSelect: (optionId) => onSendMessage?.(optionId), onProposalSubmit: (text) => onSendMessage?.(text), components: {\n a: ({ node, ref, ...props }) => {\n const href = props.href || \"\";\n if (href.includes(\"/store/objects\")) {\n return (_jsx(NavLink, { href: href, topLevelNav: true, children: props.children }));\n }\n return (_jsx(\"a\", { ...props, target: \"_blank\", rel: \"noopener noreferrer\" }));\n },\n img: ({ node, ref, ...props }) => {\n return (_jsx(\"img\", { ...props, className: \"max-w-full h-auto rounded-lg shadow-md my-3 cursor-pointer hover:shadow-lg transition-shadow\", loading: \"lazy\", onClick: () => props.src && openImage(props.src, props.alt) }));\n },\n }, children: content }) }));\n };\n // Resolve artifacts from tool details (e.g. execute_shell.outputFiles)\n const [artifactLinks, setArtifactLinks] = useState([]);\n // Create stable key from message for dependency tracking\n const runId = message.workflow_run_id;\n const details = message.details;\n // Check both outputFiles (from execute_shell) and files (from tool results like dashboard tools)\n const outputFiles = details?.outputFiles ?? details?.files;\n const outputFilesKey = Array.isArray(outputFiles) ? outputFiles.join(\",\") : \"\";\n useEffect(() => {\n const loadArtifacts = async () => {\n if (!runId || !Array.isArray(outputFiles) || outputFiles.length === 0) {\n setArtifactLinks([]);\n return;\n }\n try {\n const entries = await Promise.all(outputFiles.map(async (name) => {\n if (typeof name !== \"string\" || !name.trim())\n return null;\n const trimmed = name.trim();\n // execute_shell returns relative paths like \"result.csv\" or \"plots/chart.png\"\n // canonical artifact name is under out/\n const artifactPath = trimmed.startsWith(\"out/\") || trimmed.startsWith(\"files/\") || trimmed.startsWith(\"scripts/\")\n ? trimmed\n : `out/${trimmed}`;\n const ext = artifactPath.split(\".\").pop()?.toLowerCase() || \"\";\n const imageExtensions = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"bmp\", \"svg\"]);\n const isImage = imageExtensions.has(ext);\n const disposition = isImage ? \"inline\" : \"attachment\";\n try {\n // Use cache if available\n const cacheKey = getArtifactCacheKey(runId, artifactPath, disposition);\n let url;\n if (urlCache) {\n url = await urlCache.getOrFetch(cacheKey, async () => {\n const result = await client.files.getArtifactDownloadUrl(runId, artifactPath, disposition);\n return result.url;\n });\n }\n else {\n const result = await client.files.getArtifactDownloadUrl(runId, artifactPath, disposition);\n url = result.url;\n }\n return {\n displayName: trimmed,\n artifactPath,\n url,\n isImage,\n };\n }\n catch (err) {\n console.error(`Failed to resolve artifact URL for ${artifactPath}`, err);\n return null;\n }\n }));\n setArtifactLinks(entries.filter((e) => !!e));\n }\n catch (error) {\n console.error(\"Error loading artifact URLs from message details\", error);\n setArtifactLinks([]);\n }\n };\n loadArtifacts();\n }, [runId, outputFilesKey, client, urlCache]);\n const workstreamId = getWorkstreamId(message);\n const { Icon } = styles;\n // Render icon - show pulsating animation for active messages\n const renderIcon = () => {\n if (showPulsatingCircle) {\n return _jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" });\n }\n return _jsx(Icon, { className: `size-4 ${styles.iconColor}` });\n };\n return (_jsx(\"div\", { className: className, children: _jsxs(\"div\", { className: `border-l-4 overflow-hidden bg-white dark:bg-gray-900 mb-4 ${styles.borderColor} ${cardClassName || \"\"}`, \"data-workstream-id\": workstreamId, children: [_jsxs(\"div\", { className: `flex items-center justify-between px-4 py-1.5 ${headerClassName || \"\"}`, children: [_jsxs(\"div\", { className: \"flex items-center gap-1.5\", children: [_jsx(\"div\", { className: `${showPulsatingCircle ? \"animate-fadeIn\" : \"\"} ${iconClassName || \"\"}`, children: renderIcon() }), _jsx(\"span\", { className: `text-xs font-medium text-muted ${senderClassName || \"\"}`, children: styles.sender }), workstreamId !== \"main\" && workstreamId !== \"all\" && (_jsx(Badge, { variant: \"default\", className: \"text-xs text-muted ml-1\", children: workstreamId }))] }), _jsxs(\"div\", { className: \"flex items-center gap-1.5 print:hidden\", children: [_jsx(\"span\", { className: `text-[11px] text-muted/70 ${timestampClassName || \"\"}`, children: dayjs(message.timestamp).format(\"HH:mm:ss\") }), _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: copyToClipboard, className: \"text-muted/50 hover:text-muted h-5 w-5 p-0\", title: \"Copy message\", children: _jsx(CopyIcon, { className: \"size-3\" }) })] })] }), _jsxs(\"div\", { className: `px-4 pb-3 bg-white dark:bg-gray-900 ${contentClassName || \"\"}`, children: [message.type === AgentMessageType.REQUEST_INPUT && message.details?.ux ? ((() => {\n const uxConfig = message.details.ux;\n return (_jsx(AskUserWidget, { question: typeof messageContent === 'string' ? messageContent : '', options: uxConfig.options, variant: uxConfig.variant, multiSelect: uxConfig.multiSelect, allowFreeResponse: uxConfig.allowFreeResponse, placeholder: uxConfig.placeholder, onSelect: (optionId) => onSendMessage?.(optionId), onMultiSelect: (optionIds) => onSendMessage?.(optionIds.join(\", \")), onSubmit: (text) => onSendMessage?.(text), hideBorder: true }));\n })()) : messageContent && (_jsx(\"div\", { className: \"message-content break-words max-w-full\", style: { overflowWrap: 'anywhere' }, children: renderContent(processedContent || messageContent) })), artifactLinks.length > 0 && (_jsxs(\"div\", { className: `mt-3 text-xs ${artifactsClassName || \"\"}`, children: [_jsx(\"div\", { className: \"font-medium text-muted mb-1\", children: \"Artifacts\" }), artifactLinks.some(a => a.isImage) && (_jsx(\"div\", { className: \"mb-2 flex flex-wrap gap-3\", children: artifactLinks\n .filter(a => a.isImage)\n .map(({ displayName, artifactPath, url }) => (_jsxs(\"div\", { className: \"max-w-xs cursor-pointer\", onClick: () => openImage(url, displayName), children: [_jsx(\"img\", { src: url, alt: displayName, className: \"max-w-full h-auto rounded-lg shadow-sm hover:shadow-md transition-shadow\" }), _jsx(\"div\", { className: \"mt-1 text-[11px] text-muted truncate\", children: displayName })] }, `${artifactPath}-preview`))) })), _jsx(\"div\", { className: \"flex flex-wrap gap-2 print:hidden\", children: artifactLinks.map(({ displayName, artifactPath, url }) => (_jsx(Button, { variant: \"outline\", size: \"xs\", className: \"px-2 py-1 text-xs\", onClick: () => window.open(url, \"_blank\"), title: artifactPath, children: displayName }, artifactPath + url))) })] })), message.details && (_jsxs(\"div\", { className: `mt-2 print:hidden ${detailsClassName || \"\"}`, children: [_jsxs(\"button\", { onClick: () => setShowDetails(!showDetails), className: \"text-xs text-muted flex items-center\", children: [showDetails ? \"Hide\" : \"Show\", \" details\", _jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", className: `h-3 w-3 ml-1 transition-transform ${showDetails ? \"rotate-180\" : \"\"}`, fill: \"none\", viewBox: \"0 0 24 24\", stroke: \"currentColor\", children: _jsx(\"path\", { strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: 2, d: \"M19 9l-7 7-7-7\" }) })] }), showDetails && (_jsx(\"div\", { className: \"mt-2 p-2 bg-muted border border-mixer-muted/40 rounded text-sm\", children: typeof message.details === \"string\" ? (renderContent(message.details)) : (_jsx(\"pre\", { className: \"text-xs font-mono whitespace-pre-wrap overflow-x-auto bg-muted p-2 rounded text-muted \", children: JSON.stringify(message.details, null, 2) })) }))] }))] })] }) }));\n}\n// Memoize the component to prevent unnecessary re-renders\n// Only re-render when message timestamp, showPulsatingCircle, or className props change\nconst MessageItem = memo(MessageItemComponent, (prevProps, nextProps) => {\n return (prevProps.message.timestamp === nextProps.message.timestamp &&\n prevProps.showPulsatingCircle === nextProps.showPulsatingCircle &&\n prevProps.onSendMessage === nextProps.onSendMessage &&\n prevProps.className === nextProps.className &&\n prevProps.cardClassName === nextProps.cardClassName &&\n prevProps.headerClassName === nextProps.headerClassName &&\n prevProps.contentClassName === nextProps.contentClassName &&\n prevProps.timestampClassName === nextProps.timestampClassName &&\n prevProps.senderClassName === nextProps.senderClassName &&\n prevProps.iconClassName === nextProps.iconClassName &&\n prevProps.detailsClassName === nextProps.detailsClassName &&\n prevProps.artifactsClassName === nextProps.artifactsClassName);\n});\nexport default MessageItem;\n//# sourceMappingURL=MessageItem.js.map","import { jsxs as _jsxs, jsx as _jsx } from \"react/jsx-runtime\";\nimport React, { useState, useEffect, useRef, useCallback, useMemo } from \"react\";\nimport { Button, cn, useToast } from \"@vertesia/ui/core\";\nimport { MarkdownRenderer } from \"@vertesia/ui/widgets\";\nimport { CopyIcon } from \"lucide-react\";\nimport dayjs from \"dayjs\";\n// PERFORMANCE: Unicode cursor character - rendered inline with text\n// This avoids expensive DOM manipulation with TreeWalker on every update\nconst CURSOR_CHAR = \"▋\";\n/**\n * Displays a streaming message with adaptive reveal effect.\n * Automatically adjusts speed to match the model's generation rate,\n * creating smooth continuous text flow without bursts and pauses.\n */\nfunction StreamingMessageComponent({ text, workstreamId, revealSpeed = 300, isComplete = false, timestamp, className, headerClassName, contentClassName, }) {\n const [displayedLength, setDisplayedLength] = useState(0);\n const [throttledText, setThrottledText] = useState(\"\");\n const animationRef = useRef(null);\n const targetLengthRef = useRef(text.length);\n const displayedLengthRef = useRef(0);\n const startTime = useRef(timestamp || Date.now());\n const textRef = useRef(text); // Keep latest text for interval callback\n // Track model's generation rate for adaptive speed using exponential moving average\n const lastTextLengthRef = useRef(0);\n const lastTextTimeRef = useRef(performance.now());\n const modelRateRef = useRef(revealSpeed); // chars per second from model (EMA smoothed)\n const fractionalCharsRef = useRef(0); // sub-character accumulation for smooth reveal\n // Update model rate when new text arrives using EMA for smoother tracking\n useEffect(() => {\n const now = performance.now();\n const newChars = text.length - lastTextLengthRef.current;\n const elapsed = now - lastTextTimeRef.current;\n // Only update rate if meaningful time has passed (avoid divide-by-tiny-number issues)\n if (newChars > 0 && elapsed > 30) {\n const instantRate = (newChars / elapsed) * 1000; // chars per second\n // Exponential moving average - 20% weight to new sample\n // This creates smoother rate transitions than simple averaging\n const alpha = 0.2;\n modelRateRef.current = modelRateRef.current * (1 - alpha) + instantRate * alpha;\n // Clamp to reasonable range\n modelRateRef.current = Math.max(50, Math.min(2000, modelRateRef.current));\n }\n lastTextLengthRef.current = text.length;\n lastTextTimeRef.current = now;\n }, [text.length]);\n // Keep refs in sync\n targetLengthRef.current = text.length;\n textRef.current = text;\n const animate = useCallback(() => {\n let lastTime = performance.now();\n const step = (currentTime) => {\n const elapsed = currentTime - lastTime;\n lastTime = currentTime;\n const buffer = targetLengthRef.current - displayedLengthRef.current;\n // Nothing to reveal - keep animation running to catch new chunks\n if (buffer <= 0) {\n fractionalCharsRef.current = 0;\n animationRef.current = requestAnimationFrame(step);\n return;\n }\n // Smooth adaptive speed based on buffer size\n // Key insight: maintain a small buffer intentionally to smooth out arrival jitter\n let targetRate;\n if (isComplete) {\n // Streaming done - finish smoothly but not instant\n // Use 2x baseline or minimum 500 chars/sec for responsive feel\n targetRate = Math.max(500, modelRateRef.current * 2);\n }\n else if (buffer < 20) {\n // Nearly caught up - slow down slightly to maintain buffer\n // This prevents the \"catch up then pause\" jerkiness\n targetRate = modelRateRef.current * 0.85;\n }\n else if (buffer < 100) {\n // Healthy buffer - match model rate exactly\n targetRate = modelRateRef.current;\n }\n else if (buffer < 500) {\n // Buffer growing - gently speed up using continuous curve (1x to 1.5x)\n // Smoother than discrete steps\n const t = (buffer - 100) / 400; // 0 to 1\n targetRate = modelRateRef.current * (1 + t * 0.5);\n }\n else {\n // Large buffer - cap at 2x (not 10x like before)\n // This prevents jarring \"catch up\" bursts\n targetRate = modelRateRef.current * 2;\n }\n // Calculate chars to reveal with fractional accumulation for sub-char precision\n // This allows smoother reveal even at low rates\n const charsFloat = (targetRate * elapsed / 1000) + fractionalCharsRef.current;\n const charsToAdd = Math.floor(charsFloat);\n fractionalCharsRef.current = charsFloat - charsToAdd;\n if (charsToAdd > 0) {\n displayedLengthRef.current = Math.min(displayedLengthRef.current + charsToAdd, targetLengthRef.current);\n setDisplayedLength(displayedLengthRef.current);\n }\n // Continue animation loop\n animationRef.current = requestAnimationFrame(step);\n };\n animationRef.current = requestAnimationFrame(step);\n }, [isComplete]);\n // Start/continue animation when text grows\n useEffect(() => {\n if (text.length > displayedLengthRef.current && !animationRef.current) {\n animate();\n }\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n animationRef.current = null;\n }\n };\n }, [text.length, animate]);\n // When streaming completes, ensure we finish displaying quickly\n useEffect(() => {\n if (isComplete && displayedLengthRef.current < text.length) {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n animationRef.current = null;\n }\n animate();\n }\n }, [isComplete, text.length, animate]);\n // Throttle markdown updates for performance using a consistent interval\n // This avoids the issue where timeout-based throttling gets cancelled on every displayedLength change\n const throttleIntervalRef = useRef(null);\n const lastThrottledLengthRef = useRef(0);\n // Handle immediate updates when caught up or complete\n useEffect(() => {\n if (displayedLength >= targetLengthRef.current || isComplete) {\n setThrottledText(textRef.current.slice(0, displayedLength));\n lastThrottledLengthRef.current = displayedLength;\n }\n }, [displayedLength, isComplete]);\n // Manage the throttle interval - starts when streaming, stops when caught up\n const isStreaming = displayedLength < text.length && !isComplete;\n useEffect(() => {\n if (!isStreaming) {\n // Not streaming - clear interval\n if (throttleIntervalRef.current) {\n clearInterval(throttleIntervalRef.current);\n throttleIntervalRef.current = null;\n }\n return;\n }\n // Start interval if not already running (~30fps markdown updates)\n if (!throttleIntervalRef.current) {\n throttleIntervalRef.current = window.setInterval(() => {\n const currentLength = displayedLengthRef.current;\n // Only update if there's new content to show\n if (currentLength > lastThrottledLengthRef.current) {\n setThrottledText(textRef.current.slice(0, currentLength));\n lastThrottledLengthRef.current = currentLength;\n }\n }, 33);\n }\n return () => {\n if (throttleIntervalRef.current) {\n clearInterval(throttleIntervalRef.current);\n throttleIntervalRef.current = null;\n }\n };\n }, [isStreaming]);\n const toast = useToast();\n const formattedTime = useMemo(() => dayjs(startTime.current).format(\"HH:mm:ss\"), []);\n const isTyping = displayedLength < text.length;\n // PERFORMANCE: Append cursor character directly to text instead of DOM manipulation\n // This eliminates expensive TreeWalker traversal on every update\n const displayTextWithCursor = useMemo(() => {\n const baseText = throttledText || text.slice(0, displayedLength);\n return isTyping ? baseText + CURSOR_CHAR : baseText;\n }, [throttledText, text, displayedLength, isTyping]);\n if (!text)\n return null;\n const copyToClipboard = () => {\n navigator.clipboard.writeText(text).then(() => {\n toast({\n status: \"success\",\n title: \"Copied to clipboard\",\n duration: 2000,\n });\n });\n };\n return (_jsxs(\"div\", { className: cn(\"flex flex-col gap-1 p-3 rounded-lg\", \"bg-blue-50/50 dark:bg-blue-900/20 border border-blue-100 dark:border-blue-800/30\", \"min-h-[3rem]\", className), children: [_jsxs(\"div\", { className: cn(\"flex items-center justify-between\", headerClassName), children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [workstreamId && workstreamId !== \"main\" && (_jsxs(\"span\", { className: \"text-xs text-blue-600 dark:text-blue-400 font-medium\", children: [\"Task: \", workstreamId] })), isTyping && (_jsx(\"span\", { className: \"text-xs text-muted\", children: \"Streaming...\" }))] }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"span\", { className: \"text-xs text-muted\", children: formattedTime }), _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: copyToClipboard, className: \"text-muted opacity-50 hover:opacity-100\", title: \"Copy message\", children: _jsx(CopyIcon, { className: \"size-3\" }) })] })] }), _jsxs(\"div\", { className: cn(\"text-sm break-words leading-relaxed streaming-content prose prose-sm dark:prose-invert max-w-none\", isTyping && \"streaming-active\", contentClassName), children: [_jsx(MarkdownRenderer, { children: displayTextWithCursor }), _jsx(\"style\", { children: `\n /* Ensure inline elements flow properly */\n .streaming-content p:last-child,\n .streaming-content li:last-child {\n display: inline;\n }\n\n /* Style the cursor character when streaming */\n .streaming-active {\n /* The cursor character (▋) inherits text color by default */\n }\n\n /* Animate cursor with CSS - applies to the character via text-shadow */\n @keyframes cursorPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n }\n\n /* Make cursor character blink - targets last character when streaming */\n .streaming-active code:last-child,\n .streaming-active p:last-child,\n .streaming-active li:last-child,\n .streaming-active pre:last-child code {\n /* Cursor character inherits this animation via the container */\n }\n ` })] })] }));\n}\nconst StreamingMessage = React.memo(StreamingMessageComponent);\nexport default StreamingMessage;\n//# sourceMappingURL=StreamingMessage.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { MarkdownRenderer } from \"@vertesia/ui/widgets\";\nimport dayjs from \"dayjs\";\nimport { Bot, ChevronDown, ChevronRight, CopyIcon, CheckCircle, AlertCircle, AlertTriangle } from \"lucide-react\";\nimport { useState, memo, useEffect, useRef } from \"react\";\nimport { PulsatingCircle } from \"../AnimatedThinkingDots\";\nimport { useImageLightbox } from \"../ImageLightbox\";\nimport { useArtifactUrlCache, getArtifactCacheKey } from \"../useArtifactUrlCache.js\";\n// Helper to check if URL is an image\nconst isImageUrl = (url) => /\\.(png|jpg|jpeg|gif|webp|svg)(\\?|$)/i.test(url);\n// Component to render files (images inline, others as links)\nfunction FileDisplay({ files }) {\n const { openImage } = useImageLightbox();\n if (!files || files.length === 0)\n return null;\n return (_jsx(\"div\", { className: \"mt-2 flex flex-wrap gap-2\", children: files.map((file, idx) => {\n const fileName = file.split('/').pop()?.split('?')[0] || 'file';\n if (isImageUrl(file)) {\n return (_jsx(\"div\", { className: \"cursor-pointer\", onClick: () => openImage(file, fileName), title: \"Click to enlarge\", children: _jsx(\"img\", { src: file, alt: fileName, className: \"max-w-[300px] max-h-[200px] rounded border hover:opacity-80 transition-opacity hover:shadow-lg\" }) }, idx));\n }\n return (_jsxs(\"a\", { href: file, target: \"_blank\", rel: \"noopener noreferrer\", className: \"inline-flex items-center gap-1 px-2 py-1 bg-muted rounded text-xs hover:bg-muted/80\", children: [\"\\uD83D\\uDCCE \", fileName] }, idx));\n }) }));\n}\nfunction ToolCallItem({ message, isExpanded, onToggle, artifactRunId }) {\n const [showDetails, setShowDetails] = useState(false);\n const [resolvedFiles, setResolvedFiles] = useState([]);\n const toast = useToast();\n const { client } = useUserSession();\n const urlCache = useArtifactUrlCache();\n const details = message.details;\n const toolName = details?.tool || \"Tool\";\n const files = details?.files;\n const messageContent = typeof message.message === \"string\" ? message.message : \"\";\n // Resolve artifact paths to signed URLs\n useEffect(() => {\n if (!files || files.length === 0 || !artifactRunId) {\n setResolvedFiles([]);\n return;\n }\n let cancelled = false;\n const resolveFiles = async () => {\n const resolved = await Promise.all(files.map(async (file) => {\n if (!file || typeof file !== \"string\")\n return null;\n // If it's already a full URL, return as-is\n if (file.startsWith(\"http://\") || file.startsWith(\"https://\")) {\n return file;\n }\n // Resolve artifact path to signed URL\n const artifactPath = file.startsWith(\"out/\") || file.startsWith(\"files/\") || file.startsWith(\"scripts/\")\n ? file\n : `out/${file}`;\n const ext = artifactPath.split(\".\").pop()?.toLowerCase() || \"\";\n const imageExtensions = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"bmp\", \"svg\"]);\n const isImage = imageExtensions.has(ext);\n const disposition = isImage ? \"inline\" : \"attachment\";\n try {\n const cacheKey = getArtifactCacheKey(artifactRunId, artifactPath, disposition);\n if (urlCache) {\n return await urlCache.getOrFetch(cacheKey, async () => {\n const result = await client.files.getArtifactDownloadUrl(artifactRunId, artifactPath, disposition);\n return result.url;\n });\n }\n else {\n const result = await client.files.getArtifactDownloadUrl(artifactRunId, artifactPath, disposition);\n return result.url;\n }\n }\n catch (err) {\n console.error(`Failed to resolve artifact URL for ${artifactPath}`, err);\n return null;\n }\n }));\n if (!cancelled) {\n setResolvedFiles(resolved.filter((f) => !!f));\n }\n };\n resolveFiles();\n return () => { cancelled = true; };\n }, [files, artifactRunId, client, urlCache]);\n // Separate image files from other files for inline preview\n const imageFiles = resolvedFiles.filter(f => isImageUrl(f));\n const nonImageFiles = resolvedFiles.filter(f => !isImageUrl(f));\n const copyToClipboard = () => {\n const textToCopy = [\n messageContent,\n details ? \"\\n\\nDetails:\\n\" + JSON.stringify(details, null, 2) : \"\"\n ].join(\"\").trim();\n navigator.clipboard.writeText(textToCopy).then(() => {\n toast({\n status: \"success\",\n title: \"Copied to clipboard\",\n duration: 2000,\n });\n });\n };\n return (_jsxs(\"div\", { className: \"border-b border-gray-100 dark:border-gray-800 last:border-b-0\", children: [_jsxs(\"div\", { className: \"flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors\", onClick: onToggle, children: [_jsxs(\"div\", { className: \"flex items-center gap-2 flex-1 min-w-0\", children: [isExpanded ? (_jsx(ChevronDown, { className: \"size-3 text-muted flex-shrink-0\" })) : (_jsx(ChevronRight, { className: \"size-3 text-muted flex-shrink-0\" })), _jsx(\"span\", { className: \"text-xs font-medium text-purple-600 dark:text-purple-400 flex-shrink-0\", children: toolName }), !isExpanded && messageContent && (_jsx(\"span\", { className: \"text-xs text-muted flex-1\", children: messageContent }))] }), _jsxs(\"div\", { className: \"flex items-center gap-2 flex-shrink-0\", children: [_jsx(\"span\", { className: \"text-xs text-muted\", children: dayjs(message.timestamp).format(\"HH:mm:ss\") }), _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: (e) => {\n e.stopPropagation();\n copyToClipboard();\n }, className: \"text-muted opacity-0 group-hover:opacity-100 transition-opacity\", title: \"Copy message\", children: _jsx(CopyIcon, { className: \"size-3\" }) })] })] }), imageFiles.length > 0 && (_jsx(\"div\", { className: \"px-4 pb-2\", children: _jsx(FileDisplay, { files: imageFiles }) })), isExpanded && (_jsxs(\"div\", { className: \"px-4 py-2 bg-gray-50/50 dark:bg-gray-800/30\", children: [messageContent && (_jsx(\"div\", { className: \"vprose prose prose-slate dark:prose-invert prose-p:leading-relaxed prose-p:my-1.5 max-w-none text-sm\", children: _jsx(MarkdownRenderer, { artifactRunId: artifactRunId, children: messageContent }) })), nonImageFiles.length > 0 && _jsx(FileDisplay, { files: nonImageFiles }), details && (_jsxs(\"div\", { className: \"mt-2\", children: [_jsxs(\"button\", { onClick: (e) => {\n e.stopPropagation();\n setShowDetails(!showDetails);\n }, className: \"text-xs text-muted flex items-center\", children: [showDetails ? \"Hide\" : \"Show\", \" details\", _jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", className: `h-3 w-3 ml-1 transition-transform ${showDetails ? \"rotate-180\" : \"\"}`, fill: \"none\", viewBox: \"0 0 24 24\", stroke: \"currentColor\", children: _jsx(\"path\", { strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: 2, d: \"M19 9l-7 7-7-7\" }) })] }), showDetails && (_jsx(\"div\", { className: \"mt-2 p-2 bg-muted border border-mixer-muted/40 rounded text-sm\", children: _jsx(\"pre\", { className: \"text-xs font-mono whitespace-pre-wrap overflow-x-auto\", children: JSON.stringify(details, null, 2) }) }))] }))] }))] }));\n}\n// Component for resolving and displaying files from a collapsed tool message\nfunction CollapsedItemFiles({ files, artifactRunId }) {\n const [resolvedFiles, setResolvedFiles] = useState([]);\n const { client } = useUserSession();\n const urlCache = useArtifactUrlCache();\n useEffect(() => {\n if (!files || files.length === 0 || !artifactRunId) {\n setResolvedFiles([]);\n return;\n }\n let cancelled = false;\n const resolveFiles = async () => {\n const resolved = await Promise.all(files.map(async (file) => {\n if (!file || typeof file !== \"string\")\n return null;\n if (file.startsWith(\"http://\") || file.startsWith(\"https://\")) {\n return file;\n }\n const artifactPath = file.startsWith(\"out/\") || file.startsWith(\"files/\") || file.startsWith(\"scripts/\")\n ? file\n : `out/${file}`;\n const ext = artifactPath.split(\".\").pop()?.toLowerCase() || \"\";\n const imageExtensions = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"bmp\", \"svg\"]);\n const isImage = imageExtensions.has(ext);\n const disposition = isImage ? \"inline\" : \"attachment\";\n try {\n const cacheKey = getArtifactCacheKey(artifactRunId, artifactPath, disposition);\n if (urlCache) {\n return await urlCache.getOrFetch(cacheKey, async () => {\n const result = await client.files.getArtifactDownloadUrl(artifactRunId, artifactPath, disposition);\n return result.url;\n });\n }\n else {\n const result = await client.files.getArtifactDownloadUrl(artifactRunId, artifactPath, disposition);\n return result.url;\n }\n }\n catch (err) {\n console.error(`Failed to resolve artifact URL for ${artifactPath}`, err);\n return null;\n }\n }));\n if (!cancelled) {\n setResolvedFiles(resolved.filter((f) => !!f));\n }\n };\n resolveFiles();\n return () => { cancelled = true; };\n }, [files, artifactRunId, client, urlCache]);\n const imageFiles = resolvedFiles.filter(f => isImageUrl(f));\n const nonImageFiles = resolvedFiles.filter(f => !isImageUrl(f));\n return (_jsxs(_Fragment, { children: [imageFiles.length > 0 && (_jsx(\"div\", { className: \"pl-5 pr-3 pb-2\", children: _jsx(FileDisplay, { files: imageFiles }) })), nonImageFiles.length > 0 && (_jsx(\"div\", { className: \"pl-5 pr-3 pb-2\", children: _jsx(FileDisplay, { files: nonImageFiles }) }))] }));\n}\nfunction ToolCallGroupComponent({ messages, showPulsatingCircle = false, toolRunId: _toolRunId, toolStatus }) {\n const [isCollapsed, setIsCollapsed] = useState(true);\n const [expandedItems, setExpandedItems] = useState(new Set());\n const [animatingIndices, setAnimatingIndices] = useState(new Set());\n const prevCountRef = useRef(messages.length);\n const toast = useToast();\n // Extract workflow_run_id from messages (any message in the group should have it)\n const artifactRunId = messages.find(m => m.workflow_run_id)?.workflow_run_id\n ?? messages[0]?.workflow_run_id;\n // Render status indicator based on tool execution status\n const renderStatusIndicator = () => {\n if (showPulsatingCircle || toolStatus === \"running\") {\n return _jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" });\n }\n if (toolStatus === \"completed\") {\n return _jsx(CheckCircle, { className: \"size-4 text-success\" });\n }\n if (toolStatus === \"error\") {\n return _jsx(AlertCircle, { className: \"size-4 text-destructive\" });\n }\n if (toolStatus === \"warning\") {\n return _jsx(AlertTriangle, { className: \"size-4 text-attention\" });\n }\n return _jsx(Bot, { className: \"size-4 text-purple-600 dark:text-purple-400\" });\n };\n // Get border color based on status\n const getBorderColor = () => {\n if (toolStatus === \"completed\")\n return \"border-l-success\";\n if (toolStatus === \"error\")\n return \"border-l-destructive\";\n if (toolStatus === \"warning\")\n return \"border-l-attention\";\n return \"border-l-purple-500\";\n };\n // Animate new messages when they're added\n useEffect(() => {\n const prevCount = prevCountRef.current;\n const currentCount = messages.length;\n if (currentCount > prevCount) {\n // New messages added - animate them\n const newIndices = new Set();\n for (let i = prevCount; i < currentCount; i++) {\n newIndices.add(i);\n }\n setAnimatingIndices(newIndices);\n // Clear animation after it completes\n const timer = setTimeout(() => {\n setAnimatingIndices(new Set());\n }, 500);\n prevCountRef.current = currentCount;\n return () => clearTimeout(timer);\n }\n prevCountRef.current = currentCount;\n }, [messages.length]);\n const firstMessage = messages[0];\n const lastMessage = messages[messages.length - 1];\n const firstTimestamp = firstMessage.timestamp;\n const lastTimestamp = lastMessage.timestamp;\n // Get tool names for summary\n const toolNames = messages.map(m => {\n const details = m.details;\n return details?.tool || \"tool\";\n });\n const uniqueToolCount = new Set(toolNames).size;\n const toolSummary = uniqueToolCount === 1\n ? `${messages.length}× ${toolNames[0]}`\n : `${messages.length} tool calls`;\n const toggleItem = (index) => {\n setExpandedItems(prev => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n }\n else {\n next.add(index);\n }\n return next;\n });\n };\n const copyAllToClipboard = () => {\n const allContent = messages.map(m => {\n const details = m.details;\n return `[${details?.tool || \"tool\"}] ${m.message || \"\"}\\n${details ? JSON.stringify(details, null, 2) : \"\"}`;\n }).join(\"\\n\\n---\\n\\n\");\n navigator.clipboard.writeText(allContent).then(() => {\n toast({\n status: \"success\",\n title: \"Copied all tool calls to clipboard\",\n duration: 2000,\n });\n });\n };\n return (_jsxs(\"div\", { className: `border-l-4 ${getBorderColor()} overflow-hidden bg-white dark:bg-gray-900 mb-4`, children: [_jsxs(\"div\", { className: \"flex items-center justify-between px-4 py-1.5 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors\", onClick: () => setIsCollapsed(!isCollapsed), children: [_jsxs(\"div\", { className: \"flex items-center gap-1.5\", children: [renderStatusIndicator(), _jsx(\"span\", { className: \"text-xs font-medium text-muted\", children: \"Agent\" }), _jsx(\"span\", { className: \"text-xs text-purple-600 dark:text-purple-400 font-medium\", children: toolSummary }), isCollapsed ? (_jsx(ChevronRight, { className: \"size-3 text-muted\" })) : (_jsx(ChevronDown, { className: \"size-3 text-muted\" }))] }), _jsxs(\"div\", { className: \"flex items-center gap-1.5\", children: [_jsxs(\"span\", { className: \"text-[11px] text-muted/70\", children: [dayjs(firstTimestamp).format(\"HH:mm:ss\"), messages.length > 1 && ` - ${dayjs(lastTimestamp).format(\"HH:mm:ss\")}`] }), _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: (e) => {\n e.stopPropagation();\n copyAllToClipboard();\n }, className: \"text-muted/50 hover:text-muted h-5 w-5 p-0\", title: \"Copy all tool calls\", children: _jsx(CopyIcon, { className: \"size-3\" }) })] })] }), isCollapsed && (_jsx(\"div\", { className: \"px-4 py-1 space-y-0\", children: messages.map((m, idx) => {\n const details = m.details;\n const toolName = details?.tool || \"tool\";\n const fullMessage = typeof m.message === \"string\" ? m.message : \"\";\n const isAnimating = animatingIndices.has(idx);\n const isItemExpanded = expandedItems.has(idx);\n const files = details?.files;\n return (_jsxs(\"div\", { className: \"border-b border-gray-100 dark:border-gray-800 last:border-b-0\", style: {\n opacity: isAnimating ? 0 : 1,\n transform: isAnimating ? 'translateX(-10px)' : 'translateX(0)',\n transition: 'opacity 0.3s ease-out, transform 0.3s ease-out',\n transitionDelay: `${(idx - (messages.length - animatingIndices.size)) * 100}ms`,\n animation: isAnimating ? 'slideInFade 0.4s ease-out forwards' : 'none',\n animationDelay: `${(idx - (messages.length - animatingIndices.size)) * 100}ms`,\n }, children: [_jsxs(\"div\", { className: \"flex items-center gap-2 py-1.5 text-xs cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50\", onClick: () => toggleItem(idx), title: fullMessage, children: [isItemExpanded ? (_jsx(ChevronDown, { className: \"size-3 text-muted flex-shrink-0\" })) : (_jsx(ChevronRight, { className: \"size-3 text-muted flex-shrink-0\" })), _jsx(\"span\", { className: \"font-medium text-purple-700 dark:text-purple-300 flex-shrink-0 min-w-[100px]\", children: toolName }), !isItemExpanded && (_jsx(\"span\", { className: \"text-muted truncate flex-1\", children: fullMessage }))] }), _jsx(CollapsedItemFiles, { files: files, artifactRunId: artifactRunId }), isItemExpanded && (_jsxs(\"div\", { className: \"pl-5 pr-3 pb-2 text-sm\", children: [_jsx(\"div\", { className: \"vprose prose prose-slate dark:prose-invert prose-p:leading-relaxed prose-p:my-1.5 max-w-none text-sm\", children: _jsx(MarkdownRenderer, { artifactRunId: artifactRunId, children: fullMessage }) }), details && Object.keys(details).length > 1 && (_jsxs(\"details\", { className: \"mt-2 text-xs\", children: [_jsx(\"summary\", { className: \"text-muted cursor-pointer\", children: \"Show details\" }), _jsx(\"pre\", { className: \"mt-1 p-2 bg-muted rounded text-xs overflow-x-auto\", children: JSON.stringify(details, null, 2) })] }))] }))] }, `${m.timestamp}-${idx}`));\n }) })), _jsx(\"style\", { children: `\n @keyframes slideInFade {\n from {\n opacity: 0;\n transform: translateX(-10px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n ` }), !isCollapsed && (_jsx(\"div\", { className: \"group\", children: messages.map((message, index) => (_jsx(ToolCallItem, { message: message, isExpanded: expandedItems.has(index), onToggle: () => toggleItem(index), artifactRunId: artifactRunId }, `${message.timestamp}-${index}`))) }))] }));\n}\n// Memoize to prevent unnecessary re-renders\nconst ToolCallGroup = memo(ToolCallGroupComponent, (prevProps, nextProps) => {\n if (prevProps.messages.length !== nextProps.messages.length)\n return false;\n if (prevProps.showPulsatingCircle !== nextProps.showPulsatingCircle)\n return false;\n if (prevProps.toolRunId !== nextProps.toolRunId)\n return false;\n if (prevProps.toolStatus !== nextProps.toolStatus)\n return false;\n // Compare first and last timestamps as a proxy for content changes\n return (prevProps.messages[0]?.timestamp === nextProps.messages[0]?.timestamp &&\n prevProps.messages[prevProps.messages.length - 1]?.timestamp ===\n nextProps.messages[nextProps.messages.length - 1]?.timestamp);\n});\nexport default ToolCallGroup;\n//# sourceMappingURL=ToolCallGroup.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { CheckCircle, Clock } from \"lucide-react\";\nimport { getWorkstreamId } from \"./utils\";\n/**\n * Component that displays tabs for different workstreams\n */\nexport default function WorkstreamTabs({ workstreams, activeWorkstream, onSelectWorkstream, count, completionStatus, }) {\n // Create a new map with just the core workstreams\n const filteredWorkstreams = new Map();\n filteredWorkstreams.set(\"all\", \"All Messages\");\n filteredWorkstreams.set(\"main\", \"Main\");\n // Only add actual workstreams from messages (not our test workstreams)\n workstreams.forEach((name, id) => {\n if (id !== \"all\" &&\n id !== \"main\" &&\n id !== \"research_france\" &&\n id !== \"statistics\") {\n filteredWorkstreams.set(id, name);\n }\n });\n // Replace workstreams with our filtered version\n workstreams = filteredWorkstreams;\n // Sort workstream entries in a predictable order:\n // 1. 'all' first\n // 2. 'main' second\n // 3. The rest alphabetically by ID\n const sortedWorkstreams = Array.from(workstreams.entries()).sort(([idA], [idB]) => {\n if (idA === \"all\")\n return -1;\n if (idB === \"all\")\n return 1;\n if (idA === \"main\")\n return -1;\n if (idB === \"main\")\n return 1;\n return idA.localeCompare(idB);\n });\n // Only show tabs if there are multiple workstreams (more than just 'all' and 'main')\n const hasMultipleWorkstreams = sortedWorkstreams.length > 2;\n // If there are no multiple workstreams, return an empty div to maintain layout\n if (!hasMultipleWorkstreams) {\n return _jsx(\"div\", { className: \"py-1\" });\n }\n return (_jsx(\"div\", { className: \"flex overflow-x-auto space-x-1 mb-2 bg-muted border-b-2 border-muted/20 sticky top-0 z-10\", children: sortedWorkstreams.map(([id, name]) => (_jsxs(\"button\", { className: `px-2 py-1 text-xs font-medium whitespace-nowrap transition-colors flex items-center gap-1.5\n ${activeWorkstream === id\n ? \"bg-info text-info border-b-2 border-info\"\n : \"text-muted hover:bg-muted border-b-2 border-transparent\"}`, onClick: () => onSelectWorkstream(id), title: name.length > 20 ? name : undefined, children: [name.length > 20 ? name.substring(0, 18) + \"...\" : name, count && count.has(id) && count.get(id) > 0 && (_jsxs(\"div\", { className: \"flex items-center space-x-1\", children: [_jsx(\"span\", { className: `inline-flex items-center justify-center p-1 text-xs rounded-full\n ${activeWorkstream === id\n ? \"bg-info text-info\"\n : \"bg-muted text-muted\"}`, children: count.get(id) }), completionStatus &&\n id !== \"all\" &&\n (completionStatus.get(id) ? (_jsx(CheckCircle, { className: \"size-3 text-success\" })) : (_jsx(Clock, { className: \"size-3 text-attention\" })))] }))] }, id))) }));\n}\n/**\n * Helper function to extract workstream information from messages\n */\nexport function extractWorkstreams(messages) {\n const workstreams = new Map();\n // Always include \"all\" and \"main\" workstreams\n workstreams.set(\"all\", \"All Messages\");\n workstreams.set(\"main\", \"Main\");\n // Extract workstream IDs directly from message.workstream_id only\n messages.forEach((message) => {\n if (message.workstream_id &&\n message.workstream_id !== \"main\" &&\n message.workstream_id !== \"all\" &&\n !workstreams.has(message.workstream_id)) {\n // Use the workstream_id as both the ID and the display name\n workstreams.set(message.workstream_id, message.workstream_id);\n console.log(`Found workstream: ${message.workstream_id}`);\n }\n });\n // Special case: if there's only the 'main' workstream, we want to explicitly make sure it exists\n // This ensures that both 'all' and 'main' are added if no additional workstreams are found\n if (workstreams.size <= 2 && !workstreams.has(\"main\")) {\n workstreams.set(\"main\", \"Main\");\n }\n console.log(\"Final workstreams map:\", workstreams);\n return workstreams;\n}\n/**\n * Filter messages by workstream\n */\nexport function filterMessagesByWorkstream(messages, workstreamId) {\n if (workstreamId === \"all\") {\n // Show all messages, no filtering needed\n return [...messages];\n }\n else if (workstreamId === \"main\") {\n // For the main workstream, show only messages that belong to the main workstream\n // This excludes messages that belong to specific tasks/workstreams\n return messages.filter((message) => {\n const msgWorkstreamId = getWorkstreamId(message);\n return msgWorkstreamId === \"main\";\n });\n }\n else {\n // For specific workstreams, show only messages that match the workstream_id\n return messages.filter((message) => {\n const msgWorkstreamId = getWorkstreamId(message);\n return msgWorkstreamId === workstreamId;\n });\n }\n}\n//# sourceMappingURL=WorkstreamTabs.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { AgentMessageType } from \"@vertesia/common\";\nimport React, { useEffect, useMemo, useState, useRef, useCallback, Component } from \"react\";\nimport { PulsatingCircle } from \"../AnimatedThinkingDots\";\nimport BatchProgressPanel from \"./BatchProgressPanel\";\nimport MessageItem from \"./MessageItem\";\nimport StreamingMessage from \"./StreamingMessage\";\nimport ToolCallGroup from \"./ToolCallGroup\";\nimport WorkstreamTabs, { extractWorkstreams, filterMessagesByWorkstream } from \"./WorkstreamTabs\";\nimport { DONE_STATES, getWorkstreamId, groupMessagesWithStreaming } from \"./utils\";\nimport { ThinkingMessages } from \"../WaitingMessages\";\n// Replace %thinking_message% placeholder with actual thinking message\nconst processThinkingPlaceholder = (text, thinkingMessageIndex) => {\n if (text.includes('%thinking_message%')) {\n return text.replace(/%thinking_message%/g, ThinkingMessages[thinkingMessageIndex]);\n }\n return text;\n};\n// Check if message is a batch progress message\nconst isBatchProgressMessage = (message) => {\n return message.type === AgentMessageType.BATCH_PROGRESS && !!message.details?.batch_id;\n};\n// Check if message is a system metadata message that should be hidden from users\nconst isSystemMetadataMessage = (message) => {\n if (message.type !== AgentMessageType.UPDATE)\n return false;\n const text = message.message?.toString() || '';\n // Hide \"Tools enabled:\" messages that list all available tools\n if (text.startsWith('Tools enabled:'))\n return true;\n // Hide \"Starting work with interaction\" messages\n if (text.startsWith('Starting work with interaction'))\n return true;\n return false;\n};\n// Error boundary to catch and isolate errors in individual message components\nclass MessageErrorBoundary extends Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false };\n }\n static getDerivedStateFromError(error) {\n console.error('Message render error:', error);\n return { hasError: true, error };\n }\n render() {\n // Silent fail - just don't render the broken message\n if (this.state.hasError) {\n return null;\n }\n return this.props.children;\n }\n}\n// PERFORMANCE: Throttle interval for auto-scroll (ms)\nconst SCROLL_THROTTLE_MS = 100; // Max 10 scrolls per second\nfunction AllMessagesMixedComponent({ messages, bottomRef, viewMode = 'stacked', isCompleted = false, streamingMessages = new Map(), onSendMessage, thinkingMessageIndex = 0, }) {\n const containerRef = useRef(null);\n const [activeWorkstream, setActiveWorkstream] = useState(\"all\");\n // PERFORMANCE: Throttle auto-scroll to prevent layout thrashing\n // During streaming, scrollIntoView was being called 30+ times/sec\n const lastScrollTimeRef = useRef(0);\n const scrollScheduledRef = useRef(null);\n const isStreaming = streamingMessages.size > 0;\n // Compute bucketed streaming content length for scroll dependency\n // Changes every ~200 chars to trigger scroll without excessive updates\n const streamingContentBucket = useMemo(() => {\n let total = 0;\n streamingMessages.forEach((data) => {\n total += data.text?.length || 0;\n });\n return Math.floor(total / 200); // Bucket by 200 chars\n }, [streamingMessages]);\n // Throttled scroll function\n const performScroll = useCallback(() => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: isStreaming ? \"instant\" : \"smooth\" });\n lastScrollTimeRef.current = Date.now();\n }\n scrollScheduledRef.current = null;\n }, [bottomRef, isStreaming]);\n // Auto-scroll to bottom when messages or streaming messages change\n // Throttled to max 10 scrolls/sec to prevent layout thrashing\n useEffect(() => {\n const now = Date.now();\n const timeSinceLastScroll = now - lastScrollTimeRef.current;\n // If we haven't scrolled recently, scroll immediately\n if (timeSinceLastScroll >= SCROLL_THROTTLE_MS) {\n performScroll();\n }\n else if (scrollScheduledRef.current === null) {\n // Schedule a scroll for later if not already scheduled\n const delay = SCROLL_THROTTLE_MS - timeSinceLastScroll;\n scrollScheduledRef.current = window.setTimeout(performScroll, delay);\n }\n // Cleanup scheduled scroll on unmount or before next effect\n return () => {\n if (scrollScheduledRef.current !== null) {\n clearTimeout(scrollScheduledRef.current);\n scrollScheduledRef.current = null;\n }\n };\n }, [messages.length, streamingMessages.size, streamingContentBucket, performScroll]);\n // Sort all messages chronologically and filter out system metadata\n const sortedMessages = React.useMemo(() => [...messages]\n .filter(msg => !isSystemMetadataMessage(msg))\n .sort((a, b) => {\n const timeA = typeof a.timestamp === \"number\" ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === \"number\" ? b.timestamp : new Date(b.timestamp).getTime();\n return timeA - timeB;\n }), [messages]);\n // Get workstreams from messages - only from message.workstream_id\n const workstreams = React.useMemo(() => {\n // Just get the basic workstreams from the messages\n const extractedWorkstreams = extractWorkstreams(sortedMessages);\n // We'll keep taskLabels - they might be used for display purposes elsewhere\n // but we won't use them to create new workstream tabs\n return extractedWorkstreams;\n }, [sortedMessages]);\n // Count messages per workstream\n const workstreamCounts = React.useMemo(() => {\n const counts = new Map();\n counts.set(\"all\", sortedMessages.length);\n // Count main messages\n const mainMessages = filterMessagesByWorkstream(sortedMessages, \"main\");\n counts.set(\"main\", mainMessages.length);\n // Count other workstreams\n sortedMessages.forEach((msg) => {\n const workstreamId = getWorkstreamId(msg);\n if (workstreamId !== \"main\") {\n counts.set(workstreamId, (counts.get(workstreamId) || 0) + 1);\n }\n });\n return counts;\n }, [sortedMessages]);\n // Filter messages based on active workstream\n const displayMessages = React.useMemo(() => {\n if (activeWorkstream === \"all\") {\n return sortedMessages;\n }\n return filterMessagesByWorkstream(sortedMessages, activeWorkstream);\n }, [sortedMessages, activeWorkstream]);\n // Pre-compute important messages and recent thinking for sliding view (avoid IIFE in render)\n const { importantMessages, recentThinking } = React.useMemo(() => {\n const hasStreaming = streamingMessages.size > 0;\n // Important messages include answers, questions, completion states, AND tool progress thoughts\n const important = displayMessages.filter(msg => msg.type === AgentMessageType.ANSWER ||\n msg.type === AgentMessageType.QUESTION ||\n msg.type === AgentMessageType.COMPLETE ||\n msg.type === AgentMessageType.IDLE ||\n msg.type === AgentMessageType.REQUEST_INPUT ||\n msg.type === AgentMessageType.TERMINATED ||\n msg.type === AgentMessageType.ERROR ||\n // Include THOUGHT messages that have tool details (progress from message_to_human)\n (msg.type === AgentMessageType.THOUGHT && msg.details?.tool) ||\n // Include toolkit_ready SYSTEM message (shows at conversation start)\n (msg.type === AgentMessageType.SYSTEM && msg.details?.system_type === 'toolkit_ready'));\n // Latest thinking: show only the most recent generic thinking message (UPDATE/PLAN or THOUGHT without tool)\n // Tool progress is already in important messages\n const thinkingMessages = !isCompleted && !hasStreaming\n ? displayMessages\n .filter(msg => msg.type === AgentMessageType.UPDATE ||\n msg.type === AgentMessageType.PLAN ||\n (msg.type === AgentMessageType.THOUGHT && !msg.details?.tool))\n .slice(-1) // Show only the latest thinking message\n : [];\n return { importantMessages: important, recentThinking: thinkingMessages };\n }, [displayMessages, isCompleted, streamingMessages.size]);\n // Group messages with streaming interleaved for stacked view\n const groupedMessages = React.useMemo(() => groupMessagesWithStreaming(displayMessages, streamingMessages, activeWorkstream), [displayMessages, streamingMessages, activeWorkstream]);\n // Group important messages with streaming interleaved for sliding view\n const groupedImportantMessages = React.useMemo(() => groupMessagesWithStreaming(importantMessages, streamingMessages, activeWorkstream), [importantMessages, streamingMessages, activeWorkstream]);\n // Show working indicator when agent is actively processing\n const isAgentWorking = useMemo(() => {\n if (isCompleted)\n return false;\n // Agent is working if there are streaming messages, recent thinking, or no final answer yet\n return streamingMessages.size > 0 || recentThinking.length > 0 || !displayMessages.some(msg => msg.type === AgentMessageType.COMPLETE ||\n msg.type === AgentMessageType.IDLE ||\n msg.type === AgentMessageType.TERMINATED);\n }, [isCompleted, streamingMessages.size, recentThinking.length, displayMessages]);\n // Determine completion status for each workstream\n const workstreamCompletionStatus = useMemo(() => {\n const statusMap = new Map();\n // Group messages by workstream\n const workstreamMessages = new Map();\n sortedMessages.forEach(message => {\n const workstreamId = getWorkstreamId(message);\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n }\n workstreamMessages.get(workstreamId).push(message);\n });\n // Check if each workstream is completed\n for (const [workstreamId, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n const lastMessage = msgs[msgs.length - 1];\n statusMap.set(workstreamId, [\n AgentMessageType.COMPLETE,\n AgentMessageType.IDLE,\n AgentMessageType.REQUEST_INPUT,\n AgentMessageType.TERMINATED\n ].includes(lastMessage.type));\n }\n }\n return statusMap;\n }, [sortedMessages]);\n return (_jsxs(\"div\", { ref: containerRef, className: \"flex-1 min-h-0 h-full overflow-y-auto overflow-x-hidden px-4 sm:px-2 lg:px-4 flex flex-col relative\", \"data-testid\": \"all-messages-mixed\", children: [_jsx(\"div\", { className: \"sticky top-0 z-10\", children: _jsx(WorkstreamTabs, { workstreams: workstreams, activeWorkstream: activeWorkstream, onSelectWorkstream: setActiveWorkstream, count: workstreamCounts, completionStatus: workstreamCompletionStatus }) }), displayMessages.length === 0 ? (_jsx(\"div\", { className: \"flex items-center justify-center h-full text-center py-8\", children: _jsx(\"div\", { className: \"flex items-center px-4 py-3 text-muted\", children: activeWorkstream === \"all\"\n ? \"Waiting for agent response...\"\n : \"No messages in this workstream yet...\" }) })) : (_jsxs(\"div\", { className: \"flex-1 flex flex-col justify-start pb-4 space-y-2\", children: [viewMode === 'stacked' ? (\n // Details view - show ALL messages with streaming interleaved\n _jsxs(_Fragment, { children: [groupedMessages.map((group, groupIndex) => {\n const isLastGroup = groupIndex === groupedMessages.length - 1;\n if (group.type === 'tool_group') {\n // Render grouped tool calls\n const lastMessage = group.messages[group.messages.length - 1];\n const isLatest = !isCompleted &&\n isLastGroup &&\n !DONE_STATES.includes(lastMessage.type) &&\n group.toolStatus !== \"completed\";\n return (_jsx(MessageErrorBoundary, { children: _jsx(ToolCallGroup, { messages: group.messages, showPulsatingCircle: isLatest, toolRunId: group.toolRunId, toolStatus: group.toolStatus }) }, `group-${group.toolRunId || group.firstTimestamp}-${groupIndex}`));\n }\n else if (group.type === 'streaming') {\n // Render streaming message inline\n return (_jsx(MessageErrorBoundary, { children: _jsx(StreamingMessage, { text: group.text, workstreamId: group.workstreamId, isComplete: group.isComplete }) }, `streaming-${group.streamingId}-${groupIndex}`));\n }\n else {\n // Render single message\n const message = group.message;\n const isLatestMessage = !isCompleted &&\n isLastGroup &&\n !DONE_STATES.includes(message.type);\n // Special handling for batch progress messages\n if (isBatchProgressMessage(message)) {\n return (_jsx(MessageErrorBoundary, { children: _jsx(BatchProgressPanel, { message: message, batchData: message.details, isRunning: !message.details.completed_at }) }, `batch-${message.details.batch_id}-${message.timestamp}-${groupIndex}`));\n }\n return (_jsx(MessageErrorBoundary, { children: _jsx(MessageItem, { message: message, showPulsatingCircle: isLatestMessage, onSendMessage: onSendMessage }) }, `${message.timestamp}-${groupIndex}`));\n }\n }), isAgentWorking && streamingMessages.size === 0 && (_jsxs(\"div\", { className: \"flex items-center gap-3 p-4 rounded-lg bg-blue-50/50 dark:bg-blue-900/20 border border-blue-100 dark:border-blue-800/30\", children: [_jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" }), _jsx(\"span\", { className: \"text-sm text-muted\", children: \"Working...\" })] }))] })) : (\n // Most Important view - main messages + streaming interleaved\n _jsxs(_Fragment, { children: [groupedImportantMessages.map((group, groupIndex) => {\n const isLastGroup = groupIndex === groupedImportantMessages.length - 1;\n if (group.type === 'tool_group') {\n // Render grouped tool calls\n const lastMessage = group.messages[group.messages.length - 1];\n const isLatest = !isCompleted &&\n recentThinking.length === 0 &&\n isLastGroup &&\n !DONE_STATES.includes(lastMessage.type) &&\n group.toolStatus !== \"completed\";\n return (_jsx(MessageErrorBoundary, { children: _jsx(ToolCallGroup, { messages: group.messages, showPulsatingCircle: isLatest, toolRunId: group.toolRunId, toolStatus: group.toolStatus }) }, `group-${group.toolRunId || group.firstTimestamp}-${groupIndex}`));\n }\n else if (group.type === 'streaming') {\n // Render streaming message inline\n return (_jsx(MessageErrorBoundary, { children: _jsx(StreamingMessage, { text: group.text, workstreamId: group.workstreamId, isComplete: group.isComplete }) }, `streaming-${group.streamingId}-${groupIndex}`));\n }\n else {\n // Render single message\n const message = group.message;\n const isLatestMessage = !isCompleted &&\n recentThinking.length === 0 &&\n isLastGroup &&\n !DONE_STATES.includes(message.type);\n // Special handling for batch progress messages\n if (isBatchProgressMessage(message)) {\n return (_jsx(MessageErrorBoundary, { children: _jsx(BatchProgressPanel, { message: message, batchData: message.details, isRunning: !message.details.completed_at }) }, `batch-${message.details.batch_id}-${message.timestamp}-${groupIndex}`));\n }\n return (_jsx(MessageErrorBoundary, { children: _jsx(MessageItem, { message: message, showPulsatingCircle: isLatestMessage, onSendMessage: onSendMessage }) }, `${message.timestamp}-${groupIndex}`));\n }\n }), recentThinking.map((thinking, idx) => (_jsx(MessageErrorBoundary, { children: _jsx(StreamingMessage, { text: processThinkingPlaceholder(thinking.message || '', thinkingMessageIndex), workstreamId: getWorkstreamId(thinking), isComplete: idx < recentThinking.length - 1 }) }, `thinking-${thinking.timestamp}-${idx}`))), isAgentWorking && recentThinking.length === 0 && streamingMessages.size === 0 && (_jsxs(\"div\", { className: \"flex items-center gap-3 p-4 rounded-lg bg-blue-50/50 dark:bg-blue-900/20 border border-blue-100 dark:border-blue-800/30\", children: [_jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" }), _jsx(\"span\", { className: \"text-sm text-muted\", children: \"Working...\" })] }))] })), _jsx(\"div\", { ref: bottomRef, className: \"h-4\" })] }))] }));\n}\nconst AllMessagesMixed = React.memo(AllMessagesMixedComponent);\nexport default AllMessagesMixed;\n//# sourceMappingURL=AllMessagesMixed.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { AgentSearchScope, mergeInCodePromptSchemas, supportsToolUse } from \"@vertesia/common\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport Ajv from \"ajv\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nexport class PayloadBuilder {\n vertesia;\n updateState;\n _interactive = true;\n _debug_mode = false;\n _user_channels;\n _collection;\n _start = false;\n _preserveRunValues = false;\n _interaction;\n _environment;\n _model = '';\n _tool_names = [];\n _data;\n _interactionParamsSchema;\n _inputValidator;\n constructor(vertesia, updateState) {\n this.vertesia = vertesia;\n this.updateState = updateState;\n }\n onStateChanged() {\n const newInstance = this.clone();\n this.updateState(newInstance);\n }\n clone() {\n const builder = new PayloadBuilder(this.vertesia, this.updateState);\n builder._interactionParamsSchema = this._interactionParamsSchema;\n builder._interaction = this._interaction;\n builder._data = this._data;\n builder._environment = this._environment;\n builder._model = this._model;\n builder._tool_names = [...this._tool_names];\n builder._interactive = this._interactive;\n builder._debug_mode = this._debug_mode;\n builder._user_channels = this._user_channels ? [...this._user_channels] : undefined;\n builder._inputValidator = this._inputValidator;\n builder._start = this._start;\n builder._collection = this._collection;\n builder._preserveRunValues = this._preserveRunValues;\n return builder;\n }\n get interactive() {\n return this._interactive;\n }\n set interactive(interactive) {\n if (interactive !== this._interactive) {\n this._interactive = interactive;\n this.onStateChanged();\n }\n }\n get debug_mode() {\n return this._debug_mode;\n }\n set debug_mode(debug_mode) {\n if (debug_mode !== this._debug_mode) {\n this._debug_mode = debug_mode;\n this.onStateChanged();\n }\n }\n get user_channels() {\n return this._user_channels;\n }\n set user_channels(user_channels) {\n this._user_channels = user_channels;\n this.onStateChanged();\n }\n get collection() {\n return this._collection;\n }\n set collection(collection) {\n if (collection !== this._collection) {\n this._collection = collection;\n this.onStateChanged();\n }\n }\n get search_scope() {\n return this._collection ? AgentSearchScope.Collection : undefined;\n }\n async restoreConversation(context) {\n // Handle version-specific interaction resolution\n let interactionRef = context.interaction;\n if (context.version) {\n const objectIdRegex = /^[a-fA-F0-9]{24}$/;\n if (!objectIdRegex.test(interactionRef)) {\n // regex to check if interactionRef is an object id (24 hex characters), only append version if not an object id\n interactionRef = `${interactionRef}@${context.version}`;\n }\n }\n const inter = await this.vertesia.interactions.catalog.resolve(interactionRef);\n const envId = inter.runtime?.environment || context.config?.environment;\n const model = context.config?.model;\n const env = await (envId ?\n this.vertesia.environments.retrieve(context.config?.environment)\n :\n Promise.resolve(undefined));\n this.interactionParamsSchema = context.interactionParamsSchema ?? null;\n // trigger the setter to update the corresponding interactionParamsSchema\n this.interaction = inter;\n this._tool_names = context.tool_names || [];\n this._data = context.data;\n this._interactive = context.interactive;\n this._debug_mode = context.debug_mode ?? false;\n this._user_channels = context.user_channels;\n this.collection = context.collection_id ?? undefined;\n // we need to trigger the setter to deal with default models\n this.environment = env;\n if (model) {\n this._model = model;\n }\n this.onStateChanged();\n }\n get interaction() {\n return this._interaction;\n }\n set interaction(interaction) {\n if (interaction?.id !== this._interaction?.id) {\n this._interaction = interaction;\n // trigger the setter to update the onChange state\n this.interactionParamsSchema = interaction ? mergeInCodePromptSchemas(interaction.prompts) : undefined;\n // Reset the validator when schema changes\n this._inputValidator = undefined;\n if (interaction && !this._preserveRunValues) {\n if (interaction.runtime?.environment) {\n const envId = interaction.runtime.environment;\n this.vertesia.environments.retrieve(envId).then((environment) => this.environment = environment);\n }\n }\n this.onStateChanged();\n }\n }\n get environment() {\n return this._environment;\n }\n set environment(environment) {\n if (environment?.id !== this._environment?.id) {\n this._environment = environment;\n if (!this._preserveRunValues) {\n // First try to use the interaction model, then the environment default model\n const interactionModel = this.interaction?.runtime?.model;\n if (interactionModel && environment && supportsToolUse(interactionModel, environment.provider)) {\n this._model = interactionModel;\n }\n else {\n this._model = environment?.default_model && supportsToolUse(environment.default_model, environment.provider)\n ? environment.default_model : '';\n }\n }\n this.onStateChanged();\n }\n }\n get model() {\n return this._model;\n }\n set model(model) {\n if (model !== this._model) {\n this._model = model || '';\n this.onStateChanged();\n }\n }\n get tool_names() {\n return this._tool_names;\n }\n set tool_names(tools) {\n this._tool_names = tools;\n this.onStateChanged();\n }\n get data() {\n return this._data;\n }\n set data(prompt_data) {\n this._data = prompt_data;\n this.onStateChanged();\n }\n set run(run) {\n console.log(\"run\", run);\n this.onStateChanged();\n }\n set start(value) {\n if (this._start !== value) {\n this._start = value;\n this.onStateChanged();\n }\n }\n get start() {\n return this._start;\n }\n get preserveRunValues() {\n return this._preserveRunValues;\n }\n set preserveRunValues(value) {\n this._preserveRunValues = value;\n }\n get interactionParamsSchema() {\n return this._interactionParamsSchema;\n }\n set interactionParamsSchema(schema) {\n if (this._interactionParamsSchema !== schema) {\n this._interactionParamsSchema = schema;\n this.onStateChanged();\n }\n }\n reset() {\n this._start = false;\n this._interactive = true;\n this._debug_mode = false;\n this._user_channels = undefined;\n this._collection = undefined;\n this._preserveRunValues = false;\n this._model = '';\n this._environment = undefined;\n this._tool_names = [];\n this._interaction = undefined;\n this._data = undefined;\n this._interactionParamsSchema = null;\n this._inputValidator = undefined;\n this.model = undefined;\n this.environment = undefined;\n this.onStateChanged();\n if (location.hash) {\n const urlWithoutHash = window.location.origin + window.location.pathname + window.location.search;\n history.replaceState(null, '', urlWithoutHash);\n location.hash = '';\n }\n }\n validateInput() {\n if (!this._interactionParamsSchema) {\n return { isValid: true };\n }\n // If schema has changed or validator not initialized, recompile\n if (!this._inputValidator || this._inputValidator.schema !== this._interactionParamsSchema) {\n const ajv = new Ajv({ strict: false });\n this._inputValidator = {\n validate: ajv.compile(this._interactionParamsSchema),\n schema: this._interactionParamsSchema\n };\n }\n const prompt_data = this._data || {};\n const isValid = this._inputValidator.validate(prompt_data);\n if (!isValid) {\n const errorMessage = this._inputValidator.validate.errors\n ? this._inputValidator.validate.errors.map((err) => `${err.instancePath}: ${err.message}`).join(', ')\n : 'Invalid payload data';\n return { isValid: false, errorMessage };\n }\n return { isValid: true };\n }\n}\nexport const PayloadContext = createContext(undefined);\nexport function PayloadBuilderProvider({ children }) {\n const { client } = useUserSession();\n const [builder, setBuilder] = useState();\n useEffect(() => {\n setBuilder(new PayloadBuilder(client, setBuilder));\n }, []);\n return builder && (_jsx(PayloadContext.Provider, { value: builder, children: children }));\n}\nexport function usePayloadBuilder() {\n const ctx = useContext(PayloadContext);\n if (!ctx) {\n throw new Error('usePayloadBuilder must be used within a PayloadProvider');\n }\n return ctx;\n}\n//# sourceMappingURL=PayloadBuilder.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Command, CommandGroup, CommandItem, CommandList, Popover, PopoverContent, PopoverTrigger, useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Bot, ClipboardList, CopyIcon, DownloadCloudIcon, ExternalLink, MoreVertical, XIcon } from \"lucide-react\";\nimport { PayloadBuilderProvider, usePayloadBuilder } from \"../../PayloadBuilder\";\nimport { getConversationUrl } from \"./utils\";\nexport default function Header({ title, onClose, isModal, run, viewMode, onViewModeChange, showPlanPanel, hasPlan = false, onTogglePlanPanel, onDownload, onCopyRunId, resetWorkflow, onExportPdf, className, titleClassName, actionsClassName, }) {\n return (_jsx(PayloadBuilderProvider, { children: _jsxs(\"div\", { className: `flex flex-wrap items-end justify-between py-1.5 px-2 border-b shadow-sm flex-shrink-0 ${className || \"\"}`, children: [_jsxs(\"div\", { className: `flex flex-wrap items-center space-x-2 ${titleClassName || \"\"}`, children: [_jsxs(\"div\", { className: \"flex items-center space-x-1\", children: [_jsx(Bot, { className: \"size-5 text-muted\" }), _jsx(\"span\", { className: \"font-medium\", children: title })] }), _jsxs(\"span\", { className: \"text-xs text-muted ml-1\", children: [\"(Run ID: \", run.runId.substring(0, 8), \"...)\"] })] }), _jsxs(\"div\", { className: `flex justify-end items-center space-x-2 ml-auto ${actionsClassName || \"\"}`, children: [_jsxs(\"div\", { className: \"flex items-center space-x-1 bg-muted rounded p-0.5\", children: [_jsx(Button, { variant: viewMode === \"stacked\" ? \"outline\" : \"ghost\", size: \"xs\", className: \"rounded-l-md\", onClick: () => onViewModeChange(\"stacked\"), children: \"Details\" }), _jsx(Button, { variant: viewMode === \"sliding\" ? \"outline\" : \"ghost\", size: \"xs\", className: \"rounded-l-md\", onClick: () => onViewModeChange(\"sliding\"), children: \"Most Important\" })] }), _jsxs(\"div\", { className: \"relative\", children: [hasPlan && !showPlanPanel && (_jsx(\"span\", { className: \"absolute -top-1 -right-1 w-2.5 h-2.5 bg-primary rounded-full border border-border z-10\" })), _jsxs(Button, { size: \"sm\", variant: showPlanPanel ? \"primary\" : \"secondary\", onClick: onTogglePlanPanel, className: `transition-all duration-200 rounded-md`, title: \"Toggle plan panel\", children: [_jsx(ClipboardList, { className: \"size-4 mr-1.5\" }), _jsx(\"span\", { className: \"font-medium text-xs\", children: showPlanPanel ? \"Hide Plan\" : \"Show Plan\" })] })] }), _jsx(MoreDropdown, { run: run, isModal: isModal, onClose: onClose, onDownload: onDownload, onCopyRunId: onCopyRunId, resetWorkflow: resetWorkflow, onExportPdf: onExportPdf }), onClose && !isModal && (_jsx(Button, { size: \"xs\", variant: \"ghost\", onClick: onClose, children: _jsx(XIcon, { className: \"size-4\" }) }))] })] }) }));\n}\nfunction MoreDropdown({ run, isModal, onClose, onDownload, onCopyRunId, resetWorkflow, onExportPdf, }) {\n const toast = useToast();\n const { client } = useUserSession();\n const builder = usePayloadBuilder();\n const cancelWorkflow = async (run) => {\n try {\n await client.store.workflows.terminate(run.workflowId, run.runId, \"cancel\");\n toast({\n status: \"success\",\n title: \"Workflow cancelled\",\n duration: 2000,\n });\n builder.reset();\n resetWorkflow?.();\n return true;\n }\n catch (error) {\n toast({\n status: \"error\",\n title: \"Failed to cancel workflow\",\n duration: 2000,\n });\n return false;\n }\n };\n const openUrl = (url) => {\n window.open(url, \"_blank\");\n return url;\n };\n return (_jsxs(Popover, { hover: true, children: [_jsx(PopoverTrigger, { children: _jsx(Button, { size: \"xs\", variant: \"ghost\", title: \"More actions\", children: _jsx(MoreVertical, { className: \"size-4\" }) }) }), _jsx(PopoverContent, { className: \"w-48\", align: \"end\", children: _jsx(\"div\", { className: \"rounded-md shadow-lg z-50\", children: _jsx(\"div\", { className: \"py-1 min-w-36\", children: _jsx(Command, { children: _jsx(CommandList, { children: _jsxs(CommandGroup, { children: [_jsx(\"div\", { className: \"flex items-center px-3 py-1.5 text-xs text-gray-700 dark:text-gray-300\", children: _jsx(\"span\", { className: \"text-muted\", children: \"Actions\" }) }), isModal && (_jsxs(CommandItem, { className: \"text-xs\", onSelect: () => openUrl(`/store/agent-runner?agentId=${run.runId}__${run.workflowId}`), children: [_jsx(ExternalLink, { className: \"size-3.5 mr-2 text-muted\" }), \" Open in new tab\"] })), _jsxs(CommandItem, { className: \"text-xs\", onSelect: () => {\n if (onCopyRunId) {\n onCopyRunId();\n }\n else {\n navigator.clipboard.writeText(run.runId);\n toast({\n status: \"success\",\n title: \"Run ID copied\",\n duration: 2000,\n });\n }\n }, children: [_jsx(CopyIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Copy Run ID\"] }), _jsxs(CommandItem, { className: \"text-xs\", onSelect: () => {\n if (onDownload) {\n onDownload();\n }\n else {\n getConversationUrl(client, run.runId).then((r) => window.open(r, \"_blank\"));\n }\n }, children: [_jsx(DownloadCloudIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Download Conversation\"] }), onExportPdf && (_jsxs(CommandItem, { className: \"text-xs\", onSelect: onExportPdf, children: [_jsx(DownloadCloudIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Export as PDF\"] })), onClose && isModal && (_jsxs(CommandItem, { className: \"text-xs\", onSelect: onClose, children: [_jsx(XIcon, { className: \"size-3.5 mr-2 text-muted\" }), \" Close\"] })), _jsxs(CommandItem, { className: \"text-xs text-destructive\", onSelect: () => {\n cancelWorkflow(run);\n }, children: [_jsx(XIcon, { className: \"size-3.5 mr-2 text-destructive\" }), \" Cancel Workflow\"] })] }) }) }) }) }) })] }));\n}\n//# sourceMappingURL=Header.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { LayoutGrid, TableProperties } from 'lucide-react';\nimport { useState } from 'react';\nimport { Button } from '@vertesia/ui/core';\nconst LAST_DISPLAYED_VIEW = 'vertesia.content_store.lastDisplayedView';\nexport function ContentDispositionButton({ onUpdate }) {\n const [isGridView, setIsGridView] = useState(localStorage.getItem(LAST_DISPLAYED_VIEW) === \"grid\");\n const updateView = () => {\n if (isGridView) {\n toggleTableView();\n }\n else {\n toggleGridView();\n }\n };\n const toggleGridView = () => {\n localStorage.setItem(LAST_DISPLAYED_VIEW, \"grid\");\n setIsGridView(true);\n onUpdate(true);\n };\n const toggleTableView = () => {\n localStorage.setItem(LAST_DISPLAYED_VIEW, \"table\");\n setIsGridView(false);\n onUpdate(false);\n };\n return (_jsx(Button, { variant: \"outline\", onClick: updateView, alt: isGridView ? \"Table View\" : \"Thumbnail View\", children: isGridView\n ? _jsx(TableProperties, {})\n : _jsx(LayoutGrid, {}) }));\n}\nContentDispositionButton.LAST_DISPLAYED_VIEW = LAST_DISPLAYED_VIEW;\n//# sourceMappingURL=ContentDispositionButton.js.map","export function shortId(id, length = 7) {\n if (!id) {\n return \"\";\n }\n return \"~\" + id.slice(-length);\n}\nexport function shortenString(str, length) {\n return str.length > length ? str.substring(0, length) + '...' : str;\n}\n//# sourceMappingURL=text.js.map","const CSV_PREFIX = 'text/csv';\nconst IMAGE_PREFIX = 'image/';\nconst PDF_PREFIX = 'application/pdf';\nconst VIDEO_PREFIX = 'video/';\n// Office document MIME types that can be converted to PDF for preview\nconst PREVIEWABLE_AS_PDF_TYPES = [\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx\n 'application/msword', // .doc\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx\n 'application/vnd.ms-powerpoint', // .ppt\n];\nexport const isCsv = (type) => type === CSV_PREFIX || CSV_PREFIX.includes(type);\nexport const isImage = (type) => type.startsWith(IMAGE_PREFIX) || IMAGE_PREFIX.includes(type);\nexport const isPdf = (type) => type === PDF_PREFIX || PDF_PREFIX.includes(type);\nexport const isVideo = (type) => type.startsWith(VIDEO_PREFIX) || VIDEO_PREFIX.includes(type);\nexport const isPreviewableAsPdf = (type) => PREVIEWABLE_AS_PDF_TYPES.includes(type);\n//# sourceMappingURL=mimeType.js.map","import { isImage, isPdf, isVideo } from \"./mimeType.js\";\nimport { ImageRenditionFormat } from \"@vertesia/common\";\n//TODO we must use a setting in Env.\nconst env = import.meta.env;\nconst RENDITION_OPTIONS = {\n max_hw: env?.VITE_RENDITION_HW || 256,\n format: ImageRenditionFormat.jpeg,\n generate_if_missing: true,\n};\nconst RENDITION_ID = \"vertesia.content_store.renditionId\";\nexport async function retrieveRendition(client, doc, setRenditionUrl, setRenditionAlt, setRenditionStatus) {\n if (!doc?.content?.type ||\n !(isImage(doc.content.type) ||\n isVideo(doc.content.type) ||\n isPdf(doc.content.type))) {\n setRenditionStatus(\"No preview available\");\n return;\n }\n setRenditionStatus(\"Preparing preview...\");\n const currentTime = new Date().getTime() / 1000;\n const savedId = localStorage.getItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}`);\n const elapsedTime = localStorage.getItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}_time`);\n if (savedId?.length &&\n elapsedTime &&\n Math.abs(currentTime - parseInt(elapsedTime)) <= 900) {\n setRenditionUrl(savedId);\n setRenditionAlt(`${doc.name} Rendition`);\n setRenditionStatus(\"ready\");\n return savedId;\n }\n setRenditionStatus(\"Preparing preview...\");\n client.objects.getRendition(doc.id, RENDITION_OPTIONS).then((response) => {\n if (response.status === \"generating\") {\n setRenditionStatus(\"Preparing preview...\");\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n setTimeout(() => retrieveRendition(client, doc, setRenditionUrl, setRenditionAlt, setRenditionStatus), 60000);\n }\n else if (response.status === \"failed\") {\n setRenditionStatus(\"No preview available\");\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n return;\n }\n else {\n if (!response?.renditions?.length) {\n setRenditionStatus(\"No preview available\");\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n return;\n }\n const rendition = response.renditions[0];\n localStorage.setItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}`, rendition);\n localStorage.setItem(`${RENDITION_ID}_${doc.id}_${RENDITION_OPTIONS.max_hw}_time`, (new Date().getTime() / 1000).toString());\n setRenditionUrl(rendition);\n setRenditionAlt(`${doc.name} Rendition`);\n setRenditionStatus(\"ready\");\n console.log(`Rendition for document ${doc.id} retrieved successfully: ${rendition}`);\n }\n }).catch((error) => {\n setRenditionStatus(\"No preview available\");\n console.warn(\"Failed to retrieve rendition:\", error);\n setRenditionUrl(\"\");\n setRenditionAlt(\"\");\n });\n}\n//# sourceMappingURL=rendition.js.map","/**\n * Print styles for markdown content export to PDF.\n * These styles ensure tables and other elements render properly in print mode,\n * independent from the application theme.\n */\nconst PRINT_STYLES = `\n@media print {\n body {\n margin: 24px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #111827;\n background-color: #ffffff;\n }\n\n .vprose {\n max-width: 800px;\n margin: 0 auto;\n }\n\n .vprose h1 {\n font-size: 24px;\n font-weight: 700;\n margin: 1.5rem 0 0.75rem;\n }\n\n .vprose h2 {\n font-size: 20px;\n font-weight: 600;\n margin: 1.25rem 0 0.75rem;\n }\n\n .vprose h3 {\n font-size: 18px;\n font-weight: 600;\n margin: 1rem 0 0.5rem;\n }\n\n .vprose p {\n margin: 0 0 0.5rem;\n }\n\n .vprose ul,\n .vprose ol {\n margin: 0.5rem 0 0.5rem 1.5rem;\n padding: 0;\n }\n\n .vprose li {\n margin: 0.25rem 0;\n }\n\n .vprose table {\n width: 100%;\n border-collapse: collapse;\n margin: 1rem 0;\n }\n\n .vprose th,\n .vprose td {\n border: 1px solid #d1d5db;\n padding: 0.5rem 0.75rem;\n vertical-align: top;\n }\n\n .vprose thead th {\n background-color: #f3f4f6;\n font-weight: 600;\n }\n\n .vprose pre,\n .vprose code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 12px;\n }\n\n .vprose pre {\n padding: 0.75rem;\n border-radius: 4px;\n border: 1px solid #e5e7eb;\n background-color: #f9fafb;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n /* Hide chart action buttons when printing */\n .chart-actions {\n display: none !important;\n }\n\n /* Hide interactive elements in agent conversation when printing */\n .print-hidden,\n [class*=\"print:hidden\"],\n button[title=\"Copy message\"],\n button[title=\"Copy to clipboard\"],\n button[title=\"Export as PNG\"],\n .message-actions {\n display: none !important;\n }\n\n /* Prevent page breaks inside elements */\n .vprose table,\n .vprose pre,\n .vprose blockquote,\n .vprose figure,\n .vprose img,\n .recharts-wrapper,\n [class*=\"chart\"],\n [class*=\"Chart\"] {\n break-inside: avoid;\n page-break-inside: avoid;\n }\n\n /* Keep headings with following content */\n .vprose h1,\n .vprose h2,\n .vprose h3,\n .vprose h4,\n .vprose h5,\n .vprose h6 {\n break-after: avoid;\n page-break-after: avoid;\n }\n\n /* Keep list items together when possible */\n .vprose li {\n break-inside: avoid;\n page-break-inside: avoid;\n }\n}\n`;\n/**\n * Opens the browser print dialog with the content of a given HTML element.\n * Uses a hidden iframe to avoid opening a new window.\n *\n * @param sourceElement - The HTML element whose content to print\n * @param title - The document title for the printed page\n * @returns true if print dialog was opened successfully, false otherwise\n */\nexport function printElementToPdf(sourceElement, title) {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return false;\n }\n // Use a hidden iframe to avoid opening a new window\n const iframe = document.createElement(\"iframe\");\n iframe.style.position = \"fixed\";\n iframe.style.right = \"0\";\n iframe.style.bottom = \"0\";\n iframe.style.width = \"0\";\n iframe.style.height = \"0\";\n iframe.style.border = \"0\";\n iframe.style.visibility = \"hidden\";\n document.body.appendChild(iframe);\n const iframeWindow = iframe.contentWindow;\n if (!iframeWindow) {\n iframe.parentNode?.removeChild(iframe);\n return false;\n }\n const doc = iframeWindow.document;\n doc.open();\n doc.write(`<!doctype html><html><head><title>${title}</title></head><body></body></html>`);\n doc.close();\n doc.title = title;\n const styles = document.querySelectorAll(\"link[rel=\\\"stylesheet\\\"], style\");\n styles.forEach((node) => {\n doc.head.appendChild(node.cloneNode(true));\n });\n // Add dedicated print styles\n const printStyle = doc.createElement(\"style\");\n printStyle.textContent = PRINT_STYLES;\n doc.head.appendChild(printStyle);\n doc.body.innerHTML = sourceElement.innerHTML;\n iframeWindow.focus();\n iframeWindow.print();\n setTimeout(() => {\n iframe.parentNode?.removeChild(iframe);\n }, 1000);\n return true;\n}\n//# sourceMappingURL=print.js.map","import { WorkflowExecutionStatus } from \"@vertesia/common\";\n/**\n * Get the semantic color class for a workflow execution status.\n */\nexport function getWorkflowStatusColor(status) {\n switch (status) {\n case WorkflowExecutionStatus.RUNNING:\n return \"text-info\";\n case WorkflowExecutionStatus.COMPLETED:\n return \"text-success\";\n case WorkflowExecutionStatus.FAILED:\n return \"text-destructive\";\n case WorkflowExecutionStatus.TERMINATED:\n case WorkflowExecutionStatus.CANCELED:\n return \"text-attention\";\n default:\n return \"text-muted\";\n }\n}\n/**\n * Get a human-readable name for a workflow execution status.\n */\nexport function getWorkflowStatusName(status) {\n switch (status) {\n case WorkflowExecutionStatus.RUNNING:\n return \"Running\";\n case WorkflowExecutionStatus.COMPLETED:\n return \"Completed\";\n case WorkflowExecutionStatus.FAILED:\n return \"Failed\";\n case WorkflowExecutionStatus.CONTINUED_AS_NEW:\n return \"Continued As New\";\n case WorkflowExecutionStatus.TERMINATED:\n return \"Terminated\";\n case WorkflowExecutionStatus.TIMED_OUT:\n return \"Timed Out\";\n case WorkflowExecutionStatus.CANCELED:\n return \"Canceled\";\n default:\n return \"Unknown\";\n }\n}\n//# sourceMappingURL=workflowStatus.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState, useEffect } from 'react';\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle, Input, RadioGroup, RadioOptionAdapter, FormItem } from '@vertesia/ui/core';\nclass SaveOptionAdapter extends RadioOptionAdapter {\n labelOf(item) {\n return item.label;\n }\n idOf(item) {\n return item.id;\n }\n renderOption(item) {\n return (_jsxs(\"div\", { children: [_jsx(\"div\", { className: \"font-medium\", children: item.label }), _jsx(\"p\", { className: \"text-sm text-gray-500 dark:text-gray-400 mt-1\", children: item.description })] }));\n }\n}\nexport function SaveVersionConfirmModal({ isOpen, onClose, onConfirm, isLoading, uploadedFileName }) {\n const saveOptions = [\n {\n id: \"update\",\n label: \"Update current version\",\n description: uploadedFileName\n ? \"Replace the content file and modify properties directly in the current revision.\"\n : \"Modify the properties directly in the current revision.\"\n },\n {\n id: \"new-version\",\n label: \"Create new version\",\n description: uploadedFileName\n ? \"Create a new revision with the replacement file while preserving the original.\"\n : \"Create a new revision with these property changes while preserving the original.\"\n }\n ];\n // Default to \"create new version\" when replacing a file, \"update current version\" when editing properties\n const defaultOption = uploadedFileName ? saveOptions[1] : saveOptions[0];\n const [selectedOption, setSelectedOption] = useState(defaultOption);\n const [versionLabel, setVersionLabel] = useState('');\n const optionAdapter = new SaveOptionAdapter();\n // Reset to default when modal opens or uploadedFileName changes\n useEffect(() => {\n if (isOpen) {\n setSelectedOption(defaultOption);\n setVersionLabel('');\n }\n }, [isOpen, uploadedFileName]);\n const createVersion = selectedOption?.id === \"new-version\";\n const handleOptionChange = (option) => {\n setSelectedOption(option);\n };\n const handleConfirm = async () => {\n await onConfirm(createVersion, createVersion ? versionLabel : undefined);\n };\n return (_jsxs(Modal, { isOpen: isOpen, onClose: onClose, className: \"sm:max-w-md\", children: [_jsx(ModalTitle, { children: \"Save Changes\" }), _jsx(ModalBody, { children: _jsxs(\"div\", { className: \"space-y-4\", children: [uploadedFileName && (_jsx(\"div\", { className: \"mb-4 p-3 bg-blue-50 dark:bg-blue-900/20 rounded-md\", children: _jsxs(\"p\", { className: \"text-sm text-blue-700 dark:text-blue-300 font-medium\", children: [\"You're about to replace the content file with: \", _jsx(\"span\", { className: \"font-bold\", children: uploadedFileName })] }) })), _jsx(\"p\", { className: \"text-sm text-mixer-muted/5\", children: \"How would you like to save these changes?\" }), _jsx(RadioGroup, { adapter: optionAdapter, options: saveOptions, value: selectedOption, onChange: handleOptionChange, gap: \"gap-4\" }), createVersion && (_jsx(FormItem, { label: \"Version Label (Optional)\", description: \"Optional label for the new version.\", className: \"mt-3 pl-8\", children: _jsx(Input, { value: versionLabel, onChange: setVersionLabel, placeholder: \"e.g., v1.2, approved, post-review\", className: \"w-full\" }) }))] }) }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: \"secondary\", onClick: onClose, disabled: isLoading, children: \"Cancel\" }), _jsx(Button, { variant: \"primary\", onClick: handleConfirm, isLoading: isLoading, children: \"Save\" })] })] }));\n}\n//# sourceMappingURL=SaveVersionConfirmModal.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useState, useRef, useEffect } from 'react';\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle, useToast } from '@vertesia/ui/core';\nimport { useNavigate } from \"@vertesia/ui/router\";\n// Import Monaco Editor\nimport Editor from '@monaco-editor/react';\n// Import SaveVersionConfirmModal\nimport { SaveVersionConfirmModal } from './SaveVersionConfirmModal';\nexport function PropertiesEditorModal({ isOpen, onClose, object, refetch }) {\n const { client, store } = useUserSession();\n const toast = useToast();\n const navigate = useNavigate();\n const [isLoading, setIsLoading] = useState(false);\n const [propertiesJson, setPropertiesJson] = useState('');\n const [showConfirmation, setShowConfirmation] = useState(false);\n const [parsedProperties, setParsedProperties] = useState(null);\n const editorRef = useRef(null);\n const monacoRef = useRef(null);\n const [jsonSchema, setJsonSchema] = useState(null);\n //TODO state not used\n const [_newVersionId, setNewVersionId] = useState(null);\n // Initialize editor content when modal opens\n useEffect(() => {\n if (isOpen) {\n setPropertiesJson(JSON.stringify(object.properties || {}, null, 2));\n // Try to fetch JSON schema if object has a type\n if (object.type?.id) {\n fetchJsonSchema(object.type.id);\n }\n }\n }, [isOpen, object]);\n // Handle editor mounting\n function handleEditorDidMount(editor, monaco) {\n editorRef.current = editor;\n monacoRef.current = monaco;\n // Apply JSON schema validation if available\n if (jsonSchema) {\n setMonacoJsonSchema(monaco, jsonSchema);\n }\n }\n // Fetch JSON schema for the object type\n async function fetchJsonSchema(typeId) {\n try {\n const typeDetails = await store.types.retrieve(typeId);\n if (typeDetails.object_schema) {\n setJsonSchema(typeDetails.object_schema);\n // Apply schema if Monaco is already mounted\n if (monacoRef.current) {\n setMonacoJsonSchema(monacoRef.current, typeDetails.object_schema);\n }\n }\n }\n catch (error) {\n console.error('Failed to fetch JSON schema:', error);\n }\n }\n // Configure Monaco editor with JSON schema\n function setMonacoJsonSchema(monaco, schema) {\n monaco.languages.json.jsonDefaults.setDiagnosticsOptions({\n validate: true,\n schemas: [\n {\n uri: 'http://myserver/object-schema.json',\n fileMatch: ['*'],\n schema\n }\n ]\n });\n }\n // Validate JSON and open confirmation modal\n function handleSave() {\n if (!editorRef.current)\n return;\n const editorValue = editorRef.current.getValue();\n try {\n const properties = JSON.parse(editorValue);\n setParsedProperties(properties);\n setShowConfirmation(true);\n }\n catch (err) {\n toast({\n status: 'error',\n title: 'Invalid JSON',\n description: 'Please fix the JSON syntax errors before saving.',\n duration: 5000\n });\n }\n }\n // Save properties\n async function saveProperties(createVersion, versionLabel) {\n try {\n setIsLoading(true);\n const properties = parsedProperties || JSON.parse(propertiesJson);\n if (createVersion) {\n // Create a new version with the updated properties\n const response = await client.objects.update(object.id, {\n properties: properties\n }, {\n createRevision: true,\n revisionLabel: versionLabel\n });\n // Store the new version ID for navigation\n if (response.id !== object.id) {\n setNewVersionId(response.id);\n }\n toast({\n status: 'success',\n title: 'New version created',\n description: 'A new version with updated properties has been created.',\n duration: 2000\n });\n // Close modals\n setShowConfirmation(false);\n onClose();\n // Navigate to the new version\n if (response.id !== object.id) {\n // Delay slightly to allow modal closing to complete\n setTimeout(() => {\n navigate(`/objects/${response.id}`);\n toast({\n status: 'info',\n title: 'Viewing New Version',\n description: versionLabel ? `Now viewing version '${versionLabel}'` : 'Now viewing the new version',\n duration: 3000\n });\n }, 100);\n }\n }\n else {\n // Update the object properties in place\n await store.objects.update(object.id, {\n properties: properties\n });\n toast({\n status: 'success',\n title: 'Properties updated',\n description: 'The object properties have been updated successfully.',\n duration: 2000\n });\n if (refetch) {\n await refetch();\n }\n setShowConfirmation(false);\n onClose();\n }\n }\n catch (error) {\n toast({\n status: 'error',\n title: 'Error updating properties',\n description: error.message || 'An error occurred while updating the properties.',\n duration: 5000\n });\n setIsLoading(false);\n }\n }\n // Handle closing the confirmation modal without saving\n function handleCancelConfirmation() {\n setShowConfirmation(false);\n }\n return (_jsxs(_Fragment, { children: [_jsxs(Modal, { isOpen: isOpen, onClose: onClose, className: \"sm:max-w-[90%] md:max-w-[80%] lg:max-w-[75%] xl:max-w-[70%]\", children: [_jsx(ModalTitle, { children: \"Edit Properties\" }), _jsxs(ModalBody, { children: [_jsxs(\"div\", { className: \"mb-2 text-sm text-gray-500\", children: [object.type?.name ? (_jsxs(\"span\", { children: [\"Editing properties for object type: \", _jsx(\"strong\", { children: object.type.name })] })) : (_jsx(\"span\", { children: \"Editing properties for generic document\" })), jsonSchema && (_jsx(\"span\", { className: \"ml-2 text-green-600\", children: \"(JSON schema validation enabled)\" }))] }), _jsx(\"div\", { className: \"h-[75vh] border border-gray-300 dark:border-gray-700 rounded-md\", children: _jsx(Editor, { height: \"100%\", language: \"json\", value: propertiesJson, onChange: (value) => setPropertiesJson(value || ''), onMount: handleEditorDidMount, options: {\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n formatOnPaste: true,\n formatOnType: true,\n automaticLayout: true,\n wordWrap: 'on'\n } }) })] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: \"secondary\", onClick: onClose, children: \"Cancel\" }), _jsx(Button, { variant: \"primary\", onClick: handleSave, children: \"Save Changes\" })] })] }), _jsx(SaveVersionConfirmModal, { isOpen: showConfirmation, onClose: handleCancelConfirmation, onConfirm: saveProperties, isLoading: isLoading })] }));\n}\n//# sourceMappingURL=PropertiesEditorModal.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useState, useEffect, useRef, createContext, useContext, useCallback } from 'react';\nimport { Document, Page, pdfjs } from 'react-pdf';\nimport { Loader2 } from 'lucide-react';\n// Configure PDF.js worker - use CDN for the worker\npdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;\n// Loading spinner component\nfunction LoadingSpinner({ className, size = 'md' }) {\n const sizeClasses = {\n sm: 'w-4 h-4',\n md: 'w-6 h-6',\n lg: 'w-8 h-8'\n };\n return (_jsx(\"div\", { className: `flex items-center justify-center ${className || ''}`, children: _jsx(Loader2, { className: `${sizeClasses[size]} animate-spin text-muted-foreground` }) }));\n}\nexport function PdfPageRenderer({ pdfUrl, pageNumber, width, className, renderTextLayer = false, renderAnnotationLayer = false, onLoadSuccess, onError }) {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const handleLoadSuccess = ({ numPages }) => {\n setLoading(false);\n onLoadSuccess?.(numPages);\n };\n const handleError = (err) => {\n setLoading(false);\n setError(err);\n onError?.(err);\n };\n if (error) {\n return (_jsx(\"div\", { className: `flex items-center justify-center text-destructive text-sm ${className || ''}`, children: \"Failed to load PDF\" }));\n }\n return (_jsxs(\"div\", { className: className, children: [loading && (_jsx(LoadingSpinner, { className: \"py-4\", size: \"md\" })), _jsx(Document, { file: pdfUrl, onLoadSuccess: handleLoadSuccess, onLoadError: handleError, loading: null, children: _jsx(Page, { pageNumber: pageNumber, width: width, renderTextLayer: renderTextLayer, renderAnnotationLayer: renderAnnotationLayer, loading: _jsx(LoadingSpinner, { className: \"py-4\", size: \"sm\" }) }) })] }));\n}\nconst SharedPdfContext = createContext(null);\n/**\n * Provider that loads a PDF once using a single Document component.\n * Children receive a renderPage function to render pages inside the Document.\n */\nexport function SharedPdfProvider({ pdfUrl, urlLoading = false, children, onLoadSuccess }) {\n const [numPages, setNumPages] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const [pageDimensions, setPageDimensions] = useState(null);\n const handleLoadSuccess = async (pdf) => {\n setNumPages(pdf.numPages);\n onLoadSuccess?.(pdf.numPages);\n try {\n const page = await pdf.getPage(1);\n const viewport = page.getViewport({ scale: 1 });\n setPageDimensions({\n width: viewport.width,\n height: viewport.height,\n aspectRatio: viewport.width / viewport.height\n });\n }\n catch (err) {\n console.error('Failed to get page dimensions:', err);\n }\n setLoading(false);\n };\n const handleError = (err) => {\n setLoading(false);\n setError(err);\n };\n const isLoading = urlLoading || (pdfUrl ? loading : true);\n const value = {\n pdfUrl,\n numPages,\n loading: isLoading,\n error,\n pageDimensions\n };\n // Render function that children use to render pages\n const renderPage = (pageNumber, width) => (_jsx(Page, { pageNumber: pageNumber, width: width, renderTextLayer: false, renderAnnotationLayer: false, loading: _jsx(LoadingSpinner, { className: \"py-4\", size: \"sm\" }) }, pageNumber));\n if (error) {\n return (_jsx(\"div\", { className: \"flex items-center justify-center text-destructive text-sm py-4\", children: \"Failed to load PDF\" }));\n }\n return (_jsx(SharedPdfContext.Provider, { value: value, children: pdfUrl ? (_jsx(Document, { file: pdfUrl, onLoadSuccess: handleLoadSuccess, onLoadError: handleError, loading: _jsx(LoadingSpinner, { className: \"py-4\", size: \"md\" }), children: children(renderPage) })) : (_jsx(LoadingSpinner, { className: \"py-4\", size: \"md\" })) }));\n}\nexport function useSharedPdf() {\n return useContext(SharedPdfContext);\n}\n// A4 portrait aspect ratio\nconst A4_ASPECT_RATIO = 210 / 297;\n/**\n * Simple wrapper for a PDF page that adds styling.\n * Must be used inside SharedPdfProvider's children render function.\n */\nexport function SimplePdfPage({ pageNumber, width, className }) {\n const context = useSharedPdf();\n const aspectRatio = context?.pageDimensions?.aspectRatio ?? A4_ASPECT_RATIO;\n const placeholderHeight = width ? Math.round(width / aspectRatio) : 200;\n if (context?.loading) {\n return (_jsx(\"div\", { className: `flex items-center justify-center bg-muted ${className || ''}`, style: { height: placeholderHeight, width: width || '100%' }, children: _jsx(LoadingSpinner, { size: \"md\" }) }));\n }\n return (_jsx(\"div\", { className: className, children: _jsx(Page, { pageNumber: pageNumber, width: width, renderTextLayer: false, renderAnnotationLayer: false, loading: _jsx(LoadingSpinner, { className: \"py-4\", size: \"sm\" }) }) }));\n}\n/**\n * Virtualized PDF thumbnail that only renders the Page when visible.\n * Uses IntersectionObserver for efficient visibility detection.\n */\nfunction VirtualizedThumbnail({ pageNumber, width, isSelected, onSelect, renderThumbnail, aspectRatio = A4_ASPECT_RATIO, rootMargin = '200px 0px' }) {\n const containerRef = useRef(null);\n const [hasBeenVisible, setHasBeenVisible] = useState(false);\n // Set up intersection observer\n useEffect(() => {\n const container = containerRef.current;\n if (!container)\n return;\n const observer = new IntersectionObserver((entries) => {\n const entry = entries[0];\n if (entry?.isIntersecting) {\n setHasBeenVisible(true);\n }\n }, { rootMargin, threshold: 0 });\n observer.observe(container);\n return () => observer.disconnect();\n }, [rootMargin]);\n const placeholderHeight = width ? Math.round(width / aspectRatio) : 200;\n // Only render the actual Page component if visible or has been visible\n // Once rendered, keep it rendered to preserve the canvas\n const shouldRenderPage = hasBeenVisible;\n const pageElement = shouldRenderPage ? (_jsx(Page, { pageNumber: pageNumber, width: width, renderTextLayer: false, renderAnnotationLayer: false, loading: _jsx(\"div\", { className: \"flex items-center justify-center bg-muted\", style: { height: placeholderHeight }, children: _jsx(LoadingSpinner, { size: \"sm\" }) }) })) : (_jsx(\"div\", { className: \"flex items-center justify-center bg-muted\", style: { height: placeholderHeight, width: width || '100%' }, children: _jsx(\"span\", { className: \"text-muted-foreground text-xs\", children: pageNumber }) }));\n return (_jsx(\"div\", { ref: containerRef, children: renderThumbnail({\n pageNumber,\n isSelected,\n pageElement,\n onSelect\n }) }));\n}\n/**\n * Renders a list of PDF page thumbnails using a single Document.\n * Uses windowed virtualization for better performance with large PDFs.\n * Only renders components for pages within a window around the current scroll position.\n */\n// Helper to find the scrollable ancestor element\nfunction findScrollableAncestor(element) {\n if (!element)\n return null;\n let current = element.parentElement;\n while (current) {\n const style = window.getComputedStyle(current);\n const overflowY = style.overflowY;\n if (overflowY === 'auto' || overflowY === 'scroll') {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n}\nexport function PdfThumbnailList({ pdfUrl, urlLoading = false, pageCount, currentPage, thumbnailWidth, onPageSelect, renderThumbnail, scrollContainerRef, onAspectRatioChange, onItemHeightChange, calculateItemHeight, onPageCountChange }) {\n const [error, setError] = useState(null);\n const [visibleRange, setVisibleRange] = useState({ start: 0, end: Math.min(15, pageCount) });\n // Start with null to indicate we haven't loaded the PDF yet\n const [aspectRatio, setAspectRatio] = useState(null);\n const containerRef = useRef(null);\n const handleError = useCallback((err) => {\n setError(err);\n }, []);\n // Get actual page dimensions and count from PDF on load\n const handleLoadSuccess = useCallback(async (pdf) => {\n // Report actual page count from PDF\n onPageCountChange?.(pdf.numPages);\n try {\n const page = await pdf.getPage(1);\n const viewport = page.getViewport({ scale: 1 });\n const ratio = viewport.width / viewport.height;\n setAspectRatio(ratio);\n onAspectRatioChange?.(ratio);\n }\n catch (err) {\n console.error('Failed to get page dimensions:', err);\n // Fall back to A4 if we can't get dimensions\n setAspectRatio(A4_ASPECT_RATIO);\n onAspectRatioChange?.(A4_ASPECT_RATIO);\n }\n }, [onAspectRatioChange, onPageCountChange]);\n // Use A4 as fallback if aspect ratio not yet determined\n const effectiveAspectRatio = aspectRatio ?? A4_ASPECT_RATIO;\n // Calculate placeholder height using actual aspect ratio from PDF\n const placeholderHeight = thumbnailWidth ? Math.round(thumbnailWidth / effectiveAspectRatio) : 200;\n // Total height per item - use custom calculator if provided, otherwise default formula\n // Default: padding (p-2 = 8px top + 8px bottom) + page number text (~24px) + gap\n const itemHeight = calculateItemHeight\n ? calculateItemHeight(placeholderHeight)\n : placeholderHeight + 16 + 24 + 8;\n // Notify parent of item height changes for scroll calculations\n useEffect(() => {\n if (itemHeight > 0 && aspectRatio !== null) {\n onItemHeightChange?.(itemHeight);\n }\n }, [itemHeight, aspectRatio, onItemHeightChange]);\n // Window size: how many pages to render above and below visible area\n const WINDOW_BUFFER = 5;\n // Track scroll position to update visible range\n useEffect(() => {\n // Find the scroll container - either from prop or by searching ancestors\n const container = scrollContainerRef?.current || findScrollableAncestor(containerRef.current);\n if (!container)\n return;\n const updateVisibleRange = () => {\n const scrollTop = container.scrollTop;\n const viewportHeight = container.clientHeight;\n // Calculate which pages are visible\n const firstVisible = Math.floor(scrollTop / itemHeight);\n const lastVisible = Math.ceil((scrollTop + viewportHeight) / itemHeight);\n // Add buffer around visible range\n const start = Math.max(0, firstVisible - WINDOW_BUFFER);\n const end = Math.min(pageCount, lastVisible + WINDOW_BUFFER);\n setVisibleRange(prev => {\n if (prev.start !== start || prev.end !== end) {\n return { start, end };\n }\n return prev;\n });\n };\n // Initial calculation\n updateVisibleRange();\n // Listen to scroll events\n container.addEventListener('scroll', updateVisibleRange, { passive: true });\n return () => container.removeEventListener('scroll', updateVisibleRange);\n }, [itemHeight, pageCount, scrollContainerRef]);\n if (error) {\n return (_jsx(\"div\", { className: \"flex items-center justify-center text-destructive text-sm py-4\", children: \"Failed to load PDF\" }));\n }\n if (urlLoading || !pdfUrl) {\n return _jsx(LoadingSpinner, { className: \"py-4\", size: \"md\" });\n }\n // Calculate spacer heights for virtual scrolling\n const topSpacerHeight = visibleRange.start * itemHeight;\n const bottomSpacerHeight = (pageCount - visibleRange.end) * itemHeight;\n // Only render the virtualized list once we have the actual aspect ratio\n // This prevents the total scroll height from changing after initial render\n const hasAspectRatio = aspectRatio !== null;\n return (_jsx(\"div\", { ref: containerRef, children: _jsx(Document, { file: pdfUrl, onLoadSuccess: handleLoadSuccess, onLoadError: handleError, loading: _jsx(LoadingSpinner, { className: \"py-4\", size: \"md\" }), children: hasAspectRatio ? (_jsxs(_Fragment, { children: [topSpacerHeight > 0 && (_jsx(\"div\", { style: { height: topSpacerHeight } })), Array.from({ length: visibleRange.end - visibleRange.start }, (_, index) => {\n const pageNumber = visibleRange.start + index + 1;\n return (_jsx(\"div\", { \"data-page-index\": pageNumber - 1, style: { height: itemHeight, overflow: 'hidden' }, children: _jsx(VirtualizedThumbnail, { pageNumber: pageNumber, width: thumbnailWidth, isSelected: pageNumber === currentPage, onSelect: () => onPageSelect(pageNumber), renderThumbnail: renderThumbnail, aspectRatio: effectiveAspectRatio }) }, pageNumber));\n }), bottomSpacerHeight > 0 && (_jsx(\"div\", { style: { height: bottomSpacerHeight } }))] })) : (_jsx(LoadingSpinner, { className: \"py-4\", size: \"md\" })) }) }));\n}\nexport function PdfDocumentRenderer({ pdfUrl, pageNumber, width, height, className, renderTextLayer = false, renderAnnotationLayer = false, onPageChange }) {\n const [numPages, setNumPages] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n useEffect(() => {\n if (numPages > 0) {\n onPageChange?.(pageNumber, numPages);\n }\n }, [pageNumber, numPages, onPageChange]);\n const handleLoadSuccess = ({ numPages: pages }) => {\n setNumPages(pages);\n setLoading(false);\n };\n const handleError = (err) => {\n setLoading(false);\n setError(err);\n };\n if (error) {\n return (_jsx(\"div\", { className: `flex items-center justify-center text-destructive ${className || ''}`, children: _jsxs(\"span\", { children: [\"Failed to load PDF: \", error.message] }) }));\n }\n return (_jsxs(\"div\", { className: className, children: [loading && (_jsx(LoadingSpinner, { className: \"py-8\", size: \"lg\" })), _jsx(Document, { file: pdfUrl, onLoadSuccess: handleLoadSuccess, onLoadError: handleError, loading: null, children: _jsx(Page, { pageNumber: Math.min(pageNumber, numPages || 1), width: width, height: height, renderTextLayer: renderTextLayer, renderAnnotationLayer: renderAnnotationLayer, loading: _jsx(LoadingSpinner, { className: \"py-8\", size: \"md\" }) }) })] }));\n}\n//# sourceMappingURL=PdfPageRenderer.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Center, VTooltip } from \"@vertesia/ui/core\";\nimport clsx from \"clsx\";\nimport { ChevronsDown, ChevronsUp, Maximize, Minus, Plus } from \"lucide-react\";\nimport { useRef, useEffect, useState, useCallback } from \"react\";\nimport { PdfThumbnailList } from \"./PdfPageRenderer\";\n// A4 portrait aspect ratio - used as fallback\nconst A4_ASPECT_RATIO = 210 / 297;\n// Zoom levels as percentages (100 = fit to width)\nconst ZOOM_LEVELS = [50, 75, 100, 125, 150, 200, 300];\nconst DEFAULT_ZOOM = 100;\n/**\n * Standalone PDF thumbnail slider component.\n * Displays a vertical list of PDF page thumbnails with navigation controls.\n * Does not depend on any context - all data is passed via props.\n */\nexport function PdfPageSlider({ pdfUrl, pdfUrlLoading = false, pageCount, currentPage, onChange, onPageCountChange, className, compact = false, headerExtra }) {\n const ref = useRef(null);\n const scrollContainerRef = useRef(null);\n const [baseWidth, setBaseWidth] = useState(undefined);\n const [zoom, setZoom] = useState(DEFAULT_ZOOM);\n const [aspectRatio, setAspectRatio] = useState(A4_ASPECT_RATIO);\n // Track the actual item height from PdfThumbnailList for accurate scroll calculations\n const [itemHeight, setItemHeight] = useState(null);\n // Track the previous item height to preserve scroll position during resize\n const prevItemHeightRef = useRef(null);\n // Calculate thumbnail width based on zoom level\n const thumbnailWidth = baseWidth ? Math.round(baseWidth * zoom / 100) : undefined;\n const zoomIn = useCallback(() => {\n let currentIndex = ZOOM_LEVELS.findIndex(level => level >= zoom);\n if (currentIndex === -1) {\n currentIndex = ZOOM_LEVELS.length - 1;\n }\n const nextIndex = Math.min(currentIndex + 1, ZOOM_LEVELS.length - 1);\n setZoom(ZOOM_LEVELS[nextIndex]);\n }, [zoom]);\n const zoomOut = useCallback(() => {\n let currentIndex = ZOOM_LEVELS.findIndex(level => level >= zoom);\n if (currentIndex === -1) {\n currentIndex = ZOOM_LEVELS.length - 1;\n }\n const prevIndex = Math.max(currentIndex - 1, 0);\n setZoom(ZOOM_LEVELS[prevIndex]);\n }, [zoom]);\n const fitToView = useCallback(() => {\n setZoom(DEFAULT_ZOOM);\n }, []);\n // Calculate item height based on placeholder height - this must match the renderThumbnail layout\n // padding (p-1=8 or p-2=16) + text height (~16-20 for compact, ~24 for normal) + gap (gap-1=4 or gap-2=8)\n const calculateItemHeight = useCallback((placeholderHeight) => {\n const extraHeight = compact ? 8 + 16 + 4 : 16 + 24 + 8;\n return placeholderHeight + extraHeight;\n }, [compact]);\n // Legacy function for resize preservation - kept for backwards compatibility\n const getItemHeight = (width, ratio) => {\n const placeholderHeight = width ? Math.round(width / ratio) : 200;\n return calculateItemHeight(placeholderHeight);\n };\n // Single ResizeObserver at parent level to measure thumbnail width\n // Debounced to avoid excessive re-renders during resize\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container)\n return;\n let debounceTimer = null;\n const getAvailableWidth = () => {\n // Container width minus padding (px-2 = 8px each side) minus thumbnail padding (p-2 = 8px each side) minus border (2px each side)\n return container.clientWidth - 16 - 16 - 4;\n };\n const updateWidth = () => {\n const newWidth = getAvailableWidth();\n if (newWidth <= 0)\n return;\n // Before updating width, preserve scroll position by calculating which page is at top\n const oldItemHeight = prevItemHeightRef.current;\n if (oldItemHeight && oldItemHeight > 0) {\n const currentScrollTop = container.scrollTop;\n const currentTopPage = Math.round(currentScrollTop / oldItemHeight);\n // Calculate new item height and adjust scroll position\n const newItemHeight = getItemHeight(newWidth, aspectRatio);\n const newScrollTop = currentTopPage * newItemHeight;\n // Update width first, then scroll\n setBaseWidth(newWidth);\n // Use requestAnimationFrame to scroll after the DOM updates\n requestAnimationFrame(() => {\n container.scrollTo({ top: newScrollTop, behavior: 'instant' });\n });\n prevItemHeightRef.current = newItemHeight;\n }\n else {\n setBaseWidth(newWidth);\n prevItemHeightRef.current = getItemHeight(newWidth, aspectRatio);\n }\n };\n // Initial width update\n const initialWidth = getAvailableWidth();\n if (initialWidth > 0) {\n setBaseWidth(initialWidth);\n prevItemHeightRef.current = getItemHeight(initialWidth, aspectRatio);\n }\n const handleResize = () => {\n // Debounce width updates to avoid re-rendering PDFs during resize\n if (debounceTimer)\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(updateWidth, 150);\n };\n const resizeObserver = new ResizeObserver(handleResize);\n resizeObserver.observe(container);\n return () => {\n if (debounceTimer)\n clearTimeout(debounceTimer);\n resizeObserver.disconnect();\n };\n }, [aspectRatio]);\n // Track whether we're programmatically scrolling to avoid feedback loops\n const isProgrammaticScrollRef = useRef(false);\n // Track pending zoom scroll - we need to wait for itemHeight to update after zoom change\n const pendingZoomScrollRef = useRef(null);\n // When zoom changes, mark that we need to scroll after itemHeight updates\n const prevZoomRef = useRef(zoom);\n useEffect(() => {\n if (prevZoomRef.current !== zoom) {\n prevZoomRef.current = zoom;\n // Mark that we need to scroll to current page after itemHeight updates\n pendingZoomScrollRef.current = { targetPage: currentPage };\n isProgrammaticScrollRef.current = true;\n }\n }, [zoom, currentPage]);\n // When itemHeight changes (after zoom), perform the pending scroll\n useEffect(() => {\n const container = scrollContainerRef.current;\n const pendingScroll = pendingZoomScrollRef.current;\n if (pendingScroll && container && itemHeight) {\n pendingZoomScrollRef.current = null;\n // Calculate scroll position using the NEW itemHeight\n const targetScrollTop = (pendingScroll.targetPage - 1) * itemHeight;\n // Use requestAnimationFrame to ensure DOM is updated\n requestAnimationFrame(() => {\n container.scrollTo({ top: targetScrollTop, behavior: 'instant' });\n // Reset after scroll completes\n requestAnimationFrame(() => {\n isProgrammaticScrollRef.current = false;\n });\n });\n }\n }, [itemHeight]);\n // Track if we've done the initial scroll on mount\n const hasInitialScrolledRef = useRef(false);\n // Initial scroll to current page when component mounts and itemHeight becomes available\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container || !itemHeight || hasInitialScrolledRef.current)\n return;\n // Only do initial scroll if not on page 1\n if (currentPage > 1) {\n hasInitialScrolledRef.current = true;\n isProgrammaticScrollRef.current = true;\n const targetScrollTop = (currentPage - 1) * itemHeight;\n container.scrollTo({ top: targetScrollTop, behavior: 'instant' });\n requestAnimationFrame(() => {\n isProgrammaticScrollRef.current = false;\n });\n }\n else {\n hasInitialScrolledRef.current = true;\n }\n }, [itemHeight, currentPage]);\n // Jump to current page when it changes (user navigation)\n // Use a ref to track the previous page to avoid scrolling on resize\n const prevPageRef = useRef(currentPage);\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container || !itemHeight)\n return;\n // Only scroll if the page actually changed (user navigation)\n if (prevPageRef.current !== currentPage) {\n prevPageRef.current = currentPage;\n // Mark as programmatic scroll to avoid triggering onChange\n isProgrammaticScrollRef.current = true;\n // Calculate scroll position directly using itemHeight\n // This is more reliable than DOM queries since virtualization uses spacers\n const targetScrollTop = (currentPage - 1) * itemHeight;\n container.scrollTo({ top: targetScrollTop, behavior: 'instant' });\n // Reset after a short delay to allow scroll event to fire\n requestAnimationFrame(() => {\n isProgrammaticScrollRef.current = false;\n });\n }\n }, [currentPage, itemHeight]);\n // Update current page based on scroll position\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container || !itemHeight)\n return;\n let scrollDebounceTimer = null;\n const handleScroll = () => {\n // Skip if this is a programmatic scroll\n if (isProgrammaticScrollRef.current)\n return;\n // Debounce scroll updates\n if (scrollDebounceTimer)\n clearTimeout(scrollDebounceTimer);\n scrollDebounceTimer = setTimeout(() => {\n // Calculate current page from scroll position using itemHeight\n // This is more reliable than DOM queries since virtualization uses spacers\n const scrollTop = container.scrollTop;\n const calculatedPage = Math.round(scrollTop / itemHeight) + 1;\n // Clamp to valid range and update if different\n const clampedPage = Math.max(1, Math.min(calculatedPage, pageCount));\n if (clampedPage !== currentPage) {\n prevPageRef.current = clampedPage;\n onChange(clampedPage);\n }\n }, 50);\n };\n container.addEventListener('scroll', handleScroll, { passive: true });\n return () => {\n if (scrollDebounceTimer)\n clearTimeout(scrollDebounceTimer);\n container.removeEventListener('scroll', handleScroll);\n };\n }, [itemHeight, pageCount, currentPage, onChange]);\n const goPrev = () => {\n if (currentPage > 1) {\n onChange(currentPage - 1);\n }\n };\n const goNext = () => {\n if (currentPage < pageCount) {\n onChange(currentPage + 1);\n }\n };\n return (_jsxs(\"div\", { ref: ref, className: clsx('flex flex-col items-stretch', compact ? 'gap-y-1' : 'gap-y-2', className), children: [_jsxs(\"div\", { className: clsx(\"relative flex items-center justify-center px-2\", compact ? \"h-6\" : \"h-9\"), children: [_jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: goPrev, alt: \"Previous page\", children: _jsx(ChevronsUp, { className: 'size-4' }) }), _jsxs(\"div\", { className: \"absolute left-2 flex items-center gap-x-1\", children: [_jsx(ZoomControls, { zoom: zoom, onZoomIn: zoomIn, onZoomOut: zoomOut, onFitToView: fitToView, canZoomIn: zoom < ZOOM_LEVELS[ZOOM_LEVELS.length - 1], canZoomOut: zoom > ZOOM_LEVELS[0] }), headerExtra && (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: \"w-px h-4 bg-border mx-1\" }), headerExtra] }))] }), _jsx(\"div\", { className: \"absolute right-2\", children: _jsx(PageNavigator, { currentPage: currentPage, totalPages: pageCount, onChange: onChange }) })] }), _jsx(\"div\", { ref: scrollContainerRef, className: clsx('flex flex-col items-center flex-1 overflow-y-auto px-2', compact ? 'gap-1' : 'gap-2'), children: _jsx(PdfThumbnailList, { pdfUrl: pdfUrl, urlLoading: pdfUrlLoading, pageCount: pageCount, currentPage: currentPage, thumbnailWidth: thumbnailWidth, onPageSelect: onChange, onPageCountChange: onPageCountChange, scrollContainerRef: scrollContainerRef, onAspectRatioChange: setAspectRatio, onItemHeightChange: setItemHeight, calculateItemHeight: calculateItemHeight, renderThumbnail: ({ pageNumber, isSelected, pageElement, onSelect }) => (_jsxs(\"div\", { className: clsx(\"hover:bg-muted rounded-md w-full\", compact ? \"p-1\" : \"p-2\"), children: [_jsx(\"div\", { className: clsx('relative border-[2px] cursor-pointer overflow-hidden', isSelected ? \"border-primary\" : \"border-border\"), onClick: onSelect, children: pageElement }), _jsx(Center, { className: clsx(\"text-muted-foreground font-semibold\", compact ? \"text-xs pt-0.5\" : \"text-sm pt-1\"), children: pageNumber })] }, pageNumber)) }) }), _jsx(\"div\", { className: clsx(\"flex items-center justify-center\", compact ? \"h-6\" : \"h-9\"), children: _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: goNext, alt: \"Next page\", children: _jsx(ChevronsDown, { className: 'size-4' }) }) })] }));\n}\nfunction PageNavigator({ currentPage, totalPages, onChange }) {\n const inputRef = useRef(null);\n const [inputValue, setInputValue] = useState(String(currentPage));\n // Sync input value when currentPage changes externally\n useEffect(() => {\n setInputValue(String(currentPage));\n }, [currentPage]);\n const handleSubmit = () => {\n const page = parseInt(inputValue, 10);\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n onChange(page);\n }\n else {\n // Reset to current page if invalid\n setInputValue(String(currentPage));\n }\n };\n const handleKeyDown = (e) => {\n if (e.key === 'Enter') {\n handleSubmit();\n inputRef.current?.blur();\n }\n else if (e.key === 'Escape') {\n setInputValue(String(currentPage));\n inputRef.current?.blur();\n }\n };\n const handleBlur = () => {\n handleSubmit();\n };\n return (_jsxs(\"div\", { className: \"flex items-center gap-1 text-xs text-muted-foreground\", children: [_jsx(\"span\", { children: \"Page\" }), _jsx(\"input\", { ref: inputRef, type: \"text\", value: inputValue, onChange: (e) => setInputValue(e.target.value), onKeyDown: handleKeyDown, onBlur: handleBlur, className: \"w-8 h-5 text-center text-xs px-1 py-0 bg-background border border-border rounded focus:outline-none focus:border-primary\" }), _jsxs(\"span\", { children: [\"/ \", totalPages] })] }));\n}\nfunction ZoomControls({ zoom, onZoomIn, onZoomOut, onFitToView, canZoomIn, canZoomOut }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-x-0.5\", children: [_jsx(VTooltip, { description: \"Zoom out\", placement: \"bottom\", size: \"xs\", children: _jsx(\"button\", { className: clsx(\"p-1 rounded cursor-pointer transition-colors\", canZoomOut\n ? \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n : \"text-muted-foreground/40 cursor-not-allowed\"), onClick: onZoomOut, disabled: !canZoomOut, children: _jsx(Minus, { className: \"size-4\" }) }) }), _jsxs(\"span\", { className: \"text-xs text-muted-foreground min-w-[32px] text-center\", children: [zoom, \"%\"] }), _jsx(VTooltip, { description: \"Zoom in\", placement: \"bottom\", size: \"xs\", children: _jsx(\"button\", { className: clsx(\"p-1 rounded cursor-pointer transition-colors\", canZoomIn\n ? \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n : \"text-muted-foreground/40 cursor-not-allowed\"), onClick: onZoomIn, disabled: !canZoomIn, children: _jsx(Plus, { className: \"size-4\" }) }) }), _jsx(VTooltip, { description: \"Fit to width\", placement: \"bottom\", size: \"xs\", children: _jsx(\"button\", { className: clsx(\"p-1 rounded cursor-pointer transition-colors\", zoom !== DEFAULT_ZOOM\n ? \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n : \"text-muted-foreground/40\"), onClick: onFitToView, children: _jsx(Maximize, { className: \"size-4\" }) }) })] }));\n}\n//# sourceMappingURL=PdfPageSlider.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { PDF_RENDITION_NAME, } from \"@vertesia/common\";\nimport React, { createContext, useEffect, useState } from \"react\";\nconst DEFAULT_PAGE_COUNT = 10;\nconst ADVANCED_PROCESSING_PREFIX = \"magic-pdf\";\nexport var ImageType;\n(function (ImageType) {\n ImageType[\"original\"] = \"original\";\n ImageType[\"instrumented\"] = \"instrumented\";\n})(ImageType || (ImageType = {}));\n/** Provider for lazy-loading page images on demand */\nexport class PageImageProvider {\n client;\n objectId;\n totalPages;\n cache = new Map();\n pending = new Map();\n constructor(client, objectId, totalPages) {\n this.client = client;\n this.objectId = objectId;\n this.totalPages = totalPages;\n }\n getCacheKey(page, type) {\n return `${type}-${page}`;\n }\n /** Get the URL for a specific page and image type, fetching lazily if needed */\n async getPageImageUrl(page, type) {\n const key = this.getCacheKey(page, type);\n // Return cached URL if available\n const cached = this.cache.get(key);\n if (cached)\n return cached;\n // Return pending promise if already fetching\n const pending = this.pending.get(key);\n if (pending)\n return pending;\n // Fetch the URL\n const promise = this.fetchImageUrl(page, type);\n this.pending.set(key, promise);\n try {\n const url = await promise;\n this.cache.set(key, url);\n return url;\n }\n finally {\n this.pending.delete(key);\n }\n }\n async fetchImageUrl(page, type) {\n const path = this.getImagePath(page, type);\n const response = await this.client.files.getDownloadUrl(path);\n return response.url;\n }\n getImagePath(page, type) {\n const basePath = `${ADVANCED_PROCESSING_PREFIX}/${this.objectId}/pages`;\n switch (type) {\n case ImageType.original:\n return `${basePath}/page-${page}.original.jpg`;\n case ImageType.instrumented:\n return `${basePath}/page-${page}.instrumented.jpg`;\n }\n }\n}\nclass PageLayoutProvider {\n client;\n objectId;\n totalPages;\n cache = new Map();\n pending = new Map();\n constructor(client, objectId, totalPages) {\n this.client = client;\n this.objectId = objectId;\n this.totalPages = totalPages;\n }\n async getPageLayout(page) {\n // Return cached content if available\n const cached = this.cache.get(page);\n if (cached !== undefined)\n return cached;\n // Return pending promise if already fetching\n const pending = this.pending.get(page);\n if (pending)\n return pending;\n // Fetch the layout\n const promise = this.fetchPageLayout(page);\n this.pending.set(page, promise);\n try {\n const content = await promise;\n this.cache.set(page, content);\n return content;\n }\n finally {\n this.pending.delete(page);\n }\n }\n async fetchPageLayout(page) {\n const path = `${ADVANCED_PROCESSING_PREFIX}/${this.objectId}/pages/page-${page}.layout.json`;\n const response = await this.client.files.getDownloadUrl(path);\n const result = await fetch(response.url, { method: \"GET\" });\n if (!result.ok) {\n throw new Error(\"Failed to fetch json layout: \" + result.statusText);\n }\n return result.text();\n }\n}\nclass PageMarkdownProvider {\n totalPages;\n pages = [];\n constructor(totalPages) {\n this.totalPages = totalPages;\n }\n // Initialize by parsing pages from the full markdown content\n // Pages are delimited by <!-- {\"page\":N} --> markers\n initFromContent(markdownContent) {\n this.pages = extractMarkdownPages(markdownContent, this.totalPages);\n }\n // Keep for backwards compatibility with non-markdown processors\n async loadUrls(_vertesia, _objectId) {\n // No-op for markdown processor - content is already parsed\n }\n async getPageMarkdown(page) {\n const index = page - 1;\n if (index < 0 || index >= this.pages.length) {\n return '';\n }\n return this.pages[index];\n }\n}\n// Extract markdown pages from content delimited by <!-- {\"page\":N} --> markers\nfunction extractMarkdownPages(content, totalPages) {\n const pages = new Array(totalPages).fill('');\n // Match page delimiters: <!-- {\"page\":N} -->\n const pageDelimiterRegex = /<!--\\s*\\{\\s*\"page\"\\s*:\\s*(\\d+)\\s*\\}\\s*-->/g;\n // Find all page markers and their positions\n const markers = [];\n let match;\n while ((match = pageDelimiterRegex.exec(content)) !== null) {\n markers.push({\n page: parseInt(match[1], 10),\n index: match.index + match[0].length,\n });\n }\n // Extract content between markers\n for (let i = 0; i < markers.length; i++) {\n const marker = markers[i];\n const pageIndex = marker.page - 1;\n if (pageIndex < 0 || pageIndex >= totalPages) {\n continue;\n }\n const startIndex = marker.index;\n // Find the actual end by looking for the next delimiter or end of content\n const nextDelimiterMatch = content.slice(startIndex).match(/<!--\\s*\\{\\s*\"page\"\\s*:\\s*\\d+\\s*\\}\\s*-->/);\n const actualEndIndex = nextDelimiterMatch\n ? startIndex + nextDelimiterMatch.index\n : content.length;\n let pageContent = content.slice(startIndex, actualEndIndex).trim();\n // Remove trailing --- separators if present\n pageContent = pageContent.replace(/\\n---\\s*$/, '').trim();\n pages[pageIndex] = pageContent;\n }\n return pages;\n}\nconst MagicPdfContext = createContext(undefined);\nexport function MagicPdfProvider({ children, object }) {\n const { client } = useUserSession();\n const page_count = object.metadata.page_count || DEFAULT_PAGE_COUNT;\n const isMarkdownProcessor = object.metadata?.content_processor?.type === 'markdown';\n // Create initial context immediately (synchronously) for both processor types\n const [info, setInfo] = useState(() => {\n const markdownProvider = new PageMarkdownProvider(page_count);\n if (isMarkdownProcessor && object.text) {\n markdownProvider.initFromContent(object.text);\n }\n const xml = object.text ? cleanXml(object.text) : \"\";\n return {\n count: page_count,\n layoutProvider: new PageLayoutProvider(client, object.id, page_count),\n markdownProvider,\n imageProvider: new PageImageProvider(client, object.id, page_count),\n xml,\n xmlPages: object.text ? extractXmlPages(xml) : [],\n pdfUrl: '',\n pdfUrlLoading: true,\n };\n });\n useEffect(() => {\n if (isMarkdownProcessor) {\n // For markdown processor, fetch the PDF URL lazily\n // Priority: PDF rendition > source (only if source is PDF)\n const metadata = object.metadata;\n const pdfRendition = metadata?.renditions?.find(r => r.name === PDF_RENDITION_NAME);\n const isPdfSource = object.content?.type === 'application/pdf';\n const sourceToResolve = pdfRendition?.content?.source || (isPdfSource ? object.content?.source : undefined);\n if (sourceToResolve) {\n client.store.objects.getDownloadUrl(sourceToResolve, undefined, 'inline')\n .then((response) => {\n setInfo(prev => ({ ...prev, pdfUrl: response.url, pdfUrlLoading: false }));\n })\n .catch((e) => {\n console.warn('Failed to get PDF URL:', e);\n setInfo(prev => ({ ...prev, pdfUrlLoading: false }));\n });\n }\n else {\n setInfo(prev => ({ ...prev, pdfUrlLoading: false }));\n }\n }\n else {\n // For XML processor, no pre-loading needed - images load on demand\n setInfo(prev => ({ ...prev, pdfUrlLoading: false }));\n }\n }, [object.id, client, isMarkdownProcessor, page_count]);\n return (_jsx(MagicPdfContext.Provider, { value: info, children: children }));\n}\nexport function getResourceUrl(vertesia, objectId, name) {\n return vertesia.files\n .getDownloadUrl(`${ADVANCED_PROCESSING_PREFIX}/${objectId}/${name}`)\n .then((r) => r.url);\n}\nexport function useMagicPdfContext() {\n const context = React.useContext(MagicPdfContext);\n if (!context) {\n throw new Error(\"useMagicPdfContext must be used within a MagicPdfProvider\");\n }\n return context;\n}\nfunction extractXmlPages(xml) {\n // Parse the XML string\n const doc = new DOMParser().parseFromString(cleanXml(xml), \"text/xml\");\n const pages = doc.getElementsByTagName(\"page\");\n const serializer = new XMLSerializer();\n return Array.from(pages).map((p) => serializer.serializeToString(p));\n}\nfunction cleanXml(xml) {\n const cleanedXML = xml\n // eslint-disable-next-line no-control-regex\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, \"\")\n .replace(/<\\?xml.*?\\?>/g, \"\");\n return cleanedXML;\n}\n//# sourceMappingURL=MagicPdfProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Center, VTooltip } from \"@vertesia/ui/core\";\nimport clsx from \"clsx\";\nimport { ChevronsDown, ChevronsUp, Image, Loader2, Maximize, Minus, Plus, ScanSearch } from \"lucide-react\";\nimport { useRef, useState, useEffect, useCallback } from \"react\";\nimport { ImageType, useMagicPdfContext } from \"./MagicPdfProvider\";\n// Zoom levels as percentages (100 = fit to width)\nconst ZOOM_LEVELS = [50, 75, 100, 125, 150, 200, 300];\nconst DEFAULT_ZOOM = 100;\n// Default aspect ratio (letter size) used before first image loads\nconst DEFAULT_ASPECT_RATIO = 11 / 8.5; // height / width\n// Generate page order radiating outward from current page\n// e.g., if current=5 and total=10: [5, 6, 4, 7, 3, 8, 2, 9, 1, 10]\nfunction getPageLoadOrder(currentPage, totalPages) {\n const order = [currentPage];\n let offset = 1;\n while (order.length < totalPages) {\n const next = currentPage + offset;\n const prev = currentPage - offset;\n if (next <= totalPages)\n order.push(next);\n if (prev >= 1)\n order.push(prev);\n offset++;\n }\n return order;\n}\n/**\n * Image-based page slider that displays annotated/instrumented page images.\n * Progressively loads images starting from current page and radiating outward.\n * Loads first image immediately to determine aspect ratio for stable layout.\n */\nexport function AnnotatedImageSlider({ className, currentPage, onChange }) {\n const [imageType, setImageType] = useState(ImageType.instrumented);\n const [aspectRatio, setAspectRatio] = useState(DEFAULT_ASPECT_RATIO);\n const [loadedUrls, setLoadedUrls] = useState(new Map());\n const [zoom, setZoom] = useState(DEFAULT_ZOOM);\n const loadedPagesRef = useRef(new Set());\n const ref = useRef(null);\n const scrollContainerRef = useRef(null);\n const isProgrammaticScrollRef = useRef(false);\n const { imageProvider, count } = useMagicPdfContext();\n const zoomIn = useCallback(() => {\n let currentIndex = ZOOM_LEVELS.findIndex(level => level >= zoom);\n if (currentIndex === -1) {\n currentIndex = ZOOM_LEVELS.length - 1;\n }\n const nextIndex = Math.min(currentIndex + 1, ZOOM_LEVELS.length - 1);\n setZoom(ZOOM_LEVELS[nextIndex]);\n }, [zoom]);\n const zoomOut = useCallback(() => {\n let currentIndex = ZOOM_LEVELS.findIndex(level => level >= zoom);\n if (currentIndex === -1) {\n currentIndex = ZOOM_LEVELS.length - 1;\n }\n const prevIndex = Math.max(currentIndex - 1, 0);\n setZoom(ZOOM_LEVELS[prevIndex]);\n }, [zoom]);\n const fitToView = useCallback(() => {\n setZoom(DEFAULT_ZOOM);\n }, []);\n // Load first image to determine aspect ratio\n useEffect(() => {\n imageProvider.getPageImageUrl(1, imageType)\n .then((url) => {\n const img = new window.Image();\n img.onload = () => {\n if (img.width > 0 && img.height > 0) {\n setAspectRatio(img.height / img.width);\n }\n };\n img.src = url;\n })\n .catch(() => {\n // Keep default aspect ratio on error\n });\n }, [imageProvider, imageType]);\n // Track the current imageType for change detection\n const prevImageTypeRef = useRef(imageType);\n // Progressive loading: load pages in parallel, prioritized from current page outward\n useEffect(() => {\n let cancelled = false;\n // Check if imageType changed - if so, reset and reload all pages\n const imageTypeChanged = prevImageTypeRef.current !== imageType;\n if (imageTypeChanged) {\n prevImageTypeRef.current = imageType;\n loadedPagesRef.current = new Set();\n setLoadedUrls(new Map());\n }\n const loadOrder = getPageLoadOrder(currentPage, count);\n // Load all pages in parallel, but they're already prioritized by loadOrder\n // The imageProvider handles deduplication via its pending map\n const loadPage = async (page) => {\n if (cancelled || loadedPagesRef.current.has(page))\n return;\n try {\n const url = await imageProvider.getPageImageUrl(page, imageType);\n if (!cancelled) {\n loadedPagesRef.current.add(page);\n setLoadedUrls(prev => new Map(prev).set(page, url));\n }\n }\n catch {\n // Skip failed pages\n }\n };\n // Start all loads in parallel - prioritized pages will update state first\n // since they're fetched first in the loadOrder\n loadOrder.forEach(page => loadPage(page));\n return () => {\n cancelled = true;\n };\n }, [currentPage, count, imageType, imageProvider]);\n // Scroll to current page when zoom changes to preserve position\n const prevZoomRef = useRef(zoom);\n useEffect(() => {\n if (prevZoomRef.current !== zoom && scrollContainerRef.current) {\n prevZoomRef.current = zoom;\n // Mark as programmatic scroll to avoid triggering onChange\n isProgrammaticScrollRef.current = true;\n const thumbnail = scrollContainerRef.current.querySelector(`[data-page=\"${currentPage}\"]`);\n if (thumbnail) {\n // Use requestAnimationFrame to wait for DOM to update with new sizes\n requestAnimationFrame(() => {\n thumbnail.scrollIntoView({\n behavior: 'instant',\n block: 'center',\n });\n // Reset after scroll completes\n requestAnimationFrame(() => {\n isProgrammaticScrollRef.current = false;\n });\n });\n }\n else {\n isProgrammaticScrollRef.current = false;\n }\n }\n }, [zoom, currentPage]);\n // Jump to current page when it changes (user navigation via buttons/input)\n const prevPageRef = useRef(currentPage);\n useEffect(() => {\n if (prevPageRef.current !== currentPage && scrollContainerRef.current) {\n prevPageRef.current = currentPage;\n // Mark as programmatic scroll to avoid triggering onChange\n isProgrammaticScrollRef.current = true;\n const thumbnail = scrollContainerRef.current.querySelector(`[data-page=\"${currentPage}\"]`);\n if (thumbnail) {\n thumbnail.scrollIntoView({\n behavior: 'instant',\n block: 'nearest',\n });\n }\n // Reset after a short delay to allow scroll event to fire\n requestAnimationFrame(() => {\n isProgrammaticScrollRef.current = false;\n });\n }\n }, [currentPage]);\n // Update current page based on scroll position (when user scrolls manually)\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container)\n return;\n let scrollDebounceTimer = null;\n const handleScroll = () => {\n // Skip if this is a programmatic scroll\n if (isProgrammaticScrollRef.current)\n return;\n // Debounce scroll updates\n if (scrollDebounceTimer)\n clearTimeout(scrollDebounceTimer);\n scrollDebounceTimer = setTimeout(() => {\n // Find the page element closest to the center of the viewport\n const containerRect = container.getBoundingClientRect();\n const containerCenter = containerRect.top + containerRect.height / 2;\n let closestPage = currentPage;\n let closestDistance = Infinity;\n for (let i = 1; i <= count; i++) {\n const pageEl = container.querySelector(`[data-page=\"${i}\"]`);\n if (pageEl) {\n const pageRect = pageEl.getBoundingClientRect();\n const pageCenter = pageRect.top + pageRect.height / 2;\n const distance = Math.abs(pageCenter - containerCenter);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestPage = i;\n }\n }\n }\n if (closestPage !== currentPage) {\n prevPageRef.current = closestPage;\n onChange(closestPage);\n }\n }, 50);\n };\n container.addEventListener('scroll', handleScroll, { passive: true });\n return () => {\n if (scrollDebounceTimer)\n clearTimeout(scrollDebounceTimer);\n container.removeEventListener('scroll', handleScroll);\n };\n }, [count, currentPage, onChange]);\n const goPrev = () => {\n if (currentPage > 1) {\n onChange(currentPage - 1);\n }\n };\n const goNext = () => {\n if (currentPage < count) {\n onChange(currentPage + 1);\n }\n };\n return (_jsxs(\"div\", { ref: ref, className: clsx('flex flex-col items-stretch gap-y-2', className), children: [_jsxs(\"div\", { className: \"relative flex items-center justify-center px-2 h-9\", children: [_jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: goPrev, alt: \"Previous page\", children: _jsx(ChevronsUp, { className: 'size-4' }) }), _jsxs(\"div\", { className: \"absolute left-2 flex items-center gap-x-1\", children: [_jsx(ImageTypeButton, { type: ImageType.original, currentType: imageType, onClick: () => setImageType(ImageType.original), icon: _jsx(Image, { className: \"size-4\" }), tooltip: \"Original images\" }), _jsx(ImageTypeButton, { type: ImageType.instrumented, currentType: imageType, onClick: () => setImageType(ImageType.instrumented), icon: _jsx(ScanSearch, { className: \"size-4\" }), tooltip: \"Instrumented images\" }), _jsx(\"div\", { className: \"w-px h-4 bg-border mx-1\" }), _jsx(ZoomControls, { zoom: zoom, onZoomIn: zoomIn, onZoomOut: zoomOut, onFitToView: fitToView, canZoomIn: zoom < ZOOM_LEVELS[ZOOM_LEVELS.length - 1], canZoomOut: zoom > ZOOM_LEVELS[0] })] }), _jsx(\"div\", { className: \"absolute right-2\", children: _jsx(PageNavigator, { currentPage: currentPage, totalPages: count, onChange: onChange }) })] }), _jsx(\"div\", { ref: scrollContainerRef, className: 'flex flex-col items-center gap-2 flex-1 overflow-y-auto px-2', children: Array.from({ length: count }, (_, index) => (_jsx(PageThumbnail, { currentPage: currentPage, pageNumber: index + 1, aspectRatio: aspectRatio, zoom: zoom, url: loadedUrls.get(index + 1), onSelect: () => onChange(index + 1) }, index))) }), _jsx(\"div\", { className: \"flex items-center justify-center h-9\", children: _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: goNext, alt: \"Next page\", children: _jsx(ChevronsDown, { className: 'size-4' }) }) })] }));\n}\nfunction ImageTypeButton({ type, currentType, onClick, icon, tooltip }) {\n const isSelected = type === currentType;\n return (_jsx(VTooltip, { description: tooltip, placement: \"bottom\", size: \"xs\", children: _jsx(\"button\", { className: clsx(\"p-1 rounded cursor-pointer transition-colors\", isSelected\n ? \"text-primary bg-primary/10\"\n : \"text-muted-foreground hover:text-foreground hover:bg-muted\"), onClick: onClick, children: icon }) }));\n}\nfunction ZoomControls({ zoom, onZoomIn, onZoomOut, onFitToView, canZoomIn, canZoomOut }) {\n return (_jsxs(\"div\", { className: \"flex items-center gap-x-0.5\", children: [_jsx(VTooltip, { description: \"Zoom out\", placement: \"bottom\", size: \"xs\", children: _jsx(\"button\", { className: clsx(\"p-1 rounded cursor-pointer transition-colors\", canZoomOut\n ? \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n : \"text-muted-foreground/40 cursor-not-allowed\"), onClick: onZoomOut, disabled: !canZoomOut, children: _jsx(Minus, { className: \"size-4\" }) }) }), _jsxs(\"span\", { className: \"text-xs text-muted-foreground min-w-[32px] text-center\", children: [zoom, \"%\"] }), _jsx(VTooltip, { description: \"Zoom in\", placement: \"bottom\", size: \"xs\", children: _jsx(\"button\", { className: clsx(\"p-1 rounded cursor-pointer transition-colors\", canZoomIn\n ? \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n : \"text-muted-foreground/40 cursor-not-allowed\"), onClick: onZoomIn, disabled: !canZoomIn, children: _jsx(Plus, { className: \"size-4\" }) }) }), _jsx(VTooltip, { description: \"Fit to width\", placement: \"bottom\", size: \"xs\", children: _jsx(\"button\", { className: clsx(\"p-1 rounded cursor-pointer transition-colors\", zoom !== DEFAULT_ZOOM\n ? \"text-muted-foreground hover:text-foreground hover:bg-muted\"\n : \"text-muted-foreground/40\"), onClick: onFitToView, children: _jsx(Maximize, { className: \"size-4\" }) }) })] }));\n}\nfunction PageThumbnail({ pageNumber, currentPage, aspectRatio, zoom, url, onSelect }) {\n const isSelected = pageNumber === currentPage;\n const widthPercent = zoom;\n return (_jsxs(\"div\", { className: \"p-2 hover:bg-muted rounded-md flex flex-col items-center\", \"data-page\": pageNumber, style: { width: `${widthPercent}%` }, children: [_jsx(\"div\", { className: clsx('relative border-[2px] cursor-pointer overflow-hidden flex items-center justify-center bg-muted/50 w-full', isSelected ? \"border-primary\" : \"border-border\"), style: { aspectRatio: `1 / ${aspectRatio}` }, onClick: onSelect, children: url ? (_jsx(\"img\", { src: url, alt: `Page ${pageNumber}`, className: \"w-full\" })) : (_jsx(Loader2, { className: \"w-6 h-6 animate-spin text-muted-foreground\" })) }), _jsx(Center, { className: \"text-sm text-muted-foreground pt-1 font-semibold\", children: pageNumber })] }));\n}\nfunction PageNavigator({ currentPage, totalPages, onChange }) {\n const inputRef = useRef(null);\n const [inputValue, setInputValue] = useState(String(currentPage));\n // Sync input value when currentPage changes externally\n useEffect(() => {\n setInputValue(String(currentPage));\n }, [currentPage]);\n const handleSubmit = () => {\n const page = parseInt(inputValue, 10);\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n onChange(page);\n }\n else {\n // Reset to current page if invalid\n setInputValue(String(currentPage));\n }\n };\n const handleKeyDown = (e) => {\n if (e.key === 'Enter') {\n handleSubmit();\n inputRef.current?.blur();\n }\n else if (e.key === 'Escape') {\n setInputValue(String(currentPage));\n inputRef.current?.blur();\n }\n };\n const handleBlur = () => {\n handleSubmit();\n };\n return (_jsxs(\"div\", { className: \"flex items-center gap-1 text-xs text-muted-foreground\", children: [_jsx(\"span\", { children: \"Page\" }), _jsx(\"input\", { ref: inputRef, type: \"text\", value: inputValue, onChange: (e) => setInputValue(e.target.value), onKeyDown: handleKeyDown, onBlur: handleBlur, className: \"w-8 h-5 text-center text-xs px-1 py-0 bg-background border border-border rounded focus:outline-none focus:border-primary\" }), _jsxs(\"span\", { children: [\"/ \", totalPages] })] }));\n}\n//# sourceMappingURL=AnnotatedImageSlider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Popover } from \"@vertesia/ui/widgets\";\nimport { Download } from \"lucide-react\";\nimport { getResourceUrl } from \"./MagicPdfProvider\";\nexport function DownloadPopover({ object }) {\n const { client } = useUserSession();\n const onDownload = (name) => {\n getResourceUrl(client, object.id, name).then(url => window.open(url, '_blank'));\n };\n const getProcessorType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n return docMetadata.content_processor?.type || \"xml\";\n }\n return \"xml\"; // default\n };\n const processorType = getProcessorType();\n const buttonClass = \"p-2 cursor-pointer hover:bg-muted text-left text-sm\";\n // For markdown processor, only one download option - render simple button\n if (processorType === \"markdown\") {\n return (_jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: () => onDownload(\"document.md\"), alt: \"Download\", children: _jsx(Download, { className: 'size-4' }) }));\n }\n // Default XML processor - multiple options, use popover\n return (_jsxs(Popover, { strategy: 'absolute', placement: 'bottom-start', zIndex: 100, offset: 8, children: [_jsx(Popover.Trigger, { click: true, children: _jsx(Button, { variant: \"ghost\", size: \"xs\", alt: \"Download\", children: _jsx(Download, { className: 'size-4' }) }) }), _jsx(Popover.Content, { children: _jsxs(\"div\", { className: \"rounded-md shadow-md border border-border bg-popover min-w-[200px] flex flex-col divide-y divide-border\", children: [_jsx(\"button\", { className: buttonClass, onClick: () => onDownload(\"annotated.pdf\"), children: \"annotated.pdf\" }), _jsx(\"button\", { className: buttonClass, onClick: () => onDownload(\"document.xml\"), children: \"document.xml\" }), _jsx(\"button\", { className: buttonClass, onClick: () => onDownload(\"analyzed-pages.json\"), children: \"analyzed-pages.json\" })] }) })] }));\n}\n//# sourceMappingURL=DownloadPopover.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { JSONCode, XMLViewer, MarkdownRenderer } from '@vertesia/ui/widgets';\nimport { Loader2 } from 'lucide-react';\nimport { useEffect, useState } from \"react\";\nimport { useMagicPdfContext } from \"./MagicPdfProvider\";\nfunction LoadingSpinner({ className }) {\n return (_jsx(\"div\", { className: `flex items-center justify-center ${className || ''}`, children: _jsx(Loader2, { className: \"w-6 h-6 animate-spin text-gray-400\" }) }));\n}\nexport function ExtractedContentView({ viewType, pageNumber }) {\n switch (viewType) {\n case \"json\":\n return _jsx(JsonPageLayoutView, { pageNumber: pageNumber });\n case \"markdown\":\n return _jsx(MarkdownPageView, { pageNumber: pageNumber });\n default:\n return _jsx(XmlPageView, { pageNumber: pageNumber });\n }\n}\nfunction XmlPageView({ pageNumber }) {\n const { xmlPages: pages } = useMagicPdfContext();\n return (_jsx(\"div\", { className: \"px-4 py-2\", children: _jsx(XMLViewer, { xml: pages[pageNumber - 1], collapsible: true }) }));\n}\nfunction JsonPageLayoutView({ pageNumber }) {\n const [content, setContent] = useState(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const { layoutProvider } = useMagicPdfContext();\n useEffect(() => {\n setLoading(true);\n setError(null);\n layoutProvider.getPageLayout(pageNumber)\n .then((layoutContent) => {\n setContent(layoutContent ? JSON.parse(layoutContent) : null);\n setLoading(false);\n })\n .catch((err) => {\n console.error(err);\n setError(err.message || 'Failed to load layout');\n setLoading(false);\n });\n }, [pageNumber, layoutProvider]);\n if (loading) {\n return (_jsx(\"div\", { className: \"px-4 py-8\", children: _jsx(LoadingSpinner, {}) }));\n }\n if (error) {\n return (_jsx(\"div\", { className: \"px-4 py-2 text-red-500 text-sm\", children: error }));\n }\n return content ? _jsx(JSONCode, { className: \"w-full\", data: content }) : null;\n}\nfunction MarkdownPageView({ pageNumber }) {\n const [content, setContent] = useState(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const { markdownProvider } = useMagicPdfContext();\n useEffect(() => {\n setLoading(true);\n setError(null);\n markdownProvider.getPageMarkdown(pageNumber)\n .then((md) => {\n setContent(md);\n setLoading(false);\n })\n .catch((err) => {\n console.error(err);\n setError(err.message || 'Failed to load markdown');\n setLoading(false);\n });\n }, [pageNumber, markdownProvider]);\n if (loading) {\n return (_jsxs(\"div\", { className: \"h-full flex flex-col items-center justify-center gap-2\", children: [_jsx(LoadingSpinner, {}), _jsx(\"span\", { className: \"text-sm text-muted-foreground\", children: \"Loading...\" })] }));\n }\n if (error) {\n return (_jsx(\"div\", { className: \"px-4 py-2 text-red-500 text-sm\", children: error }));\n }\n return (_jsx(\"div\", { className: \"px-4 py-2 prose prose-sm max-w-none dark:prose-invert\", children: content ? _jsx(MarkdownRenderer, { children: content }) : _jsx(\"div\", { children: \"No markdown content available\" }) }));\n}\n//# sourceMappingURL=ExtractedContentView.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, ErrorBox, ResizableHandle, ResizablePanel, ResizablePanelGroup, useFetch } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { X } from \"lucide-react\";\nimport { Component, useState } from \"react\";\nimport { PdfPageSlider } from \"../pdf-viewer/PdfPageSlider\";\nimport { AnnotatedImageSlider } from \"./AnnotatedImageSlider\";\nimport { DownloadPopover } from \"./DownloadPopover\";\nimport { ExtractedContentView } from \"./ExtractedContentView\";\nimport { MagicPdfProvider, useMagicPdfContext } from \"./MagicPdfProvider\";\nclass PdfViewErrorBoundary extends Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n static getDerivedStateFromError(error) {\n return { hasError: true, error };\n }\n componentDidCatch(error, errorInfo) {\n console.error('PDF View error:', error, errorInfo);\n }\n render() {\n if (this.state.hasError) {\n return (_jsx(\"div\", { className: \"fixed inset-0 bg-background z-50 flex items-center justify-center\", children: _jsxs(\"div\", { className: \"flex flex-col items-center gap-4 p-8 max-w-md\", children: [_jsx(ErrorBox, { title: \"Failed to load PDF viewer\", children: this.state.error?.message || 'An unexpected error occurred' }), this.props.onClose && (_jsx(Button, { variant: \"outline\", onClick: this.props.onClose, children: \"Close\" }))] }) }));\n }\n return this.props.children;\n }\n}\nexport function MagicPdfView({ objectId, onClose }) {\n const { client } = useUserSession();\n const { data: object, error } = useFetch(() => client.store.objects.retrieve(objectId, \"+text\"), [objectId]);\n if (error) {\n return (_jsx(\"div\", { className: \"fixed inset-0 bg-background z-50 flex items-center justify-center\", children: _jsxs(\"div\", { className: \"flex flex-col items-center gap-4 p-8 max-w-md\", children: [_jsx(ErrorBox, { title: \"Fetching document failed\", children: error.message }), onClose && (_jsx(Button, { variant: \"outline\", onClick: onClose, children: \"Close\" }))] }) }));\n }\n if (!object) {\n return (_jsxs(\"div\", { className: \"fixed inset-0 bg-background z-50 flex flex-col\", children: [_jsx(\"div\", { className: \"flex h-9 items-center justify-end shrink-0 bg-sidebar px-2 border-b border-sidebar-border\", children: onClose && (_jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: onClose, alt: \"Close\", children: _jsx(X, { className: 'size-4' }) })) }), _jsx(\"div\", { className: \"flex-1 flex items-center justify-center\", children: _jsx(\"div\", { className: \"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\" }) })] }));\n }\n return (_jsx(PdfViewErrorBoundary, { onClose: onClose, children: _jsx(\"div\", { className: 'fixed inset-0 bg-background z-50 flex items-center justify-center', children: _jsx(MagicPdfProvider, { object: object, children: _jsx(MagicPdfViewImpl, { object: object, onClose: onClose }) }) }) }));\n}\nfunction MagicPdfViewImpl({ object, onClose }) {\n const { count: totalPages, pdfUrl, pdfUrlLoading } = useMagicPdfContext();\n const getProcessorType = () => {\n if (object.metadata?.type === \"document\") {\n const docMetadata = object.metadata;\n const type = docMetadata.content_processor?.type;\n if (type === \"markdown\")\n return \"markdown\";\n }\n return \"xml\"; // default\n };\n const [pageNumber, setPageNumber] = useState(1);\n const processorType = getProcessorType();\n // XML processor: ImageSlider (annotated images) on left, XML/JSON/Markdown text on right\n // Markdown processor: PageSlider (PDF thumbnails) on left, Markdown on right\n if (processorType === \"xml\") {\n return (_jsxs(ResizablePanelGroup, { direction: \"horizontal\", className: \"absolute inset-0\", children: [_jsx(ResizablePanel, { defaultSize: 50, minSize: 20, maxSize: 80, className: \"bg-muted\", children: _jsx(AnnotatedImageSlider, { className: \"h-full\", currentPage: pageNumber, onChange: setPageNumber }) }), _jsx(ResizableHandle, { className: \"w-[4px] bg-border cursor-ew-resize\" }), _jsxs(ResizablePanel, { defaultSize: 50, minSize: 20, className: \"flex flex-col\", children: [_jsxs(\"div\", { className: \"flex h-9 items-center justify-between shrink-0 bg-sidebar px-2 border-b border-sidebar-border\", children: [_jsx(\"div\", { className: \"flex items-center gap-x-2\", children: _jsx(DownloadPopover, { object: object }) }), _jsxs(\"span\", { className: \"text-xs text-muted-foreground\", children: [\"Page \", pageNumber, \" / \", totalPages] }), _jsx(\"div\", { className: \"flex items-center gap-x-2\", children: !!onClose && (_jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: onClose, alt: \"Close\", children: _jsx(X, { className: 'size-4' }) })) })] }), _jsx(\"div\", { className: \"flex-1 overflow-auto px-2\", children: _jsx(ExtractedContentView, { pageNumber: pageNumber, viewType: \"xml\" }) })] })] }));\n }\n // Markdown processor: PDF thumbnails on left, Markdown on right\n return (_jsxs(ResizablePanelGroup, { direction: \"horizontal\", className: \"absolute inset-0\", children: [_jsx(ResizablePanel, { defaultSize: 50, minSize: 20, maxSize: 80, className: \"bg-muted\", children: _jsx(PdfPageSlider, { pdfUrl: pdfUrl, pdfUrlLoading: pdfUrlLoading, pageCount: totalPages, className: \"h-full\", currentPage: pageNumber, onChange: setPageNumber }) }), _jsx(ResizableHandle, { className: \"w-[4px] bg-border cursor-ew-resize\" }), _jsxs(ResizablePanel, { defaultSize: 50, minSize: 20, className: \"flex flex-col\", children: [_jsxs(\"div\", { className: \"flex h-9 items-center justify-between shrink-0 bg-sidebar px-2 border-b border-sidebar-border\", children: [_jsx(\"div\", { className: \"flex items-center gap-x-2\", children: _jsx(DownloadPopover, { object: object }) }), _jsxs(\"span\", { className: \"text-xs text-muted-foreground\", children: [\"Page \", pageNumber, \" / \", totalPages] }), _jsx(\"div\", { className: \"flex items-center gap-x-2\", children: !!onClose && (_jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: onClose, alt: \"Close\", children: _jsx(X, { className: 'size-4' }) })) })] }), _jsx(\"div\", { className: \"flex-1 overflow-auto px-2\", children: _jsx(ExtractedContentView, { pageNumber: pageNumber, viewType: \"markdown\" }) })] })] }));\n}\n//# sourceMappingURL=MagicPdfView.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Spinner, VTooltip } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Maximize2, X } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { PdfPageSlider } from \"./PdfPageSlider\";\n/**\n * A standalone PDF viewer component that displays PDF thumbnails with navigation.\n * Fetches the PDF URL from the content object and displays it using PdfThumbnailSlider.\n * Does not depend on any magic-pdf context.\n */\nexport function SimplePdfViewer({ object, url, source, className }) {\n const { client } = useUserSession();\n const [currentPage, setCurrentPage] = useState(1);\n const [pdfUrl, setPdfUrl] = useState(url || \"\");\n const [pdfUrlLoading, setPdfUrlLoading] = useState(!url);\n const [pageCount, setPageCount] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n // Fetch the PDF URL - priority: url > source > object.content.source\n useEffect(() => {\n // If url prop is provided, use it directly (already signed)\n if (url) {\n setPdfUrl(url);\n setPdfUrlLoading(false);\n return;\n }\n // Determine the source to resolve\n const sourceToResolve = source || object?.content?.source;\n if (!sourceToResolve) {\n setPdfUrlLoading(false);\n return;\n }\n setPdfUrlLoading(true);\n client.files.getDownloadUrl(sourceToResolve)\n .then((result) => {\n setPdfUrl(result.url);\n })\n .catch((err) => {\n console.error(\"Failed to get PDF URL:\", err);\n })\n .finally(() => {\n setPdfUrlLoading(false);\n });\n }, [url, source, object?.content?.source, client]);\n // Get initial page count from metadata, but actual count will be updated when PDF loads\n useEffect(() => {\n // Try to get page count from metadata as initial estimate\n const metadata = object?.metadata;\n const count = metadata?.pages || metadata?.page_count || 0;\n if (count > 0) {\n setPageCount(count);\n }\n // If no metadata, keep pageCount at 0 - it will be set when PDF loads\n }, [object?.metadata]);\n // Callback to update page count when PDF loads\n const handlePageCountChange = (count) => {\n setPageCount(count);\n };\n if (pdfUrlLoading) {\n return (_jsx(\"div\", { className: \"flex items-center justify-center h-full\", children: _jsx(Spinner, { size: \"lg\" }) }));\n }\n if (!pdfUrl) {\n return (_jsx(\"div\", { className: \"flex items-center justify-center h-full text-muted\", children: \"No PDF available\" }));\n }\n // Fullscreen overlay\n if (isFullscreen) {\n return (_jsxs(\"div\", { className: \"fixed inset-0 bg-background z-50 flex flex-col overflow-hidden\", children: [_jsx(\"div\", { className: \"flex h-9 items-center justify-end shrink-0 bg-sidebar px-2 border-b border-sidebar-border\", children: _jsx(Button, { variant: \"ghost\", size: \"xs\", onClick: () => setIsFullscreen(false), alt: \"Close fullscreen\", children: _jsx(X, { className: \"size-4\" }) }) }), _jsx(PdfPageSlider, { pdfUrl: pdfUrl, pdfUrlLoading: pdfUrlLoading, pageCount: pageCount || 100, currentPage: currentPage, onChange: setCurrentPage, onPageCountChange: handlePageCountChange, className: \"flex-1 min-h-0\" })] }));\n }\n return (_jsx(\"div\", { className: \"relative h-full flex flex-col\", children: _jsx(PdfPageSlider, { pdfUrl: pdfUrl, pdfUrlLoading: pdfUrlLoading, pageCount: pageCount || 100, currentPage: currentPage, onChange: setCurrentPage, onPageCountChange: handlePageCountChange, className: className, compact: true, headerExtra: _jsx(VTooltip, { description: \"Fullscreen\", placement: \"bottom\", size: \"xs\", children: _jsx(\"button\", { className: \"p-1 rounded cursor-pointer transition-colors text-muted-foreground hover:text-foreground hover:bg-muted\", onClick: () => setIsFullscreen(true), children: _jsx(Maximize2, { className: \"size-4\" }) }) }) }) }));\n}\n//# sourceMappingURL=SimplePdfViewer.js.map","import { useCallback, useEffect, useState } from \"react\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { MarkdownRenditionFormat, WorkflowExecutionStatus } from \"@vertesia/common\";\n// Maximum text size before cropping (128K characters)\nconst MAX_TEXT_DISPLAY_SIZE = 128 * 1024;\n/**\n * Hook for managing object text loading and cropping.\n */\nexport function useObjectText(objectId, initialText, loadOnMount = false) {\n const { store } = useUserSession();\n const [fullText, setFullText] = useState(initialText);\n const [displayText, setDisplayText] = useState(() => {\n if (initialText && initialText.length > MAX_TEXT_DISPLAY_SIZE) {\n return initialText.substring(0, MAX_TEXT_DISPLAY_SIZE);\n }\n return initialText;\n });\n const [isLoading, setIsLoading] = useState(false);\n const [isCropped, setIsCropped] = useState(() => !!initialText && initialText.length > MAX_TEXT_DISPLAY_SIZE);\n const loadText = useCallback(() => {\n setIsLoading(true);\n store.objects\n .getObjectText(objectId)\n .then((res) => {\n setFullText(res.text);\n if (res.text.length > MAX_TEXT_DISPLAY_SIZE) {\n setDisplayText(res.text.substring(0, MAX_TEXT_DISPLAY_SIZE));\n setIsCropped(true);\n }\n else {\n setDisplayText(res.text);\n setIsCropped(false);\n }\n })\n .catch((err) => {\n console.error(\"Failed to load text\", err);\n setFullText(undefined);\n setDisplayText(undefined);\n setIsCropped(false);\n })\n .finally(() => {\n setIsLoading(false);\n });\n }, [objectId, store]);\n // Reset state when objectId changes\n useEffect(() => {\n // Reset to initial text for new object\n if (initialText && initialText.length > MAX_TEXT_DISPLAY_SIZE) {\n setFullText(initialText);\n setDisplayText(initialText.substring(0, MAX_TEXT_DISPLAY_SIZE));\n setIsCropped(true);\n }\n else {\n setFullText(initialText);\n setDisplayText(initialText);\n setIsCropped(false);\n }\n // Load text if requested\n if (loadOnMount && !initialText) {\n loadText();\n }\n }, [objectId, initialText, loadOnMount, loadText]);\n return {\n fullText,\n displayText,\n isLoading,\n isCropped,\n loadText,\n };\n}\n/**\n * Hook for polling PDF/document processing status.\n */\nexport function usePdfProcessingStatus(objectId, shouldPoll) {\n const { client } = useUserSession();\n const [progress, setProgress] = useState();\n const [status, setStatus] = useState();\n const [outputFormat, setOutputFormat] = useState();\n const [isComplete, setIsComplete] = useState(false);\n useEffect(() => {\n if (!shouldPoll)\n return;\n let interrupted = false;\n function poll() {\n if (interrupted)\n return;\n client.objects.analyze(objectId).getStatus()\n .then((r) => {\n setProgress(r.progress);\n setStatus(r.status);\n setOutputFormat(r.output_format ?? r.progress?.output_format);\n if (r.status === WorkflowExecutionStatus.RUNNING) {\n // Workflow is running, poll every 2 seconds for progress\n if (!interrupted) {\n setTimeout(poll, 2000);\n }\n }\n else {\n // Workflow completed or terminal state\n setIsComplete(true);\n }\n })\n .catch(() => {\n // No workflow found yet, poll every 10 seconds to check if one starts\n if (!interrupted) {\n setTimeout(poll, 10000);\n }\n });\n }\n poll();\n return () => { interrupted = true; };\n }, [shouldPoll, objectId, client]);\n return {\n progress,\n status,\n outputFormat,\n isComplete,\n };\n}\n/**\n * Hook for managing Office document to PDF conversion.\n */\nexport function useOfficePdfConversion(objectId, enabled) {\n const { client } = useUserSession();\n const [pdfUrl, setPdfUrl] = useState();\n const [isConverting, setIsConverting] = useState(false);\n const [error, setError] = useState();\n const triggerConversion = useCallback(async () => {\n if (!enabled || isConverting)\n return;\n setIsConverting(true);\n setError(undefined);\n const pollForPdf = async (isFirstCall) => {\n try {\n const response = await client.objects.getRendition(objectId, {\n format: MarkdownRenditionFormat.pdf,\n generate_if_missing: isFirstCall,\n sign_url: true,\n block_on_generation: false,\n });\n if (response.status === \"generating\") {\n // Poll every 5 seconds\n setTimeout(() => pollForPdf(false), 5000);\n }\n else if (response.status === \"found\" && response.renditions?.length) {\n setPdfUrl(response.renditions[0]);\n setIsConverting(false);\n }\n else if (response.status === \"failed\") {\n setError(\"PDF conversion failed\");\n setIsConverting(false);\n }\n }\n catch (err) {\n console.error(\"Failed to convert Office document to PDF:\", err);\n setError(\"Failed to convert to PDF\");\n setIsConverting(false);\n }\n };\n await pollForPdf(true);\n }, [objectId, enabled, isConverting, client]);\n return {\n pdfUrl,\n isConverting,\n error,\n triggerConversion,\n };\n}\n//# sourceMappingURL=useContentPanelHooks.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useEffect, useState, memo, useRef } from \"react\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Button, Portal, ResizableHandle, ResizablePanel, ResizablePanelGroup, Spinner, useToast, VModal, VModalBody, VModalFooter, VModalTitle } from \"@vertesia/ui/core\";\nimport { JSONDisplay, MarkdownRenderer, Progress, XMLViewer } from \"@vertesia/ui/widgets\";\nimport { ContentNature, ContentObjectStatus, ImageRenditionFormat, POSTER_RENDITION_NAME, AUDIO_RENDITION_NAME, WorkflowExecutionStatus, PDF_RENDITION_NAME } from \"@vertesia/common\";\nimport { Copy, Download, SquarePen, AlertTriangle, FileSearch } from \"lucide-react\";\nimport { isPreviewableAsPdf, printElementToPdf, getWorkflowStatusColor, getWorkflowStatusName } from \"../../../utils/index.js\";\nimport { PropertiesEditorModal } from \"./PropertiesEditorModal\";\nimport { NavLink } from \"@vertesia/ui/router\";\nimport { MagicPdfView } from \"../../../magic-pdf\";\nimport { SimplePdfViewer } from \"../../../pdf-viewer\";\nimport { useObjectText, usePdfProcessingStatus, useOfficePdfConversion } from \"./useContentPanelHooks.js\";\n// Web-supported image formats for browser display\nconst WEB_SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml'];\n// Web-supported video formats for browser display\nconst WEB_SUPPORTED_VIDEO_FORMATS = ['video/mp4', 'video/webm'];\n// Web-supported audio formats for browser display\nconst WEB_SUPPORTED_AUDIO_FORMATS = [\n 'audio/mp4', // M4A/AAC (official MIME type)\n 'audio/m4a', // M4A (alternative MIME type)\n 'audio/x-m4a', // M4A (legacy MIME type)\n 'audio/mpeg', // MP3\n 'audio/ogg', // Ogg Vorbis\n 'audio/wav', // WAV\n 'audio/webm', // WebM audio\n];\n// Panel height constants for consistent layout\nconst PANEL_HEIGHTS = {\n /** Main resizable panel group */\n main: \"h-[calc(100vh-208px)]\",\n /** Properties panel content area */\n properties: \"h-[calc(100vh-228px)]\",\n /** Text/PDF content panel */\n content: \"h-[calc(100vh-218px)]\",\n /** Video max height */\n video: \"max-h-[calc(100vh-268px)]\",\n};\n/**\n * Custom markdown components for the content overview.\n * Handles internal links to store objects and provides consistent styling.\n */\nconst createMarkdownComponents = () => ({\n a: ({ node, ...props }) => {\n const href = props.href || \"\";\n if (href.includes(\"/store/objects/\")) {\n return (_jsx(NavLink, { topLevelNav: true, href: href, className: \"text-info\", children: props.children }));\n }\n return _jsx(\"a\", { ...props, target: \"_blank\", rel: \"noopener noreferrer\" });\n },\n p: ({ node, ...props }) => (_jsx(\"p\", { ...props, className: \"my-0\" })),\n pre: ({ node, ...props }) => (_jsx(\"pre\", { ...props, className: \"my-2 p-2 rounded\" })),\n code: ({ node, className, children, ...props }) => {\n const match = /language-(\\w+)/.exec(className || \"\");\n const isInline = !match;\n return (_jsx(\"code\", { ...props, className: isInline ? \"px-1.5 py-0.5 rounded\" : \"text-muted\", children: children }));\n },\n h1: ({ node, ...props }) => (_jsx(\"h1\", { ...props, className: \"font-bold text-2xl my-2\" })),\n h2: ({ node, ...props }) => (_jsx(\"h2\", { ...props, className: \"font-bold text-xl my-2\" })),\n h3: ({ node, ...props }) => (_jsx(\"h3\", { ...props, className: \"font-bold text-lg my-2\" })),\n li: ({ node, ...props }) => _jsx(\"li\", { ...props }),\n});\n/**\n * Check if an object is in created or processing status.\n */\nfunction isCreatedOrProcessingStatus(status) {\n return status === ContentObjectStatus.created || status === ContentObjectStatus.processing;\n}\n/**\n * Get the content processor type from object metadata.\n */\nfunction getContentProcessorType(object) {\n return object.metadata?.content_processor?.type;\n}\n/**\n * Check if text content appears to be markdown based on common patterns.\n */\nfunction looksLikeMarkdown(text) {\n if (!text)\n return false;\n return (text.includes(\"\\n# \") ||\n text.includes(\"\\n## \") ||\n text.includes(\"\\n### \") ||\n text.includes(\"\\n* \") ||\n text.includes(\"\\n- \") ||\n text.includes(\"\\n+ \") ||\n text.includes(\");\n}\n/**\n * Helper function to get panel visibility className.\n * Returns empty string if visible, 'hidden' if not visible.\n */\nfunction getPanelVisibility(isVisible) {\n return isVisible ? '' : 'hidden';\n}\nvar PanelView;\n(function (PanelView) {\n PanelView[\"Text\"] = \"text\";\n PanelView[\"Image\"] = \"image\";\n PanelView[\"Video\"] = \"video\";\n PanelView[\"Audio\"] = \"audio\";\n PanelView[\"Pdf\"] = \"pdf\";\n PanelView[\"Transcript\"] = \"transcript\";\n})(PanelView || (PanelView = {}));\nexport function ContentOverview({ object, loadText, refetch, }) {\n const toast = useToast();\n const handleCopyContent = async (content, type) => {\n try {\n await navigator.clipboard.writeText(content);\n toast({\n status: \"success\",\n title: `${type === \"text\" ? \"Content\" : \"Properties\"} copied`,\n description: `Successfully copied ${type} to clipboard`,\n duration: 2000,\n });\n }\n catch (err) {\n console.error(`Failed to copy ${type}:`, err);\n toast({\n status: \"error\",\n title: \"Copy failed\",\n description: `Failed to copy ${type} to clipboard`,\n duration: 5000,\n });\n }\n };\n return (_jsx(_Fragment, { children: _jsxs(ResizablePanelGroup, { direction: \"horizontal\", className: PANEL_HEIGHTS.main, children: [_jsx(ResizablePanel, { className: \"min-w-[100px]\", children: _jsx(PropertiesPanel, { object: object, refetch: refetch ?? (() => Promise.resolve()), handleCopyContent: handleCopyContent }) }), _jsx(ResizableHandle, { withHandle: true }), _jsx(ResizablePanel, { className: \"min-w-[100px]\", children: _jsx(DataPanel, { object: object, loadText: loadText ?? false, handleCopyContent: handleCopyContent, refetch: refetch }) })] }) }));\n}\nfunction PropertiesPanel({ object, refetch, handleCopyContent }) {\n const [viewCode, setViewCode] = useState(false);\n const [isPropertiesModalOpen, setPropertiesModalOpen] = useState(false);\n const handleOpenPropertiesModal = () => {\n setPropertiesModalOpen(true);\n };\n const handleClosePropertiesModal = () => {\n setPropertiesModalOpen(false);\n };\n return (_jsxs(_Fragment, { children: [_jsxs(\"div\", { className: \"flex justify-between items-center px-2\", children: [_jsxs(\"div\", { className: \"flex items-center gap-1 bg-muted mb-2 p-1 rounded\", children: [_jsx(Button, { variant: `${viewCode ? \"ghost\" : \"primary\"}`, size: \"sm\", alt: \"Preview properties\", onClick: () => setViewCode(!viewCode), children: \"Properties\" }), _jsx(Button, { variant: `${viewCode ? \"primary\" : \"ghost\"}`, size: \"sm\", alt: \"View in JSON format\", onClick: () => setViewCode(!viewCode), children: \"JSON\" })] }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [object.properties && (_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Copy properties\", onClick: () => handleCopyContent(JSON.stringify(object.properties, null, 2), \"properties\"), children: _jsx(Copy, { className: \"size-4\" }) })), _jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: handleOpenPropertiesModal, title: \"Edit properties\", className: \"flex items-center gap-2\", children: _jsx(SquarePen, { className: \"size-4\" }) })] })] }), object.properties ? (_jsx(\"div\", { className: `${PANEL_HEIGHTS.properties} overflow-auto px-2`, children: _jsx(JSONDisplay, { value: object.properties, viewCode: viewCode }) })) : (_jsx(\"div\", { className: `${PANEL_HEIGHTS.properties} overflow-auto px-2`, children: _jsx(\"div\", { children: \"No properties defined\" }) })), _jsx(PropertiesEditorModal, { isOpen: isPropertiesModalOpen, onClose: handleClosePropertiesModal, object: object, refetch: refetch })] }));\n}\nfunction DataPanel({ object, loadText, handleCopyContent, refetch }) {\n const isImage = object?.metadata?.type === ContentNature.Image;\n const isVideo = object?.metadata?.type === ContentNature.Video;\n const isAudio = object?.metadata?.type === ContentNature.Audio;\n const isPdf = object?.content?.type === 'application/pdf';\n const isPreviewableAsPdfDoc = object?.content?.type ? isPreviewableAsPdf(object.content.type) : false;\n const isCreatedOrProcessing = isCreatedOrProcessingStatus(object?.status);\n const hasTranscript = !!(object.transcript && (isVideo || isAudio));\n // Check if PDF rendition exists for Office documents\n const metadata = object.metadata;\n const pdfRendition = metadata?.renditions?.find(r => r.name === PDF_RENDITION_NAME);\n // Determine initial panel view\n const getInitialView = () => {\n if (isVideo)\n return PanelView.Video;\n if (isAudio)\n return PanelView.Audio;\n if (isImage)\n return PanelView.Image;\n return PanelView.Text;\n };\n const [currentPanel, setCurrentPanel] = useState(getInitialView());\n // Use custom hooks for text loading, PDF processing, and Office conversion\n const { fullText, displayText, isLoading: isLoadingText, isCropped: isTextCropped, } = useObjectText(object.id, object.text, loadText);\n // Poll for PDF/document processing status when object is created or processing\n const shouldPollProgress = (isPdf || isPreviewableAsPdfDoc) && isCreatedOrProcessing;\n const { progress: pdfProgress, status: pdfStatus, outputFormat: pdfOutputFormat, isComplete: processingComplete, } = usePdfProcessingStatus(object.id, shouldPollProgress);\n // Office document PDF conversion\n const { pdfUrl: officePdfUrl, isConverting: officePdfConverting, error: officePdfError, triggerConversion: triggerOfficePdfConversion, } = useOfficePdfConversion(object.id, isPreviewableAsPdfDoc);\n // Reload object when PDF processing completes\n useEffect(() => {\n if (processingComplete && pdfStatus === WorkflowExecutionStatus.COMPLETED) {\n refetch?.();\n }\n }, [processingComplete, pdfStatus, refetch]);\n // Show processing panel when workflow is running (for both PDFs and Office documents)\n const showProcessingPanel = (isPdf || isPreviewableAsPdfDoc) && isCreatedOrProcessing && !processingComplete && pdfStatus === WorkflowExecutionStatus.RUNNING;\n const textContainerRef = useRef(null);\n return (_jsxs(\"div\", { className: \"flex flex-col h-full\", children: [_jsxs(\"div\", { className: \"flex justify-between items-center px-2 shrink-0\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2 mb-2\", children: [_jsxs(\"div\", { className: \"flex items-center gap-1 bg-muted p-1 rounded\", children: [isImage &&\n _jsx(Button, { variant: currentPanel === PanelView.Image ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Image\", onClick: () => setCurrentPanel(PanelView.Image), children: \"Image\" }), isVideo &&\n _jsx(Button, { variant: currentPanel === PanelView.Video ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Video\", onClick: () => setCurrentPanel(PanelView.Video), children: \"Video\" }), isAudio &&\n _jsx(Button, { variant: currentPanel === PanelView.Audio ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Audio\", onClick: () => setCurrentPanel(PanelView.Audio), children: \"Audio\" }), hasTranscript &&\n _jsx(Button, { variant: currentPanel === PanelView.Transcript ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Transcript\", onClick: () => setCurrentPanel(PanelView.Transcript), children: \"Transcript\" }), _jsx(Button, { variant: currentPanel === PanelView.Text ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View Text\", onClick: () => setCurrentPanel(PanelView.Text), children: \"Text\" }), isPdf &&\n _jsx(Button, { variant: currentPanel === PanelView.Pdf ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View PDF\", onClick: () => setCurrentPanel(PanelView.Pdf), children: \"PDF\" }), isPreviewableAsPdfDoc && (_jsx(Button, { variant: currentPanel === PanelView.Pdf ? \"primary\" : \"ghost\", size: \"sm\", alt: \"View as PDF\", onClick: () => {\n setCurrentPanel(PanelView.Pdf);\n if (!pdfRendition && !officePdfUrl && !officePdfConverting) {\n triggerOfficePdfConversion();\n }\n }, disabled: officePdfConverting, children: officePdfConverting ? _jsx(Spinner, { size: \"sm\" }) : \"PDF\" }))] }), _jsx(PdfActions, { object: object })] }), currentPanel === PanelView.Text && !showProcessingPanel && (_jsx(TextActions, { object: object, text: displayText, fullText: fullText, handleCopyContent: handleCopyContent, textContainerRef: textContainerRef })), currentPanel === PanelView.Pdf && isPreviewableAsPdfDoc && (pdfRendition || officePdfUrl) && (_jsx(OfficePdfActions, { object: object, pdfRendition: pdfRendition, officePdfUrl: officePdfUrl }))] }), _jsx(\"div\", { className: getPanelVisibility(currentPanel === PanelView.Image), children: _jsx(ImagePanel, { object: object }) }), _jsx(\"div\", { className: getPanelVisibility(currentPanel === PanelView.Video), children: _jsx(VideoPanel, { object: object }) }), _jsx(\"div\", { className: getPanelVisibility(currentPanel === PanelView.Audio), children: _jsx(AudioPanel, { object: object }) }), hasTranscript && (_jsx(\"div\", { className: getPanelVisibility(currentPanel === PanelView.Transcript), children: _jsx(TranscriptPanel, { object: object, handleCopyContent: handleCopyContent }) })), isPdf && (_jsx(\"div\", { className: getPanelVisibility(currentPanel === PanelView.Pdf), children: _jsx(PdfPreviewPanel, { object: object }) })), isPreviewableAsPdfDoc && (_jsx(\"div\", { className: getPanelVisibility(currentPanel === PanelView.Pdf), children: _jsx(OfficePdfPreviewPanel, { pdfRendition: pdfRendition, officePdfUrl: officePdfUrl, officePdfConverting: officePdfConverting, officePdfError: officePdfError, onConvert: triggerOfficePdfConversion }) })), showProcessingPanel && (_jsx(\"div\", { className: getPanelVisibility(currentPanel === PanelView.Text), children: _jsx(PdfProcessingPanel, { progress: pdfProgress, status: pdfStatus, outputFormat: pdfOutputFormat }) })), _jsx(\"div\", { className: getPanelVisibility(currentPanel === PanelView.Text && !showProcessingPanel && isLoadingText), children: _jsx(\"div\", { className: \"flex justify-center items-center flex-1\", children: _jsx(Spinner, { size: \"lg\" }) }) }), _jsx(\"div\", { className: getPanelVisibility(currentPanel === PanelView.Text && !showProcessingPanel && !isLoadingText), children: _jsx(TextPanel, { object: object, text: displayText, isTextCropped: isTextCropped, textContainerRef: textContainerRef }) })] }));\n}\nfunction TextActions({ object, text, fullText, handleCopyContent, textContainerRef, }) {\n const { client } = useUserSession();\n const toast = useToast();\n const [loadingFormat, setLoadingFormat] = useState(null);\n const [isPdfModalOpen, setIsPdfModalOpen] = useState(false);\n const content = object.content;\n const isMarkdown = content &&\n content.type &&\n content.type === \"text/markdown\";\n // Get content processor type for file extension detection\n const contentProcessorType = getContentProcessorType(object);\n const handleExportDocument = async (format) => {\n // Prevent multiple concurrent exports\n if (loadingFormat)\n return;\n setLoadingFormat(format);\n // Show immediate feedback\n toast({\n status: \"info\",\n title: `Preparing ${format.toUpperCase()}`,\n description: \"Fetching your document...\",\n duration: 2000,\n });\n try {\n // Request document rendition from the server\n const response = await client.objects.getRendition(object.id, {\n format: format, // We're extending the format type\n generate_if_missing: true,\n sign_url: true,\n });\n if (response.status === \"generating\") {\n toast({\n status: \"info\",\n title: \"Generating document\",\n description: `Please wait while we prepare your ${format.toUpperCase()} file...`,\n duration: 5000,\n });\n // Poll for completion\n setTimeout(() => handleExportDocument(format), 3000);\n return;\n }\n if (response.status === \"failed\") {\n throw new Error(\"Document generation failed\");\n }\n // Download the generated file or open in new window\n if (response.renditions && response.renditions.length > 0) {\n const downloadUrl = response.renditions[0];\n if (format === 'pdf') {\n // Open PDF in new window\n window.open(downloadUrl, '_blank');\n toast({\n status: \"success\",\n title: \"PDF opened\",\n description: \"PDF document opened in a new window\",\n duration: 2000,\n });\n }\n else {\n // Download DOCX file\n const link = document.createElement(\"a\");\n link.href = downloadUrl;\n link.download = `${object.name || \"document\"}.${format}`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n toast({\n status: \"success\",\n title: \"Document exported\",\n description: `Successfully exported to ${format.toUpperCase()} format`,\n duration: 2000,\n });\n }\n }\n }\n catch (err) {\n console.error(`Failed to export document as ${format}:`, err);\n toast({\n status: \"error\",\n title: \"Export failed\",\n description: `Failed to export document to ${format.toUpperCase()} format`,\n duration: 5000,\n });\n }\n finally {\n setLoadingFormat(null);\n }\n };\n const handleExportDocx = () => handleExportDocument(\"docx\");\n const handleClientPdfExport = () => {\n if (!textContainerRef.current) {\n toast({\n status: \"error\",\n title: \"PDF export failed\",\n description: \"No content available to export\",\n duration: 3000,\n });\n return;\n }\n setIsPdfModalOpen(true);\n };\n const handleConfirmClientPdfExport = () => {\n if (!textContainerRef.current) {\n toast({\n status: \"error\",\n title: \"PDF export failed\",\n description: \"No content available to export\",\n duration: 3000,\n });\n return;\n }\n const baseName = object.name || object.id;\n const pdfTitle = `${baseName || \"document\"} - content`;\n const success = printElementToPdf(textContainerRef.current, pdfTitle);\n if (!success) {\n toast({\n status: \"error\",\n title: \"PDF export failed\",\n description: \"Unable to open print preview\",\n duration: 4000,\n });\n return;\n }\n toast({\n status: \"success\",\n title: \"PDF export ready\",\n description: \"Use your browser's Print dialog to save as PDF\",\n duration: 4000,\n });\n setIsPdfModalOpen(false);\n };\n const handleDownloadText = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!fullText)\n return;\n // Determine file extension based on content processor type\n let ext = \"txt\";\n let mimeType = \"text/plain\";\n if (contentProcessorType === \"xml\") {\n ext = \"xml\";\n mimeType = \"text/xml\";\n }\n else if (contentProcessorType === \"markdown\" || isMarkdown) {\n ext = \"md\";\n mimeType = \"text/markdown\";\n }\n const blob = new Blob([fullText], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const filename = `${object.name || \"document\"}.${ext}`;\n // Use the download attribute with an anchor, but avoid triggering navigation\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename;\n link.style.display = \"none\";\n // Temporarily remove from DOM event flow\n setTimeout(() => {\n link.click();\n URL.revokeObjectURL(url);\n }, 0);\n };\n return (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: \"h-[41px] text-lg font-semibold flex justify-between items-center px-2\", children: _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [fullText && (_jsxs(_Fragment, { children: [_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Copy text\", onClick: () => handleCopyContent(fullText, \"text\"), children: _jsx(Copy, { className: \"size-4\" }) }), _jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Download text\", onClick: handleDownloadText, children: _jsx(Download, { className: \"size-4\" }) })] })), isMarkdown && text && (_jsxs(_Fragment, { children: [_jsxs(Button, { variant: \"ghost\", size: \"sm\", onClick: handleExportDocx, disabled: loadingFormat !== null, className: \"flex items-center gap-2\", children: [loadingFormat === \"docx\" ? (_jsx(Spinner, { size: \"sm\" })) : (_jsx(Download, { className: \"size-4\" })), \"DOCX\"] }), _jsxs(Button, { variant: \"ghost\", size: \"sm\", onClick: handleClientPdfExport, className: \"flex items-center gap-2\", children: [_jsx(Download, { className: \"size-4\" }), \"PDF\"] })] }))] }) }), _jsxs(VModal, { isOpen: isPdfModalOpen, onClose: () => setIsPdfModalOpen(false), children: [_jsx(VModalTitle, { children: \"Export document as PDF\" }), _jsxs(VModalBody, { children: [_jsx(\"p\", { className: \"mb-2\", children: \"This will open your browser's print dialog with the current document content.\" }), _jsx(\"p\", { className: \"text-sm text-muted\", children: \"To save a PDF, choose \\\"Save as PDF\\\" or a similar option in the print dialog.\" })] }), _jsxs(VModalFooter, { align: \"right\", children: [_jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: () => setIsPdfModalOpen(false), children: \"Cancel\" }), _jsx(Button, { size: \"sm\", onClick: handleConfirmClientPdfExport, children: \"Open print dialog\" })] })] })] }));\n}\nconst TextPanel = memo(({ object, text, isTextCropped, textContainerRef, }) => {\n const content = object.content;\n const isCreatedOrProcessing = isCreatedOrProcessingStatus(object?.status);\n // Check content processor type for XML\n const contentProcessorType = getContentProcessorType(object);\n const isXml = contentProcessorType === \"xml\";\n // Check if content type is markdown or plain text\n const isMarkdownOrText = content &&\n content.type &&\n (content.type === \"text/markdown\" || content.type === \"text/plain\");\n // Render as markdown if it's markdown/text type OR if text looks like markdown (but not if XML)\n const shouldRenderAsMarkdown = !isXml && (isMarkdownOrText || looksLikeMarkdown(text));\n return (text ? (_jsxs(_Fragment, { children: [isTextCropped && (_jsx(\"div\", { className: \"px-2 py-2 bg-attention/10 border-l-4 border-attention mx-2 mb-2 rounded\", children: _jsxs(\"div\", { className: \"flex items-center gap-2 text-attention\", children: [_jsx(AlertTriangle, { className: \"size-4\" }), _jsx(\"span\", { className: \"text-sm font-semibold\", children: \"Showing first 128K characters only\" })] }) })), _jsx(\"div\", { className: `max-w-7xl px-2 ${PANEL_HEIGHTS.content} overflow-auto`, ref: textContainerRef, children: isXml ? (_jsx(\"div\", { className: \"px-4 py-2\", children: _jsx(XMLViewer, { xml: text, collapsible: true }) })) : shouldRenderAsMarkdown ? (_jsx(\"div\", { className: \"vprose prose-sm p-1\", children: _jsx(MarkdownRenderer, { components: createMarkdownComponents(), children: text }) })) : (_jsx(\"pre\", { className: \"text-wrap bg-muted text-muted p-2\", children: text })) })] })) :\n _jsx(\"div\", { className: \"px-2\", children: _jsx(\"div\", { children: isCreatedOrProcessing ? \"Extracting content...\" : \"No content\" }) }));\n});\nfunction ImagePanel({ object }) {\n const { client } = useUserSession();\n const [imageUrl, setImageUrl] = useState();\n const content = object.content;\n const isImage = object.metadata && object.metadata.type === ContentNature.Image;\n useEffect(() => {\n if (isImage) {\n // Reset image URL when object changes\n setImageUrl(undefined);\n const loadImage = async () => {\n const isOriginalWebSupported = content?.type && WEB_SUPPORTED_IMAGE_FORMATS.includes(content.type);\n try {\n const rendition = await client.objects.getRendition(object.id, {\n format: ImageRenditionFormat.jpeg,\n generate_if_missing: false,\n sign_url: true,\n });\n if (rendition.status === \"found\" && rendition.renditions?.length) {\n // Use rendition URL directly\n setImageUrl(rendition.renditions[0]);\n }\n else if (isOriginalWebSupported) {\n // Fall back to original file only if web-supported\n const downloadUrl = await client.files.getDownloadUrl(object.content.source);\n setImageUrl(downloadUrl.url);\n }\n }\n catch (error) {\n // Fall back to original file only if web-supported\n if (isOriginalWebSupported) {\n const downloadUrl = await client.files.getDownloadUrl(object.content.source);\n setImageUrl(downloadUrl.url);\n }\n }\n };\n loadImage();\n }\n }, [object.id, isImage, content?.type, content?.source, client]);\n return (_jsx(\"div\", { className: \"mb-4 px-2\", children: imageUrl ? (_jsx(\"img\", { src: imageUrl, alt: object.name, className: \"w-full object-contain\" })) : (_jsx(Spinner, { size: \"md\" })) }));\n}\nfunction VideoPanel({ object }) {\n const { client } = useUserSession();\n const [videoUrl, setVideoUrl] = useState();\n const [posterUrl, setPosterUrl] = useState();\n const [isLoading, setIsLoading] = useState(true);\n const content = object.content;\n const isVideo = object.metadata?.type === ContentNature.Video;\n // Check if there are mp4 or webm renditions available in metadata\n const metadata = object.metadata;\n const renditions = metadata?.renditions || [];\n // Find mp4 or webm rendition by mime type, preferring mp4\n const webRendition = renditions.find(r => r.content.type === 'video/mp4') ||\n renditions.find(r => r.content.type === 'video/webm');\n // Check if original file is web-compatible\n const isOriginalWebSupported = content?.type && WEB_SUPPORTED_VIDEO_FORMATS.includes(content.type);\n // Get poster\n const poster = renditions.find(r => r.name === POSTER_RENDITION_NAME);\n // Reset state when object changes\n useEffect(() => {\n setVideoUrl(undefined);\n setPosterUrl(undefined);\n setIsLoading(true);\n }, [object.id]);\n useEffect(() => {\n const loadPoster = async () => {\n if (poster?.content?.source) {\n try {\n const response = await client.files.getDownloadUrl(poster.content.source);\n setPosterUrl(response.url);\n }\n catch (error) {\n console.error(\"Failed to load poster image\", error);\n }\n }\n };\n loadPoster();\n }, [poster, client]);\n useEffect(() => {\n if (isVideo && (webRendition?.content?.source || isOriginalWebSupported)) {\n const loadVideoUrl = async () => {\n try {\n let downloadUrl;\n if (webRendition?.content?.source) {\n // Use rendition if available\n downloadUrl = await client.files.getDownloadUrl(webRendition.content.source);\n }\n else if (isOriginalWebSupported && content?.source) {\n // Fall back to original file if web-supported\n downloadUrl = await client.files.getDownloadUrl(content.source);\n }\n if (downloadUrl) {\n setVideoUrl(downloadUrl.url);\n }\n }\n catch (error) {\n console.error(\"Failed to get video URL\", error);\n }\n finally {\n setIsLoading(false);\n }\n };\n loadVideoUrl();\n }\n else {\n setIsLoading(false);\n }\n }, [isVideo, webRendition, isOriginalWebSupported, content?.source, client]);\n return (_jsx(\"div\", { className: \"mb-4 px-2\", children: !webRendition && !isOriginalWebSupported ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[400px] text-muted\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsx(\"p\", { children: \"No web-compatible video rendition available\" }), _jsx(\"p\", { className: \"text-sm mt-2\", children: \"MP4 or WebM format required\" })] }) })) : isLoading ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[400px]\", children: _jsx(Spinner, { size: \"md\" }) })) : videoUrl ? (_jsx(\"video\", { src: videoUrl, poster: posterUrl, controls: true, className: `w-full ${PANEL_HEIGHTS.video} object-contain`, children: \"Your browser does not support the video tag.\" })) : (_jsx(\"div\", { className: \"flex justify-center items-center h-[400px] text-muted\", children: \"Failed to load video\" })) }));\n}\nfunction AudioPanel({ object }) {\n const { client } = useUserSession();\n const [audioUrl, setAudioUrl] = useState();\n const [isLoading, setIsLoading] = useState(true);\n const content = object.content;\n const isAudio = object.metadata?.type === ContentNature.Audio;\n // Check if there are audio renditions available in metadata\n const metadata = object.metadata;\n const renditions = metadata?.renditions || [];\n // Find audio rendition by name (AUDIO_RENDITION_NAME = \"Audio\")\n const audioRendition = renditions.find(r => r.name === AUDIO_RENDITION_NAME);\n // Check if original file is web-compatible\n const isOriginalWebSupported = content?.type && WEB_SUPPORTED_AUDIO_FORMATS.includes(content.type);\n // Reset state when object changes\n useEffect(() => {\n setAudioUrl(undefined);\n setIsLoading(true);\n }, [object.id]);\n useEffect(() => {\n if (isAudio && (audioRendition?.content?.source || isOriginalWebSupported)) {\n const loadAudioUrl = async () => {\n try {\n let downloadUrl;\n if (audioRendition?.content?.source) {\n // Use rendition if available\n downloadUrl = await client.files.getDownloadUrl(audioRendition.content.source);\n }\n else if (isOriginalWebSupported && content?.source) {\n // Fall back to original file if web-supported\n downloadUrl = await client.files.getDownloadUrl(content.source);\n }\n if (downloadUrl) {\n setAudioUrl(downloadUrl.url);\n }\n }\n catch (error) {\n console.error(\"Failed to get audio URL\", error);\n }\n finally {\n setIsLoading(false);\n }\n };\n loadAudioUrl();\n }\n else {\n setIsLoading(false);\n }\n }, [isAudio, audioRendition, isOriginalWebSupported, content?.source, client]);\n return (_jsx(\"div\", { className: \"mb-4 px-2\", children: !audioRendition && !isOriginalWebSupported ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[200px] text-muted\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsx(\"p\", { children: \"No web-compatible audio rendition available\" }), _jsx(\"p\", { className: \"text-sm mt-2\", children: \"MP3, M4A, OGG, WAV, or WebM format required\" })] }) })) : isLoading ? (_jsx(\"div\", { className: \"flex justify-center items-center h-[200px]\", children: _jsx(Spinner, { size: \"md\" }) })) : audioUrl ? (_jsxs(\"div\", { className: \"flex flex-col items-center gap-4\", children: [_jsx(\"audio\", { src: audioUrl, controls: true, className: \"w-full max-w-2xl\", children: \"Your browser does not support the audio tag.\" }), metadata?.duration && (_jsxs(\"div\", { className: \"text-sm text-muted\", children: [\"Duration: \", formatDuration(metadata.duration)] }))] })) : (_jsx(\"div\", { className: \"flex justify-center items-center h-[200px] text-muted\", children: \"Failed to load audio\" })) }));\n}\nfunction formatDuration(seconds) {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n }\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n}\nfunction TranscriptPanel({ object, handleCopyContent }) {\n const transcript = object.transcript;\n const transcriptText = transcript?.text;\n const segments = transcript?.segments;\n // Build full text from segments if text is not available\n const fullText = transcriptText || (segments ? segments.map(s => s.text).join(' ') : '');\n const formatTimestamp = (seconds) => {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n }\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n };\n return (_jsxs(\"div\", { className: \"flex flex-col h-full\", children: [_jsx(\"div\", { className: \"flex justify-end items-center px-2 mb-2\", children: fullText && (_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Copy transcript\", onClick: () => handleCopyContent(fullText, \"text\"), children: _jsx(Copy, { className: \"size-4\" }) })) }), _jsx(\"div\", { className: `${PANEL_HEIGHTS.content} overflow-auto px-2`, children: segments && segments.length > 0 ? (_jsx(\"div\", { className: \"space-y-2\", children: segments.map((segment, idx) => (_jsxs(\"div\", { className: \"flex gap-3 text-sm\", children: [_jsxs(\"span\", { className: \"text-muted font-mono text-xs shrink-0 pt-0.5\", children: [formatTimestamp(segment.start), segment.end && ` - ${formatTimestamp(segment.end)}`] }), _jsx(\"span\", { className: \"flex-1\", children: segment.text })] }, idx))) })) : transcriptText ? (_jsx(\"pre\", { className: \"text-wrap bg-muted text-muted p-2 whitespace-pre-wrap\", children: transcriptText })) : (_jsx(\"div\", { className: \"text-muted\", children: \"No transcript available\" })) })] }));\n}\nfunction PdfActions({ object }) {\n const [isPdfPreviewOpen, setPdfPreviewOpen] = useState(false);\n // Check if PDF has been processed (content_processor.type is xml or markdown)\n const contentProcessorType = getContentProcessorType(object);\n const hasPdfAnalysis = contentProcessorType === \"xml\" || contentProcessorType === \"markdown\";\n if (!hasPdfAnalysis)\n return null;\n return (_jsxs(_Fragment, { children: [_jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: () => setPdfPreviewOpen(true), title: \"Side by side view\", children: _jsx(FileSearch, { className: \"size-4\" }) }), isPdfPreviewOpen && (_jsx(Portal, { children: _jsx(MagicPdfView, { objectId: object.id, onClose: () => setPdfPreviewOpen(false) }) }))] }));\n}\nfunction OfficePdfActions({ object, pdfRendition, officePdfUrl, }) {\n const { client } = useUserSession();\n const toast = useToast();\n const [isDownloading, setIsDownloading] = useState(false);\n const handleDownloadPdf = async () => {\n setIsDownloading(true);\n try {\n let downloadUrl = officePdfUrl;\n // If we have a rendition source but no signed URL yet, get a signed URL\n if (!downloadUrl && pdfRendition?.content?.source) {\n const response = await client.files.getDownloadUrl(pdfRendition.content.source, `${object.name || 'document'}.pdf`, 'attachment');\n downloadUrl = response.url;\n }\n if (downloadUrl) {\n // Open in new tab - browser will handle as download due to content-disposition\n window.open(downloadUrl, '_blank');\n }\n }\n catch (err) {\n console.error('Failed to download PDF:', err);\n toast({\n status: 'error',\n title: 'Download failed',\n description: 'Failed to download the PDF file',\n duration: 5000,\n });\n }\n finally {\n setIsDownloading(false);\n }\n };\n return (_jsx(\"div\", { className: \"flex items-center gap-2\", children: _jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: handleDownloadPdf, disabled: isDownloading, title: \"Download PDF\", children: isDownloading ? _jsx(Spinner, { size: \"sm\" }) : _jsx(Download, { className: \"size-4\" }) }) }));\n}\nfunction PdfPreviewPanel({ object }) {\n return (_jsx(\"div\", { className: PANEL_HEIGHTS.content, children: _jsx(SimplePdfViewer, { object: object, className: \"h-full\" }) }));\n}\n/**\n * Panel for displaying Office documents converted to PDF.\n * Handles the various states: converting, error, showing PDF.\n */\nfunction OfficePdfPreviewPanel({ pdfRendition, officePdfUrl, officePdfConverting, officePdfError, onConvert, }) {\n if (officePdfConverting) {\n return (_jsxs(\"div\", { className: \"flex flex-col justify-center items-center flex-1 gap-2\", children: [_jsx(Spinner, { size: \"lg\" }), _jsx(\"span\", { className: \"text-muted\", children: \"Converting to PDF...\" })] }));\n }\n if (officePdfError) {\n return (_jsxs(\"div\", { className: \"flex flex-col justify-center items-center flex-1 gap-2 text-destructive\", children: [_jsx(AlertTriangle, { className: \"size-8\" }), _jsx(\"span\", { children: officePdfError })] }));\n }\n if (pdfRendition?.content?.source) {\n return (_jsx(\"div\", { className: PANEL_HEIGHTS.content, children: _jsx(SimplePdfViewer, { source: pdfRendition.content.source, className: \"h-full\" }) }));\n }\n if (officePdfUrl) {\n return (_jsx(\"div\", { className: PANEL_HEIGHTS.content, children: _jsx(SimplePdfViewer, { url: officePdfUrl, className: \"h-full\" }) }));\n }\n return (_jsx(\"div\", { className: \"flex flex-col justify-center items-center flex-1 gap-2\", children: _jsx(Button, { onClick: onConvert, children: \"Convert to PDF\" }) }));\n}\nfunction PdfProcessingPanel({ progress, status, outputFormat }) {\n const statusColor = getWorkflowStatusColor(status);\n const statusName = getWorkflowStatusName(status);\n // Show detailed progress (tables, images, visuals) for XML processing\n const isXmlProcessing = outputFormat === \"xml\";\n // Ensure percent is a valid number (handle undefined and NaN from division by zero)\n const percent = progress?.percent != null && !isNaN(progress.percent) ? progress.percent : 0;\n return (_jsxs(\"div\", { className: \"px-4 py-4\", children: [progress && (_jsxs(\"div\", { className: \"space-y-2\", children: [_jsxs(\"div\", { className: \"flex flex-col gap-1\", children: [_jsx(ProgressLine, { name: isXmlProcessing ? \"Analyze Layouts\" : \"Analyze Page\", progress: progress.pages }), isXmlProcessing && (_jsxs(_Fragment, { children: [_jsx(ProgressLine, { name: \"Extract Tables\", progress: progress.tables }), _jsx(ProgressLine, { name: \"Describe Images\", progress: progress.images }), _jsx(ProgressLine, { name: \"Process Visually\", progress: progress.visuals })] }))] }), _jsxs(\"div\", { className: \"pt-2 text-sm text-muted\", children: [\"Progress: \", percent, \"%\", _jsx(\"span\", { className: \"px-2\", children: \"\\u2022\" }), _jsx(\"span\", { className: statusColor, children: statusName }), progress.started_at && (_jsxs(_Fragment, { children: [_jsx(\"span\", { className: \"px-2\", children: \"\\u2022\" }), _jsxs(\"span\", { children: [((Date.now() - progress.started_at) / 1000).toFixed(0), \" sec. elapsed\"] })] }))] }), _jsx(Progress, { percent: percent })] })), !progress && (_jsxs(\"div\", { className: \"flex items-center gap-2 text-muted\", children: [_jsx(Spinner, { size: \"sm\" }), _jsx(\"span\", { children: \"Loading processing status...\" })] }))] }));\n}\nfunction ProgressLine({ name, progress }) {\n return (_jsxs(\"div\", { className: \"flex gap-2 text-sm\", children: [_jsxs(\"span\", { className: \"text-muted min-w-36\", children: [name, \":\"] }), _jsxs(\"span\", { children: [progress.processed, \" of \", progress.total] })] }));\n}\n//# sourceMappingURL=ContentOverview.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { retrieveRendition } from '../../../utils';\nimport { Button, Card, CardContent, Separator, VTooltip } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Eye } from 'lucide-react';\nexport function DocumentIconSkeleton({ isLoading = false, counts = 6 }) {\n if (!isLoading) {\n return null;\n }\n return (_jsx(\"div\", { className: 'flex flex-wrap gap-2 justify-between', children: Array(counts).fill(0).map((_, index) => _jsx(\"div\", { className: \"w-[15vw] animate-pulse\", children: _jsxs(Card, { className: \"relative flex flex-col border h-fit\", children: [_jsx(\"div\", { className: \"h-48 bg-muted rounded-t-xl flex items-center justify-center text-muted\", children: \"\\u00A0\" }), _jsx(Separator, { className: 'bg-muted h-[2px]' }), _jsxs(CardContent, { className: \"p-2 flex flex-col\", children: [_jsxs(\"div\", { className: \"flex flex-col overflow-hidden\", children: [_jsx(\"div\", { className: \"h-5 bg-muted rounded w-3/4 mb-2\" }), _jsx(\"div\", { className: \"h-4 bg-muted rounded w-1/2\" })] }), _jsx(\"div\", { className: \"text-xs text-muted w-full flex justify-end mt-2\", children: _jsx(\"div\", { className: \"h-3 bg-muted rounded w-1/4\" }) })] })] }) }, index)) }));\n}\nexport function DocumentIcon({ selection, document, onSelectionChange, onRowClick, previewObject, selectedObject }) {\n const { client } = useUserSession();\n const [renditionUrl, setRenditionUrl] = useState(undefined);\n const [renditionAlt, setRenditionAlt] = useState(undefined);\n const [renditionStatus, setRenditionStatus] = useState(undefined);\n const handleSelect = (ev) => {\n ev.stopPropagation();\n onSelectionChange(document, ev);\n };\n useEffect(() => {\n if (!document?.content) {\n return;\n }\n retrieveRendition(client, document, setRenditionUrl, setRenditionAlt, setRenditionStatus);\n }, [document]);\n return (_jsxs(Card, { className: `relative flex flex-col border h-fit w-full ${selectedObject?.id === document.id ? 'border-attention border-4' : ''}`, onClick: () => (onRowClick && onRowClick(document)), children: [selection && (_jsx(\"div\", { className: \"absolute top-2 left-2 z-10 flex flex-col items-center gap-1\", children: _jsx(\"input\", { checked: selection.isSelected(document.id), type: \"checkbox\", onChange: handleSelect, onClick: (e) => e.stopPropagation() }) })), _jsx(\"div\", { className: \"absolute top-1 right-1 z-10 flex flex-col items-center\", children: _jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Preivew Object\", onClick: (e) => {\n e.stopPropagation();\n previewObject?.(document.id);\n }, children: _jsx(Eye, { className: `size-4 ${renditionStatus === 'ready' ? 'text-muted' : 'text-white'}` }) }) }), (renditionUrl && renditionStatus == 'ready') ? (_jsx(\"img\", { src: renditionUrl, alt: renditionAlt, className: \"w-auto h-48 object-cover rounded-t-xl\" })) : (_jsx(\"div\", { className: \"h-48 bg-gray-700 rounded-t-xl flex items-center justify-center text-muted\", children: renditionStatus })), _jsx(Separator, { className: 'bg-gray-200 h-[2px]' }), _jsxs(CardContent, { className: \"p-2 flex flex-col\", children: [_jsxs(\"div\", { className: \"flex flex-col overflow-hidden\", children: [_jsx(VTooltip, { placement: 'top', description: document.properties?.title ?? document.name, children: _jsx(\"h3\", { className: \"text-start font-medium leading-none truncate\", children: document.properties?.title ?? document.name }) }), document?.type?.name ? (_jsx(VTooltip, { placement: 'bottom', size: 'xs', description: document?.type?.name, children: _jsx(\"p\", { className: \"text-start text-xs text-muted truncate\", children: document?.type?.name }) })) : _jsx(\"p\", { className: \"text-xs text-muted\", children: \"\\u2002\" })] }), document.score && (_jsxs(\"div\", { className: \"text-xs text-muted w-full flex justify-end\", children: [\"Score: \", (document.score).toFixed(4) ?? \"-\"] }))] })] }));\n}\n//# sourceMappingURL=DocumentIcon.js.map","export function facetOptionLabel(bucket) {\n return `${bucket._id} (${bucket.count})`;\n}\nexport function facetOptionNameLabel(bucket) {\n return `${bucket.name} (${bucket.count})`;\n}\n//# sourceMappingURL=utils.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { SelectBox } from '@vertesia/ui/core';\nimport { facetOptionLabel } from './utils';\nexport function StringFacet({ search, buckets, name, placeholder, className }) {\n const filterValue = search.getFilterValue(name);\n const onChange = (option) => {\n search.setFilterValue(name, option?._id);\n };\n const value = buckets?.find((option) => JSON.stringify(option._id) === JSON.stringify(filterValue));\n return (_jsx(SelectBox, { filterBy: \"_id\", className: className, isClearable: true, optionLabel: facetOptionLabel, options: buckets, value: value, onChange: onChange, by: '_id', placeholder: placeholder }));\n}\n//# sourceMappingURL=StringFacet.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { InputList } from '@vertesia/ui/core';\nimport { useEffect, useState } from 'react';\nexport function StringListFacet({ search, name, placeholder, className }) {\n const [tags, setTags] = useState([]);\n useEffect(() => {\n search.setFilterValue(name, tags);\n }, [tags]);\n return (_jsx(InputList, { className: className, value: tags, onChange: setTags, placeholder: placeholder }));\n}\n//# sourceMappingURL=StringListFacet.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { SelectBox } from \"@vertesia/ui/core\";\nimport { useEffect, useState } from \"react\";\nexport function facetOptionLabel(bucket) {\n return `${bucket.name} (${bucket.count})`;\n}\nexport function TypeFacet({ search, buckets, placeholder = \"Filter by Type\", className }) {\n const [options, setOptions] = useState([]);\n const { typeRegistry } = useUserSession();\n const filterValue = search.getFilterValue(\"type\");\n const onChange = (option) => {\n search.setFilterValue(\"type\", option?._id);\n };\n useEffect(() => {\n if (typeRegistry) {\n const options = buckets.map((bucket) => {\n let name;\n if (bucket._id == null) {\n bucket._id = \"Document\";\n name = \"Document\";\n }\n else {\n name = typeRegistry.getTypeName(bucket._id);\n if (!name) {\n console.warn(\"Content Object Type not found\", bucket._id);\n name = bucket._id;\n }\n }\n return {\n ...bucket,\n name\n };\n });\n options.sort((a, b) => a.name.localeCompare(b.name));\n setOptions(options);\n }\n }, [buckets, typeRegistry]);\n const value = options?.find((option) => option._id === filterValue);\n return (_jsx(SelectBox, { filterBy: \"name\", className: className, isClearable: true, optionLabel: facetOptionLabel, options: options, value: value, onChange: onChange, by: '_id', placeholder: placeholder }));\n}\n//# sourceMappingURL=TypeFacet.js.map","import { facetOptionLabel } from './utils';\nexport function createStringFilterGroup({ buckets, name, placeholder, type = 'select', multiple = false }) {\n const options = buckets.map((bucket) => ({\n label: facetOptionLabel(bucket),\n value: bucket._id\n }));\n const filterGroup = {\n name: name,\n options: options,\n type: type,\n multiple: multiple,\n placeholder: `${placeholder ?? `${name.charAt(0).toUpperCase() + name.slice(1)}`}`,\n ...({ allowCreate: false })\n };\n return filterGroup;\n}\nexport function VStringFacet({ buckets, name, placeholder, type, multiple }) {\n return createStringFilterGroup({ buckets, name, placeholder, type, multiple });\n}\n//# sourceMappingURL=VStringFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function VTypeFacet({ buckets, typeRegistry, type = 'select', multiple = false }) {\n // Create a map for quick lookups of type names and counts\n const typeDataMap = new Map();\n if (!typeRegistry) {\n console.warn(\"Type names cannot be resolved\");\n }\n buckets.forEach((bucket) => {\n let name;\n let typeId = bucket._id;\n if (bucket._id == null) {\n typeId = \"Document\";\n name = \"Document\";\n }\n else {\n name = typeRegistry?.getTypeName(bucket._id);\n if (!name) {\n console.warn(\"Content Object Type not found\", bucket._id);\n name = bucket._id;\n }\n }\n typeDataMap.set(typeId, {\n name,\n count: bucket.count\n });\n });\n const options = buckets.map((bucket) => {\n const actualId = bucket._id;\n const displayKey = actualId || \"Document\";\n const typeData = typeDataMap.get(displayKey);\n return {\n value: actualId,\n label: typeData ? `${typeData.name} (${typeData.count})` : `Unknown (${bucket.count})`\n };\n });\n const customFilterGroups = {\n name: 'types',\n placeholder: 'Types',\n type: type,\n multiple: multiple,\n options: options,\n labelRenderer: (typeId) => {\n const typeData = typeDataMap.get(typeId);\n if (!typeData) {\n console.warn(`Type data not found for ${typeId}`);\n return typeId;\n }\n return (_jsxs(\"div\", { className: \"w-full flex items-center\", children: [_jsx(\"span\", { className: \"text-sm truncate\", children: typeData.name }), _jsxs(\"span\", { className: \"ml-2 text-xs\", children: [\"(\", typeData.count, \")\"] })] }));\n },\n filterBy: (optionValue, searchText) => {\n const typeData = typeDataMap.get(optionValue);\n if (!typeData) {\n console.warn(`Type name not found for ${optionValue}`);\n return false;\n }\n return typeData.name.toLowerCase().includes(searchText.toLowerCase());\n }\n };\n return customFilterGroups;\n}\n//# sourceMappingURL=VTypeFacet.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { PrincipalType } from \"@vertesia/common\";\nimport { Avatar, Table, Popover, PopoverContent, PopoverTrigger, useFetch } from \"@vertesia/ui/core\";\nimport { Users } from \"lucide-react\";\n//TODO use a real cache\nconst USER_CACHE = {};\nconst GROUP_CACHE = {};\n/**\n * Fetch the user information given a user reference.\n * The reference has the format: `type:id`. A special reference `system` is used to refer to the system user.\n * @param userRef\n */\nexport function useFetchUserInfo(userId) {\n const { client } = useUserSession();\n return useFetch(() => {\n let user = USER_CACHE[userId];\n if (!user) {\n user = client.users.retrieve(userId).then(user => {\n return user;\n });\n USER_CACHE[userId] = user;\n }\n return user;\n }, [userId]);\n}\n/**\n * Fetch the group information given a group ID.\n * @param groupId\n */\nexport function useFetchGroupInfo(groupId) {\n const { client } = useUserSession();\n return useFetch(() => {\n let group = GROUP_CACHE[groupId];\n if (!group) {\n group = client.iam.groups.retrieve(groupId).then(group => {\n return group;\n });\n GROUP_CACHE[groupId] = group;\n }\n return group;\n }, [groupId]);\n}\nfunction AvatarPlaceholder() {\n return _jsx(\"div\", { className: 'size-8' });\n}\nfunction SystemAvatar({ showTitle = false, size = \"md\" }) {\n return (_jsx(UserPopoverPanel, { title: \"System User\", description: \"The system user is used to initialize built-in objects.\", children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(Avatar, { src: \"/icon.svg\", size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-2\", children: \"System User\" })] }) }));\n}\nfunction ServiceAccountAvatar({ accountId, showTitle = false, size = \"md\" }) {\n const description = (_jsxs(_Fragment, { children: [_jsx(\"div\", { children: \"This user is used by robots like workflow workers.\" }), _jsxs(\"div\", { className: \"text-gray-800 dark:text-gray-500 text-sm\", children: [_jsx(\"span\", { className: \"font-semibold\", children: \"ID:\" }), \" \", accountId] })] }));\n return (_jsx(UserPopoverPanel, { title: \"Service Account\", description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Avatar, { src: \"/cloud.svg\", name: \"SA\", color: \"bg-amber-500\", className: \"px-[5px] text-white\", size: size }), showTitle && _jsxs(\"div\", { className: \"text-sm font-semibold pl-2 truncate\", children: [\"Service Account : \", accountId] })] }) }));\n}\nfunction ErrorAvatar({ title = \"Error\", error, showTitle = false, size = \"md\" }) {\n return (_jsx(UnknownAvatar, { title: title, message: typeof error === 'string' ? error : error.message, color: \"bg-red-500\", showTitle: showTitle, size: size }));\n}\nexport function UserInfo({ userRef, showTitle = false, size = \"md\" }) {\n if (!userRef) {\n return _jsx(UnknownAvatar, { title: \"Unknown User\", message: \"User information is not available.\", showTitle: showTitle, size: size });\n }\n const [type, id] = userRef ? userRef.split(':') : [\"unknown\"];\n switch (type) {\n case PrincipalType.User:\n return _jsx(UserAvatar, { userId: id, showTitle: showTitle, size: size });\n case PrincipalType.Group:\n return _jsx(GroupAvatar, { userId: id, showTitle: showTitle, size: size });\n case \"system\":\n return _jsx(SystemAvatar, { showTitle: showTitle, size: size });\n case PrincipalType.ServiceAccount:\n return _jsx(ServiceAccountAvatar, { accountId: id, showTitle: showTitle, size: size });\n case PrincipalType.Agent:\n return _jsx(ServiceAccountAvatar, { accountId: id, showTitle: showTitle, size: size });\n case PrincipalType.ApiKey:\n return _jsx(ApiKeyAvatar, { keyId: id, size: size, showTitle: showTitle });\n default:\n return _jsx(ErrorAvatar, { title: \"Unknown User\", error: `Invalid user ref type: ${type}`, showTitle: showTitle, size: size });\n }\n}\nfunction UnknownAvatar({ title, message, color, size = \"md\", showTitle = false }) {\n return (_jsx(UserPopoverPanel, { title: title, description: message, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Avatar, { color: color, size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-1\", children: title })] }) }));\n}\nfunction GroupAvatar({ userId, showTitle = false, size = \"md\" }) {\n const { data: group, error } = useFetchGroupInfo(userId);\n if (error) {\n return _jsx(ErrorAvatar, { title: \"Failed to fetch group\", error: error, showTitle: showTitle, size: size });\n }\n if (!group) {\n return _jsx(AvatarPlaceholder, {});\n }\n const description = (_jsxs(\"div\", { className: \"space-y-1\", children: [group.description && _jsx(\"div\", { className: \"text-sm\", children: group.description }), _jsxs(\"div\", { className: \"text-xs text-muted-foreground\", children: [\"Group ID: \", group.id] }), group.tags && group.tags.length > 0 && (_jsx(\"div\", { className: \"flex flex-wrap gap-1\", children: group.tags.map(tag => (_jsx(\"span\", { className: \"px-1.5 py-0.5 bg-muted rounded text-xs\", children: tag }, tag))) }))] }));\n return (_jsx(UserPopoverPanel, { title: group.name || \"Unnamed Group\", description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Users, { className: \"size-6 text-indigo-500\", size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-2\", children: group.name || \"Unnamed Group\" })] }) }));\n}\nfunction UserAvatar({ userId, showTitle = false, size = \"md\" }) {\n const { data: user, error } = useFetchUserInfo(userId);\n if (error) {\n return _jsx(ErrorAvatar, { title: \"Failed to fetch user\", error: error, showTitle: showTitle, size: size });\n }\n if (!user) {\n return _jsx(AvatarPlaceholder, {});\n }\n const description = (_jsx(\"div\", { className: \"truncate\", title: user.email, children: user.email }));\n return (_jsx(UserPopoverPanel, { title: user.name || user.email || user.username || \"unknown\", description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [_jsx(Avatar, { src: user.picture, name: user.name, color: \"bg-indigo-500\", size: size }), showTitle && _jsx(\"div\", { className: \"text-sm font-semibold pl-2\", children: user.name || user.email || user.username || \"unknown\" })] }) }));\n}\nexport function ApiKeyAvatar({ keyId, showTitle = false, size = \"md\" }) {\n const { client } = useUserSession();\n const { data, error } = useFetch(() => client.apikeys.retrieve(keyId), []);\n if (error) {\n return _jsx(ErrorAvatar, { title: \"Failed to fetch the apikey\", error: error, showTitle: showTitle, size: size });\n }\n if (!data) {\n return _jsx(AvatarPlaceholder, {});\n }\n const title = \"Private Key\";\n const avatar = _jsx(Avatar, { name: \"PK\", color: \"bg-pink-500\", size: size });\n const description = (_jsxs(Table, { className: \"dark:bg-gray-800 dark:text-gray-200 table-fixed w-full\", children: [_jsxs(\"tr\", { children: [_jsx(\"td\", { className: \"font-semibold w-20\", children: \"Key:\" }), _jsx(\"td\", { className: \"truncate max-w-0\", children: data?.name })] }), _jsxs(\"tr\", { children: [_jsx(\"td\", { className: \"font-semibold w-20\", children: \"Account:\" }), _jsx(\"td\", { className: \"truncate max-w-0\", children: data?.account })] }), _jsxs(\"tr\", { children: [_jsx(\"td\", { className: \"font-semibold w-20\", children: \"Project:\" }), _jsx(\"td\", { className: \"truncate max-w-0\", children: data?.project.name })] })] }));\n return (_jsx(UserPopoverPanel, { title: title, description: description, children: _jsxs(\"div\", { className: \"flex flex-row items-center gap-2\", children: [avatar, showTitle && _jsx(\"div\", { className: \"text-sm font-semibold\", children: data?.name || data?.account || data?.project.name || \"unknown\" })] }) }));\n}\nfunction UserPopoverPanel({ title, description, children }) {\n return (_jsxs(Popover, { hover: true, children: [_jsx(PopoverTrigger, { className: \"cursor-pointer flex items-center inline-block\", children: _jsx(\"div\", { children: children }) }), _jsx(PopoverContent, { align: \"center\", sideOffset: 8, side: \"right\", children: _jsxs(\"div\", { className: \"flex flex-col gap-1 rounded-md shadow-md p-2\", children: [_jsx(\"div\", { className: 'text-md font-semibold', children: title }), description] }) })] }));\n}\n//# sourceMappingURL=UserInfo.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { UserInfo } from '../../user/UserInfo';\nexport function createUserFilterGroup({ buckets, name, placeholder }) {\n const options = buckets.map((bucket) => {\n return {\n value: bucket._id,\n label: `(${bucket.count})`\n };\n });\n const filterGroup = {\n name: name,\n placeholder: placeholder || `${name.charAt(0).toUpperCase() + name.slice(1)}`,\n options: options,\n labelRenderer: (userRef) => {\n const isUnknownUser = userRef === 'Unknown User' || !userRef;\n if (isUnknownUser) {\n // Find the count for this user from buckets\n const bucket = buckets.find(b => b._id === userRef);\n return `Unknown User (${bucket?.count || 0})`;\n }\n // For known users, render UserInfo with count\n const bucket = buckets.find(b => b._id === userRef);\n return (_jsxs(\"div\", { className: \"flex items-center w-full gap-2\", children: [_jsx(\"div\", { className: \"flex-1 min-w-0 flex items-center truncate\", children: _jsx(UserInfo, { userRef: userRef, showTitle: true, size: \"sm\" }) }), _jsxs(\"span\", { className: \"text-muted-foreground flex-shrink-0\", children: [\"(\", bucket?.count || 0, \")\"] })] }));\n },\n };\n return filterGroup;\n}\nexport function VUserFacet({ buckets, name, placeholder }) {\n return createUserFilterGroup({ buckets, name, placeholder });\n}\n//# sourceMappingURL=VUserFacet.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { SelectBox } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { facetOptionNameLabel } from './utils/utils';\nexport function EnvironmentFacet({ search, buckets, placeholder = \"All Environments\", className }) {\n const { client } = useUserSession();\n const [options, setOptions] = useState([]);\n const filterValue = search.getFilterValue(\"environment\");\n const onChange = (option) => {\n search.setFilterValue(\"environment\", option?._id);\n };\n useEffect(() => {\n if (client) {\n const options = buckets.map(async (bucket) => {\n let name;\n await client.environments.retrieve(bucket._id).then((environment) => {\n name = environment.name;\n }).catch(() => {\n name = `${bucket._id} (deleted)`;\n });\n if (!name) {\n name = bucket._id;\n }\n return {\n ...bucket,\n name\n };\n });\n Promise.all(options).then(resolvedOptions => {\n resolvedOptions.sort((a, b) => a.name.localeCompare(b.name));\n setOptions(resolvedOptions);\n });\n }\n }, [buckets, client]);\n const value = options?.find((option) => option._id === filterValue);\n return (_jsx(SelectBox, { filterBy: \"name\", className: className, isClearable: true, optionLabel: facetOptionNameLabel, options: options, value: value, onChange: onChange, by: '_id', placeholder: placeholder }));\n}\n//# sourceMappingURL=EnvironmentFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\nimport { VEnvironmentFacet } from './utils/VEnvironmentFacet';\nimport { VInteractionFacet } from './utils/VInteractionFacet';\nimport { VStringFacet } from './utils/VStringFacet';\nimport { VUserFacet } from './utils/VUserFacet';\nimport { RefreshCw } from 'lucide-react';\n// Hook to create filter groups for runs\nexport function useRunsFilterGroups(facets) {\n const customFilterGroups = [];\n const runIdFilterGroup = {\n name: 'run_ids',\n placeholder: 'Run ID',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(runIdFilterGroup);\n if (facets.interactions) {\n const interactionFilterGroup = VInteractionFacet({\n buckets: facets.interactions || [],\n name: 'interaction',\n placeholder: 'Interactions',\n });\n customFilterGroups.push(interactionFilterGroup);\n }\n if (facets.environments) {\n const environmentFilterGroup = VEnvironmentFacet({\n buckets: facets.environments || [],\n name: 'environments',\n });\n customFilterGroups.push(environmentFilterGroup);\n }\n // Add tags filter as stringList type (allows custom input)\n const tagsFilterGroup = {\n name: 'tags',\n placeholder: 'Tags',\n type: 'stringList',\n multiple: true\n };\n customFilterGroups.push(tagsFilterGroup);\n if (facets.models) {\n const modelFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.models || [],\n name: 'model'\n });\n customFilterGroups.push(modelFilterGroup);\n }\n if (facets.statuses) {\n const statusFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.statuses || [],\n name: 'status'\n });\n customFilterGroups.push(statusFilterGroup);\n }\n if (facets.finish_reason) {\n const processedFinishReason = facets.finish_reason.map((bucket) => ({\n ...bucket,\n _id: bucket._id === null ? 'none' : bucket._id\n }));\n const finishReasonFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: processedFinishReason,\n name: 'finish_reason',\n placeholder: 'Finish Reason'\n });\n customFilterGroups.push(finishReasonFilterGroup);\n }\n if (facets.created_by) {\n const createdByFilterGroup = VUserFacet({\n buckets: facets.created_by || [],\n name: 'created_by',\n placeholder: 'Created By'\n });\n customFilterGroups.push(createdByFilterGroup);\n }\n const dateAfterFilterGroup = {\n name: 'start',\n placeholder: 'Date After',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateAfterFilterGroup);\n const dateBeforeFilterGroup = {\n name: 'end',\n placeholder: 'Date Before',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateBeforeFilterGroup);\n const workflowRunIdFilterGroup = {\n name: 'workflow_run_ids',\n placeholder: 'Workflow Run ID',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(workflowRunIdFilterGroup);\n return customFilterGroups;\n}\n// Hook to create filter change handler for runs\nexport function useRunsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n // Clear filters without applying defaults - user wants to remove all filters\n search.clearFilters(true, false);\n return;\n }\n // Clear all filters first without defaults, then apply new ones\n search.clearFilters(false, false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n // Force array format for backend fields that expect arrays\n if ((filterName === 'run_ids' || filterName === 'workflow_run_ids') && !Array.isArray(filterValue)) {\n filterValue = [filterValue];\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search();\n };\n}\n// Legacy component for backward compatibility\nexport function RunsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useRunsFilterGroups(facets);\n const handleFilterLogic = useRunsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n const handleRefetch = () => {\n search.search();\n };\n return (_jsxs(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: [_jsxs(\"div\", { className: 'flex justify-between mb-1', children: [_jsx(FilterBtn, {}), _jsx(Button, { onClick: handleRefetch, variant: 'outline', title: \"Refresh\", children: _jsx(RefreshCw, { className: \"size-5\" }) })] }), _jsxs(\"div\", { className: 'flex gap-2 items-center', children: [_jsx(FilterBar, {}), _jsx(FilterClear, {})] })] }));\n}\n//# sourceMappingURL=RunsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { InteractionStatus } from '@vertesia/common';\nimport { Badge } from '@vertesia/ui/core';\nexport function VInteractionFacet({ buckets, name, placeholder }) {\n const options = buckets.map((bucket) => ({\n label: `(${bucket.count})`,\n value: bucket._id\n }));\n const filterGroup = {\n name: name,\n placeholder: placeholder || `${name.charAt(0).toUpperCase() + name.slice(1)}`,\n options: options,\n type: \"select\",\n labelRenderer: (interactionId) => {\n const bucket = buckets.find(b => b._id === interactionId);\n const displayName = bucket?.name || interactionId;\n // Determine badge variant based on status\n let badgeVariant = \"success\";\n if (bucket?.status) {\n switch (bucket.status) {\n case InteractionStatus.published:\n badgeVariant = \"success\";\n break;\n case InteractionStatus.archived:\n badgeVariant = \"destructive\";\n break;\n default:\n badgeVariant = \"attention\";\n break;\n }\n }\n const badgeText = bucket?.version && bucket?.status ?\n `v${bucket.version} ${bucket.status}` :\n bucket?.status || (bucket?.version ? `v${bucket.version}` : '');\n return (_jsxs(\"div\", { className: \"w-full flex items-center justify-between\", children: [_jsxs(\"div\", { className: \"flex flex-row flex-wrap items-center gap-2 min-w-0 flex-1\", children: [_jsx(\"span\", { className: \"text-sm truncate\", children: displayName }), badgeText && (_jsx(Badge, { variant: badgeVariant, className: \"text-xs w-fit\", children: badgeText }))] }), _jsxs(\"span\", { className: \"ml-2 text-xs shrink-0\", children: [\"(\", bucket?.count || 0, \")\"] })] }));\n },\n filterBy: (optionValue, searchText) => {\n const bucket = buckets.find(b => b._id === optionValue);\n const searchName = bucket?.name || optionValue;\n return searchName.toLowerCase().includes(searchText.toLowerCase());\n }\n };\n return filterGroup;\n}\n//# sourceMappingURL=VInteractionFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function VEnvironmentFacet({ buckets, name }) {\n const options = buckets.map((bucket) => ({\n label: `(${bucket.count})`,\n value: bucket._id\n }));\n const filterGroup = {\n name: 'environment',\n placeholder: name.charAt(0).toUpperCase() + name.slice(1),\n options: options,\n type: \"select\",\n labelRenderer: (environmentId) => {\n const bucket = buckets.find(b => b._id === environmentId);\n const displayName = bucket?.name || environmentId;\n return (_jsxs(\"div\", { className: \"w-full flex items-center\", children: [_jsx(\"span\", { className: \"text-sm truncate\", children: displayName }), _jsxs(\"span\", { className: \"ml-2 text-xs\", children: [\"(\", bucket?.count || 0, \")\"] })] }));\n },\n filterBy: (optionValue, searchText) => {\n const bucket = buckets.find(b => b._id === optionValue);\n const searchName = bucket?.name || optionValue;\n return searchName.toLowerCase().includes(searchText.toLowerCase());\n }\n };\n return filterGroup;\n}\n//# sourceMappingURL=VEnvironmentFacet.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\nimport { VStringFacet } from './utils/VStringFacet';\nimport { VUserFacet } from './utils/VUserFacet';\n// Hook to create filter groups for workflow executions\nexport function useWorkflowExecutionsFilterGroups(facets) {\n const customFilterGroups = [];\n customFilterGroups.push({\n placeholder: 'Workflow or Run ID',\n name: 'name',\n type: 'text',\n options: [],\n });\n if (facets.status) {\n const statusFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.status || [],\n name: 'status',\n placeholder: 'Status'\n });\n customFilterGroups.push(statusFilterGroup);\n }\n if (facets.initiated_by) {\n const initiatedByFilterGroup = VUserFacet({\n buckets: facets.initiated_by || [],\n name: 'initiated_by',\n placeholder: 'Initiated By'\n });\n customFilterGroups.push(initiatedByFilterGroup);\n }\n const dateAfterFilterGroup = {\n name: 'start',\n placeholder: 'Date After',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateAfterFilterGroup);\n const dateBeforeFilterGroup = {\n name: 'end',\n placeholder: 'Date Before',\n type: 'date',\n multiple: false\n };\n customFilterGroups.push(dateBeforeFilterGroup);\n return customFilterGroups;\n}\n// Hook to create filter change handler for workflow executions\nexport function useWorkflowExecutionsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n search.clearFilters();\n return;\n }\n search.clearFilters(false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n if (filterName === 'name') {\n search.query.search_term = filterValue;\n search.query.name = filterValue;\n }\n else {\n search.query[filterName] = filterValue;\n }\n }\n });\n search.search();\n };\n}\n// Legacy component for backward compatibility\nexport function WorkflowExecutionsFacetsNav({ facets, search, }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useWorkflowExecutionsFilterGroups(facets);\n const handleFilterLogic = useWorkflowExecutionsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=WorkflowExecutionsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useState } from 'react';\nimport { VStringFacet } from './utils/VStringFacet';\nimport { VTypeFacet } from './utils/VTypeFacet';\n// Hook to create filter groups for documents\nexport function useDocumentFilterGroups(facets) {\n const { typeRegistry } = useUserSession();\n const customFilterGroups = [];\n customFilterGroups.push({\n placeholder: 'ID',\n name: 'id',\n type: 'text',\n options: [],\n });\n customFilterGroups.push({\n placeholder: 'Name',\n name: 'name',\n type: 'text',\n options: [],\n });\n if (facets.type) {\n const typeFilterGroup = VTypeFacet({\n buckets: facets.type || [],\n typeRegistry: typeRegistry,\n type: 'select',\n multiple: true\n });\n customFilterGroups.push(typeFilterGroup);\n }\n if (facets.status) {\n const statusFilterGroup = VStringFacet({\n search: null, // This will be provided by the search context\n buckets: facets.status || [],\n name: 'status',\n placeholder: 'Status',\n type: 'select',\n multiple: true\n });\n customFilterGroups.push(statusFilterGroup);\n }\n if (facets.tags) {\n customFilterGroups.push({\n name: 'tags',\n placeholder: 'Tags',\n type: 'stringList',\n options: facets.tags.map((tag) => ({\n label: tag,\n value: tag\n }))\n });\n }\n customFilterGroups.push({\n name: 'created_at',\n placeholder: 'Created Date',\n type: 'date',\n multiple: true,\n options: []\n });\n customFilterGroups.push({\n name: 'updated_at',\n placeholder: 'Updated Date',\n type: 'date',\n multiple: true,\n options: []\n });\n return customFilterGroups;\n}\n// Hook to create filter change handler for documents\nexport function useDocumentFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n search.clearFilters();\n return;\n }\n search.clearFilters(false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'date' && filter.multiple) {\n // Handle date range filters\n if (Array.isArray(filter.value) && filter.value.length > 0) {\n if (filter.value.length === 1) {\n // Single date - use as both start and end\n const dateValue = typeof filter.value[0] === 'object' ? filter.value[0].value : filter.value[0];\n filterValue = {\n gte: dateValue,\n lte: dateValue\n };\n }\n else if (filter.value.length === 2) {\n // Date range - start and end dates\n const startDate = typeof filter.value[0] === 'object' ? filter.value[0].value : filter.value[0];\n const endDate = typeof filter.value[1] === 'object' ? filter.value[1].value : filter.value[1];\n filterValue = {\n gte: startDate,\n lte: endDate\n };\n }\n }\n }\n else if (filter.multiple) {\n if (Array.isArray(filter.value)) {\n filterValue = filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v);\n }\n else {\n const singleValue = typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value;\n filterValue = [singleValue];\n }\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n if (filterName === 'name') {\n search.query.name = filterValue;\n }\n else if (filterName === 'id') {\n search.query.id = filterValue;\n }\n else {\n search.query[filterName] = filterValue;\n }\n }\n });\n search.search();\n };\n}\n// Legacy component for backward compatibility\nexport function DocumentsFacetsNav({ facets, search, }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useDocumentFilterGroups(facets);\n const handleFilterLogic = useDocumentFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=DocumentsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\n// Hook to create filter groups for interactions\nexport function useInteractionsFilterGroups(facets) {\n void facets;\n const customFilterGroups = [];\n // Add name filter as string type\n const nameFilterGroup = {\n name: 'name',\n placeholder: 'Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(nameFilterGroup);\n // Add prompt name filter as string type\n const promptNameFilterGroup = {\n name: 'prompt',\n placeholder: 'Prompt Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(promptNameFilterGroup);\n const ModelFilterGroup = {\n name: 'model',\n placeholder: 'Model',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(ModelFilterGroup);\n // Add tags filter as stringList type (allows custom input)\n const tagsFilterGroup = {\n name: 'tags',\n placeholder: 'Tags',\n type: 'stringList',\n multiple: true\n };\n customFilterGroups.push(tagsFilterGroup);\n return customFilterGroups;\n}\n// Hook to create filter change handler for interactions\nexport function useInteractionsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n search.clearFilters(true, true);\n return;\n }\n // Clear all filters first without defaults, then apply new ones\n search.clearFilters(false, false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search(true);\n };\n}\n// Component for interactions filtering\nexport function InteractionsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useInteractionsFilterGroups(facets);\n const handleFilterLogic = useInteractionsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=InteractionsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\n// Hook to create filter groups for prompts\nexport function usePromptsFilterGroups(facets) {\n void facets;\n const customFilterGroups = [];\n // Add name filter as text type\n const nameFilterGroup = {\n name: 'name',\n placeholder: 'Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(nameFilterGroup);\n // Add role filter as select type if role facets are available\n if (facets.role && facets.role.length > 0) {\n const rolesFilterGroup = {\n name: 'role',\n placeholder: 'Role',\n type: 'select',\n options: facets.role.map((facet) => ({\n label: facet._id,\n value: facet._id,\n count: facet.count\n })),\n };\n customFilterGroups.push(rolesFilterGroup);\n }\n return customFilterGroups;\n}\n// Hook to create filter change handler for prompts\nexport function usePromptsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n // Clear filters without applying defaults - user wants to remove all filters\n search.clearFilters(true, false);\n return;\n }\n // Clear all filters first without defaults, then apply new ones\n search.clearFilters(false, false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search();\n };\n}\n// Component for prompts filtering\nexport function PromptsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = usePromptsFilterGroups(facets);\n const handleFilterLogic = usePromptsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=PromptsFacetsNav.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { FilterProvider, FilterBtn, FilterBar, FilterClear } from '@vertesia/ui/core';\nimport { useState } from 'react';\nimport { useUserSession } from '@vertesia/ui/session';\n// Hook to create filter groups for collections\nexport function useCollectionsFilterGroups(facets) {\n void facets;\n const { typeRegistry } = useUserSession();\n const customFilterGroups = [];\n // Add name filter as text type\n const nameFilterGroup = {\n name: 'name',\n placeholder: 'Name',\n type: 'text',\n multiple: false\n };\n customFilterGroups.push(nameFilterGroup);\n // add type filter as select type\n if (typeRegistry) {\n const typeOptions = typeRegistry.types.map(type => {\n return {\n label: type.name,\n value: type.id\n };\n });\n const typeFilterGroup = {\n name: 'types',\n placeholder: 'Type',\n type: 'select',\n multiple: true,\n options: typeOptions,\n filterBy: (value, searchText) => {\n const option = typeOptions.find(opt => opt.value === value);\n return option?.label?.toLowerCase().includes(searchText.toLowerCase()) ?? false;\n }\n };\n customFilterGroups.push(typeFilterGroup);\n }\n return customFilterGroups;\n}\n// Hook to create filter change handler for collections\nexport function useCollectionsFilterHandler(search) {\n return (newFilters) => {\n if (newFilters.length === 0) {\n // Clear filters without applying defaults - user wants to remove all filters\n search.clearFilters(true);\n return;\n }\n // Clear all filters first, then apply new ones\n search.clearFilters(false);\n newFilters.forEach(filter => {\n if (filter.value && filter.value.length > 0) {\n const filterName = filter.name;\n let filterValue;\n if (filter.type === 'stringList') {\n filterValue = filter.value.map(v => typeof v === 'string' ? v : v.value);\n }\n else if (filter.multiple) {\n filterValue = Array.isArray(filter.value)\n ? filter.value.map((v) => typeof v === 'object' && v.value ? v.value : v)\n : [typeof filter.value === 'object' && filter.value.value ? filter.value.value : filter.value];\n }\n else {\n // Single value - don't wrap in array\n filterValue = Array.isArray(filter.value) && filter.value[0] && typeof filter.value[0] === 'object'\n ? filter.value[0].value\n : Array.isArray(filter.value) && filter.value[0]\n ? filter.value[0]\n : filter.value;\n }\n search.query[filterName] = filterValue;\n }\n });\n search.search();\n };\n}\n// Component for collections filtering\nexport function CollectionsFacetsNav({ facets, search }) {\n const [filters, setFilters] = useState([]);\n const filterGroups = useCollectionsFilterGroups(facets);\n const handleFilterLogic = useCollectionsFilterHandler(search);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n return (_jsx(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: _jsxs(\"div\", { className: \"flex gap-2 items-center\", children: [_jsx(FilterBtn, {}), _jsx(FilterBar, {}), _jsx(FilterClear, {})] }) }));\n}\n//# sourceMappingURL=CollectionsFacetsNav.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createContext, useContext, useEffect, useState } from \"react\";\nexport class DocumentSelection {\n object;\n objects;\n setState;\n /**\n * The collection id to which the selected objects belong to.\n */\n collectionId;\n singleSelection = false;\n constructor(object, collectionId, objects, setState) {\n this.object = object;\n this.objects = objects;\n this.setState = setState;\n this.singleSelection = Object.keys(this.objects).length === 0;\n this.collectionId = collectionId;\n }\n isSingleSelection() {\n return this.singleSelection;\n }\n hasSelection() {\n return this.object !== undefined || this.size() !== 0;\n }\n size() {\n return Object.keys(this.objects).length;\n }\n getObjectIds() {\n return Object.keys(this.objects);\n }\n getObjectId() {\n return this.object?.id;\n }\n clone() {\n return new DocumentSelection(this.object, this.collectionId, this.objects, this.setState);\n }\n add(object) {\n this.objects[object.id] = object;\n this.singleSelection = Object.keys(this.objects).length === 0;\n this.setState(this.clone());\n }\n remove(objectId) {\n delete this.objects[objectId];\n this.singleSelection = Object.keys(this.objects).length === 0;\n this.setState(this.clone());\n }\n addAll(objects) {\n for (const obj of objects) {\n this.objects[obj.id] = obj;\n }\n this.setState(this.clone());\n }\n isSelected(objectId) {\n return this.objects[objectId] !== undefined;\n }\n removeAll() {\n this.objects = {};\n this.singleSelection = true;\n this.setState(this.clone());\n }\n}\nconst DocumentSelectionContext = createContext(undefined);\nexport function useDocumentSelection() {\n const selection = useContext(DocumentSelectionContext);\n if (!selection) {\n throw new Error(\"useObjectSelection must be used within a ObjectSelectionProvider\");\n }\n return selection;\n}\nexport function useOptionalDocumentSelection() {\n return useContext(DocumentSelectionContext);\n}\nexport function DocumentSelectionProvider({ value, collectionId, children }) {\n const [selection, setSelection] = useState();\n useEffect(() => {\n const selection = new DocumentSelection(value, collectionId, {}, setSelection);\n setSelection(selection);\n }, [value]);\n return selection && (_jsx(DocumentSelectionContext.Provider, { value: selection, children: children }));\n}\n//# sourceMappingURL=DocumentSelectionProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport dayjs from \"dayjs\";\nimport LocalizedFormat from \"dayjs/plugin/localizedFormat\";\nimport RelativeTime from \"dayjs/plugin/relativeTime\";\nimport { shortId } from \"../../../utils\";\nimport { Eye } from \"lucide-react\";\nimport { Button } from \"@vertesia/ui/core\";\ndayjs.extend(RelativeTime);\ndayjs.extend(LocalizedFormat);\nconst renderers = {\n string(params, _onClick) {\n let transforms = [];\n if (params) {\n const slice = params.get(\"slice\");\n if (slice) {\n transforms.push((value) => value.slice(parseInt(slice)));\n }\n const max_length = params.get(\"max_length\");\n if (max_length) {\n transforms.push((value) => value.slice(0, parseInt(max_length)));\n }\n if (params.has(\"upper\")) {\n transforms.push((value) => value.toUpperCase());\n }\n if (params.has(\"lower\")) {\n transforms.push((value) => value.toLowerCase());\n }\n if (params.has(\"capitalize\")) {\n transforms.push((value) => value[0].toUpperCase() + value.substring(1));\n }\n if (params.has(\"ellipsis\")) {\n transforms.push((value) => value + \"...\");\n }\n }\n return (value, index) => {\n let v;\n if (value) {\n v = String(value);\n if (transforms.length > 0) {\n for (const t of transforms) {\n v = t(v);\n }\n }\n }\n else {\n v = \"\";\n }\n return _jsx(\"td\", { children: v }, index);\n };\n },\n fileSize(_params, _onClick) {\n return (value, index) => {\n let fileSize = \"\";\n if (value) {\n const bytes = Number(value);\n if (!isNaN(bytes)) {\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n if (bytes === 0) {\n fileSize = \"0 Bytes\";\n }\n else {\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n fileSize = `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;\n }\n }\n else {\n fileSize = String(value);\n }\n }\n return _jsx(\"td\", { children: fileSize }, index);\n };\n },\n number(params, _onClick) {\n let currency;\n let decimals;\n if (params) {\n currency = params.get(\"currency\") || undefined;\n decimals = params.get(\"decimals\") || undefined;\n }\n const digits = decimals ? parseInt(decimals) : 2;\n return (value, index) => {\n let v = new Intl.NumberFormat(\"en-US\", {\n style: currency ? \"currency\" : \"decimal\",\n currency,\n maximumFractionDigits: digits,\n }).format(value);\n return _jsx(\"td\", { children: v }, index);\n };\n },\n objectId(params, onClick) {\n let transforms = [];\n let hasSlice = false;\n if (params) {\n const slice = params.get(\"slice\");\n if (slice) {\n hasSlice = true;\n transforms.push((value) => value.slice(parseInt(slice)));\n }\n }\n return (value, index) => {\n const displayValue = transforms.reduce((v, t) => t(v), value.id);\n return (_jsxs(\"td\", { className: \"flex justify-between items-center gap-2\", children: [hasSlice ? '~' : '', displayValue, _jsx(Button, { variant: \"ghost\", alt: \"Preview Object\", onClick: (e) => {\n e.stopPropagation();\n onClick?.(value.id);\n }, children: _jsx(Eye, { className: \"size-4\" }) })] }, index));\n };\n },\n objectName(params, _onClick) {\n let title = \"title\";\n if (params) {\n title = params.get(\"title\") || \"title\";\n }\n return (value, index) => {\n return (_jsx(\"td\", { children: value.properties?.[title] || value.name || shortId(value.id) }, index));\n };\n },\n // objectLink - same implementation as objectId but defaults to slice=-7\n objectLink(_params, onClick) {\n const transforms = [];\n const hasSlice = true;\n transforms.push((value) => value.slice(-7));\n return (value, index) => {\n const displayValue = transforms.reduce((v, t) => t(v), value.id);\n return (_jsxs(\"td\", { className: \"flex justify-between items-center gap-2 max-w-48\", children: [hasSlice ? \"~\" : \"\", displayValue, _jsx(Button, { variant: \"ghost\", alt: \"Preview Object\", onClick: (e) => {\n e.stopPropagation();\n onClick?.(value.id);\n }, children: _jsx(Eye, { className: \"size-4\" }) })] }, index));\n };\n },\n typeLink(_params, _onClick) {\n return (value, index) => {\n return _jsx(\"td\", { children: value?.name || \"n/a\" }, index);\n };\n },\n date(params, _onClick) {\n let method = \"format\";\n let arg = \"LLL\";\n if (params) {\n const localized = params.get(\"localized\");\n if (localized) {\n arg = localized;\n }\n else {\n const relative = params.get(\"relative\");\n if (relative) {\n method = relative; // fromNow or toNow\n arg = undefined;\n }\n }\n }\n return (value, index) => {\n return _jsx(\"td\", { children: dayjs(value)[method](arg) }, index);\n };\n },\n};\nexport default renderers;\n//# sourceMappingURL=renderers.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport renderers from './renderers';\nconst defaultRenderer = renderers.string();\nfunction resolveField(object, path) {\n let p = object;\n if (!p)\n return undefined;\n if (!path.length)\n return p;\n const last = path.length - 1;\n for (let i = 0; i < last; i++) {\n p = p[path[i]];\n if (!p) {\n return undefined;\n }\n }\n return p[path[last]];\n}\nfunction splitPath(path) {\n if (!path || path === '.') {\n return [];\n }\n return path.split('.');\n}\nexport class DocumentTableColumn {\n layout;\n renderer = defaultRenderer;\n path;\n fallbackPath;\n previewObject;\n constructor(layout, previewObject) {\n this.layout = layout;\n this.path = splitPath(layout.field || '');\n this.fallbackPath = layout.fallback ? splitPath(layout.fallback) : undefined;\n this.previewObject = previewObject;\n // If there's a custom render function, use it\n if (layout.render) {\n this.renderer = (_value, _index) => null; // Placeholder, we'll use render directly\n }\n else {\n // Otherwise use the type-based renderer\n const type = layout.type || 'string';\n const i = type.indexOf('?');\n if (i > 0) {\n const name = type.substring(0, i);\n const params = new URLSearchParams(type.substring(i + 1));\n this.renderer = renderers[name](params);\n }\n else {\n this.renderer = renderers[type]();\n }\n }\n }\n get name() {\n return this.layout.name;\n }\n resolveValue(object) {\n let value = resolveField(object, this.path);\n if (value === undefined && this.fallbackPath) {\n value = resolveField(object, this.fallbackPath);\n }\n if (value === undefined) {\n value = this.layout.default;\n }\n return value;\n }\n render(object, index) {\n // If there's a custom render function, wrap its result in a td\n if (this.layout.render) {\n return _jsx(\"td\", { className: \"whitespace-nowrap px-3 py-4 text-sm\", children: this.layout.render(object) }, index);\n }\n const type = this.layout.type || 'string';\n const baseType = type.indexOf('?') > 0 ? type.substring(0, type.indexOf('?')) : type;\n if ((baseType === 'objectId' || baseType === 'objectLink') && this.previewObject) {\n const i = type.indexOf('?');\n const params = i > 0 ? new URLSearchParams(type.substring(i + 1)) : undefined;\n const renderer = renderers[baseType](params, (_id) => {\n this.previewObject(object.id);\n });\n return renderer(object, index);\n }\n // Otherwise use the type-based renderer with the resolved value\n return this.renderer(this.resolveValue(object), index);\n }\n}\n//# sourceMappingURL=DocumentTableColumn.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Table, TBody } from \"@vertesia/ui/core\";\nimport { DocumentIcon, DocumentIconSkeleton } from \"../components/DocumentIcon\";\nexport function DocumentTableView({ objects, selection, isLoading, columns, onRowClick, selectedObject, toggleAll, onSelectionChange }) {\n return (_jsxs(Table, { className: \"w-full border-t\", children: [_jsx(\"thead\", { children: _jsxs(\"tr\", { children: [selection && _jsx(\"th\", { children: _jsx(\"input\", { type: \"checkbox\", onChange: toggleAll }) }), columns.map((col) => (_jsx(\"th\", { children: col.name }, col.name)))] }) }), _jsxs(TBody, { isLoading: isLoading, columns: columns.length + 1, children: [objects?.map((obj) => {\n return (_jsxs(\"tr\", { className: `cursor-pointer hover:bg-muted group ${selectedObject?.id === obj.id ? 'bg-muted' : ''}`, onClick: () => {\n onRowClick && onRowClick(obj);\n }, children: [selection &&\n _jsx(\"td\", { onClick: ev => ev.stopPropagation(), children: _jsx(\"input\", { checked: selection.isSelected(obj.id), type: \"checkbox\", className: `${!selection.isSelected(obj.id) ? 'hidden group-hover:block' : ''}`, onChange: (ev) => onSelectionChange(obj, ev) }) }), columns.map((col, index) => col.render(obj, index))] }, obj.id));\n }), objects.length === 0 && _jsx(\"tr\", { children: _jsx(\"td\", { colSpan: columns.length + (selection ? 1 : 0), className: \"text-center\", children: \"No objects. Just drag and drop documents or images here to create content objects.\" }) })] })] }));\n}\nexport function DocumentGridView({ objects, selection, isLoading, onSelectionChange, onRowClick, previewObject, selectedObject }) {\n return (_jsxs(_Fragment, { children: [_jsx(DocumentIconSkeleton, { isLoading: isLoading }), _jsx(\"div\", { className: \"w-full gap-2 grid xs:grid-cols-1 sm:grid-cols-2 md:grid-cols-4 lg:grid-cols-6 @xs:grid-cols-1 @sm:grid-cols-2 @md:grid-cols-3 @lg:grid-cols-4\", children: objects.map((document) => (_jsx(DocumentIcon, { document: document, selection: selection, onSelectionChange: onSelectionChange, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject }, document.id))) })] }));\n}\n//# sourceMappingURL=documentLayout.js.map","import { createContext, useContext } from 'react';\nimport { SharedState, useWatchSharedState } from '@vertesia/ui/core';\nexport class DocumentSearch {\n client;\n limit;\n collectionId;\n facets = new SharedState({});\n result = new SharedState({ objects: [], isLoading: false });\n facetSpecs = [];\n query = {};\n constructor(client, limit = 100) {\n this.client = client;\n this.limit = limit;\n }\n withFacets(facets) {\n this.facetSpecs = facets;\n return this;\n }\n get objects() {\n return this.result.value.objects;\n }\n get error() {\n return this.result.value.error;\n }\n get isRunning() {\n return this.result.value.isLoading;\n }\n get hasMore() {\n return this.result.value.hasMore || false;\n }\n getFilterValue(name) {\n return this.query[name];\n }\n setFilterValue(name, value) {\n this.query[name] = value;\n // search now\n this.search();\n }\n setDefaultKeys(keys) {\n void keys;\n }\n clearFilters(autoSearch = true) {\n // Preserve search-related fields when clearing filters\n const { parent, full_text, vector, weights, score_aggregation, dynamic_scaling, limit, all_revisions } = this.query;\n this.query = {\n parent,\n ...(full_text !== undefined && { full_text }),\n ...(vector !== undefined && { vector }),\n ...(weights !== undefined && { weights }),\n ...(score_aggregation !== undefined && { score_aggregation }),\n ...(dynamic_scaling !== undefined && { dynamic_scaling }),\n ...(all_revisions !== undefined && { all_revisions }),\n ...(limit !== undefined && { limit })\n };\n if (autoSearch) {\n this.search();\n }\n }\n getFacetBuckets(name) {\n return this.facets.value[name]?.buckets || [];\n }\n resetFacets() {\n this.query = {};\n }\n reset(isLoading = false) {\n this.result.value = {\n objects: [],\n isLoading,\n hasMore: true\n };\n }\n _updateRunningState(value) {\n const prev = this.result.value;\n this.result.value = {\n objects: prev.objects,\n isLoading: value,\n error: prev.error,\n hasMore: prev.hasMore\n };\n }\n _searchRequest(query, limit, offset, includeFacets = true) {\n const payload = {\n limit,\n offset,\n query,\n facets: includeFacets ? this.facetSpecs : undefined\n };\n const request = this.collectionId ?\n this.client.collections.searchMembers(this.collectionId, payload)\n : this.client.objects.search(payload);\n return request;\n }\n _facetsRequest() {\n const payload = { facets: this.facetSpecs, query: this.query };\n return this.collectionId ?\n this.client.collections.computeFacets(this.collectionId, payload)\n : this.client.objects.computeFacets(payload);\n }\n computeFacets(_query) {\n this._facetsRequest().then((facets) => {\n this.facets.value = facets;\n });\n }\n _search(loadMore = false, noFacets = false) {\n if (this.isRunning && loadMore) { // avoid searching when a search is pending, but allow initial search\n return Promise.resolve(false);\n }\n this.result.value = {\n isLoading: true,\n objects: loadMore ? this.objects : [],\n hasMore: loadMore ? this.result.value.hasMore : true\n };\n const limit = this.limit;\n const offset = loadMore ? this.objects.length : 0;\n return this._searchRequest(this.query, limit, offset, !noFacets).then(async (res) => {\n // Handle the new format with results and facets\n const results = res.results || [];\n const facets = res.facets || {};\n this.result.value = {\n isLoading: false,\n objects: loadMore ? this.objects.concat(results) : results,\n hasMore: results.length === limit\n };\n // Update facets if they were requested and returned\n if (!noFacets && facets && Object.keys(facets).length > 0) {\n this.facets.value = facets;\n }\n return true;\n }).catch((err) => {\n this.result.value = {\n error: err,\n isLoading: false,\n objects: this.objects,\n hasMore: this.result.value.hasMore\n };\n throw err;\n });\n }\n search(noFacets = false) {\n // Allow initial search even if isLoading is true (for initial page load)\n if (this.isRunning && this.objects.length > 0) {\n return Promise.resolve(false);\n }\n return this._search(false, noFacets);\n }\n loadMore(noFacets = false) {\n if (this.isRunning || !this.hasMore)\n return Promise.resolve(false);\n if (this.query.vector)\n return Promise.resolve(false); //Load more not supported on vector queries\n if (this.objects.length > 0) {\n noFacets = true; //Only reload facets on loadMore if there are no results.\n }\n return this._search(true, noFacets);\n }\n}\nconst DocumentSearchContext = createContext(undefined);\nexport function useDocumentSearch() {\n return useContext(DocumentSearchContext);\n}\nexport function useWatchDocumentSearchFacets() {\n return useWatchSharedState(useDocumentSearch().facets);\n}\nexport function useWatchDocumentSearchResult() {\n const search = useDocumentSearch();\n const result = useWatchSharedState(search.result);\n return { ...result, search };\n}\nexport function useDocumentSearchCount() {\n const search = useDocumentSearch();\n const result = useWatchSharedState(search.facets);\n return result.total;\n}\nexport { DocumentSearchContext as SearchContext };\n//# sourceMappingURL=DocumentSearchContext.js.map","import { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Md5 } from \"ts-md5\";\n/**\n * Types of actions that can be taken with a file\n */\nexport var FileUploadAction;\n(function (FileUploadAction) {\n FileUploadAction[\"CREATE\"] = \"create\";\n FileUploadAction[\"SKIP\"] = \"skip\";\n FileUploadAction[\"UPDATE\"] = \"update\";\n})(FileUploadAction || (FileUploadAction = {}));\n/**\n * Calculates the MD5 hash of a file\n * @param file The file to hash\n * @returns Promise with the MD5 hash of the file\n */\nasync function calculateFileHash(file) {\n try {\n const arrayBuffer = await file.arrayBuffer();\n const md5 = new Md5();\n md5.appendByteArray(new Uint8Array(arrayBuffer));\n const hash = md5.end();\n return hash?.toString();\n }\n catch (error) {\n console.error(\"Error calculating file hash:\", error);\n return undefined;\n }\n}\n/**\n * Prepares files by calculating their hashes and metadata\n * @param files Array of files to process\n * @param selectedFolder Optional folder location for the files\n * @returns Promise with array of files with their metadata\n */\nasync function prepareFilesWithMetadata(files, selectedFolder) {\n const filesWithMetadata = [];\n // Process files in batches to avoid overwhelming the browser\n const batchSize = 5;\n for (let i = 0; i < files.length; i += batchSize) {\n const batch = files.slice(i, i + batchSize);\n // Process this batch in parallel\n const metadataResults = await Promise.all(batch.map(async (file) => {\n // Determine the location for this file\n let location = selectedFolder || \"/\";\n // If file has relative path, use it to determine location\n const hasRelativePath = !!file.webkitRelativePath;\n if (hasRelativePath) {\n const relativePath = file.webkitRelativePath;\n const pathParts = relativePath.split(\"/\");\n if (pathParts.length > 1) {\n // Extract folder path (everything except the filename)\n const folderPath = pathParts.slice(0, -1).join(\"/\");\n // Combine with selected folder if any\n location = selectedFolder ? `${selectedFolder}/${folderPath}` : folderPath;\n }\n }\n // Calculate hash for content comparison\n const hash = await calculateFileHash(file);\n return {\n file,\n hash,\n name: file.name,\n size: file.size,\n location,\n };\n }));\n filesWithMetadata.push(...metadataResults);\n }\n return filesWithMetadata;\n}\n/**\n * Hook to check if documents need to be created, updated, or skipped\n * @param collectionId Optional collection ID to check within\n * @returns Object with functions to process documents\n */\nexport function useSmartFileUploadProcessing() {\n const { client } = useUserSession();\n const toast = useToast();\n /**\n * Check files to determine if they need to be created, updated, or skipped\n * @param files Array of files to check\n * @param selectedFolder Optional folder location\n * @param collectionId limit the check to a collection\n * @returns Promise with information about actions to take for each file\n */\n const prepareFilesForUpload = async (files, selectedFolder, limitToCollectionId) => {\n try {\n // First, prepare all the files with their metadata\n console.log(`Preparing metadata for ${files.length} files...`);\n const filesWithMetadata = await prepareFilesWithMetadata(files, selectedFolder);\n const identifyExistingHash = async () => {\n const query = {\n \"content.etag\": { $in: filesWithMetadata.map((file) => file.hash) },\n };\n let res;\n const payload = {\n query: { match: query },\n select: \"id content.etag\" // Only fetch fields needed for comparison\n };\n if (limitToCollectionId) {\n res = (await client.store.collections.searchMembers(limitToCollectionId, payload)).results;\n }\n else {\n res = (await client.store.objects.search(payload)).results;\n }\n for (const doc of res) {\n const file = filesWithMetadata.find((f) => f.hash === doc.content.etag);\n if (file) {\n file.existingId = doc.id;\n file.action = FileUploadAction.SKIP;\n }\n }\n };\n /**\n * Find what file are present based on location and name\n */\n const identifyExistingIds = async () => {\n const unskippedFiles = filesWithMetadata.filter((file) => file.action !== FileUploadAction.SKIP);\n const allLocations = unskippedFiles.map((file) => file.location);\n const uniqueLocations = Array.from(new Set(allLocations));\n const queries = [];\n for (const location of uniqueLocations) {\n const namesInLocation = unskippedFiles\n .filter((file) => file.location === location)\n .map((file) => file.name);\n const query = {\n \"content.name\": { $in: namesInLocation },\n location: location || \"/\"\n };\n if (limitToCollectionId) {\n const res = client.store.collections.searchMembers(limitToCollectionId, {\n query: {\n match: query,\n },\n select: \"id content.name location\" // Only fetch fields needed for comparison\n }).then((response) => response.results);\n queries.push(res);\n }\n else {\n const res = client.store.objects.find({\n query: query,\n select: \"id content.name location\" // Only fetch fields needed for comparison\n });\n queries.push(res);\n }\n }\n const results = (await Promise.all(queries)).flat();\n console.log(`Found ${results.length} document to update`, results);\n //update fileWithMetadata\n for (const doc of results) {\n const file = filesWithMetadata.find(\n //name must be the same, and location must match (default is \"/\")\n (f) => f.name === doc.content.name &&\n (f.location ? f.location === doc.location : doc.location === \"/\"));\n if (file) {\n file.existingId = doc.id;\n file.action = FileUploadAction.UPDATE;\n }\n }\n console.log(`Reconciled ${filesWithMetadata.filter((f) => f.action === FileUploadAction.UPDATE).length}`);\n };\n await identifyExistingHash();\n await identifyExistingIds();\n //set create flag on remaining files\n filesWithMetadata.forEach((f) => {\n if (!f.action) {\n f.action = FileUploadAction.CREATE;\n }\n });\n // Log the results\n console.log(\"Document processing check results:\", {\n totalFiles: files.length,\n toCreate: filesWithMetadata.filter((f) => f.action === FileUploadAction.CREATE).length,\n toUpdate: filesWithMetadata.filter((f) => f.action === FileUploadAction.UPDATE).length,\n toSkip: filesWithMetadata.filter((f) => f.action === FileUploadAction.SKIP).length,\n });\n return filesWithMetadata;\n }\n catch (error) {\n toast({\n title: \"Error in file upload processing check\",\n status: \"error\",\n description: error.message,\n });\n console.log(\"Error in file upload processing check\", error);\n throw new Error(\"Error in file upload processing check: \" + error.message);\n }\n };\n return {\n checkDocumentProcessing: prepareFilesForUpload,\n };\n}\n//# sourceMappingURL=useSmartFileUploadProcessing.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, MessageBox, VModal, VModalBody, VModalFooter, VModalTitle, VSelectBox, Spinner, useToast, VTooltip } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { DropZone, UploadSummary } from '@vertesia/ui/widgets';\nimport { AlertCircleIcon, CheckCircleIcon, FileIcon, FolderIcon, Info, UploadIcon, XCircleIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { FileUploadAction, useSmartFileUploadProcessing } from \"./useSmartFileUploadProcessing\";\n/**\n * Unified upload modal that handles the complete upload process:\n * 1. File selection (if no files provided)\n * 2. Smart file processing to detect duplicates\n * 3. Type selection\n * 4. Upload with progress tracking\n * 5. Result display\n */\nexport function DocumentUploadModal({ isOpen, onClose, files: initialFiles, collectionId, selectedFolder, title = \"Upload Files\", children, onUploadComplete, hideFileSelection = false, showTypeSelectionOnly = false, allowFolders = true, }) {\n const { client, typeRegistry } = useUserSession();\n const toast = useToast();\n const [files, setFiles] = useState([]);\n const [processedFiles, setProcessedFiles] = useState([]);\n const [processingDone, setProcessingDone] = useState(false);\n const [selectedType, setSelectedType] = useState(null);\n const [fileStatuses, setFileStatuses] = useState([]);\n const [isUploading, setIsUploading] = useState(false);\n const [uploadComplete, setUploadComplete] = useState(false);\n const [overallProgress, setOverallProgress] = useState(0);\n const [modalKey, setModalKey] = useState(Date.now());\n const [collectionData, setCollectionData] = useState(undefined);\n const [result, setResult] = useState(null);\n const [_title, setTitle] = useState(title);\n const [_description, setDescription] = useState(\"\");\n // Fetch collection details if a collectionId is provided\n useEffect(() => {\n if (!collectionId)\n return;\n client.store.collections.retrieve(collectionId).then(setCollectionData);\n }, [collectionId]);\n // Update title and description based on current state\n useEffect(() => {\n if (isUploading) {\n setTitle(\"Uploading Files\");\n setDescription(`${Math.round(overallProgress)}% complete`);\n }\n else if (uploadComplete) {\n setTitle(\"Upload Complete\");\n setDescription(\"\");\n }\n else if (processingDone) {\n setTitle(\"File Analysis Results\");\n setDescription(`${files.length} file${files.length !== 1 ? \"s\" : \"\"}`);\n }\n else if (files.length > 0) {\n setTitle(title);\n setDescription(\"Checking for duplicates and updates\");\n }\n else {\n setTitle(title);\n setDescription(\"\");\n }\n }, [isUploading, uploadComplete, processingDone, title, overallProgress, files.length]);\n // Helper function to render collection and folder information\n const renderLocationInfo = () => {\n if (!collectionData && !selectedFolder)\n return null;\n return (_jsxs(MessageBox, { className: \"mb-4\", status: \"default\", icon: _jsx(FolderIcon, { className: \"size-5\" }), children: [_jsx(\"div\", { className: \"flex items-center\", children: _jsx(\"span\", { className: \"font-medium\", children: \"Upload Location:\" }) }), _jsxs(\"div\", { className: \"text-sm mt-1\", children: [collectionData && (_jsxs(\"div\", { className: \"flex items-center\", children: [_jsx(\"span\", { className: \"mr-1\", children: \"Collection:\" }), _jsx(\"span\", { className: \"font-medium\", children: collectionData.name })] })), selectedFolder && (_jsxs(\"div\", { className: \"flex items-center mt-1\", children: [_jsx(\"span\", { className: \"mr-1\", children: \"Folder:\" }), _jsx(\"span\", { className: \"font-medium\", children: selectedFolder })] }))] })] }));\n };\n // Statistics for upload processing\n const [processingStats, setProcessingStats] = useState({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n // Get the smart file processing utility\n const { checkDocumentProcessing } = useSmartFileUploadProcessing();\n // Get available types from the registry\n const types = useMemo(() => {\n return typeRegistry?.types || [];\n }, [typeRegistry?.types]);\n // Reset state when modal opens/closes\n useEffect(() => {\n if (isOpen) {\n // Always reset state first\n setProcessedFiles([]);\n setProcessingDone(false);\n setSelectedType(null);\n setFileStatuses([]);\n setIsUploading(false);\n setUploadComplete(false);\n setOverallProgress(0);\n setProcessingStats({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n setResult(null);\n setTitle(title);\n setDescription(\"\");\n // Set initial files if provided\n if (initialFiles && initialFiles.length > 0) {\n setFiles(initialFiles);\n processFiles(initialFiles);\n }\n else {\n setFiles([]);\n }\n // Create a new key to ensure the modal is fresh\n setModalKey(Date.now());\n }\n }, [isOpen, initialFiles]);\n // Complete cleanup when modal closes\n const handleClose = () => {\n // Reset all state to initial values to prevent memory leaks\n setFiles([]);\n setProcessedFiles([]);\n setProcessingDone(false);\n setSelectedType(null);\n setFileStatuses([]);\n setIsUploading(false);\n setUploadComplete(false);\n setOverallProgress(0);\n setProcessingStats({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n setResult(null);\n setTitle(title);\n setDescription(\"\");\n setModalKey(Date.now());\n // Call the provided onClose function\n onClose();\n };\n // Handle file drop/selection\n const handleFileSelect = (newFiles) => {\n if (newFiles && newFiles.length > 0) {\n setFiles(newFiles);\n processFiles(newFiles);\n }\n };\n // Process files to determine create/update/skip status\n const processFiles = async (filesToProcess) => {\n if (!filesToProcess.length)\n return;\n try {\n console.log(`Processing ${filesToProcess.length} files to determine required actions...`);\n // Get the document processing results\n const processed = await checkDocumentProcessing(filesToProcess, selectedFolder, collectionId);\n setProcessedFiles(processed);\n // Count files by action\n const toCreate = processed.filter((f) => f.action === FileUploadAction.CREATE).length;\n const toUpdate = processed.filter((f) => f.action === FileUploadAction.UPDATE).length;\n const toSkip = processed.filter((f) => f.action === FileUploadAction.SKIP).length;\n // Update stats for UI feedback\n setProcessingStats({\n toCreate,\n toUpdate,\n toSkip,\n });\n // Show processing results to user\n toast({\n title: \"Files analyzed\",\n description: `${filesToProcess.length} file(s): ${toCreate} new, ${toUpdate} to update, ${toSkip} to skip`,\n status: \"info\",\n duration: 4000,\n });\n // Set processing as complete\n setProcessingDone(true);\n }\n catch (error) {\n console.error(\"Error processing files:\", error);\n toast({\n title: \"Error\",\n description: \"There was an error analyzing the files\",\n status: \"error\",\n duration: 5000,\n });\n }\n };\n // Handle type selection and start the upload\n const handleUpload = async () => {\n if (!processedFiles.length)\n return;\n const typeId = selectedType?.id || null;\n // Initialize file statuses\n const initialStatuses = processedFiles.map((fileInfo) => ({\n file: fileInfo.file,\n status: \"pending\",\n progress: 0,\n action: fileInfo.action === FileUploadAction.CREATE\n ? \"create\"\n : fileInfo.action === FileUploadAction.UPDATE\n ? \"update\"\n : \"skip\",\n }));\n setFileStatuses(initialStatuses);\n setIsUploading(true);\n setUploadComplete(false);\n // Process files in batches\n const filesToSkip = processedFiles.filter((f) => f.action === FileUploadAction.SKIP);\n const filesToUpdate = processedFiles.filter((f) => f.action === FileUploadAction.UPDATE);\n const filesToCreate = processedFiles.filter((f) => f.action === FileUploadAction.CREATE);\n const result = {\n success: true,\n objectIds: [],\n uploadedFiles: [],\n skippedFiles: [],\n failedFiles: [],\n };\n // Process SKIP files\n for (const fileInfo of filesToSkip) {\n if (fileInfo.existingId) {\n result.objectIds.push(fileInfo.existingId);\n result.skippedFiles.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type: typeId,\n status: \"skipped\",\n location: fileInfo.location,\n });\n // Update the file status\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"success\", progress: 100, id: fileInfo.existingId }\n : status));\n }\n }\n // Process files in batches of 50\n const BATCH_SIZE = 50;\n const PROGRESS_UPDATE_INTERVAL = 5; // Update progress every 5 files\n // Helper function to process a batch of files\n const processBatch = async (files, action) => {\n const batches = [];\n for (let i = 0; i < files.length; i += BATCH_SIZE) {\n batches.push(files.slice(i, i + BATCH_SIZE));\n }\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {\n const batch = batches[batchIndex];\n console.log(`Processing ${action} batch ${batchIndex + 1}/${batches.length} (${batch.length} files)`);\n // Show progress for larger file sets\n if (files.length > BATCH_SIZE) {\n const processedCount = batchIndex * BATCH_SIZE;\n toast({\n title: `Processing files (${action})`,\n description: `Processed ${processedCount}/${files.length} files...`,\n status: \"info\",\n duration: 2000,\n });\n }\n // Process the batch with progress tracking\n let filesProcessedInBatch = 0;\n await Promise.all(batch.map(async (fileInfo) => {\n try {\n // Update status to uploading\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"uploading\", progress: 20 }\n : status));\n if (action === \"update\" && fileInfo.existingId) {\n // Update existing file\n await client.store.objects.update(fileInfo.existingId, {\n type: typeId || undefined,\n content: fileInfo.file,\n location: fileInfo.location,\n name: fileInfo.name,\n }, {\n createRevision: true,\n revisionLabel: \"upload on \" + new Date().toISOString(),\n });\n // Update status to success\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"success\", progress: 100, id: fileInfo.existingId }\n : status));\n // Add to result\n result.objectIds.push(fileInfo.existingId);\n result.uploadedFiles.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type: typeId,\n status: \"updated\",\n location: fileInfo.location,\n });\n }\n else {\n // Create new file\n const createResult = await client.store.objects.create({\n type: typeId || undefined,\n content: fileInfo.file,\n location: fileInfo.location || fileInfo.file.webkitRelativePath || fileInfo.name,\n }, {\n collection_id: collectionId,\n });\n // Update status to success\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? { ...status, status: \"success\", progress: 100, id: createResult.id }\n : status));\n // Add to result\n result.objectIds.push(createResult.id);\n result.uploadedFiles.push({\n id: createResult.id,\n name: fileInfo.name,\n type: typeId,\n status: \"created\",\n location: fileInfo.location,\n });\n }\n }\n catch (error) {\n console.error(`Failed to process file ${fileInfo.name}:`, error);\n // Update status to error\n setFileStatuses((current) => current.map((status) => status.file === fileInfo.file\n ? {\n ...status,\n status: \"error\",\n progress: 100,\n message: error.message || \"Unknown error\",\n }\n : status));\n // Add to failed result\n result.failedFiles.push({\n name: fileInfo.name,\n error: error.message || \"Unknown error\",\n status: \"failed\",\n location: fileInfo.location,\n type: typeId,\n });\n // Mark the overall success as false if any file fails\n result.success = false;\n }\n // Update progress every PROGRESS_UPDATE_INTERVAL files\n filesProcessedInBatch++;\n if (filesProcessedInBatch % PROGRESS_UPDATE_INTERVAL === 0 || filesProcessedInBatch === batch.length) {\n setFileStatuses((currentStatuses) => {\n const completedFiles = currentStatuses.filter((f) => f.status === \"success\" || f.status === \"error\").length;\n const totalFiles = currentStatuses.length;\n const progress = totalFiles > 0 ? Math.round((completedFiles / totalFiles) * 100) : 0;\n setOverallProgress(progress);\n return currentStatuses;\n });\n }\n }));\n }\n };\n // Process UPDATE files first, then CREATE files\n if (filesToUpdate.length > 0) {\n await processBatch(filesToUpdate, \"update\");\n }\n if (filesToCreate.length > 0) {\n await processBatch(filesToCreate, \"create\");\n }\n // Finalize the upload\n // Ensure all files are accounted for before completing\n setFileStatuses((current) => {\n // Check for any pending files that might have been missed\n const missingStatuses = current\n .filter((status) => status.status === \"pending\")\n .map((status) => ({\n ...status,\n status: \"error\",\n progress: 100,\n message: \"Upload process interrupted\",\n }));\n if (missingStatuses.length > 0) {\n // Add missing files to the failed files list\n missingStatuses.forEach((status) => {\n result.failedFiles.push({\n name: status.file.name,\n error: \"Upload process interrupted\",\n status: \"failed\",\n type: selectedType?.id || null,\n });\n });\n // Update the success flag if any files failed\n result.success = false;\n // Return updated statuses\n return current.map((status) => status.status === \"pending\"\n ? {\n ...status,\n status: \"error\",\n progress: 100,\n message: \"Upload process interrupted\",\n }\n : status);\n }\n return current;\n });\n setIsUploading(false);\n setUploadComplete(true);\n // Show summary toast\n const createdCount = result.uploadedFiles.filter((f) => f.status === \"created\").length;\n const updatedCount = result.uploadedFiles.filter((f) => f.status === \"updated\").length;\n const skippedCount = result.skippedFiles.length;\n const failedCount = result.failedFiles.length;\n let statusMessage = \"\";\n if (createdCount > 0)\n statusMessage += `${createdCount} file${createdCount !== 1 ? \"s\" : \"\"} uploaded`;\n if (updatedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${updatedCount} file${updatedCount !== 1 ? \"s\" : \"\"} updated`;\n }\n if (skippedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${skippedCount} file${skippedCount !== 1 ? \"s\" : \"\"} skipped`;\n }\n if (failedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${failedCount} file${failedCount !== 1 ? \"s\" : \"\"} failed`;\n }\n toast({\n title: \"Upload Complete\",\n description: statusMessage,\n status: failedCount > 0 ? \"warning\" : \"success\",\n duration: 5000,\n });\n setResult(result);\n };\n const typeSelection = () => {\n return (_jsxs(\"div\", { className: \"mb-4\", children: [_jsxs(\"label\", { className: \"block text-sm font-medium mb-2\", children: [\"Content Type \", _jsx(\"span\", { className: \"text-muted font-normal\", children: \"(Optional)\" }), _jsx(VTooltip, { description: \"Select a content type to apply to the uploaded files. If left empty, Vertesia will automatically detect the type based on file content.\", placement: \"top\", size: \"xs\", children: _jsx(Info, { className: \"size-3 ml-2\" }) })] }), _jsx(VSelectBox, { options: types, value: selectedType, optionLabel: (type) => (type ? type.name : \"Select a content type\"), placeholder: \"Select a content type or leave empty for automatic detection\", onChange: (selected) => setSelectedType(selected === undefined ? null : selected), filterBy: \"name\", isClearable: true }), selectedType ? (_jsx(_Fragment, {})) : (_jsx(\"div\", { className: \"p-2 rounded-md\", children: _jsxs(\"div\", { className: \"flex items-center text-attention\", children: [_jsx(CheckCircleIcon, { className: \"size-4 mr-1\" }), \"Automatic Type Detection\", _jsx(VTooltip, { description: \"Vertesia will analyze the content and select the most appropriate type. This is recommended for most uploads and ensures optimal processing.\", placement: \"top\", size: \"xs\", children: _jsx(Info, { className: \"size-3 ml-2\" }) })] }) }))] }));\n };\n // Determine what content to show based on the current state\n const renderModalContent = () => {\n // When showing only type selection, skip directly to the type selection UI\n if (showTypeSelectionOnly) {\n return (_jsxs(VModalBody, { children: [children, renderLocationInfo(), typeSelection()] }));\n }\n // Step 1: File selection #todo: update styles\n if (files.length === 0 && !hideFileSelection) {\n return (_jsxs(VModalBody, { className: \"flex flex-col items-center justify-center p-8\", children: [renderLocationInfo(), _jsx(DropZone, { onDrop: handleFileSelect, message: \"Drag and drop files here or click to select\", buttonLabel: \"Select Files\", className: \"w-full h-64\", allowFolders: allowFolders }), children] }));\n }\n // Step 2: File processing and type selection\n if (!isUploading && !uploadComplete) {\n return (_jsx(VModalBody, { children: !processingDone ? (\n // File processing in progress\n _jsxs(\"div\", { className: \"flex flex-col items-center justify-center py-4\", children: [_jsx(Spinner, { size: \"lg\", className: \"mb-4\" }), _jsx(\"div\", { className: \"text-lg font-medium\", children: \"Analyzing files...\" })] })) : (\n // Processing complete, show type selection\n _jsxs(_Fragment, { children: [renderLocationInfo(), _jsx(\"div\", { className: \"mb-4\", children: _jsx(\"div\", { className: \"p-4 rounded-md mb-4\", children: _jsxs(\"div\", { className: \"grid grid-cols-3 gap-4\", children: [_jsxs(\"div\", { className: \"flex flex-col items-center\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(UploadIcon, { className: \"size-5 text-primary\" }), _jsx(\"span\", { className: \"font-medium\", children: \"New\" })] }), _jsx(\"div\", { className: \"text-2xl font-semibold\", children: processingStats.toCreate })] }), _jsxs(\"div\", { className: \"flex flex-col items-center\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(CheckCircleIcon, { className: \"size-5 text-success\" }), _jsx(\"span\", { className: \"font-medium\", children: \"Update\" })] }), _jsx(\"div\", { className: \"text-2xl font-semibold\", children: processingStats.toUpdate })] }), _jsxs(\"div\", { className: \"flex flex-col items-center\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(AlertCircleIcon, { className: \"size-5 text-mixer-attention/40\" }), _jsx(\"span\", { className: \"font-medium\", children: \"Skip\" })] }), _jsx(\"div\", { className: \"text-2xl font-semibold\", children: processingStats.toSkip })] })] }) }) }), typeSelection(), _jsx(MessageBox, { className: \"mb-4\", status: \"info\", children: processingStats.toCreate + processingStats.toUpdate > 0 ? (_jsxs(\"div\", { className: \"space-y-1\", children: [_jsxs(\"p\", { children: [processingStats.toCreate + processingStats.toUpdate, \" file\", processingStats.toCreate + processingStats.toUpdate > 1 ? \"s are\" : \" is\", \" ready to process\"] }), _jsx(\"p\", { children: processingStats.toSkip > 0 &&\n `${processingStats.toSkip} file${processingStats.toSkip > 1 ? \"s are\" : \" is\"} already in the system and will be skipped.` })] })) : processingStats.toSkip > 0 ? (_jsxs(\"span\", { children: [\"All \", processingStats.toSkip, \" file(s) already exist in the system and will be skipped. You can proceed to view the results.\"] })) : (_jsx(\"span\", { children: \"No files to process.\" })) })] })) }));\n }\n // Step 3: Upload in progress #todo: update styles\n if (isUploading) {\n return (_jsxs(VModalBody, { children: [renderLocationInfo(), _jsx(\"div\", { className: \"mb-4\", children: _jsx(\"div\", { className: \"h-2 bg-muted/20 rounded-full overflow-hidden\", children: _jsx(\"div\", { className: \"h-full bg-primary rounded-full\", style: { width: `${overallProgress}%` } }) }) }), _jsx(\"div\", { className: \"max-h-96 overflow-y-auto\", children: fileStatuses.map((fileStatus, index) => (_jsxs(\"div\", { className: \"flex items-center py-2 border-b border-border last:border-b-0\", children: [_jsxs(\"div\", { className: \"mr-3\", children: [fileStatus.status === \"pending\" && (_jsx(FileIcon, { className: \"size-5 text-muted\" })), fileStatus.status === \"uploading\" && _jsx(Spinner, { size: \"sm\" }), fileStatus.status === \"success\" && (_jsx(CheckCircleIcon, { className: \"size-5 text-success\" })), fileStatus.status === \"error\" && _jsx(XCircleIcon, { className: \"size-5 text-destructive\" })] }), _jsxs(\"div\", { className: \"flex-1 min-w-0\", children: [_jsx(\"div\", { className: \"truncate font-medium\", children: fileStatus.file.name }), _jsxs(\"div\", { className: \"text-xs text-muted\", children: [fileStatus.status === \"pending\" && \"Waiting...\", fileStatus.status === \"uploading\" && \"Uploading...\", fileStatus.status === \"success\" &&\n (fileStatus.action === \"create\"\n ? \"Created\"\n : fileStatus.action === \"update\"\n ? \"Updated\"\n : \"Skipped\"), fileStatus.status === \"error\" && fileStatus.message] })] })] }, `${fileStatus.file.name}-${index}`))) })] }));\n }\n // Step 4: Upload complete, show results\n return (_jsx(VModalBody, { children: _jsxs(\"div\", { className: \"mb-4\", children: [renderLocationInfo(), _jsx(UploadSummary, { files: fileStatuses.map((f) => {\n // Map fileStatus to the expected ProcessedFile format\n let status;\n if (f.status === \"success\") {\n if (f.action === \"create\") {\n status = \"success\";\n }\n else if (f.action === \"update\") {\n status = \"updated\";\n }\n else {\n status = \"skipped\";\n }\n }\n else {\n status = \"failed\";\n }\n return {\n name: f.file.name,\n status,\n error: f.status === \"error\" ? f.message : undefined,\n };\n }), location: selectedFolder || undefined, collection: collectionData?.name })] }) }));\n };\n const renderModalFooter = () => {\n // Type-selection-only mode\n if (showTypeSelectionOnly) {\n return (_jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }), _jsx(Button, { onClick: () => {\n // Create minimal result with the selected type (or null)\n const result = {\n success: true,\n objectIds: [],\n uploadedFiles: [\n {\n name: \"type-selection\",\n type: selectedType?.id || null,\n status: \"created\",\n },\n ],\n skippedFiles: [],\n failedFiles: [],\n };\n if (onUploadComplete) {\n onUploadComplete(result);\n }\n handleClose();\n }, children: selectedType ? `Use ${selectedType.name}` : \"Use Automatic Type Detection\" })] }));\n }\n // File selection step - only show cancel\n if (files.length === 0 && !hideFileSelection) {\n return (_jsx(VModalFooter, { children: _jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }) }));\n }\n // Processing and type selection step\n if (!isUploading && !uploadComplete) {\n // Allow upload even without a type (Vertesia will choose one)\n const canUpload = processingDone;\n return (_jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }), _jsx(Button, { disabled: !canUpload, onClick: handleUpload, children: processingStats.toCreate + processingStats.toUpdate > 0\n ? \"Upload\"\n : \"Continue\" })] }));\n }\n // Upload in progress - can't cancel\n if (isUploading) {\n return (_jsx(VModalFooter, { children: _jsx(Button, { variant: \"ghost\", disabled: true, children: \"Uploading...\" }) }));\n }\n // Upload complete - close or upload more\n return (_jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: () => {\n // Reset state and start over\n setFiles([]);\n setProcessedFiles([]);\n setProcessingDone(false);\n setSelectedType(null);\n setFileStatuses([]);\n setIsUploading(false);\n setUploadComplete(false);\n setOverallProgress(0);\n setProcessingStats({ toCreate: 0, toUpdate: 0, toSkip: 0 });\n }, children: \"Upload More\" }), _jsx(Button, { onClick: () => {\n if (onUploadComplete && result) {\n onUploadComplete(result);\n }\n handleClose();\n }, children: \"Close\" })] }));\n };\n return (_jsxs(VModal, { isOpen: isOpen, onClose: handleClose, className: \"mx-auto\", disableCloseOnClickOutside: true, children: [_jsx(VModalTitle, { description: _description, children: _title }), renderModalContent(), renderModalFooter()] }, modalKey));\n}\n//# sourceMappingURL=DocumentUploadModal.js.map","import { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useDocumentSearch } from \"../search/DocumentSearchContext\";\nimport { FileUploadAction, useSmartFileUploadProcessing } from \"./useSmartFileUploadProcessing\";\n/**\n * Hook for handling file uploads to the store\n *\n * @param options Configuration options for the upload handler\n * @returns Upload handler function that takes files and type, and returns upload results\n */\nexport function useDocumentUploadHandler(options) {\n // Handle both object and legacy function format for backward compatibility\n const onUploadDone = typeof options === \"function\" ? options : options.onUploadDone;\n const { client, project: projectRef, store } = useUserSession();\n const search = useDocumentSearch();\n const toast = useToast();\n const { checkDocumentProcessing } = useSmartFileUploadProcessing();\n return async (files, type, collectionId) => {\n // Initialize result object\n const result = {\n success: false,\n objectIds: [],\n uploadedFiles: [],\n skippedFiles: [],\n failedFiles: [],\n };\n if (!projectRef) {\n toast({\n status: \"error\",\n title: \"No project selected\",\n duration: 3000,\n });\n return result;\n }\n if (!files || files.length === 0) {\n toast({\n status: \"warning\",\n title: \"No files selected\",\n duration: 3000,\n });\n return result;\n }\n const filesToUpload = Array.from(files).filter((file) => file.size > 0);\n if (filesToUpload.length === 0) {\n toast({\n status: \"error\",\n title: \"No valid files selected\",\n description: \"Please select files with valid content.\",\n duration: 5000,\n });\n return result;\n }\n const skippedFilesInfo = [];\n const uploadedFilesInfo = [];\n const failedFilesInfo = [];\n console.log(`Processing ${filesToUpload.length} files with smart file processing...`);\n // Determine if what need to be updated\n const filesWithMetadata = await checkDocumentProcessing(filesToUpload, null, collectionId);\n // Create statistics for user feedback\n const toCreate = filesWithMetadata.filter((f) => f.action === FileUploadAction.CREATE).length;\n const toUpdate = filesWithMetadata.filter((f) => f.action === FileUploadAction.UPDATE).length;\n const toSkip = filesWithMetadata.filter((f) => f.action === FileUploadAction.SKIP).length;\n // Show user feedback about processed files\n toast({\n title: \"Files analyzed\",\n description: `${filesToUpload.length} file(s): ${toCreate} new, ${toUpdate} to update, ${toSkip} to skip`,\n status: \"info\",\n duration: 4000,\n });\n // Process SKIP files - add them to skipped list and result IDs\n for (const fileInfo of filesWithMetadata.filter((f) => f.action === FileUploadAction.SKIP && f.existingId)) {\n skippedFilesInfo.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type,\n status: \"skipped\",\n location: fileInfo.location,\n });\n }\n // Collect files for processing (both CREATE and UPDATE)\n const filesToProcess = filesWithMetadata.filter((f) => (f.action === FileUploadAction.CREATE || f.action === FileUploadAction.UPDATE) && f.file);\n if (filesToProcess.length > 0) {\n console.log(`Processing ${filesToProcess.length} files (${filesToProcess.filter((f) => f.action === FileUploadAction.CREATE).length} create, ${filesToProcess.filter((f) => f.action === FileUploadAction.UPDATE).length} update)...`);\n // Create batches of 50 files\n const batchSize = 50;\n const processBatches = [];\n for (let i = 0; i < filesToProcess.length; i += batchSize) {\n processBatches.push(filesToProcess.slice(i, i + batchSize));\n }\n // Process each batch\n for (let batchIndex = 0; batchIndex < processBatches.length; batchIndex++) {\n const batch = processBatches[batchIndex];\n const processedCount = batchIndex * batchSize;\n console.log(`Processing batch ${batchIndex + 1}/${processBatches.length} (${batch.length} files)`);\n // Show progress for larger file sets\n if (filesToProcess.length > batchSize) {\n toast({\n title: \"Processing files\",\n description: `Processed ${processedCount}/${filesToProcess.length} files...`,\n status: \"info\",\n duration: 2000,\n });\n }\n // Process this batch in parallel\n const processResults = await Promise.all(batch.map(async (fileInfo) => {\n try {\n if (fileInfo.action === FileUploadAction.UPDATE && fileInfo.existingId) {\n // UPDATE - Update the existing object\n const updateResult = await client.store.objects.update(fileInfo.existingId, {\n type: type || undefined,\n content: fileInfo.file,\n location: fileInfo.location,\n name: fileInfo.name,\n }, {\n createRevision: true,\n revisionLabel: \"upload on \" + new Date().toISOString(),\n });\n // Use a separate data structure for updated files\n uploadedFilesInfo.push({\n id: fileInfo.existingId,\n name: fileInfo.name,\n type,\n status: \"updated\",\n location: fileInfo.location,\n });\n // Add to result IDs\n result.objectIds.push(fileInfo.existingId);\n return {\n success: true,\n id: updateResult.id,\n name: fileInfo.name,\n action: \"update\",\n };\n }\n else {\n // CREATE - Create a new object\n // If collectionId is provided, pass it as an option\n const options = collectionId ? { collection_id: collectionId } : undefined;\n const createResult = await store.objects.create({\n type: type || undefined,\n content: fileInfo.file,\n location: fileInfo.location || fileInfo.file.webkitRelativePath || fileInfo.name,\n }, options);\n // Track successful upload\n uploadedFilesInfo.push({\n id: createResult.id,\n name: fileInfo.name,\n type,\n status: \"created\",\n location: fileInfo.location,\n });\n }\n }\n catch (error) {\n console.error(`Failed to process file ${fileInfo.name}:`, error);\n // Track failed upload\n failedFilesInfo.push({\n name: fileInfo.name,\n error: error.message || \"Unknown error\",\n status: \"failed\",\n location: fileInfo.location,\n type,\n });\n toast({\n status: \"error\",\n title: `Processing failed for ${fileInfo.name}`,\n description: error.message,\n duration: 4000,\n });\n }\n }));\n // Log batch results\n const creates = uploadedFilesInfo.filter((f) => f.status === \"created\");\n const updates = uploadedFilesInfo.filter((f) => f.status === \"updated\");\n const failures = uploadedFilesInfo.filter((f) => f.status === \"failed\");\n console.log(`Batch ${batchIndex + 1} results:`, {\n creates,\n updates,\n failures,\n total: processResults.length,\n });\n }\n }\n const uploadedCount = uploadedFilesInfo.filter((f) => f.status === \"created\").length;\n const updatedCount = uploadedFilesInfo.filter((f) => f.status === \"updated\").length;\n const failedCount = uploadedFilesInfo.filter((f) => f.status === \"failed\").length;\n const skippedCount = uploadedFilesInfo.filter((f) => f.status === \"skipped\").length;\n // Call the original callback with all object IDs and additional metadata\n if (onUploadDone) {\n // Log the actual upload count for debugging\n console.log(\"Upload complete:\", {\n totalObjectIds: result.objectIds.length,\n uploadedFiles: uploadedCount,\n updatedFiles: updatedCount,\n skippedFiles: skippedCount,\n failedFiles: failedCount,\n });\n // Call the callback with all object IDs\n await onUploadDone(result.objectIds);\n }\n // Create a success message that includes information about all file operations\n let statusMessage = \"\";\n if (uploadedCount > 0) {\n statusMessage += `${uploadedCount} file${uploadedCount !== 1 ? \"s\" : \"\"} uploaded`;\n }\n if (updatedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${updatedCount} file${updatedCount !== 1 ? \"s\" : \"\"} updated`;\n }\n if (skippedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${skippedCount} file${skippedCount !== 1 ? \"s\" : \"\"} skipped (already existed)`;\n }\n if (failedCount > 0) {\n statusMessage += statusMessage ? \", \" : \"\";\n statusMessage += `${failedCount} file${failedCount !== 1 ? \"s\" : \"\"} failed`;\n }\n if (statusMessage) {\n toast({\n status: failedCount > 0 ? \"warning\" : \"success\",\n title: statusMessage,\n duration: 4000,\n });\n }\n // Refresh search results\n search.search();\n return result;\n };\n}\n//# sourceMappingURL=useUploadHandler.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Spinner, useToast } from \"@vertesia/ui/core\";\nimport { DropZone } from '@vertesia/ui/widgets';\nimport clsx from \"clsx\";\nimport { useMemo, useState } from \"react\";\nimport { useOptionalDocumentSelection } from \"./DocumentSelectionProvider\";\nimport { DocumentTableColumn } from \"./layout/DocumentTableColumn\";\nimport { DocumentGridView, DocumentTableView } from \"./layout/documentLayout\";\nimport { useDocumentSearch } from \"./search/DocumentSearchContext\";\nimport { DocumentUploadModal, useSmartFileUploadProcessing } from \"./upload\";\nconst defaultLayout = [\n { name: \"ID\", field: \"id\", type: \"objectId?slice=-7\" },\n { name: \"Name\", field: \".\", type: \"objectName\" },\n { name: \"Type\", field: \"type.name\", type: \"string\" },\n { name: \"Status\", field: \"status\", type: \"string\" },\n { name: \"Updated At\", field: \"updated_at\", type: \"date\" },\n];\nexport function DocumentTable({ isGridView = false, onUpload, collectionId, ...others }) {\n if (onUpload) {\n return (_jsx(ObjectTableWithDropZone, { ...others, onUpload: onUpload, isGridView: isGridView, collectionId: collectionId }));\n }\n else {\n return _jsx(DocumentTableImpl, { ...others, isGridView: isGridView });\n }\n}\nfunction ObjectTableWithDropZone({ isGridView, onUpload, collectionId, skipTypeModal = false, ...others }) {\n const [isLoading, setLoading] = useState(false);\n const [files, setFiles] = useState([]);\n const [isDragging, setIsDragging] = useState(false);\n const [processedFiles, setProcessedFiles] = useState(null);\n const [typeSelectionOpen, setTypeSelectionOpen] = useState(false);\n const search = useDocumentSearch();\n const toast = useToast();\n const { checkDocumentProcessing } = useSmartFileUploadProcessing();\n // Handle file uploads when a file is dropped\n const handleFileDrop = async (droppedFiles, feedback) => {\n console.log(\"Files dropped on ObjectTable:\", droppedFiles.length, feedback);\n setLoading(true);\n try {\n // Always process files with the smart upload processing if we have a collection ID\n if (collectionId) {\n // Process files to check for duplicates, updates, etc.\n const processed = await checkDocumentProcessing(droppedFiles, null, collectionId);\n setProcessedFiles(processed);\n // Create a user-friendly summary message\n const toCreate = processed.filter((f) => f.action === \"create\").length;\n const toUpdate = processed.filter((f) => f.action === \"update\").length;\n const toSkip = processed.filter((f) => f.action === \"skip\").length;\n toast({\n title: \"Files ready to process\",\n description: `${droppedFiles.length} file(s): ${toCreate} new, ${toUpdate} to update, ${toSkip} to skip`,\n status: \"info\",\n duration: 4000,\n });\n }\n else {\n // If no collection ID, we can't check for duplicates\n setProcessedFiles(null);\n }\n }\n catch (error) {\n console.error(\"Error processing files:\", error);\n toast({\n title: \"Error processing files\",\n description: \"There was an error checking for duplicate files\",\n status: \"error\",\n duration: 4000,\n });\n // Continue with plain upload in case of error\n setProcessedFiles(null);\n }\n finally {\n setLoading(false);\n setFiles(droppedFiles);\n setIsDragging(false);\n if (skipTypeModal) {\n // If skipTypeModal is true, we skip our internal modal and call onUpload directly\n console.log(\"Skipping type modal and calling onUpload directly\", {\n filesLength: droppedFiles.length,\n processedFilesLength: processedFiles?.length,\n });\n // Pass processed files as a custom property and collectionId as the third parameter\n const uploadPromise = onUpload(droppedFiles, null, collectionId);\n // Attach the processed files to the promise for parent components to use\n if (uploadPromise && typeof uploadPromise === \"object\") {\n uploadPromise.processedFiles = processedFiles;\n }\n }\n else {\n // Otherwise, open our type selection modal\n console.log(\"Setting typeSelectionOpen to true\", { filesLength: droppedFiles.length });\n setTypeSelectionOpen(true);\n }\n }\n };\n // Handle the type selection and start the upload\n const onDoUpload = (typeId) => {\n const filesToUpload = [...files]; // Make a copy to be safe\n // Reset state variables\n setFiles([]);\n setProcessedFiles(null);\n setTypeSelectionOpen(false);\n // If typeid is undefined we cancel the upload\n if (filesToUpload.length > 0 && typeId !== undefined) {\n setLoading(true);\n console.log(\"Starting upload with\", {\n typeId,\n filesCount: filesToUpload.length,\n hasProcessingResults: !!processedFiles,\n collectionId,\n });\n onUpload(filesToUpload, typeId, collectionId).finally(() => {\n setLoading(false);\n search.search(); // Refresh the search results after upload\n });\n }\n };\n // Handle drag events to show the drop zone\n const handleDragOver = (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n };\n const handleDragLeave = (e) => {\n e.preventDefault();\n e.stopPropagation();\n // Only set dragging to false if leaving the container (not entering a child)\n if (e.currentTarget.contains(e.relatedTarget)) {\n return;\n }\n setIsDragging(false);\n };\n return (_jsxs(\"div\", { className: \"min-h-[400px] relative\", onDragOver: handleDragOver, onDragEnter: handleDragOver, onDragLeave: handleDragLeave, onDrop: (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n // Get the files from the drop event\n if (e.dataTransfer.items) {\n const files = [];\n for (let i = 0; i < e.dataTransfer.items.length; i++) {\n const item = e.dataTransfer.items[i];\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file)\n files.push(file);\n }\n }\n if (files.length > 0) {\n const feedback = {\n count: files.length,\n message: `Preparing to upload ${files.length} file${files.length === 1 ? \"\" : \"s\"}...`,\n };\n handleFileDrop(files, feedback);\n }\n }\n }, children: [_jsx(\"div\", { className: clsx(\"bg-white dark:bg-gray-800 opacity-40 absolute inset-0 z-50 flex justify-center items-center\", isLoading ? \"block\" : \"hidden\"), children: _jsx(Spinner, { size: \"xl\" }) }), _jsx(DocumentTableImpl, { ...others, isGridView: isGridView }), _jsx(\"div\", { className: clsx(\"absolute inset-0 pointer-events-none\", isDragging ? \"z-40\" : \"-z-10\"), children: _jsx(\"div\", { className: \"w-full h-full relative\", children: _jsx(DropZone, { onDrop: handleFileDrop, message: \"Drop files or folders here to upload\", className: clsx(\"absolute inset-0 bg-white/90 dark:bg-gray-800/90 pointer-events-auto\", isDragging ? \"flex\" : \"hidden\"), buttonLabel: \"Select Files or Folders\", allowFolders: true }) }) }), _jsx(DocumentUploadModal, { isOpen: typeSelectionOpen && files.length > 0, onClose: () => {\n // Reset state variables and close the modal\n setFiles([]);\n setProcessedFiles(null);\n setTypeSelectionOpen(false);\n onDoUpload(undefined);\n }, files: files, collectionId: collectionId, selectedFolder: null, title: \"Upload Files\", onUploadComplete: (result) => {\n // Handle upload completion\n if (result) {\n // If there are failures, show them\n if (result.failedFiles && result.failedFiles.length > 0) {\n toast({\n title: \"Upload Issues\",\n description: `${result.failedFiles.length} file(s) failed to upload`,\n status: \"warning\",\n duration: 5000,\n });\n }\n // On success, summarize the results\n if (result.success) {\n const created = result.uploadedFiles.filter((f) => f.status === \"created\").length;\n const updated = result.uploadedFiles.filter((f) => f.status === \"updated\").length;\n const skipped = result.skippedFiles.length;\n if (created > 0 || updated > 0) {\n toast({\n title: \"Upload Complete\",\n description: `${created > 0 ? `${created} created` : \"\"}${created > 0 && updated > 0 ? \", \" : \"\"}${updated > 0 ? `${updated} updated` : \"\"}${skipped > 0 ? `, ${skipped} skipped` : \"\"}`,\n status: \"success\",\n duration: 5000,\n });\n }\n }\n // Force search refresh\n search.search();\n }\n // Close modal and reset state without passing result\n setFiles([]);\n setProcessedFiles(null);\n setTypeSelectionOpen(false);\n // Complete the upload process with type ID if successful\n if (result && result.success && result.objectIds.length > 0) {\n // We don't have type information here, so pass null (process completed)\n onDoUpload(null);\n }\n else {\n // Cancel the upload\n onDoUpload(undefined);\n }\n } })] }));\n}\nfunction DocumentTableImpl({ objects, layout = defaultLayout, isLoading, onRowClick, onSelectionChange, previewObject, selectedObject, isGridView, }) {\n const selection = useOptionalDocumentSelection();\n const _onSelectionChange = (object, ev) => {\n if (selection) {\n const isShift = ev.nativeEvent.shiftKey;\n const checked = ev.target.checked;\n if (!checked) {\n selection.remove(object.id);\n }\n else {\n selection.add(object);\n if (isShift) {\n const index = objects.findIndex((obj) => obj.id === object.id);\n const prev = findPreviousSelected(objects, index, selection);\n if (prev > -1 && prev < index - 1) {\n const toSelect = [];\n for (let i = prev + 1; i < index; i++) {\n toSelect.push(objects[i]);\n }\n selection.addAll(toSelect);\n }\n else {\n const next = findNextSelected(objects, index, selection);\n if (next > -1 && next > index + 1) {\n const toSelect = [];\n for (let i = index + 1; i < next; i++) {\n toSelect.push(objects[i]);\n }\n selection.addAll(toSelect);\n }\n }\n }\n }\n onSelectionChange && onSelectionChange(selection);\n }\n };\n const toggleAll = (ev) => {\n if (selection) {\n const checked = ev.target.checked;\n if (!checked) {\n // remove all\n selection.removeAll();\n }\n else {\n selection.addAll(objects);\n }\n }\n };\n const columns = useMemo(() => {\n // avoid rendering empty layouts\n const actualLayout = layout.length > 0 ? layout : defaultLayout;\n return actualLayout.map((col) => new DocumentTableColumn(col, previewObject));\n }, [layout, previewObject]);\n return isGridView ? (_jsx(DocumentGridView, { objects: objects, isLoading: isLoading, columns: columns, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject, selection: selection, toggleAll: toggleAll, onSelectionChange: _onSelectionChange })) : (_jsx(DocumentTableView, { objects: objects, isLoading: isLoading, columns: columns, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject, selection: selection, toggleAll: toggleAll, onSelectionChange: _onSelectionChange }));\n}\nfunction findPreviousSelected(objects, index, selection) {\n for (let i = index - 1; i >= 0; i--) {\n if (selection.isSelected(objects[i].id)) {\n return i;\n }\n }\n return -1;\n}\nfunction findNextSelected(objects, index, selection) {\n const length = objects.length;\n for (let i = index + 1; i < length; i++) {\n if (selection.isSelected(objects[i].id)) {\n return i;\n }\n }\n return -1;\n}\n//# sourceMappingURL=DocumentTable.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useMemo } from \"react\";\nimport { DocumentSearch, SearchContext } from \"./DocumentSearchContext\";\nexport function DocumentSearchProvider({ children, limit, parent, typeId, facets, name, collectionId }) {\n const { store } = useUserSession();\n const search = useMemo(() => {\n let facetSpecs;\n if (facets) {\n facetSpecs = facets;\n }\n else {\n facetSpecs = [\n {\n name: 'status',\n field: 'status'\n },\n {\n name: 'location',\n field: 'location'\n }\n ];\n if (!typeId) {\n facetSpecs.unshift({\n name: 'type',\n field: 'type'\n });\n }\n }\n const search = new DocumentSearch(store, limit).withFacets(facetSpecs);\n search.collectionId = collectionId;\n search.query.type = typeId;\n search.query.parent = parent;\n search.query.name = name;\n return search;\n }, [typeId, limit, collectionId]);\n return (_jsx(SearchContext.Provider, { value: search, children: children }));\n}\n//# sourceMappingURL=DocumentSearchProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { clsx } from \"clsx\";\nimport { RefreshCw } from \"lucide-react\";\nimport { DocumentsFacetsNav } from \"../../../facets\";\nimport { DocumentTable } from \"../DocumentTable\";\nimport { useDocumentSearch, useWatchDocumentSearchFacets, useWatchDocumentSearchResult } from \"../search/DocumentSearchContext\";\nimport { DocumentSearchProvider } from \"../search/DocumentSearchProvider\";\nimport { ContentDispositionButton } from \"./ContentDispositionButton\";\nimport { Button, ErrorBox, Spinner, useIntersectionObserver } from \"@vertesia/ui/core\";\nconst layout = [\n { \"name\": \"Name\", \"field\": \"properties.title\", \"type\": \"string\", \"fallback\": \"name\" },\n { \"name\": \"Type\", \"field\": \"type.name\", \"type\": \"string\" },\n { \"name\": \"Status\", \"field\": \"status\", \"type\": \"string\" },\n { \"name\": \"Created At\", \"field\": \"created_at\", \"type\": \"date\" }\n];\nconst LAST_DISPLAYED_VIEW = \"vertesia.content_store.lastDisplayedView\";\nexport function SelectDocument({ onChange }) {\n const onRowClick = (selected) => {\n onChange(selected || undefined);\n };\n return (_jsx(DocumentSearchProvider, { children: _jsx(SelectDocumentImpl, { onRowClick: onRowClick }) }));\n}\nfunction SelectDocumentImpl({ onRowClick }) {\n const [isReady, setIsReady] = useState(false);\n const [isGridView, setIsGridView] = useState(localStorage.getItem(LAST_DISPLAYED_VIEW) === \"grid\");\n const { search, isLoading, error, objects, hasMore } = useWatchDocumentSearchResult();\n const loadMoreRef = useRef(null);\n useIntersectionObserver(loadMoreRef, () => {\n if (isReady && hasMore && !isLoading) {\n setIsReady(false);\n search.loadMore(true)\n .finally(() => {\n setIsReady(true);\n });\n }\n }, { threshold: 0.1, deps: [isReady, hasMore, isLoading] });\n useEffect(() => {\n search.search()\n .finally(() => {\n setIsReady(true);\n });\n }, []);\n const facets = useWatchDocumentSearchFacets();\n const facetSearch = useDocumentSearch();\n const handleRefetch = () => {\n setIsReady(false);\n search.search().then(() => setIsReady(true));\n };\n if (error) {\n return _jsx(ErrorBox, { title: \"Search failed\", children: error.message });\n }\n return (_jsxs(\"div\", { className: \"flex flex-col gap-2 h-full w-full\", children: [_jsxs(\"div\", { className: \"flex justify-between items-center flex-shrink-0\", children: [_jsx(DocumentsFacetsNav, { facets: facets, search: facetSearch }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(Button, { variant: \"outline\", onClick: handleRefetch, alt: \"Refresh\", children: _jsx(RefreshCw, { size: 16 }) }), _jsx(ContentDispositionButton, { onUpdate: setIsGridView })] })] }), _jsxs(\"div\", { className: \"@container flex-1 overflow-y-auto\", children: [_jsx(DocumentTable, { objects: objects || [], isLoading: false, layout: layout, onRowClick: onRowClick, isGridView: isGridView }), _jsx(\"div\", { ref: loadMoreRef, className: \"h-4 w-full\" }), _jsx(\"div\", { className: clsx(\"bg-white dark:bg-gray-800 opacity-80 absolute inset-0 z-50 flex justify-center items-center rounded\", isLoading ? \"block\" : \"hidden\"), children: _jsx(Spinner, { size: \"xl\" }) })] })] }));\n}\n//# sourceMappingURL=SelectDocument.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VModal, VModalBody, VModalTitle } from \"@vertesia/ui/core\";\nimport { SelectDocument } from \"./SelectDocument\";\nexport function SelectDocumentModal({ isOpen, onClose }) {\n return (_jsxs(VModal, { onClose: () => onClose(), isOpen: !!isOpen, className: 'min-w-[60vw]', children: [_jsx(VModalTitle, { children: \"Select Content\" }), _jsx(VModalBody, { className: 'pt-0 overflow-y-auto max-h-[80vh] min-h-[80vh]', children: isOpen && _jsx(SelectDocument, { onChange: onClose }) })] }));\n}\n//# sourceMappingURL=SelectDocumentModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport clsx from 'clsx';\nimport { useEffect, useState } from 'react';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { ChevronsUpDown, X } from 'lucide-react';\nimport { Button, Styles, useFlag } from '@vertesia/ui/core';\nimport { SelectDocumentModal } from './SelectDocumentModal';\nconst STORE_REGEX = /store:([a-f0-9]+)/;\nexport function DocumentInput({ object }) {\n const { client } = useUserSession();\n const { off, on, isOn } = useFlag();\n const [actualValue, setValue] = useState(object.value != null ? String(object.value) : '');\n const [doc, setDoc] = useState(undefined);\n const _onChange = (event) => {\n const value = event.target.value;\n setValue(value);\n object.value = value;\n };\n const clearValue = () => {\n setValue('');\n object.value = '';\n setDoc(undefined);\n };\n const onSelect = (value) => {\n if (value) {\n const uri = \"store:\" + value.id;\n setValue(uri);\n setDoc(value || undefined);\n object.value = uri;\n }\n off();\n };\n useEffect(() => {\n if (!actualValue || doc) {\n return;\n }\n const match = actualValue.match(STORE_REGEX);\n if (!match) {\n return;\n }\n client.objects.get(match[1]).then((doc) => {\n setDoc(doc);\n }).catch(() => {\n clearValue();\n });\n }, [actualValue]);\n return (_jsxs(\"div\", { children: [_jsxs(\"div\", { className: \"relative\", children: [_jsx(\"input\", { value: actualValue, onChange: _onChange, className: clsx(Styles.INPUT, \"pr-10 w-full\") }), doc &&\n _jsx(\"div\", { className: \"absolute inset-y-0 right-10 flex items-center justify-center \", children: _jsx(Button, { onClick: clearValue, variant: 'unstyled', className: 'hover:text-red-500 hover:bg-gray-100 dark:hover:bg-gray-600', children: _jsx(X, { className: \"size-5\" }) }) }), _jsx(\"div\", { className: \"absolute inset-y-0 right-0 flex items-center justify-center\", children: _jsx(Button, { onClick: on, variant: 'unstyled', className: 'hover:bg-gray-100 dark:hover:bg-gray-600', children: _jsx(ChevronsUpDown, { className: \"size-5\" }) }) }), _jsx(SelectDocumentModal, { value: actualValue, isOpen: isOn, onClose: onSelect })] }), doc &&\n _jsx(\"div\", { className: \"p-1 semibold text-sm text-gray-600 dark:text-slate-300\", children: doc.properties?.title || doc.name })] }));\n}\n//# sourceMappingURL=DocumentInput.js.map","export function useDownloadDocument(client, toast, uri, name) {\n const onDownload = () => {\n if (uri) {\n client.files\n .getDownloadUrlWithOptions({ file: uri, name })\n .then((r) => {\n window.open(r.url, \"_blank\");\n })\n .catch((err) => {\n toast({\n status: \"error\",\n title: \"Failed to get download URL\",\n description: err.message,\n duration: 5000,\n });\n });\n }\n };\n return onDownload;\n}\n//# sourceMappingURL=useDownloadObject.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { ImageRenditionFormat } from \"@vertesia/common\";\nimport { Button, Spinner, useToast } from \"@vertesia/ui/core\";\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { JSONDisplay, MarkdownRenderer } from \"@vertesia/ui/widgets\";\nimport { ChevronRight, Download, FileText, Info, LayoutGrid, Maximize2, X, } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nexport function DocumentPreviewPanel({ objectId, isOpen, onClose, }) {\n const navigate = useNavigate();\n const { client, store } = useUserSession();\n const [object, setObject] = useState(null);\n const [isLoading, setIsLoading] = useState(false);\n const [loadingText, setLoadingText] = useState(false);\n const [text, setText] = useState();\n const [imageUrl, setImageUrl] = useState();\n const [currentTab, setCurrentTab] = useState(\"preview\");\n const toast = useToast();\n useEffect(() => {\n if (objectId && isOpen) {\n setIsLoading(true);\n store.objects\n .retrieve(objectId, \"+embeddings\")\n .then((result) => {\n setObject(result);\n // If the object has text, use it\n if (result.text) {\n setText(result.text);\n }\n else {\n // Otherwise, fetch text\n loadObjectText(result.id);\n }\n // If it's an image, load the image URL\n const content = result.content;\n const isImage = content &&\n content.source &&\n content.type &&\n content.type.startsWith(\"image/\");\n if (isImage) {\n loadImageUrl(result);\n }\n })\n .catch((error) => {\n console.error(\"Error loading object:\", error);\n toast({\n title: \"Error\",\n description: \"Failed to load document\",\n status: \"error\",\n duration: 3000,\n });\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n else {\n // Reset state when panel closes\n setObject(null);\n setText(undefined);\n setImageUrl(undefined);\n }\n }, [objectId, isOpen, store.objects]);\n const loadObjectText = async (id) => {\n setLoadingText(true);\n try {\n const result = await store.objects.getObjectText(id);\n setText(result.text);\n }\n catch (error) {\n console.error(\"Error loading text:\", error);\n }\n finally {\n setLoadingText(false);\n }\n };\n const loadImageUrl = async (obj) => {\n try {\n // Try to get a rendition first\n const rendition = await client.objects.getRendition(obj.id, {\n format: ImageRenditionFormat.jpeg,\n generate_if_missing: false,\n });\n // Don't use rendition object to avoid type issues\n if (rendition.status === \"found\") {\n console.log(\"Found rendition\");\n }\n // Get download URL\n const downloadUrlResult = await client.files.getDownloadUrl(obj.content.source);\n setImageUrl(downloadUrlResult.url);\n }\n catch (error) {\n console.error(\"Error loading image:\", error);\n }\n };\n const handleViewFullDocument = () => {\n if (object) {\n navigate(`/legal/objects/${object.id}`);\n onClose();\n }\n };\n const seemsMarkdown = text &&\n (text.startsWith(\"#\") || text.includes(\"\\n#\") || text.includes(\"\\n*\"));\n const isImage = object?.content?.type && object.content.type.startsWith(\"image/\");\n const isPdf = object?.content?.type === \"application/pdf\";\n if (!isOpen)\n return null;\n return (_jsxs(\"div\", { className: `fixed inset-y-0 right-0 w-2/5 dark:bg-slate-900 shadow-xl z-50 flex flex-col transition-transform duration-300 transform ${isOpen ? \"translate-x-0\" : \"translate-x-full\"}`, children: [_jsxs(\"div\", { className: \"flex items-center justify-between px-4 py-3 border-b dark:border-gray-700 bg-gradient-to-r from-indigo-50 to-gray-50 dark:from-gray-800 dark:to-gray-900\", children: [_jsxs(\"div\", { className: \"flex items-center\", children: [_jsx(FileText, { className: \"h-5 w-5 text-indigo-600 mr-2\" }), _jsx(\"h2\", { className: \"text-lg font-semibold text-gray-800 dark:text-gray-200 truncate\", children: isLoading\n ? \"Loading document...\"\n : object?.name || \"Document Preview\" })] }), _jsxs(\"div\", { className: \"flex items-center space-x-2\", children: [_jsxs(Button, { variant: \"ghost\", size: \"sm\", onClick: handleViewFullDocument, className: \"flex items-center gap-1 text-indigo-600 hover:text-indigo-800\", children: [_jsx(Maximize2, { className: \"h-4 w-4\" }), _jsx(\"span\", { children: \"Full View\" })] }), _jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: onClose, className: \"flex items-center text-gray-600 hover:text-gray-800 dark:text-gray-300 dark:hover:text-gray-100\", children: _jsx(X, { className: \"h-5 w-5\" }) })] })] }), isLoading ? (_jsx(\"div\", { className: \"flex-1 flex items-center justify-center\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsx(Spinner, { size: \"lg\", className: \"text-indigo-600 dark:text-indigo-400 mb-2\" }), _jsx(\"p\", { className: \"text-gray-600 dark:text-gray-400\", children: \"Loading document...\" })] }) })) : (_jsxs(\"div\", { className: \"flex-1 flex flex-col h-full\", children: [_jsx(\"div\", { className: \"border-b\", children: _jsxs(\"div\", { className: \"flex px-4\", children: [_jsx(\"button\", { className: `py-2 px-4 font-medium border-b-2 ${currentTab === \"preview\"\n ? \"border-indigo-600 text-indigo-700 dark:text-indigo-300\"\n : \"border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"}`, onClick: () => setCurrentTab(\"preview\"), children: _jsxs(\"div\", { className: \"flex items-center gap-1\", children: [_jsx(LayoutGrid, { className: \"h-4 w-4\" }), _jsx(\"span\", { children: \"Preview\" })] }) }), _jsx(\"button\", { className: `py-2 px-4 font-medium border-b-2 ${currentTab === \"properties\"\n ? \"border-indigo-600 text-indigo-700 dark:text-indigo-300\"\n : \"border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"}`, onClick: () => setCurrentTab(\"properties\"), children: _jsxs(\"div\", { className: \"flex items-center gap-1\", children: [_jsx(Info, { className: \"h-4 w-4\" }), _jsx(\"span\", { children: \"Properties\" })] }) })] }) }), _jsxs(\"div\", { className: \"flex-1 overflow-auto p-4\", children: [currentTab === \"preview\" && (_jsxs(\"div\", { className: \"h-full\", children: [loadingText ? (_jsx(\"div\", { className: \"flex items-center justify-center h-40\", children: _jsx(Spinner, { size: \"md\", className: \"text-indigo-600 dark:text-indigo-400\" }) })) : text ? (_jsx(\"div\", { className: \"shadow rounded-md p-4 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\", children: seemsMarkdown ? (_jsx(\"div\", { className: \"prose prose-sm max-w-none prose-p:my-2 prose-pre:bg-gray-800 prose-pre:my-2 prose-headings:text-indigo-700 dark:prose-invert dark:prose-headings:text-indigo-300\", children: _jsx(MarkdownRenderer, { children: text }) })) : (_jsx(\"pre\", { className: \"text-wrap whitespace-pre-wrap dark:text-gray-200\", children: text })) })) : null, isImage && (_jsx(\"div\", { className: \"mt-4\", children: imageUrl ? (_jsx(\"div\", { className: \"border border-gray-200 dark:border-gray-700 rounded-md p-2 bg-white dark:bg-gray-800\", children: _jsx(\"img\", { src: imageUrl, alt: object?.name, className: \"mx-auto max-h-[70vh] object-contain\" }) })) : (_jsx(\"div\", { className: \"flex items-center justify-center h-40\", children: _jsx(Spinner, { size: \"md\", className: \"text-indigo-600 dark:text-indigo-400\" }) })) })), isPdf && (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center h-64 border border-gray-200 dark:border-gray-700 rounded-md p-4 bg-gray-50 dark:bg-gray-800\", children: [_jsx(FileText, { className: \"h-16 w-16 text-indigo-300 dark:text-indigo-400 mb-4\" }), _jsxs(\"p\", { className: \"text-gray-600 dark:text-gray-400 text-center mb-4\", children: [\"PDF document preview is available in full view. TODO\", \" \"] }), _jsx(Button, { onClick: handleViewFullDocument, className: \"bg-indigo-600 hover:bg-indigo-700 text-white\", children: \"Open Full Document View\" })] })), !isImage && !text && !isPdf && !loadingText && (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center h-64 border border-gray-200 dark:border-gray-700 rounded-md p-4 bg-gray-50 dark:bg-gray-800\", children: [_jsx(FileText, { className: \"h-16 w-16 text-gray-300 dark:text-gray-600 mb-4\" }), _jsx(\"p\", { className: \"text-gray-600 dark:text-gray-400 text-center\", children: \"No preview available for this document type.\" })] }))] })), currentTab === \"properties\" && object && (_jsxs(\"div\", { className: \"h-full\", children: [object.properties ? (_jsx(\"div\", { className: \"shadow rounded-md p-4 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\", children: _jsx(JSONDisplay, { value: object.properties }) })) : (_jsxs(\"div\", { className: \"flex flex-col items-center justify-center h-64 border border-gray-200 dark:border-gray-700 rounded-md p-4 bg-gray-50 dark:bg-gray-800\", children: [_jsx(Info, { className: \"h-16 w-16 text-gray-300 dark:text-gray-600 mb-4\" }), _jsx(\"p\", { className: \"text-gray-600 dark:text-gray-400 text-center\", children: \"No properties available for this document.\" })] })), _jsxs(\"div\", { className: \"mt-4\", children: [_jsx(\"h3\", { className: \"text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2\", children: \"Document Information\" }), _jsx(\"div\", { className: \"shadow rounded-md p-4 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\", children: _jsxs(\"div\", { className: \"grid grid-cols-2 gap-y-2 gap-x-4 text-sm\", children: [_jsx(\"div\", { className: \"text-gray-500 dark:text-gray-400\", children: \"ID\" }), _jsx(\"div\", { className: \"font-medium dark:text-gray-200\", children: object.id }), _jsx(\"div\", { className: \"text-gray-500 dark:text-gray-400\", children: \"Type\" }), _jsx(\"div\", { className: \"font-medium dark:text-gray-200\", children: object.type?.name || \"Unknown\" }), _jsx(\"div\", { className: \"text-gray-500 dark:text-gray-400\", children: \"Content Type\" }), _jsx(\"div\", { className: \"font-medium dark:text-gray-200\", children: object.content?.type || \"N/A\" }), _jsx(\"div\", { className: \"text-gray-500\", children: \"Size\" }), _jsx(\"div\", { className: \"font-medium\", children: object.content && \"size\" in object.content\n ? formatFileSize(object.content.size)\n : \"Unknown\" }), _jsx(\"div\", { className: \"text-gray-500\", children: \"Created\" }), _jsx(\"div\", { className: \"font-medium\", children: object.created_at\n ? new Date(object.created_at).toLocaleString()\n : \"N/A\" }), _jsx(\"div\", { className: \"text-gray-500\", children: \"Updated\" }), _jsx(\"div\", { className: \"font-medium\", children: object.updated_at\n ? new Date(object.updated_at).toLocaleString()\n : \"N/A\" })] }) })] })] }))] })] })), _jsxs(\"div\", { className: \"flex items-center justify-between p-4 border-t bg-gray-50 dark:bg-gray-800 dark:border-gray-700\", children: [_jsx(\"div\", { children: object?.content?.source && (_jsxs(Button, { onClick: () => {\n if (object?.content?.source) {\n client.files\n .getDownloadUrl(object.content.source)\n .then((result) => {\n window.open(result.url, \"_blank\");\n })\n .catch((error) => {\n console.error(\"Error getting download URL:\", error);\n toast({\n title: \"Error\",\n description: \"Failed to download file\",\n status: \"error\",\n duration: 3000,\n });\n });\n }\n }, variant: \"outline\", className: \"text-indigo-600 border-indigo-300 hover:bg-indigo-50\", children: [_jsx(Download, { className: \"h-4 w-4 mr-2\" }), \"Download\"] })) }), _jsxs(Button, { onClick: handleViewFullDocument, className: \"bg-indigo-600 hover:bg-indigo-700 text-white\", children: [\"Open Full Document\", _jsx(ChevronRight, { className: \"h-4 w-4 ml-2\" })] })] })] }));\n}\nfunction formatFileSize(bytes) {\n if (bytes === 0)\n return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n//# sourceMappingURL=DocumentPreviewPanel.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useState } from 'react';\nimport { SearchTypes, SupportedEmbeddingTypes } from '@vertesia/common';\nimport { Button, Checkbox, Input, Modal, ModalBody, ModalFooter, ModalTitle, NumberInput, useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { Settings } from 'lucide-react';\nconst allTypes = Object.values(SearchTypes);\nconst embeddingTypes = Object.values(SupportedEmbeddingTypes);\nexport function VectorSearchWidget({ onChange, isLoading, refresh, searchTypes }) {\n const { client, project } = useUserSession();\n const toast = useToast();\n const [searchText, setSearchText] = useState(undefined);\n const [config, setConfig] = useState(undefined);\n const isReady = !!project && (!!config?.embeddings.text || !!config?.embeddings.image);\n const [status, setStatus] = useState(undefined);\n const [showSettings, setShowSettings] = useState(false);\n // Default to all types, or use prop if provided\n const [selectedTypes, setSelectedTypes] = useState(searchTypes || allTypes);\n const [limit, setLimit] = useState(100);\n useEffect(() => {\n if (searchTypes)\n setSelectedTypes(searchTypes);\n }, [searchTypes]);\n // Always derive embeddingSearchTypes and full_text from selectedTypes\n const embeddingSearchTypes = {};\n let fullTextEnabled = false;\n let vectorSearchEnabled = false;\n selectedTypes.forEach(type => {\n if (type === SearchTypes.full_text) {\n fullTextEnabled = true;\n }\n else {\n vectorSearchEnabled = true;\n }\n if (embeddingTypes.includes(type)) {\n embeddingSearchTypes[type] = true;\n }\n });\n useEffect(() => {\n setSearchText(undefined);\n setStatus(undefined);\n }, [refresh]);\n useEffect(() => {\n if (!project)\n return;\n client.projects.retrieve(project.id).then((project) => {\n setConfig(project.configuration);\n });\n }, [project]);\n useEffect(() => {\n if (status) {\n toast({ title: status, status: 'success', duration: 2000 });\n }\n }, [status]);\n useEffect(() => {\n if (!searchText || searchText.length === 0) {\n onChange(undefined);\n }\n }, [searchText]);\n const fireSearch = () => {\n if (!isReady || !searchText)\n return;\n const query = {\n vector: vectorSearchEnabled ? {\n text: searchText,\n config: embeddingSearchTypes,\n } : undefined,\n full_text: fullTextEnabled ? searchText : undefined,\n limit: limit\n };\n onChange(query);\n setStatus(\"Searching...\");\n };\n const handleKeyPress = (e) => {\n if (e.key === \"Enter\") {\n fireSearch();\n }\n };\n // Modal state for search type selection\n const handleCheckboxChange = (type) => (checked) => {\n if (checked) {\n setSelectedTypes(prev => Array.from(new Set([...prev, type])));\n }\n else {\n setSelectedTypes(prev => prev.filter(t => t !== type));\n }\n };\n return (_jsxs(\"div\", { className: \"flex gap-1 items-center w-1/2\", children: [_jsx(Input, { placeholder: \"Type what you are looking for, or select a filter\", value: searchText, onChange: setSearchText, onKeyDown: handleKeyPress }), _jsx(Button, { variant: \"ghost\", onClick: () => setShowSettings(true), alt: \"Semantic search settings\", className: \"ml-1\", children: _jsx(Settings, { size: 18 }) }), _jsxs(Modal, { isOpen: showSettings, onClose: () => setShowSettings(false), children: [_jsx(ModalTitle, { children: \"Search Types\" }), _jsx(ModalBody, { children: _jsxs(\"div\", { className: \"flex flex-col gap-2\", children: [_jsxs(\"label\", { className: \"flex items-center gap-2\", children: [_jsx(Checkbox, { checked: selectedTypes.includes(SearchTypes.full_text), onCheckedChange: handleCheckboxChange(SearchTypes.full_text) }), _jsx(\"span\", { children: \"Full Text\" })] }), _jsx(\"div\", { className: \"font-semibold mt-2 mb-1\", children: \"Embeddings\" }), embeddingTypes.map(type => (_jsxs(\"label\", { className: \"flex items-center gap-2\", children: [_jsx(Checkbox, { checked: selectedTypes.includes(type), onCheckedChange: handleCheckboxChange(type) }), _jsx(\"span\", { children: type.charAt(0).toUpperCase() + type.slice(1) })] }, type))), _jsxs(\"div\", { className: \"mt-3\", children: [_jsx(\"span\", { className: \"mr-2\", children: \"Limit\" }), _jsx(NumberInput, { type: \"number\", min: 1, value: limit, onChange: v => setLimit(Number(v ?? 100)), style: { width: 80 } })] })] }) }), _jsx(ModalFooter, { children: _jsx(Button, { variant: \"outline\", onClick: () => setShowSettings(false), children: \"Close\" }) })] }), _jsx(Button, { variant: \"secondary\", isLoading: isLoading, onClick: fireSearch, isDisabled: !isReady, alt: \"Semantic search\", children: \"Search\" })] }));\n}\n//# sourceMappingURL=VectorSearchWidget.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Divider, ErrorBox, FilterBar, FilterBtn, FilterClear, FilterProvider, SidePanel, Spinner, useIntersectionObserver, useToast } from '@vertesia/ui/core';\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { Download, ExternalLink, RefreshCw } from 'lucide-react';\nimport { useEffect, useRef, useState } from \"react\";\nimport { useDocumentFilterGroups, useDocumentFilterHandler } from \"../../facets/DocumentsFacetsNav\";\nimport { ContentDispositionButton } from './components/ContentDispositionButton';\nimport { ContentOverview } from './components/ContentOverview';\nimport { useDownloadDocument } from './components/useDownloadObject';\nimport { VectorSearchWidget } from './components/VectorSearchWidget';\nimport { DocumentTable } from './DocumentTable';\nimport { useDocumentSearch, useWatchDocumentSearchFacets, useWatchDocumentSearchResult } from './search/DocumentSearchContext';\nimport { useDocumentUploadHandler } from './upload/useUploadHandler';\nconst defaultLayout = [\n { name: \"ID\", field: \"id\", type: \"objectId?slice=-7\" },\n { name: \"Name\", field: \".\", type: \"objectName\" },\n { name: \"Type\", field: \"type.name\", type: \"string\" },\n { name: \"Status\", field: \"status\", type: \"string\" },\n { name: \"Updated At\", field: \"updated_at\", type: \"date\" },\n];\nfunction getTableLayout(registry, type) {\n const layout = type ? registry.getTypeLayout(type) : defaultLayout;\n const result = layout ?? defaultLayout;\n return result;\n}\nexport function DocumentSearchResultsWithDropZone({ onUploadDone = async () => { }, layout }) {\n const search = useDocumentSearch();\n const toast = useToast();\n // Create a wrapper around the onUploadDone callback that also refreshes the search\n const handleUploadDone = async (objectIds) => {\n // First, call the original callback\n await onUploadDone(objectIds);\n // Use a timeout to let the backend catch up, then refresh the search results\n setTimeout(() => {\n console.log('Delayed refresh after upload to ensure backend consistency');\n search.search().then(() => {\n // Notify the user that the list has been refreshed\n toast({\n title: \"Document list refreshed\",\n description: \"The document list has been updated with your uploaded files.\",\n status: \"info\",\n duration: 3000,\n });\n }).catch(err => {\n console.error('Failed to refresh search results:', err);\n });\n }, 1000); // 1-second delay for backend processing\n };\n // Use the enhanced standard upload handler with smart processing\n const uploadHandler = useDocumentUploadHandler(handleUploadDone);\n // Wrap the uploadHandler to ensure the collectionId is passed\n const wrappedUploadHandler = (files, type) => {\n // Get the collection ID from the search context\n const collectionId = search.collectionId;\n return uploadHandler(files, type, collectionId);\n };\n return _jsx(DocumentSearchResults, { layout: layout, onUpload: wrappedUploadHandler });\n}\nexport function DocumentSearchResults({ layout, onUpload, allowFilter = true, allowSearch = true }) {\n // Get the search context to access collectionId\n const searchContext = useDocumentSearch();\n const [isReady, setIsReady] = useState(false);\n const [selectedObject, setSelectedObject] = useState(null);\n const { typeRegistry } = useUserSession();\n const { search, isLoading, error, objects, hasMore } = useWatchDocumentSearchResult();\n const [actualLayout, setActualLayout] = useState(typeRegistry ? layout || getTableLayout(typeRegistry, search.query.type) : defaultLayout);\n //TODO _setRefreshTrigger state not used\n const [refreshTrigger, _setRefreshTrigger] = useState(0);\n const [loaded, setLoaded] = useState(0);\n const [isGridView, setIsGridView] = useState(localStorage.getItem(ContentDispositionButton.LAST_DISPLAYED_VIEW) === \"grid\");\n const [filters, setFilters] = useState([]);\n const loadMoreRef = useRef(null);\n // Trigger initial search when component mounts\n useEffect(() => {\n if (!isReady && objects.length === 0) {\n setLoaded(0);\n // Manually set loading state to show spinner during initial load\n search._updateRunningState(true);\n search.search().then(() => {\n setIsReady(true);\n }).catch(err => {\n console.error('Initial search failed:', err);\n search._updateRunningState(false);\n });\n }\n }, []);\n useEffect(() => {\n if (objects.length < loaded) {\n setLoaded(objects.length);\n }\n }, [objects.length, loaded]);\n useIntersectionObserver(loadMoreRef, () => {\n if (isReady && objects.length > 0 && objects.length != loaded) {\n setIsReady(false);\n search.loadMore().finally(() => {\n setLoaded(objects.length);\n setIsReady(true);\n });\n }\n }, { deps: [isReady, objects.length] });\n // Handler for vector search widget\n const handleVectorSearch = (query) => {\n if (query && query.vector) {\n search.query.vector = query.vector;\n search.query.full_text = query.full_text;\n search.query.weights = query.weights;\n search.query.score_aggregation = query.score_aggregation;\n search.query.dynamic_scaling = query.dynamic_scaling;\n if (query.limit !== undefined) {\n search.limit = query.limit;\n search.query.limit = query.limit;\n }\n if (!actualLayout.find((c) => c.name === \"Search Score\")) {\n const layout = [\n ...actualLayout,\n {\n name: \"Search Score\",\n field: \"score\",\n render: (item) => item.score?.toFixed(4) || \"0.0000\"\n },\n ];\n setActualLayout(layout);\n }\n search.search().then(() => setIsReady(true));\n }\n else if (query && query.full_text) {\n search.query.full_text = query.full_text;\n if (query.limit !== undefined) {\n search.limit = query.limit;\n search.query.limit = query.limit;\n }\n search.search().then(() => setIsReady(true));\n }\n else if (query === undefined) {\n // Only clear search if this is a user-initiated clear (not initialization)\n // The VectorSearchWidget calls onChange(undefined) during initialization\n if (isReady) {\n delete search.query.vector;\n delete search.query.full_text;\n search.search().then(() => setIsReady(true));\n }\n }\n };\n const facets = useWatchDocumentSearchFacets();\n const facetSearch = useDocumentSearch();\n const handleRefetch = () => {\n search.search().then(() => setIsReady(true));\n };\n // Use DocumentsFacetsNav hooks for cleaner organization\n const filterGroups = useDocumentFilterGroups(facets);\n const handleFilterLogic = useDocumentFilterHandler(facetSearch);\n const handleFilterChange = (value) => {\n const newFilters = typeof value === 'function' ? value(filters) : value;\n setFilters(newFilters);\n handleFilterLogic(newFilters);\n };\n const url = new URL(window.location.href);\n const filtersParam = url.searchParams.get('filters');\n if (filtersParam) {\n try {\n const filterPairs = filtersParam.split(';');\n const validFilterPairs = filterPairs.filter(pair => {\n const [encodedName] = pair.split(':');\n const name = decodeURIComponent(encodedName);\n return name !== 'start' && name !== 'end';\n });\n if (validFilterPairs.length !== filterPairs.length) {\n const newFiltersParam = validFilterPairs.length > 0 ? validFilterPairs.join(';') : '';\n if (newFiltersParam) {\n url.searchParams.set('filters', newFiltersParam);\n }\n else {\n url.searchParams.delete('filters');\n }\n window.history.replaceState(window.history.state || {}, '', url.toString());\n }\n }\n catch (error) {\n console.error(\"Failed to clean start/end filters from URL:\", error);\n }\n }\n const navigate = useNavigate();\n const onRowClick = (object) => {\n navigate(`/objects/${object.id}`);\n };\n const previewObject = (objectId) => {\n const obj = objects.find(o => o.id === objectId) || null;\n setSelectedObject(obj);\n };\n return (_jsxs(\"div\", { className: \"flex flex-col gap-y-2\", children: [_jsx(OverviewDrawer, { object: selectedObject, onClose: () => setSelectedObject(null) }), error && _jsx(ErrorBox, { title: \"Error\", children: error.message }), _jsx(Toolsbar, { isLoading: isLoading, refreshTrigger: refreshTrigger, allowFilter: allowFilter, allowSearch: allowSearch, filterGroups: filterGroups, filters: filters, handleFilterChange: handleFilterChange, handleVectorSearch: handleVectorSearch, handleRefetch: handleRefetch, setIsGridView: setIsGridView }), _jsx(DocumentTable, { objects: objects, isLoading: !objects.length && isLoading, layout: actualLayout, onRowClick: onRowClick, previewObject: previewObject, selectedObject: selectedObject, onUpload: onUpload, isGridView: isGridView, collectionId: searchContext.collectionId }), hasMore ? (_jsx(\"div\", { ref: loadMoreRef, className: \"w-full flex justify-center\", children: _jsx(Spinner, { size: 'xl' }) })) : (_jsx(\"div\", { className: \"text-muted text-center text-sm py-1\", children: `All ${objects.length} objects loaded.` }))] }));\n}\nfunction Toolsbar(props) {\n const { isLoading, refreshTrigger, allowFilter, allowSearch, filterGroups, filters, handleFilterChange, handleVectorSearch, handleRefetch, setIsGridView } = props;\n return (_jsxs(\"div\", { className: \"sticky top-0 z-10 bg-background py-2\", children: [allowFilter && (_jsxs(FilterProvider, { filterGroups: filterGroups, filters: filters, setFilters: handleFilterChange, children: [_jsxs(\"div\", { className: \"flex flex-row gap-4 items-center justify-between w-full\", children: [_jsxs(\"div\", { className: \"flex gap-2 items-center w-2/3\", children: [allowSearch && _jsx(VectorSearchWidget, { onChange: handleVectorSearch, isLoading: isLoading, refresh: refreshTrigger, className: \"w-full\" }), _jsx(FilterBtn, {})] }), _jsxs(\"div\", { className: \"flex gap-1 items-center\", children: [_jsx(Button, { variant: \"outline\", onClick: handleRefetch, alt: \"Refresh\", children: _jsx(RefreshCw, { size: 16 }) }), _jsx(ContentDispositionButton, { onUpdate: setIsGridView })] })] }), _jsxs(\"div\", { className: \"flex gap-2 items-center pt-2\", children: [_jsx(FilterBar, {}), _jsx(FilterClear, {})] })] })), !allowFilter && (_jsxs(\"div\", { className: \"flex flex-row gap-4 items-center justify-between w-full\", children: [_jsx(\"div\", { className: \"flex gap-2 items-center w-2/3\", children: allowSearch && _jsx(VectorSearchWidget, { onChange: handleVectorSearch, isLoading: isLoading, refresh: refreshTrigger }) }), _jsxs(\"div\", { className: \"flex gap-1 items-center\", children: [_jsx(Button, { variant: \"outline\", onClick: handleRefetch, alt: \"Refresh\", children: _jsx(RefreshCw, { size: 16 }) }), _jsx(ContentDispositionButton, { onUpdate: setIsGridView })] })] }))] }));\n}\nfunction OverviewDrawer({ object, onClose }) {\n const { store } = useUserSession();\n const toast = useToast();\n const navigate = useNavigate();\n const onDownload = useDownloadDocument(store, toast, object?.content?.source, object?.name || object?.content?.name);\n return object ? (_jsxs(SidePanel, { title: object.properties?.title || object.name, isOpen: true, onClose: onClose, children: [_jsxs(\"div\", { className: \"flex items-center gap-x-2\", children: [_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Open Object\", onClick: () => navigate(`/objects/${object.id}`), children: _jsx(ExternalLink, { className: \"size-4\" }) }), object.content?.source && (_jsx(Button, { variant: \"ghost\", size: \"sm\", title: \"Download\", onClick: onDownload, children: _jsx(Download, { className: \"size-4\" }) }))] }), _jsx(Divider, { className: \"my-2\" }), _jsx(\"div\", { className: \"pt-2\", children: _jsx(ContentOverview, { object: object, loadText: true }, object.id) })] })) : null;\n}\n//# sourceMappingURL=DocumentSearchResults.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Modal, ModalBody, ModalTitle, SelectBox, Spinner } from \"@vertesia/ui/core\";\nimport { useState } from \"react\";\nexport var ExportTypes;\n(function (ExportTypes) {\n ExportTypes[\"CSV\"] = \"CSV\";\n ExportTypes[\"JSON\"] = \"JSON\";\n})(ExportTypes || (ExportTypes = {}));\n;\nexport function ExportPropertiesModal({ isExporting, isOpen, onClose }) {\n const title = \"Export Object Properties\";\n return (_jsxs(Modal, { onClose: () => onClose(undefined), isOpen: isOpen, className: \"relative overflow-visible\", children: [_jsx(ModalTitle, { children: title }), !isExporting &&\n _jsx(SelectPanel, { onClose: onClose }), isExporting &&\n _jsx(WaitingPanel, {})] }));\n}\nfunction SelectPanel({ onClose }) {\n const [exportType, setExportType] = useState(undefined);\n const [exportAll, setExportAll] = useState(undefined);\n const selectionOption = [\"Export selected objects\", \"Export all objects\"];\n const exportAllBoolean = (option) => {\n return option == selectionOption[1];\n };\n const onSubmit = () => {\n onClose(exportType, exportAllBoolean(exportAll));\n };\n return (_jsxs(ModalBody, { className: \"min-h-[104px] pt-0 flex flex-col gap-y-4\", children: [_jsx(\"div\", { className: 'h-1/3', children: _jsx(SelectBox, { options: selectionOption, value: exportAll, onChange: setExportAll, placeholder: \"Choose what to export\", className: \"h-full w-full text-sm\", filterBy: \"name\", isClearable: true }) }), _jsxs(\"div\", { className: 'h-1/2 flex flex-col gap-y-8 content-between', children: [_jsx(SelectBox, { options: Object.values(ExportTypes), value: exportType, onChange: setExportType, placeholder: \"Choose a format\", className: \"h-full w-full text-sm\", filterBy: \"name\", isClearable: true }), _jsx(Button, { className: \"w-full\", isDisabled: !exportType || !exportAll, onClick: onSubmit, children: \"Export Properties\" })] })] }));\n}\nfunction WaitingPanel({}) {\n return (_jsx(ModalBody, { className: \"min-h-[84px] pt-0\", children: _jsxs(\"div\", { className: 'h-full grid flex-col gap-y-2 content-between justify-items-center', children: [_jsxs(\"div\", { className: \"text-sm flex flex-col gap-x-2\", children: [_jsx(\"p\", { children: \"EXPORT IS IN PROGRESS\" }), _jsx(\"p\", { className: \"pt-2 grid justify-items-center\", children: \"PLEASE WAIT\" })] }), _jsx(Spinner, { size: 'lg' })] }) }));\n}\n//# sourceMappingURL=ExportPropertiesModal.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { DocumentSearchResultsWithDropZone, DocumentSearchResults } from \"../objects/DocumentSearchResults\";\nimport { useToast } from \"@vertesia/ui/core\";\nimport { useDocumentSearch } from \"../objects/search/DocumentSearchContext\";\nexport function BrowseCollectionView({ collection }) {\n const toast = useToast();\n const { client, typeRegistry } = useUserSession();\n const search = useDocumentSearch();\n search.query.all_revisions = true;\n const onUploadDone = async (objectIds) => {\n if (objectIds.length > 0) {\n await client.store.collections.addMembers(collection.id, objectIds).catch(err => {\n toast({\n title: 'Failed to add objects to collection',\n description: err.message,\n status: 'error'\n });\n });\n }\n };\n const tableLayout = getTableLayout(collection, typeRegistry);\n return collection.dynamic ? (_jsx(DocumentSearchResults, { layout: tableLayout })) : (_jsx(DocumentSearchResultsWithDropZone, { onUploadDone: onUploadDone, layout: tableLayout }));\n}\nfunction getTableLayout(collection, typeRegistry) {\n let table_layout = collection.table_layout;\n if (table_layout && table_layout.length > 0) {\n return table_layout;\n }\n if (collection.type && typeRegistry) {\n table_layout = typeRegistry?.getTypeLayout(collection.type.id);\n }\n if (table_layout && table_layout.length > 0) {\n return table_layout;\n }\n else {\n return undefined;\n }\n}\n//# sourceMappingURL=BrowseCollectionView.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VSelectBox } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useEffect, useState } from \"react\";\nconst optionLabel = (t) => {\n if (t === null)\n return 'None';\n return (_jsxs(\"div\", { children: [_jsx(\"div\", { className: \"text-sm\", children: t.name }), _jsx(\"div\", { className: \"text-xs text-gray-500\", children: t.description })] }));\n};\nexport function SelectContentType({ className, defaultValue, onChange, isClearable, multiple }) {\n const session = useUserSession();\n const [isMounted, setIsMounted] = useState(false);\n const [selectedType, setSelectedType] = useState();\n const [selectedTypes, setSelectedTypes] = useState([]);\n useEffect(() => {\n if (!isMounted) {\n setIsMounted(true);\n if (session.typeRegistry && defaultValue) {\n if (multiple && Array.isArray(defaultValue)) {\n const types = session.typeRegistry.types.filter(t => defaultValue.includes(t.id));\n setSelectedTypes(types);\n }\n const type = session.typeRegistry.types.find(t => t.id === defaultValue);\n if (type) {\n setSelectedType(type);\n }\n }\n }\n }, [session.typeRegistry, defaultValue, multiple]);\n const _onChange = (option) => {\n setSelectedType(option || undefined);\n onChange(option);\n };\n const _onChangeMultiple = (options) => {\n setSelectedTypes(options);\n onChange(options);\n };\n if (multiple) {\n return (_jsx(\"div\", { className: 'flex flex-col gap-4 content-between', children: _jsx(VSelectBox, { options: session.typeRegistry?.types || [], value: selectedTypes, onChange: _onChangeMultiple, placeholder: \"Choose Content Types...\", optionLabel: optionLabel, className: className || \"text-sm bg-background\", filterBy: \"name\", isClearable: isClearable || false, multiple: true }) }));\n }\n return (_jsx(\"div\", { className: 'flex flex-col gap-4 content-between', children: _jsx(VSelectBox, { options: session.typeRegistry?.types || [], value: selectedType, onChange: _onChange, placeholder: \"Choose a Content Type...\", optionLabel: optionLabel, className: className || \"text-sm bg-background\", filterBy: \"name\", isClearable: isClearable || false }) }));\n}\n//# sourceMappingURL=SelectContentType.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useToast, VModalBody, FormItem, VModalFooter, Input, Switch, Button, VModal, VModalTitle, Textarea } from \"@vertesia/ui/core\";\nimport { SelectContentType } from \"../types/SelectContentType\";\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useState } from \"react\";\nexport function CreateCollectionForm({ onClose, redirect = true, onAddToCollection }) {\n const navigate = useNavigate();\n const toast = useToast();\n const [isProcessing, setProcessing] = useState(false);\n const { client } = useUserSession();\n const [payload, setPayload] = useState({\n dynamic: false,\n name: \"\",\n description: \"\",\n });\n function setPayloadProp(name, value) {\n setPayload({\n ...payload,\n [name]: value,\n });\n }\n const onCreate = () => {\n if (!payload?.name || !payload.name.trim()) {\n toast({\n title: \"Name is required\",\n description: \"Please provide a name for the collection\",\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n payload.name = payload.name.trim();\n if (payload.description) {\n payload.description = payload.description.trim();\n }\n if (payload.dynamic == null) {\n payload.dynamic = false;\n }\n setProcessing(true);\n client.store.collections\n .create(payload)\n .then((r) => {\n onClose();\n toast({\n title: \"Collection created\",\n description: `Collection \"${r.name}\" created successfully`,\n status: \"success\",\n duration: 3000,\n });\n if (redirect)\n navigate(`/collections/${r.id}`);\n if (onAddToCollection) {\n onAddToCollection(r.id);\n }\n })\n .catch((err) => {\n toast({\n title: \"Failed to create collection\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n })\n .finally(() => setProcessing(false));\n };\n return (_jsxs(\"form\", { onSubmit: (e) => e.preventDefault(), children: [_jsxs(VModalBody, { children: [_jsx(FormItem, { label: \"Name\", required: true, children: _jsx(Input, { type: \"text\", value: payload.name || \"\", onChange: (value) => setPayloadProp(\"name\", value) }) }), _jsx(FormItem, { label: \"Description\", className: \"mt-2\", children: _jsx(Textarea, { value: payload.description || \"\", onChange: (ev) => setPayloadProp(\"description\", ev) }) }), _jsx(FormItem, { label: \"Dynamic Collection\", className: \"mt-2\", direction: \"row\", description: \"Dynamically fetch content for the collection based on a query. If not enabled, then content must be added by users or agents.\", children: _jsx(Switch, { value: payload.dynamic || false, onChange: (value) => setPayloadProp(\"dynamic\", value) }) }), !payload.dynamic &&\n _jsx(FormItem, { label: \"Allowed Content Types\", className: \"mt-4\", description: \"Optionally select which content types can be added to the collection. If not set, then all content types are allowed.\", children: _jsx(SelectContentType, { defaultValue: payload.allowed_types || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setPayloadProp(\"allowed_types\", v.map(type => type.id));\n }\n else {\n setPayloadProp(\"allowed_types\", v ? [v.id] : []);\n }\n }, isClearable: true, multiple: true }) }), _jsx(FormItem, { label: \"Type\", className: \"mt-2\", description: \"Optionally select a content type to assign custom properties and data to the collection.\", children: _jsx(SelectContentType, { defaultValue: payload.type || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setPayloadProp(\"type\", v.length > 0 ? v[0].id : null);\n }\n else {\n setPayloadProp(\"type\", v?.id || null);\n }\n }, isClearable: true }) })] }), _jsx(VModalFooter, { children: _jsx(Button, { isDisabled: isProcessing, onClick: onCreate, children: \"Create Collection\" }) })] }));\n}\nexport function CreateCollectionModal({ isOpen, onClose }) {\n return (_jsxs(VModal, { onClose: onClose, isOpen: isOpen, children: [_jsx(VModalTitle, { children: \"Create a Collection\" }), _jsx(CreateCollectionForm, { onClose: onClose })] }));\n}\n//# sourceMappingURL=CreateCollection.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { NavLink } from \"@vertesia/ui/router\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { FolderClosed, Search, Trash2 } from \"lucide-react\";\nimport { Button, ConfirmModal, ErrorBox, Table, TBody, TR, useToast, VTooltip, useFetch, EmptyCollection } from \"@vertesia/ui/core\";\nimport dayjs from 'dayjs';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport { useState, useEffect } from \"react\";\nimport { CreateCollectionModal } from \"./CreateCollection\";\ndayjs.extend(relativeTime);\nexport function CollectionsTable({}) {\n const { client } = useUserSession();\n const toast = useToast();\n const [collectionToDelete, setCollectionToDelete] = useState();\n const [isLoading, setIsLoading] = useState(true);\n const [isOpen, setOpen] = useState(false);\n const { data: collections, error, refetch } = useFetch(() => client.store.collections.search({}), []);\n // Update loading state when data is fetched\n useEffect(() => {\n if (collections || error) {\n setIsLoading(false);\n }\n }, [collections, error]);\n if (error) {\n return _jsx(ErrorBox, { title: 'Collections fetch failed', children: error.message });\n }\n const deleteCollection = async () => {\n if (!collectionToDelete)\n return;\n try {\n await client.store.collections.delete(collectionToDelete);\n toast({\n title: 'Collection deleted',\n status: 'success',\n duration: 3000\n });\n refetch();\n }\n catch (err) {\n console.error('Failed to delete collection:', err);\n toast({\n title: 'Failed to delete collection',\n description: err.message || 'An error occurred',\n status: 'error',\n duration: 5000\n });\n }\n finally {\n setCollectionToDelete(undefined);\n }\n };\n return (_jsxs(_Fragment, { children: [collections &&\n (collections.length > 0 ?\n (_jsxs(Table, { className: \"w-full\", children: [_jsx(\"thead\", { children: _jsxs(\"tr\", { children: [_jsx(\"th\", { children: \"Name\" }), _jsx(\"th\", { children: \"Type\" }), _jsx(\"th\", { children: \"Created\" }), _jsx(\"th\", {})] }) }), _jsx(TBody, { columns: 4, isLoading: isLoading, children: collections.map((c) => {\n return _jsxs(TR, { children: [_jsx(\"td\", { children: _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [collectionIcon(c.dynamic), _jsx(NavLink, { href: `/collections/${c.id}`, children: c.name })] }) }), _jsx(\"td\", { children: c.type?.name || \"-\" }), _jsx(\"td\", { children: dayjs(c.created_at).fromNow() }), _jsx(\"td\", { className: \"text-right\", children: _jsx(Button, { variant: \"destructive\", size: \"sm\", onClick: () => setCollectionToDelete(c.id), children: _jsx(Trash2, { className: \"size-4\" }) }) })] }, c.id);\n }) })] })) :\n _jsx(EmptyCollection, { title: \"No Collections\", buttonLabel: 'New Collections', onClick: () => setOpen(true), children: \"Get started by creating a new Collections.\" })), _jsx(CreateCollectionModal, { isOpen: isOpen, onClose: () => setOpen(false) }), _jsx(ConfirmModal, { isOpen: !!collectionToDelete, title: \"Delete Collection\", content: \"Are you sure you want to delete this collection? This action cannot be undone.\", onConfirm: deleteCollection, onCancel: () => setCollectionToDelete(undefined) })] }));\n}\nexport function collectionIcon(isDynamic) {\n const tooltipText = isDynamic ? \"Dynamic Collection\" : \"Static Collection\";\n const icon = isDynamic ? _jsx(Search, { className: \"size-5\" }) : _jsx(FolderClosed, { className: \"size-5\" });\n return (_jsx(VTooltip, { description: tooltipText, className: \"mr-2\", children: icon }));\n}\n//# sourceMappingURL=CollectionsTable.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport dayjs from \"dayjs\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport { Table, TBody, THead } from \"@vertesia/ui/core\";\nimport { useNavigate } from \"@vertesia/ui/router\";\ndayjs.extend(relativeTime);\nexport function ContentObjectTypesTable({ objects, isLoading }) {\n const navigate = useNavigate();\n return (_jsxs(Table, { className: \"w-full\", children: [_jsx(THead, { children: _jsxs(\"tr\", { children: [_jsx(\"th\", { children: \"Name\" }), _jsx(\"th\", { children: \"Strict Mode\" }), _jsx(\"th\", { children: \"Semantic Chunking\" }), _jsx(\"th\", { children: \"Updated At\" })] }) }), _jsx(TBody, { isLoading: isLoading && (!objects || objects.length === 0), columns: 4, children: objects?.map((obj) => (_jsxs(\"tr\", { onClick: () => navigate(`/types/${obj.id}`), className: 'cursor-pointer hover:bg-muted', children: [_jsx(\"td\", { children: obj.name }), _jsx(\"td\", { children: obj.strict_mode ? 'Yes' : 'No' }), _jsx(\"td\", { children: obj.is_chunkable ? 'Yes' : 'No' }), _jsx(\"td\", { children: dayjs(obj.updated_at).fromNow() })] }, obj.id))) })] }));\n}\n//# sourceMappingURL=ContentObjectTypesTable.js.map","import { SharedState, useWatchSharedState } from \"@vertesia/ui/core\";\nimport { createContext, useContext } from \"react\";\nexport class ObjectTypeSearch {\n client;\n limit;\n result = new SharedState({ objects: [], isLoading: false });\n query = {};\n constructor(client, limit = 100) {\n this.client = client;\n this.limit = limit;\n }\n get objects() {\n return this.result.value.objects;\n }\n get error() {\n return this.result.value.error;\n }\n get isRunning() {\n return this.result.value.isLoading;\n }\n getFilterValue(name) {\n return this.query[name];\n }\n setFilterValue(name, value) {\n this.query[name] = value;\n this.search();\n }\n reset(isLoading = false) {\n this.result.value = {\n objects: [],\n isLoading\n };\n }\n _updateRunningState(value) {\n const prev = this.result.value;\n this.result.value = {\n objects: prev.objects,\n isLoading: value,\n error: prev.error\n };\n }\n async _search(loadMore = false) {\n if (this.isRunning) {\n return Promise.resolve(false);\n }\n this.result.value = {\n isLoading: true,\n objects: loadMore ? this.objects : [],\n };\n const limit = this.limit;\n const offset = this.objects.length;\n return this.client.types.list({\n limit,\n offset,\n query: this.query\n }).then(async (result) => {\n this.result.value = {\n isLoading: false,\n objects: this.objects.concat(result)\n };\n return true;\n }).catch((err) => {\n this.result.value = {\n error: err,\n isLoading: false,\n objects: this.objects\n };\n throw err;\n });\n }\n search() {\n if (this.isRunning) {\n return Promise.resolve(false);\n }\n return this._search(false);\n }\n loadMore() {\n if (this.isRunning) {\n return Promise.resolve(false);\n }\n return this._search(true);\n }\n}\nconst ObjectTypeSearchContext = createContext(undefined);\nexport function useSearch() {\n return useContext(ObjectTypeSearchContext);\n}\nexport function useWatchSearchResult() {\n const search = useSearch();\n const result = useWatchSharedState(search.result);\n return { ...result, search };\n}\nexport function useSearchCount() {\n const search = useSearch();\n return search.objects.length;\n}\nexport { ObjectTypeSearchContext };\n//# sourceMappingURL=ObjectTypeSearchContext.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState } from 'react';\nimport { Button, Input, Modal, ModalBody, ModalFooter, ModalTitle, useToast, Textarea } from '@vertesia/ui/core';\nexport function CreateOrUpdateTypeModal({ title, isOpen, onClose, okLabel, initialPayload }) {\n const toast = useToast();\n const [name, setName] = useState(initialPayload?.name);\n const [description, setDescription] = useState(initialPayload?.description);\n const [strictMode, setStrictMode] = useState(initialPayload?.strict_mode ?? false);\n const onSave = () => {\n if (!name) {\n toast({\n status: 'error',\n title: 'Name is required',\n duration: 5000\n });\n return;\n }\n const payload = { name, description, strict_mode: strictMode };\n onClose(payload).then(() => onClose());\n setName(undefined);\n setDescription(undefined);\n setStrictMode(false);\n };\n return (_jsxs(Modal, { isOpen: isOpen, onClose: () => onClose(), children: [_jsx(ModalTitle, { children: title }), _jsx(ModalBody, { className: \"pt-0\", children: _jsxs(\"div\", { className: 'h-full flex flex-col gap-4 content-between', children: [_jsxs(\"div\", { children: [_jsx(\"label\", { className: \"block text-sm font-medium text-muted\", children: \"Name\" }), _jsx(Input, { value: name, onChange: setName })] }), _jsxs(\"div\", { children: [_jsx(\"label\", { className: \"block text-sm font-medium text-muted\", children: \"Description\" }), _jsx(Textarea, { value: description, onChange: e => setDescription(e.target.value) })] })] }) }), _jsx(ModalFooter, { children: _jsxs(\"div\", { className: 'flex justify-end gap-4', children: [_jsx(Button, { variant: \"secondary\", onClick: () => onClose(), children: \"Cancel\" }), _jsx(Button, { variant: \"primary\", onClick: () => onSave(), children: okLabel })] }) })] }));\n}\n//# sourceMappingURL=CreateOrUpdateTypeModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { ContentObjectTypesTable } from \"./ContentObjectTypesTable\";\nimport { useWatchSearchResult } from \"./search/ObjectTypeSearchContext\";\nimport { EmptyCollection, ErrorBox, Input, SelectBox, useDebounce, useIntersectionObserver, useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { CreateOrUpdateTypeModal } from \"./CreateOrUpdateTypeModal\";\nvar ChunkableOptions;\n(function (ChunkableOptions) {\n ChunkableOptions[\"true\"] = \"Yes\";\n ChunkableOptions[\"false\"] = \"No\";\n})(ChunkableOptions || (ChunkableOptions = {}));\n;\nexport function ContentObjectTypesSearch({ isDirty = false }) {\n const session = useUserSession();\n const { store } = session;\n const toast = useToast();\n const [isReady, setIsReady] = useState(false);\n const { search, isLoading, error, objects } = useWatchSearchResult();\n const [searchTerm, setSearchTerm] = useState(\"\");\n const debounceValue = useDebounce(searchTerm, 500);\n const loadMoreRef = useRef(null);\n useIntersectionObserver(loadMoreRef, () => {\n isReady && search.loadMore();\n }, { deps: [isReady] });\n useEffect(() => {\n search.search()\n .then(() => setIsReady(true));\n }, []);\n useEffect(() => {\n search.query.name = searchTerm;\n search.search()\n .then(() => setIsReady(true));\n }, [debounceValue]);\n const [chunkable, setChunkable] = useState(undefined);\n const onChunkableChange = (data) => {\n setChunkable(data);\n };\n useEffect(() => {\n search.query.chunkable = chunkable ? chunkable == \"Yes\" : undefined;\n search.search()\n .then(() => setIsReady(true));\n }, [chunkable]);\n useEffect(() => {\n if (isDirty && isReady) {\n search.search().then(() => setIsReady(true));\n }\n }, [isDirty]);\n const [showCreateModal, setShowCreateModal] = useState(false);\n const onOpenCreateModal = () => {\n setShowCreateModal(true);\n };\n if (error) {\n return (_jsx(ErrorBox, { title: \"Failed to fetch ObjectTypes\", children: error.message }));\n }\n ;\n const onCloseCreateModal = async (payload) => {\n if (!payload) {\n setShowCreateModal(false);\n return Promise.resolve();\n }\n return store.types.create(payload).then(async () => {\n toast({\n status: \"success\",\n title: \"Type created\",\n duration: 2000\n });\n session.reloadTypes();\n search.search().then(() => setIsReady(true));\n }).catch(err => {\n toast({\n status: \"error\",\n title: \"Error creating type\",\n description: err.message,\n duration: 5000\n });\n });\n };\n return (_jsxs(\"div\", { className: \"flex flex-col gap-4 h-full\", children: [_jsxs(\"div\", { className: \"flex flex-shrink-0 gap-4\", children: [_jsx(Input, { placeholder: \"Filter by Name\", value: searchTerm, onChange: setSearchTerm }), _jsx(SelectBox, { className: \"w-60\", isClearable: true, options: Object.values(ChunkableOptions), value: chunkable, onChange: onChunkableChange, placeholder: \"Is Chunkable\" })] }), _jsxs(\"div\", { className: \"flex-1 overflow-y-auto\", children: [(!isLoading && objects?.length === 0) ? (_jsx(EmptyCollection, { title: \"No Type\", buttonLabel: \"Create Type\", onClick: onOpenCreateModal, children: \"Get started by creating a new Type.\" })) : (_jsx(ContentObjectTypesTable, { objects: objects, isLoading: isLoading })), _jsx(CreateOrUpdateTypeModal, { okLabel: \"Create\", title: \"Create Type\", isOpen: showCreateModal, onClose: onCloseCreateModal })] })] }));\n}\n//# sourceMappingURL=ContentObjectTypesSearch.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { basicSetup } from 'codemirror';\nimport { useMemo, useRef, useState } from 'react';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { json } from '@codemirror/lang-json';\nimport { CodeMirrorEditor, SchemaEditor, useSchema } from '@vertesia/ui/widgets';\nimport { Button, useToast } from '@vertesia/ui/core';\nimport { Ajv } from \"ajv\";\nconst CODE_MIRROR_EXTENSIONS = [basicSetup, json()];\nexport function ObjectSchemaEditor({ objectType, onSchemaUpdate }) {\n const { store } = useUserSession();\n const toast = useToast();\n const [isUpdating, setUpdating] = useState(false);\n const schema = useSchema(objectType.object_schema);\n const editorRef = useRef(undefined);\n const [displayJson, setDisplayJson] = useState(false);\n const value = useMemo(() => {\n return jsonToContent(schema.schema);\n }, [schema]);\n const onSave = () => {\n if (displayJson) {\n if (!updateSchemaFromJson()) {\n return;\n }\n }\n setUpdating(true);\n store.types.update(objectType.id, { object_schema: schema.schema }).then(() => {\n onSchemaUpdate(schema);\n toast({\n status: 'success',\n title: 'Schema updated',\n description: 'The schema has been updated successfully',\n duration: 2000\n });\n }).catch((err) => {\n toast({\n status: 'error',\n title: 'Failed to update schema',\n description: err.message,\n duration: 5000\n });\n }).finally(() => {\n setUpdating(false);\n });\n };\n const handleOnSave = () => {\n if (displayJson) {\n if (!updateSchemaFromJson()) {\n return;\n }\n }\n setDisplayJson(prev => !prev);\n };\n const updateSchemaFromJson = () => {\n if (editorRef.current) {\n const value = editorRef.current.getValue();\n try {\n const newSchema = contentToJson(value);\n validateSchema(newSchema);\n schema.replaceSchema(newSchema);\n }\n catch (err) {\n toast({\n status: 'error',\n title: 'Invalid JSON Schema',\n description: err.message,\n duration: 5000\n });\n return false;\n }\n }\n return true;\n };\n return (_jsxs(\"div\", { className: \"mx-2 my-2 rounded-2xl border border-solid shadow-md border-spacing-2\", children: [_jsxs(\"div\", { className: \"flex items-center rounded-t-md border-b gap-x-2 py-2 pl-4 pr-2\", children: [_jsx(\"div\", { className: \"text-base font-semibold\", children: \"Schema Editor\" }), _jsx(\"div\", { children: _jsx(Button, { variant: \"outline\", size: \"sm\", onClick: handleOnSave, children: displayJson ? \"Edit Schema\" : \"Edit Json\" }) }), _jsx(\"div\", { className: \"ml-auto flex gap-x-2\", children: _jsx(Button, { isLoading: isUpdating, variant: \"outline\", size: \"sm\", onClick: onSave, children: \"Save Changes\" }) })] }), _jsx(\"div\", { className: \"px-4 py-2\", children: displayJson\n ? _jsx(CodeMirrorEditor, { value: value, extensions: CODE_MIRROR_EXTENSIONS, editorRef: editorRef })\n : _jsx(SchemaEditor, { schema: schema }) })] }));\n}\nfunction jsonToContent(json) {\n if (!json) {\n return '';\n }\n return JSON.stringify(json, null, 2);\n}\nfunction contentToJson(content) {\n if (!content?.trim()) {\n return undefined;\n }\n return JSON.parse(content.trim());\n}\nconst validateSchema = (schema) => {\n try {\n const ajv = new Ajv({\n strict: false, // Enable strict mode to ensure all properties are validated\n });\n // Compile the schema. This implicitly validates the schema definition\n // against the JSON Schema draft that ajv supports by default.\n ajv.compile(schema);\n }\n catch (error) {\n throw new Error(`Invalid JSON Schema definition: ${error.message}`);\n }\n};\n//# sourceMappingURL=ObjectSchemaEditor.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useMemo } from \"react\";\nimport { ObjectTypeSearch, ObjectTypeSearchContext } from \"./ObjectTypeSearchContext\";\nexport function ObjectTypeSearchProvider({ children, limit, name, chunkable: chunkable }) {\n const { store } = useUserSession();\n const search = useMemo(() => {\n const search = new ObjectTypeSearch(store, limit);\n search.query.name = name;\n search.query.chunkable = chunkable;\n return search;\n }, [limit]);\n return (_jsx(ObjectTypeSearchContext.Provider, { value: search, children: children }));\n}\n//# sourceMappingURL=ObjectTypeSearchProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState } from \"react\";\nimport { Button, Modal, ModalBody, ModalFooter, ModalTitle, SelectBox, } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { CheckCircleIcon } from \"lucide-react\";\n/**\n * A dedicated modal for selecting content types.\n *\n * This is a lightweight modal specifically for selecting a content type,\n * without any file upload functionality. Used for changing types, setting\n * types in other contexts, etc.\n */\nexport function SelectContentTypeModal({ isOpen, onClose, title = \"Select Content Type\", children, initialSelectedType = null, confirmLabel = \"Select Type\", allowNone = true, }) {\n const { typeRegistry } = useUserSession();\n const [selectedType, setSelectedType] = useState(initialSelectedType);\n // Get available types from the registry\n const types = typeRegistry?.types || [];\n // Handle close/cancel\n const handleClose = () => {\n onClose(undefined);\n };\n // Handle type selection and confirmation\n const handleConfirm = () => {\n onClose(selectedType?.id ?? null);\n };\n return (_jsxs(Modal, { isOpen: isOpen, onClose: handleClose, className: \"w-full max-w-xl mx-auto\", children: [_jsx(ModalTitle, { children: title }), _jsxs(ModalBody, { className: \"p-6\", children: [children, _jsxs(\"div\", { className: \"mb-4 mt-4\", children: [_jsxs(\"label\", { className: \"block text-sm font-medium mb-2\", children: [\"Content Type \", allowNone && _jsx(\"span\", { className: \"text-gray-500 font-normal\", children: \"(Optional)\" })] }), allowNone ? (_jsx(SelectBox, { options: types, value: selectedType, optionLabel: (type) => type ? type.name : 'Select a content type', placeholder: \"Select a content type or leave empty for automatic detection\", onChange: (selected) => setSelectedType(selected || null), filterBy: \"name\", isClearable: true })) : (_jsx(SelectBox, { options: types, value: selectedType, optionLabel: (type) => type ? type.name : 'Select a content type', placeholder: \"Select a content type\", onChange: (selected) => setSelectedType(selected || null), filterBy: \"name\" })), allowNone && (_jsxs(\"div\", { className: \"mt-2 text-sm text-blue-600 flex items-center\", children: [_jsx(CheckCircleIcon, { className: \"h-4 w-4 mr-1\" }), _jsxs(\"span\", { children: [_jsx(\"strong\", { children: \"Type selection is optional.\" }), \" Leave empty to let Vertesia choose the appropriate type\"] })] }))] }), selectedType ? (_jsxs(\"div\", { className: \"text-sm text-gray-500 bg-gray-50 p-3 rounded-md mb-4\", children: [_jsx(\"div\", { className: \"font-medium\", children: selectedType.name }), selectedType.description && (_jsx(\"div\", { className: \"mt-1\", children: selectedType.description }))] })) : allowNone && (_jsxs(\"div\", { className: \"text-sm text-blue-600 bg-blue-50 p-3 rounded-md mb-4\", children: [_jsx(\"div\", { className: \"font-medium\", children: \"Automatic Type Detection\" }), _jsxs(\"div\", { className: \"mt-1\", children: [\"Vertesia will analyze each file's content and automatically select the most appropriate type.\", _jsx(\"br\", {}), _jsx(\"span\", { className: \"mt-1 block font-medium\", children: \"This is recommended for most uploads.\" })] })] }))] }), _jsxs(ModalFooter, { children: [_jsx(Button, { variant: \"ghost\", onClick: handleClose, children: \"Cancel\" }), _jsx(Button, { onClick: handleConfirm, children: selectedType ? `${confirmLabel}: ${selectedType.name}` : allowNone ? \"Let Vertesia Choose\" : confirmLabel })] })] }));\n}\n//# sourceMappingURL=SelectContentTypeModal.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { basicSetup } from 'codemirror';\nimport { useMemo, useRef, useState } from 'react';\nimport { json } from '@codemirror/lang-json';\nimport { Button, useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { CodeMirrorEditor } from '@vertesia/ui/widgets';\nconst extensions = [basicSetup, json()];\nexport function TableLayoutEditor({ objectType, onLayoutUpdate }) {\n const toast = useToast();\n const [isUpdating, setUpdating] = useState(false);\n const { store } = useUserSession();\n const editorRef = useRef(undefined);\n const value = useMemo(() => {\n return stringifyTableLayout(objectType.table_layout);\n }, [objectType.table_layout]);\n const validationError = (title, message) => {\n toast({\n status: 'error',\n title: title,\n description: message,\n duration: 5000\n });\n };\n const onSave = () => {\n if (!editorRef.current) {\n return;\n }\n const value = editorRef.current.getValue();\n let table_layout;\n if (!value) {\n table_layout = null;\n }\n else {\n try {\n table_layout = JSON.parse(value);\n }\n catch (err) {\n return validationError('Invalid JSON', err.message);\n }\n }\n if (!Array.isArray(table_layout)) {\n return validationError('Invalid JSON', 'The table layout must be an array');\n }\n if (table_layout.some((col) => !col || !col.name || !col.field)) {\n return validationError('Invalid JSON', 'A table layout entry must contain the following properties:] {field, name, converter?}');\n }\n setUpdating(true);\n store.types.update(objectType.id, {\n table_layout\n }).then((response) => {\n toast({\n status: 'success',\n title: 'Table Layout updated',\n description: 'The table layout has been updated successfully',\n duration: 2000\n });\n onLayoutUpdate(response.table_layout);\n }).catch((err) => {\n toast({\n status: 'error',\n title: 'Failed to update table layout',\n description: err.message,\n duration: 5000\n });\n }).finally(() => {\n setUpdating(false);\n });\n };\n return (_jsxs(\"div\", { className: \"mx-2 my-2 rounded-2xl border border-solid shadow-xs\", children: [_jsxs(\"div\", { className: \"flex items-center rounded-t-md border-b gap-x-2 py-2 pl-4 pr-2\", children: [_jsx(\"div\", { className: \"text-base font-semibold \", children: \"Table Layout Editor\" }), _jsx(\"div\", { className: \"ml-auto flex gap-x-2\", children: _jsx(Button, { isLoading: isUpdating, variant: \"outline\", size: \"sm\", onClick: onSave, children: \"Save Changes\" }) })] }), _jsx(\"div\", { className: \"px-4 py-2\", children: _jsx(CodeMirrorEditor, { value: value, extensions: extensions, editorRef: editorRef }) })] }));\n}\nexport function stringifyTableLayout(obj) {\n if (!obj) {\n return '[\\n\\n]';\n }\n return JSON.stringify(obj, null, 2);\n}\n//# sourceMappingURL=TableLayoutEditor.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { json } from \"@codemirror/lang-json\";\nimport { Button, ErrorBox, FormItem, Input, Panel, Styles, Textarea, useFetch, useToast } from \"@vertesia/ui/core\";\nimport { SharedPropsEditor, SyncMemberHeadsToggle, UserInfo } from \"@vertesia/ui/features\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { CodeMirrorEditor, GeneratedForm, ManagedObject } from \"@vertesia/ui/widgets\";\nimport { basicSetup } from \"codemirror\";\nimport dayjs from \"dayjs\";\nimport { useMemo, useRef, useState } from \"react\";\nimport { SelectContentType, stringifyTableLayout } from \"../types\";\nconst extensions = [basicSetup, json()];\nexport function EditCollectionView({ refetch, collection }) {\n const typeId = collection.type?.id;\n const tableLayoutRef = useRef(undefined);\n const toast = useToast();\n const { client } = useUserSession();\n const [isUpdating, setUpdating] = useState(false);\n const [metadata, setMetadata] = useState({\n name: collection.name,\n description: collection.description || \"\",\n query: collection.query ? JSON.stringify(collection.query, null, 2) : \"\",\n tags: collection.tags || [],\n type: collection.type?.id || \"\",\n allowed_types: collection.allowed_types || [],\n });\n const tableLayoutValue = useMemo(() => {\n return stringifyTableLayout(collection.table_layout);\n }, [collection.table_layout]);\n const onSubmit = () => {\n let query = undefined;\n try {\n query = metadata.query ? JSON.parse(metadata.query) : undefined;\n }\n catch (err) {\n toast({\n title: \"Invalid Query JSON\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n const payload = {\n name: metadata.name,\n description: metadata.description,\n query: query,\n tags: metadata.tags,\n type: metadata.type,\n allowed_types: metadata.allowed_types,\n };\n let error;\n if (!payload.name) {\n error = \"Name is required\";\n }\n if (!payload.type) {\n payload.type = null;\n }\n if (error) {\n toast({\n title: \"Validation failed\",\n description: error,\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n if (tableLayoutRef.current) {\n const layout = tableLayoutRef.current.getValue();\n if (layout) {\n try {\n payload.table_layout = JSON.parse(layout);\n }\n catch (err) {\n toast({\n title: \"Invalid Table Layout\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n return;\n }\n }\n else {\n payload.table_layout = null;\n }\n }\n setUpdating(true);\n client.store.collections\n .update(collection.id, payload)\n .then(() => {\n refetch();\n toast({\n title: \"Collection updated\",\n description: \"Collection has been updated successfully\",\n status: \"success\",\n duration: 3000,\n });\n })\n .catch((err) => {\n toast({\n title: \"Failed to update collection\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n })\n .finally(() => {\n setUpdating(false);\n });\n };\n const setField = (name, value) => {\n setMetadata({\n ...metadata,\n [name]: value,\n });\n };\n return (_jsxs(\"div\", { className: \"flex flex-col gap-4 py-2\", children: [_jsxs(Panel, { title: \"Configuration\", action: _jsx(Button, { size: \"lg\", isDisabled: isUpdating, onClick: onSubmit, children: \"Save\" }), children: [_jsxs(\"div\", { className: \"flex justify-between mb-2\", children: [_jsxs(\"div\", { className: \"w-1/2 gap-2 flex flex-col\", children: [_jsx(\"div\", { className: \"text-sm font-medium mb-1\", children: \"Created By\" }), _jsxs(\"div\", { className: \"gap-2 flex items-center\", children: [_jsx(UserInfo, { userRef: collection.created_by, showTitle: true }), _jsxs(\"span\", { children: [\"at \", dayjs(collection.created_at).format(\"YYYY-MM-DD HH:mm:ss\")] })] })] }), _jsxs(\"div\", { className: \"w-1/2 gap-2 flex flex-col\", children: [_jsx(\"div\", { className: \"text-sm font-medium mb-1\", children: \"Updated By\" }), _jsxs(\"div\", { className: \"gap-2 flex items-center\", children: [_jsx(UserInfo, { userRef: collection.updated_by, showTitle: true }), _jsxs(\"span\", { children: [\"at \", dayjs(collection.updated_at).format(\"YYYY-MM-DD HH:mm:ss\")] })] })] })] }), _jsx(FormItem, { label: \"Name\", required: true, children: _jsx(Input, { value: metadata.name, onChange: (v) => setField(\"name\", v) }) }), _jsx(FormItem, { label: \"Description\", children: _jsx(Textarea, { value: metadata.description, onChange: (e) => setField(\"description\", e.target.value) }) }), !collection.dynamic &&\n _jsx(FormItem, { label: \"Allowed Content Types\", description: \"Select which content types can be added to the collection. If not set, then all content types are allowed.\", children: _jsx(SelectContentType, { defaultValue: metadata.allowed_types || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setField(\"allowed_types\", v.map(type => type.id));\n }\n else {\n setField(\"allowed_types\", v ? [v.id] : []);\n }\n }, isClearable: true, multiple: true }) }), collection.dynamic && (_jsx(FormItem, { label: \"Query\", description: \"Define the query to dynamically fetch content for the collection.\", children: _jsx(Textarea, { className: Styles.INPUT, value: metadata.query, onChange: (e) => setField(\"query\", e.target.value) }) })), _jsx(FormItem, { label: \"Table Layout\", description: \"Define a custom layout for displaying the collection in tables.\", children: _jsx(CodeMirrorEditor, { className: \"border-1 rounded-md border-border\", value: tableLayoutValue, extensions: extensions, editorRef: tableLayoutRef }) }), _jsx(FormItem, { label: \"Type\", description: \"Select a content type to assign custom properties and data to the collection.\", children: _jsx(SelectContentType, { defaultValue: metadata.type || null, onChange: (v) => {\n if (Array.isArray(v)) {\n setField(\"type\", v.length > 0 ? v[0].id : null);\n }\n else {\n setField(\"type\", v?.id || null);\n }\n }, isClearable: true }) })] }), typeId && _jsx(PropertiesEditor, { typeId: typeId, collection: collection }), !collection.dynamic && (_jsxs(_Fragment, { children: [_jsx(SyncMemberHeadsToggle, { collection: collection }), _jsx(SharedPropsEditor, { collection: collection })] }))] }));\n}\nfunction PropertiesEditor({ typeId, collection }) {\n const [formData, setFormData] = useState({});\n const toast = useToast();\n const { client } = useUserSession();\n const [isUpdating, setIsUpdating] = useState(false);\n const { data: type, error } = useFetch(() => client.store.types.retrieve(typeId), [typeId]);\n const schema = type?.object_schema || {};\n const object = useMemo(() => new ManagedObject(schema, collection.properties || {}), [schema, collection.properties]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Failed to load type\", children: error.message });\n }\n if (!type) {\n return null;\n }\n const _onSave = (data) => {\n if (!data || !Object.keys(data).length) {\n return;\n }\n const payload = { properties: data || {} };\n setIsUpdating(true);\n client.store.collections\n .update(collection.id, payload)\n .then(() => {\n toast({\n title: \"Collection properties updated\",\n description: \"Collection has been updated successfully\",\n status: \"success\",\n duration: 3000,\n });\n })\n .catch((err) => {\n toast({\n title: \"Failed to update collection properties\",\n description: err.message,\n status: \"error\",\n duration: 5000,\n });\n })\n .finally(() => {\n setIsUpdating(false);\n });\n };\n const onDataChanged = (data) => {\n if (data instanceof ManagedObject) {\n setFormData(data.value);\n }\n };\n return (_jsx(Panel, { title: \"Properties\", action: _jsx(Button, { size: \"lg\", isLoading: isUpdating, type: \"submit\", onClick: () => _onSave(formData), children: \"Save\" }), children: _jsx(GeneratedForm, { object: object, onChange: onDataChanged }) }));\n}\n//# sourceMappingURL=EditCollectionView.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Check, ChevronsUpDown } from \"lucide-react\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { Button, cn, ErrorBox, useDebounce, useFetch, Popover, PopoverContent, PopoverTrigger, Command, CommandEmpty, CommandGroup, CommandItem, CommandInput } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nexport function SelectCollection({ onChange, value, disabled = false, placeholder = \"Select a collection\", searchPlaceholder = \"Search collections\", filterOut, allowDynamic = true, multiple = false }) {\n const { client } = useUserSession();\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [useServerSearch, setUseServerSearch] = useState(false);\n // Debounce the search query to avoid excessive API calls (only used for server-side search)\n const debouncedSearchQuery = useDebounce(searchQuery, 300);\n // Memoize the search function to prevent unnecessary re-renders\n const searchCollections = useCallback(async (query) => {\n setIsSearching(true);\n const trimmedQuery = query.trim();\n const collections = await client.store.collections.search({\n dynamic: allowDynamic ? undefined : false,\n name: useServerSearch ? (trimmedQuery || undefined) : undefined\n });\n setIsSearching(false);\n // Check if we hit the maximum limit (1000 collections) - if so, enable server-side search\n if (!useServerSearch && collections.length >= 1000) {\n setUseServerSearch(true);\n }\n // Filter out collections if filterOut is provided\n if (filterOut && filterOut.length > 0) {\n return collections.filter(col => !filterOut.includes(col.id));\n }\n return collections;\n }, [client, allowDynamic, filterOut, useServerSearch]);\n // Fetch collections based on search mode\n const { data: collections, error } = useFetch(() => searchCollections(useServerSearch ? debouncedSearchQuery : ''), [useServerSearch ? debouncedSearchQuery : '', searchCollections]);\n // Memoize the selected collection(s)\n const selectedCollection = useMemo(() => {\n if (!collections)\n return multiple ? [] : undefined;\n if (multiple && Array.isArray(value)) {\n return collections.filter((collection) => value.includes(collection.id));\n }\n else if (!multiple && typeof value === 'string') {\n return collections.find((collection) => collection.id === value);\n }\n return multiple ? [] : undefined;\n }, [collections, value, multiple]);\n // Handle collection selection\n const handleSelect = useCallback((collection) => {\n if (multiple) {\n const currentValues = Array.isArray(value) ? value : [];\n const isSelected = currentValues.includes(collection.id);\n if (isSelected) {\n // Remove from selection\n const newValues = currentValues.filter(id => id !== collection.id);\n const newCollections = collections?.filter(c => newValues.includes(c.id)) || [];\n onChange(newValues, newCollections);\n }\n else {\n // Add to selection\n const newValues = [...currentValues, collection.id];\n const newCollections = collections?.filter(c => newValues.includes(c.id)) || [];\n onChange(newValues, newCollections);\n }\n }\n else {\n onChange(collection.id, collection);\n }\n }, [onChange, value, collections, multiple]);\n // Handle clear selection\n const handleClear = useCallback(() => {\n onChange(undefined, undefined);\n }, [onChange]);\n // Handle search input change\n const handleSearchChange = useCallback((query) => {\n setSearchQuery(query);\n }, []);\n const hasSearchQuery = searchQuery.trim().length > 0;\n // Client-side filtering when not using server search\n const filteredCollections = useMemo(() => {\n if (!collections)\n return [];\n // If using server search, collections are already filtered by the server\n if (useServerSearch)\n return collections;\n // Otherwise, do client-side filtering\n if (!hasSearchQuery)\n return collections;\n const queryLower = searchQuery.toLowerCase();\n return collections.filter(col => col.name.toLowerCase().includes(queryLower));\n }, [collections, useServerSearch, hasSearchQuery, searchQuery]);\n const showClearOption = selectedCollection && hasSearchQuery;\n // Show error state\n if (error) {\n return (_jsx(ErrorBox, { title: \"Collection fetch failed\", children: error.message }));\n }\n // Get display text for the button\n const getDisplayText = () => {\n if (multiple && Array.isArray(selectedCollection) && selectedCollection.length > 0) {\n if (selectedCollection.length === 1) {\n return selectedCollection[0].name;\n }\n return `${selectedCollection.length} collections selected`;\n }\n else if (!multiple && selectedCollection && !Array.isArray(selectedCollection)) {\n return selectedCollection.name;\n }\n return placeholder;\n };\n return (_jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: \"outline\", role: \"combobox\", \"aria-haspopup\": \"listbox\", className: cn(\"w-full justify-between min-w-0\"), disabled: disabled, children: [_jsx(\"span\", { className: \"truncate flex-1 text-left min-w-0\", children: getDisplayText() }), _jsx(ChevronsUpDown, { className: \"ml-2 h-4 w-4 shrink-0 opacity-50\" })] }) }), _jsx(PopoverContent, { className: \"mt-2 mb-2 w-[var(--radix-popover-trigger-width)] p-0\", align: \"start\", children: _jsxs(Command, { shouldFilter: false, children: [_jsxs(\"div\", { className: \"flex justify-between items-center border-b px-3\", \"cmdk-input-wrapper\": \"\", children: [_jsx(CommandInput, { placeholder: searchPlaceholder, value: searchQuery, onValueChange: handleSearchChange, className: \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\" }), isSearching && (_jsx(\"div\", { className: \"mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" }))] }), _jsx(CommandEmpty, { children: isSearching\n ? \"Searching...\"\n : hasSearchQuery\n ? \"No collections found.\"\n : \"No collections available.\" }), _jsxs(CommandGroup, { className: \"max-h-[300px] overflow-auto\", children: [showClearOption && !multiple && (_jsx(CommandItem, { value: \"__clear__\", onSelect: handleClear, className: \"text-muted-foreground\", children: \"Clear selection\" })), filteredCollections.map((collection) => {\n const isSelected = multiple && Array.isArray(value)\n ? value.includes(collection.id)\n : value === collection.id;\n return (_jsxs(CommandItem, { value: collection.id, onSelect: () => handleSelect(collection), className: \"flex items-center justify-between\", children: [_jsx(\"span\", { className: \"truncate\", children: collection.name }), isSelected && (_jsx(Check, { className: \"ml-2 h-4 w-4 shrink-0\" }))] }, collection.id));\n })] })] }) })] }));\n}\n//# sourceMappingURL=SelectCollection.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Button, Panel, TagsInput, useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useEffect, useState } from \"react\";\nexport function SharedPropsEditor({ collection }) {\n const { client } = useUserSession();\n const [colType, setColType] = useState(undefined);\n const [sharedProps, setSharedProps] = useState(collection.shared_properties || []);\n const toast = useToast();\n useEffect(() => {\n if (collection.type?.id) {\n client.store.types.retrieve(collection.type.id).then(setColType);\n }\n }, [collection.type?.id]);\n const options = colType ? Object.keys(colType.object_schema?.properties || {}) : [];\n const onSelect = (selected) => {\n setSharedProps(selected);\n };\n const onSave = () => {\n client.store.collections.update(collection.id, {\n shared_properties: sharedProps\n }).then(() => {\n // Handle success\n toast({\n title: \"Updated shared properties\",\n status: \"success\"\n });\n }).catch((error) => {\n toast({\n title: \"Failed to update shared properties\",\n description: error.message,\n status: \"error\"\n });\n // Handle error\n });\n };\n return (_jsx(Panel, { title: \"Shared Properties\", description: \"Add properties to share across all members in the collection. This feature requires to enable shared property synchronization on the project.\", action: _jsx(Button, { size: \"lg\", isLoading: false, onClick: onSave, children: \"Save\" }), children: _jsx(\"div\", { className: '', children: _jsx(TagsInput, { value: sharedProps, onChange: onSelect, options: options, placeholder: \"Select properties to share\" }) }) }));\n}\n//# sourceMappingURL=SharedPropsEditor.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Panel, Switch, useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useState } from \"react\";\nexport function SyncMemberHeadsToggle({ collection }) {\n const { client } = useUserSession();\n const [skipHeadSync, setSkipHeadSync] = useState(collection.skip_head_sync ?? false);\n const [isSaving, setIsSaving] = useState(false);\n const toast = useToast();\n const onSaveSkipHeadSync = (enableSyncHeads) => {\n const skip_head_sync = !enableSyncHeads;\n setIsSaving(true);\n client.store.collections.update(collection.id, {\n skip_head_sync: skip_head_sync\n }).then(() => {\n // Handle success\n toast({\n title: \"Updated skip head sync setting\",\n status: \"success\"\n });\n setSkipHeadSync(skip_head_sync);\n }).catch((error) => {\n toast({\n title: \"Failed to update skip head sync\",\n description: error.message,\n status: \"error\"\n });\n // Handle error\n }).finally(() => {\n setIsSaving(false);\n });\n };\n return (_jsx(Panel, { title: \"Synchronize Member Heads\", description: \"When a new HEAD version of a member is created the colleciton will be updated to point to the new HEAD.\", children: _jsx(Switch, { disabled: isSaving, value: !skipHeadSync, onChange: onSaveSkipHeadSync, children: \"Enable synchronizing member heads\" }) }));\n}\n//# sourceMappingURL=SyncMemberHeadsToggle.js.map","import { jsxs as _jsxs, jsx as _jsx } from \"react/jsx-runtime\";\nimport { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useCallback, useState } from \"react\";\nimport { SelectContentTypeModal } from \"../../../types\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\nexport function ChangeTypeActionComponent({ action, objectIds, children }) {\n const { store } = useUserSession();\n const toast = useToast();\n const [isOpen, setOpen] = useState(false);\n const callback = useCallback(() => {\n setOpen(true);\n return Promise.resolve(true);\n }, []);\n useObjectsActionCallback(action.id, callback);\n const handleTypeSelect = (typeId) => {\n // Close the modal\n setOpen(false);\n // If no selection was made\n if (typeId === undefined) {\n return;\n }\n // Execute the operation with the selected typeId\n store.runOperation({\n name: \"change_type\",\n ids: objectIds,\n params: { typeId }\n }).then((r) => {\n toast({\n status: 'success',\n title: 'Change Type',\n description: `Change the type of ${objectIds.length} objects is ${r.status === 'in_progress' ? 'in progress' : 'completed'}`,\n duration: 2000\n });\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error changing type',\n description: err.message,\n duration: 5000\n });\n });\n };\n return (_jsxs(\"div\", { children: [children, _jsx(SelectContentTypeModal, { isOpen: isOpen, onClose: handleTypeSelect, title: \"Change Content Type\", confirmLabel: \"Change Type\", children: _jsxs(\"div\", { className: \"text-sm flex flex-col gap-x-2\", children: [_jsxs(\"p\", { children: [\"Choose a new Content Type for the selected object\", objectIds.length > 1 ? 's' : ' ', \"or let the system choose or generate a type based on the content.\"] }), _jsxs(\"p\", { className: \"pt-2 text-xs\", children: [\"Note: This action will raise the \", _jsx(\"code\", { children: \"change_type\" }), \" event and will trigger the standard intake workflows which may reset the object properties.\"] })] }) })] }));\n}\nexport const ChangeTypeAction = {\n id: \"changeType\",\n name: 'Change Content Type',\n description: 'Change the Content Type of the selected documents',\n confirm: false,\n component: ChangeTypeActionComponent,\n};\n//# sourceMappingURL=ChangeTypeAction.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { ConfirmModal } from \"@vertesia/ui/core\";\nimport { useCallback, useState } from \"react\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\n/**\n * Generic implementation of an action component.\n * The action component is not the one which is clicked by the user, but the one that is registering the action callback.\n * @param param0\n * @returns\n */\nexport default function ConfirmAction({ action, callback, children }) {\n const [showConfirmModal, setShowConfirmModal] = useState(false);\n const confirmationText = action.confirmationText || `Are you sure you want to ${action.name}?`;\n const _callback = useCallback((params) => {\n if (action.confirm) {\n setShowConfirmModal(true);\n return Promise.resolve(true);\n }\n else {\n return callback(params);\n }\n }, [action.confirm, callback]);\n const ctx = useObjectsActionCallback(action.id, _callback);\n const onConfirm = () => {\n setShowConfirmModal(false);\n callback({ ...ctx.params, action });\n };\n return (_jsxs(_Fragment, { children: [children, _jsx(ConfirmModal, { onConfirm: onConfirm, onCancel: () => setShowConfirmModal(false), title: \"Are you sure?\", content: confirmationText, isOpen: showConfirmModal })] }));\n}\n//# sourceMappingURL=ConfirmAction.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useCallback } from 'react';\nimport { useToast } from '@vertesia/ui/core';\nimport { useNavigate } from \"@vertesia/ui/router\";\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useDocumentSearch } from '../../search/DocumentSearchContext';\nimport { useObjectsActionContext } from '../ObjectsActionContext';\nimport ConfirmAction from './ConfirmAction';\nexport function DeleteObjectsActionComponent({ action, objectIds, children }) {\n const ctx = useObjectsActionContext();\n const toast = useToast();\n const { client } = useUserSession();\n const search = useDocumentSearch();\n const navigate = useNavigate();\n const callback = useCallback(() => {\n if (!objectIds || !objectIds.length) {\n toast({\n status: 'error',\n title: 'No objects selected',\n description: 'Please select objects to delete',\n duration: 3000\n });\n return Promise.resolve(false);\n }\n function limitFilesName(names, maxLength) {\n if (names.length <= maxLength)\n return names;\n const extIndex = names.lastIndexOf('.');\n const ext = extIndex !== -1 ? names.substring(extIndex) : '';\n const baseName = extIndex !== -1 ? names.substring(0, extIndex) : names;\n const limitedBaseName = baseName.substring(0, maxLength - ext.length - 3);\n return `${limitedBaseName}...${ext}`;\n }\n return Promise.all(objectIds.map(id => client.store.objects.delete(id))).then((res) => {\n const plural = res.length > 1 ? 's' : '';\n toast({\n status: 'success',\n title: `${res.length} object${plural} deleted`,\n description: `Objects ${(limitFilesName(res.map(d => d.id).join(\", \"), 100))} have been deleted`,\n duration: 2000\n });\n if (search) { // we are in the objects table view\n ctx.params?.selection?.removeAll();\n const facets = JSON.parse(JSON.stringify(search.facets));\n if (objectIds.length === facets._value.total) {\n search.resetFacets();\n }\n search.search();\n }\n else {\n // we are in the object view\n // go back to the parent\n navigate(\"/objects\");\n }\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error deleting objects',\n description: err.message,\n duration: 5000\n });\n });\n }, [objectIds]);\n return (_jsx(ConfirmAction, { action: action, callback: callback, children: children }));\n}\nexport const DeleteObjectsAction = {\n id: 'delete',\n name: 'Delete',\n description: 'Delete the selected objects',\n confirm: true,\n confirmationText: 'Are you sure you want to delete all the selected objects? This action cannot be undone.',\n component: DeleteObjectsActionComponent,\n destructive: true\n};\nexport const DeleteObjectsFromCollectionsAction = {\n id: 'deleteFromCollections',\n name: 'Delete Objects',\n description: 'Delete the selected objects',\n confirm: true,\n confirmationText: 'Are you sure you want to delete the selected objects?\\nThis is not removable from collections.',\n component: DeleteObjectsActionComponent,\n destructive: true\n};\n//# sourceMappingURL=DeleteObjectsAction.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useToast } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useCallback, useState } from \"react\";\nimport { ExportPropertiesModal, ExportTypes } from \"../../ExportPropertiesModal\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\nexport function ExportPropertiesComponent({ action, objectIds }) {\n const { store } = useUserSession();\n const toast = useToast();\n const [isOpen, setOpen] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n const callback = useCallback(() => {\n setOpen(true);\n return Promise.resolve(true);\n }, []);\n const ctx = useObjectsActionCallback(action.id, callback);\n const onExportType = (exportType, exportAll) => {\n if (exportType && (exportAll || objectIds.length > 0)) {\n setIsExporting(true);\n const query = ctx.params?.search?.query || {};\n const search_objectIds = ctx.params?.search?.result?.value?.objects?.map(obj => obj.id) || undefined;\n const getChildObjects = async (objectId) => {\n return store.objects.list({\n query: {\n parent: objectId,\n }\n }).then((response) => {\n return response.map(obj => obj.id);\n });\n };\n const getObjectIds = async () => {\n if (exportAll) {\n // If there is a vector search use that.\n if (search_objectIds) {\n return query.vector ? search_objectIds : [];\n }\n // Nothing is selected, export all objects.\n if (objectIds.length === 0) {\n return [];\n }\n // If there is no search, and 1 object is selected we are on the object page.\n // Export all children of the object and the object itself.\n return (await getChildObjects(objectIds[0])).concat(objectIds);\n }\n else {\n return objectIds;\n }\n };\n getObjectIds().then((Ids) => {\n // When exporting all, send search result if a vector search was used\n // otherwise send the query.\n store.objects.exportProperties({\n objectIds: Ids,\n type: exportType,\n query: exportAll && !query.vector ? query : { type: query.type },\n }).then((response) => {\n let data;\n if (exportType === ExportTypes.CSV) {\n data = new Blob([response.data], { type: response.type });\n }\n else if (exportType === ExportTypes.JSON) {\n data = new Blob([JSON.stringify(response.data)], { type: response.type });\n }\n else {\n const responseData = response.data;\n data = new Blob([new Uint8Array(responseData.data)], { type: response.type });\n }\n const url = window.URL.createObjectURL(data);\n const a = document.createElement('a');\n a.download = response.name;\n a.href = url;\n a.click();\n toast({\n status: 'success',\n title: 'Export Properties',\n description: exportAll ? 'Export the properties of all objects completed'\n : `Export the properties of ${objectIds.length} object${objectIds.length > 1 ? 's' : ''} is completed`,\n duration: 2000\n });\n }).catch(err => {\n toast({\n status: 'error',\n title: 'Error Export Properties',\n description: err.message,\n duration: 5000\n });\n }).finally(() => {\n setIsExporting(false);\n setOpen(false);\n });\n });\n }\n else {\n setOpen(false);\n }\n };\n return (_jsx(\"div\", { children: _jsx(ExportPropertiesModal, { isExporting: isExporting, isOpen: isOpen, onClose: onExportType }) }));\n}\nexport const ExportPropertiesAction = {\n id: \"exportProperties\",\n name: 'Export Properties',\n description: 'Export all Object Properties',\n confirm: false,\n component: ExportPropertiesComponent,\n};\n//# sourceMappingURL=ExportPropertiesAction.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { useCallback } from 'react';\nimport { useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useDocumentSearch } from '../../search';\nimport { useObjectsActionContext } from '../ObjectsActionContext';\nimport ConfirmAction from './ConfirmAction';\nexport function RemoveFromCollectionActionComponent({ action, objectIds, collectionId }) {\n const ctx = useObjectsActionContext();\n const toast = useToast();\n const { client } = useUserSession();\n const search = useDocumentSearch();\n const callback = useCallback(() => {\n if (!objectIds || !objectIds.length) {\n toast({\n status: 'error',\n title: 'No objects selected',\n description: 'Please select objects to remove from collection',\n duration: 3000\n });\n return Promise.resolve(false);\n }\n if (!collectionId) {\n toast({\n status: 'error',\n title: 'No collection context',\n description: 'Cannot remove objects: no collection specified',\n duration: 3000\n });\n return Promise.resolve(false);\n }\n return client.store.collections.deleteMembers(collectionId, objectIds).then(() => {\n const plural = objectIds.length > 1 ? 's' : '';\n toast({\n status: 'success',\n title: `${objectIds.length} object${plural} removed from collection`,\n description: `Objects have been removed from the collection`,\n duration: 2000\n });\n if (search) {\n ctx.params?.selection?.removeAll();\n search.search();\n }\n }).catch((err) => {\n toast({\n status: 'error',\n title: 'Error removing objects from collection',\n description: err.message,\n duration: 5000\n });\n });\n }, [objectIds, collectionId]);\n return (_jsx(ConfirmAction, { action: action, callback: callback }));\n}\nexport const RemoveFromCollectionAction = {\n id: 'removeFromCollection',\n name: 'Remove from Collection',\n description: 'Remove the selected objects from this collection',\n confirm: true,\n confirmationText: 'Are you sure you want to remove the selected objects from this collection?',\n component: RemoveFromCollectionActionComponent,\n destructive: true\n};\n//# sourceMappingURL=RemoveFromCollectionAction.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { Button, VModal, VModalBody, VModalFooter, VModalTitle, SelectList, useToast } from \"@vertesia/ui/core\";\nimport { useCallback, useState } from \"react\";\nimport { useObjectsActionCallback, useObjectsActionContext } from \"../ObjectsActionContext\";\nexport function StartWorkflowComponent({ action, objectIds, collectionId }) {\n const toast = useToast();\n const { client } = useUserSession();\n const [isOpen, setOpen] = useState(false);\n const callback = useCallback(() => {\n setOpen(true);\n return Promise.resolve(true);\n }, []);\n const onStartWorkflow = (workflowId) => {\n setOpen(false);\n if (!workflowId) {\n return;\n }\n // const objectIds = params.selection.getObjectIds();\n // const workflowId = params.action.id;\n return client.store.workflows.rules\n .execute(workflowId, objectIds, { collection_id: collectionId })\n .then(() => {\n toast({\n title: \"Workflow started\",\n status: \"success\",\n duration: 3000,\n });\n })\n .catch((err) => {\n toast({\n title: \"Error starting workflow\",\n status: \"error\",\n description: err.message,\n duration: 9000,\n });\n });\n };\n useObjectsActionCallback(action.id, callback);\n return _jsx(StartWorkflowModal, { isOpen: isOpen, onClose: onStartWorkflow });\n}\nexport const StartWorkflowAction = {\n id: \"startWorkflow\",\n name: \"Start Workflow\",\n description: \"Start an workflow on the selected objects\",\n confirm: false,\n hideInList: true,\n component: StartWorkflowComponent,\n};\nfunction StartWorkflowModal({ isOpen, onClose }) {\n return (_jsxs(VModal, { onClose: () => onClose(undefined), isOpen: isOpen, className: \"\", children: [_jsx(VModalTitle, { children: \"Start a Workflow by Rule\" }), _jsx(StartWorkflowBody, { onClose: onClose })] }));\n}\nfunction optionLayout(option) {\n return {\n label: (_jsxs(\"div\", { children: [_jsx(\"div\", { children: option.name }), _jsx(\"div\", { className: \"text-sm text-muted\", children: option.description })] })),\n reverse: true,\n };\n}\nfunction StartWorkflowBody({ onClose }) {\n const [selected, setSelected] = useState(undefined);\n const context = useObjectsActionContext();\n const onSelect = (value) => {\n setSelected(value);\n };\n const onStart = () => {\n if (selected) {\n onClose(selected.id);\n }\n };\n return (_jsxs(\"div\", { children: [_jsxs(VModalBody, { children: [_jsx(\"div\", { className: \"pb-2\", children: \"Choose a workflow rule to start:\" }), _jsx(\"div\", { className: \"max-h-[420px] overflow-y-scroll border-border border rounded-md\", children: _jsx(SelectList, { options: context.wfRules, optionLayout: optionLayout, onChange: onSelect, value: selected }) })] }), _jsxs(VModalFooter, { children: [_jsx(Button, { variant: \"secondary\", onClick: () => onClose(), children: \"Cancel\" }), _jsx(Button, { onClick: onStart, isDisabled: !selected, children: \"Start\" })] })] }));\n}\n//# sourceMappingURL=StartWorkflowComponent.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { createContext, useContext, useEffect, useMemo } from 'react';\nimport { ErrorBox, useFetch, useToast } from '@vertesia/ui/core';\nimport { useUserSession } from '@vertesia/ui/session';\nimport { useDocumentSearch, useDocumentSelection } from '../../../store';\nimport { AddToCollectionAction } from './actions/AddToCollectionAction';\nimport { ChangeTypeAction } from './actions/ChangeTypeAction';\nimport { DeleteObjectsAction, DeleteObjectsFromCollectionsAction } from './actions/DeleteObjectsAction';\nimport { ExportPropertiesAction } from './actions/ExportPropertiesAction';\nimport { RemoveFromCollectionAction } from './actions/RemoveFromCollectionAction';\nimport { StartWorkflowAction, StartWorkflowComponent } from './actions/StartWorkflowComponent';\nexport class ObjectsActionContext {\n params;\n allActions = [\n ExportPropertiesAction,\n ChangeTypeAction,\n StartWorkflowAction,\n AddToCollectionAction,\n DeleteObjectsAction,\n RemoveFromCollectionAction,\n DeleteObjectsFromCollectionsAction\n ];\n wfRules = [];\n callbacks = {};\n startWorkflow;\n constructor(params) {\n this.params = params;\n }\n get actions() {\n const isInCollection = !!this.params.selection?.collectionId;\n if (isInCollection) {\n return this.allActions.filter(action => action.id !== 'addToCollection' && action.id !== 'delete');\n }\n else {\n return this.allActions.filter(action => action.id !== 'removeFromCollection' && action.id !== 'deleteFromCollections');\n }\n }\n async loadWorkflows() {\n this.params.client.workflows.rules.list().then((rules) => {\n this.wfRules = rules.map(rule => ({\n id: rule.id,\n name: rule.name,\n description: rule.description,\n confirm: false,\n isWorkflow: true,\n component: StartWorkflowComponent\n })).sort((a, b) => a.name.localeCompare(b.name));\n });\n return this.wfRules;\n }\n registerCallback(name, cb) {\n this.callbacks[name] = cb;\n return () => {\n delete this.callbacks[name];\n };\n }\n unregisterCallback(name) {\n delete this.callbacks[name];\n }\n findAction(actionId) {\n let action = this.allActions.find(a => a.id === actionId);\n if (!action) {\n action = this.wfRules.find(a => a.id === actionId);\n }\n return action;\n }\n async run(actionId) {\n const action = this.findAction(actionId);\n if (!action) {\n throw new Error(`Action ${actionId} not found`);\n }\n const params = { ...this.params, action };\n // if (action.isWorkflow) {\n // if (!this.startWorkflow) {\n // throw new Error(\"No startWorkflow callback set\");\n // }\n // return this.startWorkflow(params);\n // } else {\n const cb = this.callbacks[actionId];\n if (cb) {\n return cb(params);\n }\n else {\n throw new Error(\"No action callback set\");\n }\n // }\n }\n}\nconst ObjectsActionContextReact = createContext(undefined);\nexport function ObjectsActionContextProvider({ children }) {\n const selection = useDocumentSelection();\n const toast = useToast();\n const { client } = useUserSession();\n const search = useDocumentSearch();\n const { data: rules, error } = useFetch(() => {\n return client.workflows.rules.list().then((rules) => {\n return rules.map(rule => ({\n id: rule.id,\n name: rule.name,\n description: rule.description,\n confirm: false,\n isWorkflow: true,\n component: StartWorkflowComponent\n })).sort((a, b) => a.name.localeCompare(b.name));\n });\n }, []);\n const context = useMemo(() => {\n const context = new ObjectsActionContext({\n selection, toast, client, search\n });\n context.wfRules = rules;\n return context;\n }, [selection, rules]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Failed to fetch workflows\", children: error.message });\n }\n return (context && (_jsxs(ObjectsActionContextReact.Provider, { value: context, children: [_jsx(Actions, {}), children] })));\n}\nfunction Actions({}) {\n const context = useObjectsActionContext();\n const selection = context.params.selection;\n const objectId = selection.getObjectId();\n const objectIds = selection.isSingleSelection() && objectId ? [objectId] : selection.getObjectIds();\n return (_jsx(\"div\", { style: { display: 'none' }, children: context.allActions.map(action => (_jsx(action.component, { action: action, objectIds: objectIds, collectionId: selection.collectionId }, action.id))) }));\n}\nexport function useObjectsActionContext() {\n const ctx = useContext(ObjectsActionContextReact);\n if (!ctx) {\n throw new Error(\"You cannot use useActionContext outside an ActionProvider\");\n }\n return ctx;\n}\nexport function useObjectsActionCallback(name, cb) {\n const ctx = useObjectsActionContext();\n useEffect(() => {\n return ctx.registerCallback(name, cb);\n }, [ctx, name, cb]);\n return ctx;\n}\nexport function useStartWorkflowCallback(cb) {\n const ctx = useObjectsActionContext();\n useEffect(() => {\n ctx.startWorkflow = cb;\n return () => {\n ctx.startWorkflow = undefined;\n };\n }, [cb, ctx]);\n return ctx;\n}\n//# sourceMappingURL=ObjectsActionContext.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, DialogDescription, Heading, Portal, useToast, VModal, VModalBody, VModalFooter, VModalTitle, VTabs, VTabsBar, VTabsPanel } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { useCallback, useState } from \"react\";\nimport { CreateCollectionForm, SelectCollection } from \"../../../collections\";\nimport { useObjectsActionCallback } from \"../ObjectsActionContext\";\nexport function AddToCollectionActionComponent({ action, objectIds }) {\n const [showModal, setShowModal] = useState(false);\n const callback = useCallback(() => {\n if (objectIds.length > 0) {\n setShowModal(true);\n }\n return Promise.resolve(true);\n }, [objectIds]);\n const onClose = () => {\n setShowModal(false);\n };\n useObjectsActionCallback(action.id, callback);\n return showModal && _jsx(Portal, { children: _jsx(SelectCollectionModal, { objectIds: objectIds, isOpen: showModal, onClose: onClose }) });\n}\nexport const AddToCollectionAction = {\n id: \"addToCollection\",\n name: 'Add to Collection',\n description: 'Add documents to a collection',\n confirm: false,\n component: AddToCollectionActionComponent,\n};\nfunction SelectCollectionModal({ isOpen, onClose, objectIds }) {\n return (_jsxs(VModal, { isOpen: isOpen, onClose: onClose, className: \"max-w-lg w-full min-w-0 overflow-hidden\", children: [_jsx(VModalTitle, { className: \"flex flex-col min-w-0 overflow-hidden\", children: \"Add to a Collection\" }), _jsx(DialogDescription, { className: \"min-w-0 overflow-hidden\", children: \"Add the selected objects to an existing collection or create a new one.\" }), _jsx(\"div\", { className: \"min-w-0 max-w-full overflow-hidden\", children: _jsx(AddToCollectionForm, { onClose: onClose, objectIds: objectIds }) })] }));\n}\nfunction AddToCollectionForm({ onClose, objectIds }) {\n const toast = useToast();\n const { client } = useUserSession();\n const [selectedCollectionId, setSelectedCollectionId] = useState();\n const onAddToCollection = ({ collectionId }) => {\n if (!collectionId || !objectIds?.length) {\n return;\n }\n client.store.collections.addMembers(collectionId, objectIds).then(() => {\n toast({\n title: 'Add to collection success',\n status: 'success',\n description: `Added ${objectIds.length} objects to the selected collection`,\n duration: 3000\n });\n onClose();\n }).catch(() => {\n toast({\n title: 'Add to collection failure',\n status: 'error',\n description: `Failed to add the selected objects to the collection`,\n duration: 5000\n });\n });\n };\n const onCollectionChange = (collectionId, _collection) => {\n if (typeof collectionId === \"string\" || typeof collectionId === \"undefined\") {\n setSelectedCollectionId(collectionId);\n }\n else if (Array.isArray(collectionId) && collectionId.length > 0) {\n setSelectedCollectionId(collectionId[0]);\n }\n else {\n setSelectedCollectionId(undefined);\n }\n };\n const tabs = [\n {\n name: 'select',\n label: 'Select Collection',\n content: (_jsxs(\"div\", { className: \"p-4 min-w-0 max-w-full overflow-hidden\", children: [_jsx(Heading, { level: 5, children: \"Choose from existing collections\" }), _jsx(VModalBody, { className: \"min-w-0 max-w-full overflow-hidden\", children: _jsx(\"div\", { className: \"mb-4 min-w-0 max-w-full overflow-hidden\", children: _jsx(SelectCollection, { onChange: onCollectionChange, value: selectedCollectionId }) }) }), _jsx(VModalFooter, { children: _jsx(Button, { isDisabled: !selectedCollectionId, onClick: () => selectedCollectionId && onAddToCollection({ collectionId: selectedCollectionId }), children: \"Add to Collection\" }) })] }))\n },\n {\n name: 'create',\n label: 'Create new',\n content: _jsx(\"div\", { className: \"p-4\", children: _jsx(CreateCollectionForm, { onClose: onClose, onAddToCollection: (id) => onAddToCollection({ collectionId: id }), redirect: false }) })\n }\n ];\n return (_jsxs(VTabs, { defaultValue: \"select\", tabs: tabs, fullWidth: true, children: [_jsx(VTabsBar, {}), _jsx(VTabsPanel, {})] }));\n}\n//# sourceMappingURL=AddToCollectionAction.js.map","import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Button, Popover, PopoverContent, PopoverTrigger, SelectList } from '@vertesia/ui/core';\nimport clsx from 'clsx';\nimport { EllipsisVertical, X } from 'lucide-react';\nimport { useState } from \"react\";\nimport { DocumentUploadModal, useDocumentSelection } from \"../../../store\";\nimport { ExportPropertiesAction } from \"./actions/ExportPropertiesAction\";\nimport { StartWorkflowAction } from \"./actions/StartWorkflowComponent\";\nimport { ObjectsActionContextProvider, useObjectsActionContext } from \"./ObjectsActionContext\";\nexport function SelectionActions() {\n const selection = useDocumentSelection();\n const size = selection.size();\n const plural = size > 1 ? \"s\" : \"\";\n const hasSelection = selection?.hasSelection();\n const hasSingleSelection = selection?.isSingleSelection();\n const onClearSelection = () => {\n selection?.removeAll();\n };\n return (_jsx(ObjectsActionContextProvider, { children: _jsxs(\"div\", { className: \"flex items-center gap-x-2\", children: [hasSelection && !hasSingleSelection &&\n _jsxs(\"div\", { className: \"flex items-center gap-x-1 shrink-0\", children: [_jsxs(\"div\", { className: 'text-sm nowrap', children: [size, \" document\", plural, \" selected\"] }), _jsx(Button, { title: \"Clear selection\", variant: \"ghost\", onClick: onClearSelection, children: _jsx(X, { className: \"size-4\" }) })] }), _jsx(SelectionActionsPopover, { selection: selection, children: _jsx(Button, { variant: \"ghost\", alt: \"More action\", size: \"sm\", children: _jsx(EllipsisVertical, { size: 16 }) }) }), hasSelection && _jsx(ActionsWrapper, { selection: selection })] }) }));\n}\nfunction ActionsWrapper({}) {\n return _jsx(StartWorkflowButton, {});\n}\nexport function UploadObjectsButton({ collectionId, allowFolders = true }) {\n const [files, setFiles] = useState([]);\n const [isOpen, setIsOpen] = useState(false);\n const selection = useDocumentSelection();\n const hasSelection = selection?.hasSelection();\n const onClose = () => {\n setIsOpen(false);\n setFiles([]);\n };\n return (!hasSelection &&\n _jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => setIsOpen(true), children: \"Upload\" }), _jsx(DocumentUploadModal, { collectionId: collectionId ?? '', isOpen: isOpen, onClose: onClose, files: files, title: \"Upload Files\", onUploadComplete: (result) => {\n if (result && result.success) {\n setFiles([]);\n }\n }, allowFolders: allowFolders })] }));\n}\nfunction StartWorkflowButton() {\n const ctx = useObjectsActionContext();\n const selection = ctx.params.selection;\n const hasSelection = selection.hasSelection();\n return (hasSelection &&\n _jsx(Button, { onClick: () => ctx.run(StartWorkflowAction.id), children: \"Start Workflow\" }));\n}\nfunction optionLayout(option) {\n return {\n label: option.name,\n className: clsx('flex-1 px-2 py-2 hover:bg-accent nowrap', option.destructive ? 'text-destructive' : ''),\n };\n}\nfunction SelectionActionsPopover({ selection, children }) {\n const context = useObjectsActionContext();\n const executeAction = (action) => {\n context.run(action.id);\n };\n return (_jsxs(Popover, { hover: true, children: [_jsx(PopoverTrigger, { children: children }), _jsx(PopoverContent, { className: 'p-0 w-50', align: 'end', sideOffset: 6, children: _jsx(PopoverBody, { executeAction: executeAction, selection: selection }) })] }));\n}\nfunction PopoverBody({ executeAction, selection }) {\n const context = useObjectsActionContext();\n const _executeAction = (action) => {\n executeAction(action);\n };\n const _selection = selection?.hasSelection() ? context.actions.filter(action => !action.hideInList) : [ExportPropertiesAction];\n return (_jsx(\"div\", { className: \"rounded-md shadow-md py-2\", children: _jsx(\"div\", { className: \"px-1 text-sm\", children: _jsx(SelectList, { options: _selection, optionLayout: optionLayout, onChange: _executeAction, noCheck: true }) }) }));\n}\n//# sourceMappingURL=SelectionActions.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Button, Spinner, VModal, VModalBody, VModalTitle, VTooltip } from \"@vertesia/ui/core\";\nimport { Activity, CheckIcon, FileTextIcon, HelpCircleIcon, PaperclipIcon, SendIcon, StopCircleIcon, UploadIcon, XIcon } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { FileProcessingStatus } from \"@vertesia/common\";\nimport { SelectDocument } from \"../../../store\";\nexport default function MessageInput({ onSend, onStop, disabled = false, isSending = false, isStopping = false, isStreaming = false, isCompleted = false, activeTaskCount = 0, placeholder = \"Type your message...\", \n// File upload props\nonFilesSelected, uploadedFiles = [], onRemoveFile, acceptedFileTypes = \".pdf,.doc,.docx,.txt,.csv,.xlsx,.xls,.png,.jpg,.jpeg,.gif,.webp\", maxFiles = 5, processingFiles, hasProcessingFiles = false, \n// Document search props\nrenderDocumentSearch, selectedDocuments = [], onRemoveDocument, \n// Object linking\nhideObjectLinking = false, \n// Styling props\nclassName, inputClassName, }) {\n const ref = useRef(null);\n const fileInputRef = useRef(null);\n const [value, setValue] = useState(\"\");\n const [isObjectModalOpen, setIsObjectModalOpen] = useState(false);\n const [isDocSearchOpen, setIsDocSearchOpen] = useState(false);\n const [isDragOver, setIsDragOver] = useState(false);\n useEffect(() => {\n if (!disabled && isCompleted)\n ref.current?.focus();\n }, [disabled, isCompleted]);\n // File handling\n const handleFiles = useCallback((files) => {\n if (!onFilesSelected)\n return;\n const fileArray = Array.from(files);\n const remainingSlots = maxFiles - uploadedFiles.length;\n const filesToAdd = fileArray.slice(0, remainingSlots);\n if (filesToAdd.length > 0) {\n onFilesSelected(filesToAdd);\n }\n }, [onFilesSelected, maxFiles, uploadedFiles.length]);\n // Drag and drop handlers\n const handleDragOver = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n if (onFilesSelected) {\n setIsDragOver(true);\n }\n }, [onFilesSelected]);\n const handleDragLeave = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n }, []);\n const handleDrop = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n handleFiles(e.dataTransfer.files);\n }\n }, [handleFiles]);\n // Paste handler for files\n const handlePaste = useCallback((e) => {\n if (!onFilesSelected)\n return;\n const items = e.clipboardData?.items;\n if (!items)\n return;\n const files = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) {\n // If it's an image without a proper name, generate one\n if (item.type.startsWith('image/') && (!file.name || file.name === 'image.png')) {\n const extension = item.type.split('/')[1] || 'png';\n const namedFile = new File([file], `pasted-image-${Date.now()}.${extension}`, {\n type: file.type,\n });\n files.push(namedFile);\n }\n else {\n files.push(file);\n }\n }\n }\n }\n if (files.length > 0) {\n handleFiles(files);\n }\n }, [onFilesSelected, handleFiles]);\n // File input change handler\n const handleFileInputChange = useCallback((e) => {\n if (e.target.files && e.target.files.length > 0) {\n handleFiles(e.target.files);\n // Reset input so same file can be selected again\n e.target.value = '';\n }\n }, [handleFiles]);\n const openFileDialog = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n // Document search handlers\n const handleDocumentSelect = useCallback((doc) => {\n // Insert document reference into message\n const markdownLink = `[📄 ${doc.name}](doc:${doc.id})`;\n const currentValue = value || '';\n const cursorPos = ref.current?.selectionStart || currentValue.length;\n const newValue = currentValue.substring(0, cursorPos) + markdownLink + currentValue.substring(cursorPos);\n setValue(newValue);\n setIsDocSearchOpen(false);\n }, [value]);\n const handleSend = () => {\n const message = value.trim();\n if (!message || disabled || isSending)\n return;\n onSend(message);\n setValue(\"\");\n };\n const handleStop = () => {\n if (onStop && !isStopping) {\n onStop();\n }\n };\n // Track Escape key presses for double-tap to stop\n const lastEscapeRef = useRef(0);\n const keyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n const hasMessage = value.trim().length > 0;\n if (hasMessage) {\n // If there's a message, send it (this will interrupt + send message via UserInput signal)\n handleSend();\n }\n // Enter with no text does nothing (don't stop, don't send)\n }\n // Double Escape to stop the agent\n if (e.key === \"Escape\" && isStreaming && onStop) {\n const now = Date.now();\n if (now - lastEscapeRef.current < 500) {\n // Double Escape within 500ms - stop the agent\n handleStop();\n lastEscapeRef.current = 0;\n }\n else {\n lastEscapeRef.current = now;\n }\n }\n // Shift+Enter allows newline (default textarea behavior)\n };\n // Auto-resize textarea as content grows\n const adjustTextareaHeight = useCallback(() => {\n const textarea = ref.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 200)}px`;\n }\n }, []);\n useEffect(() => {\n adjustTextareaHeight();\n }, [value, adjustTextareaHeight]);\n const handleObjectSelect = (object) => {\n // Create a markdown link with the object title and ID\n const objectTitle = object.properties?.title || object.name || 'Object';\n const objectId = object.id;\n const markdownLink = `[${objectTitle}](store:${objectId})`;\n // Insert the link at cursor position or append to end\n const currentValue = value || '';\n const cursorPos = ref.current?.selectionStart || currentValue.length;\n const newValue = currentValue.substring(0, cursorPos) + markdownLink + currentValue.substring(cursorPos);\n // Update the input value\n setValue(newValue);\n // Close the modal\n setIsObjectModalOpen(false);\n // Focus back on the input\n setTimeout(() => {\n if (ref.current) {\n ref.current.focus();\n // Place cursor after the inserted link\n const newCursorPos = cursorPos + markdownLink.length;\n ref.current.setSelectionRange(newCursorPos, newCursorPos);\n }\n }, 100);\n };\n const hasAttachments = uploadedFiles.length > 0 || selectedDocuments.length > 0 || (processingFiles && processingFiles.size > 0);\n return (_jsxs(\"div\", { className: `relative p-3 border-t border-muted flex-shrink-0 transition-all ${isDragOver ? 'bg-blue-50 dark:bg-blue-900/20 border-blue-400' : ''} ${className || ''}`, style: { minHeight: \"120px\" }, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: [isDragOver && (_jsx(\"div\", { className: \"absolute inset-0 flex items-center justify-center bg-blue-100/80 dark:bg-blue-900/40 rounded-lg z-10 pointer-events-none\", children: _jsxs(\"div\", { className: \"text-blue-600 dark:text-blue-400 font-medium flex items-center gap-2\", children: [_jsx(UploadIcon, { className: \"size-5\" }), \"Drop files to upload\"] }) })), onFilesSelected && (_jsx(\"input\", { ref: fileInputRef, type: \"file\", multiple: true, accept: acceptedFileTypes, onChange: handleFileInputChange, className: \"hidden\" })), hasAttachments && (_jsxs(\"div\", { className: \"flex flex-col gap-2 mb-3\", children: [(uploadedFiles.length > 0 || (processingFiles && processingFiles.size > 0)) && (_jsxs(\"div\", { children: [_jsxs(\"div\", { className: \"flex items-center gap-1 mb-1\", children: [_jsx(\"span\", { className: \"text-xs font-medium text-gray-500 dark:text-gray-400\", children: \"Uploaded Files\" }), _jsx(VTooltip, { description: \"Files uploaded to this conversation remain available throughout. The agent can access them anytime.\", placement: \"top\", size: \"md\", children: _jsx(HelpCircleIcon, { className: \"size-3 text-gray-400 dark:text-gray-500\" }) })] }), _jsxs(\"div\", { className: \"flex flex-wrap gap-2\", children: [uploadedFiles.map((file) => (_jsxs(\"div\", { className: \"flex items-center gap-1.5 px-2 py-1 bg-gray-100 dark:bg-gray-800 rounded-md text-sm\", children: [_jsx(FileTextIcon, { className: \"size-3.5 text-gray-500\" }), _jsx(\"span\", { className: \"max-w-[120px] truncate\", children: file.name }), onRemoveFile && (_jsx(\"button\", { onClick: () => onRemoveFile(file.id), className: \"ml-1 p-0.5 hover:bg-gray-200 dark:hover:bg-gray-700 rounded\", children: _jsx(XIcon, { className: \"size-3\" }) }))] }, file.id))), processingFiles && Array.from(processingFiles.values()).map((file) => (_jsxs(\"div\", { className: `flex items-center gap-1.5 px-2 py-1 rounded-md text-sm ${file.status === FileProcessingStatus.ERROR\n ? 'bg-destructive/10 text-destructive'\n : file.status === FileProcessingStatus.READY\n ? 'bg-success/10 text-success'\n : 'bg-attention/10 text-attention'}`, children: [file.status === FileProcessingStatus.UPLOADING && (_jsx(Spinner, { size: \"xs\" })), file.status === FileProcessingStatus.PROCESSING && (_jsx(Spinner, { size: \"xs\" })), file.status === FileProcessingStatus.READY && (_jsx(CheckIcon, { className: \"size-3.5\" })), file.status === FileProcessingStatus.ERROR && (_jsx(XIcon, { className: \"size-3.5\" })), _jsx(\"span\", { className: \"max-w-[120px] truncate\", children: file.name }), _jsxs(\"span\", { className: \"text-xs opacity-70\", children: [file.status === FileProcessingStatus.UPLOADING && 'Uploading...', file.status === FileProcessingStatus.PROCESSING && 'Processing...', file.status === FileProcessingStatus.READY && 'Ready', file.status === FileProcessingStatus.ERROR && (file.error || 'Error')] })] }, file.id)))] })] })), selectedDocuments.length > 0 && (_jsxs(\"div\", { children: [_jsxs(\"div\", { className: \"flex items-center gap-1 mb-1\", children: [_jsx(\"span\", { className: \"text-xs font-medium text-blue-600 dark:text-blue-400\", children: \"Document Attachments\" }), _jsx(VTooltip, { description: \"Documents from the store attached to this message. The agent can re-fetch them by ID anytime, or re-attach to include content directly.\", placement: \"top\", size: \"md\", children: _jsx(HelpCircleIcon, { className: \"size-3 text-blue-400 dark:text-blue-500\" }) })] }), _jsx(\"div\", { className: \"flex flex-wrap gap-2\", children: selectedDocuments.map((doc) => (_jsxs(\"div\", { className: \"flex items-center gap-1.5 px-2 py-1 bg-blue-100 dark:bg-blue-900/30 rounded-md text-sm text-blue-700 dark:text-blue-300\", children: [_jsx(FileTextIcon, { className: \"size-3.5\" }), _jsx(\"span\", { className: \"max-w-[120px] truncate\", children: doc.name }), onRemoveDocument && (_jsx(\"button\", { onClick: () => onRemoveDocument(doc.id), className: \"ml-1 p-0.5 hover:bg-blue-200 dark:hover:bg-blue-800 rounded\", children: _jsx(XIcon, { className: \"size-3\" }) }))] }, doc.id))) })] }))] })), (onFilesSelected || renderDocumentSearch) && (_jsxs(\"div\", { className: \"flex gap-2 mb-2\", children: [onFilesSelected && (_jsxs(Button, { variant: \"outline\", size: \"sm\", onClick: openFileDialog, disabled: disabled || uploadedFiles.length >= maxFiles, className: \"text-xs\", children: [_jsx(UploadIcon, { className: \"size-3.5 mr-1.5\" }), \"Upload\"] })), renderDocumentSearch && (_jsxs(Button, { variant: \"outline\", size: \"sm\", onClick: () => setIsDocSearchOpen(true), disabled: disabled, className: \"text-xs\", children: [_jsx(FileTextIcon, { className: \"size-3.5 mr-1.5\" }), \"Search Documents\"] }))] })), _jsxs(\"div\", { className: \"flex items-end space-x-2\", children: [_jsxs(\"div\", { className: \"flex flex-1 items-end space-x-1\", children: [_jsx(\"textarea\", { ref: ref, value: value, onKeyDown: keyDown, onChange: (e) => setValue(e.target.value), onPaste: handlePaste, disabled: disabled, placeholder: isStreaming ? \"Agent is working... (Esc Esc to stop)\" : (onFilesSelected ? \"Ask anything... (drop or paste files)\" : placeholder), className: `flex-1 w-full px-3 py-2.5 text-sm border border-gray-200 dark:border-gray-700 dark:bg-gray-800 dark:text-white focus:border-gray-300 dark:focus:border-gray-600 focus:outline-none focus:ring-1 focus:ring-gray-300 dark:focus:ring-gray-600 rounded-md resize-none overflow-hidden ${inputClassName || ''}`, rows: 2, style: { minHeight: '60px', maxHeight: '200px' } }), !hideObjectLinking && (_jsx(Button, { variant: \"ghost\", className: \"rounded-full\", disabled: !isCompleted, onClick: () => setIsObjectModalOpen(true), alt: \"Link Object\", children: _jsx(PaperclipIcon, { className: \"size-4\" }) }))] }), isStreaming && onStop && !value.trim() ? (_jsxs(Button, { onClick: handleStop, disabled: isStopping, className: \"px-4 py-2.5 bg-red-600 hover:bg-red-700 text-white\", title: \"Stop the agent\", children: [isStopping ? _jsx(Spinner, { size: \"sm\", className: \"mr-2\" }) : _jsx(StopCircleIcon, { className: \"size-4 mr-2\" }), \" Stop\"] })) : (_jsxs(Button, { onClick: handleSend, disabled: disabled || isSending || !value.trim() || hasProcessingFiles, className: \"px-4 py-2.5\", title: hasProcessingFiles ? \"Wait for files to finish processing\" : undefined, children: [isSending ? _jsx(Spinner, { size: \"sm\", className: \"mr-2\" }) : _jsx(SendIcon, { className: \"size-4 mr-2\" }), hasProcessingFiles ? \"Processing...\" : \"Send\"] }))] }), _jsx(\"div\", { className: \"text-xs text-muted mt-2 text-center\", children: activeTaskCount > 0 ? (_jsxs(\"div\", { className: \"flex items-center justify-center\", children: [_jsx(Activity, { className: \"h-3 w-3 mr-1 text-attention\" }), _jsxs(\"span\", { children: [\"Agent has \", activeTaskCount, \" active workstream\", activeTaskCount !== 1 ? 's' : '', \" running\"] })] })) : isStreaming\n ? \"Agent is working... Press Esc twice or click Stop to interrupt\"\n : disabled\n ? \"Agent is processing, you can continue once it completes...\"\n : \"Enter to send • Shift+Enter for new line\" }), !hideObjectLinking && (_jsxs(VModal, { isOpen: isObjectModalOpen, onClose: () => setIsObjectModalOpen(false), className: 'min-w-[60vw]', children: [_jsx(VModalTitle, { children: \"Link Object\" }), _jsx(VModalBody, { className: \"pb-6\", children: _jsx(SelectDocument, { onChange: handleObjectSelect }) })] })), renderDocumentSearch && renderDocumentSearch({\n isOpen: isDocSearchOpen,\n onClose: () => setIsDocSearchOpen(false),\n onSelect: handleDocumentSelect,\n })] }));\n}\n//# sourceMappingURL=MessageInput.js.map","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Badge, Button } from \"@vertesia/ui/core\";\nimport { AlertCircle, CheckCircle, Circle, Clock, X } from \"lucide-react\";\nimport React from \"react\";\nfunction InlineSlidingPlanPanelComponent({ plan, workstreamStatus, isOpen, onClose, plans = [], activePlanIndex = 0, onChangePlan = () => { }, }) {\n // Don't render if panel is closed\n if (!isOpen) {\n return null;\n }\n // Render the normal panel\n return (_jsxs(\"div\", { className: \"h-full shadow-xl border border-muted/20 overflow-hidden\", children: [_jsxs(\"div\", { className: \"flex items-center justify-between p-3 border-b border-muted/20\", children: [_jsx(\"h3\", { className: \"font-bold text-base\", children: \"Plan\" }), _jsxs(Button, { variant: \"ghost\", onClick: onClose, children: [_jsx(X, { className: \"size-4\" }), _jsx(\"span\", { className: \"sr-only\", children: \"Close\" })] })] }), _jsxs(\"div\", { className: \"p-3 overflow-y-auto\", style: {\n height: \"calc(100% - 44px)\",\n maxHeight: \"calc(100vh - 150px)\",\n }, children: [_jsxs(\"div\", { className: \"mb-3 p-2 bg-info rounded-md border border-info\", children: [_jsx(\"div\", { className: \"text-xs font-medium text-info mb-1\", children: \"Task Progress\" }), _jsx(\"div\", { className: \"flex items-center gap-2\", children: (() => {\n // Get all tasks from the plan itself\n const planTasks = plan.plan || [];\n const totalTasks = planTasks.length;\n // Count completed tasks by checking their status in workstreamStatus\n let completedTasks = 0;\n if (totalTasks > 0) {\n // Count each completed task from the plan\n planTasks.forEach((task) => {\n if (task && task.id) {\n const taskId = task.id.toString();\n const taskStatus = workstreamStatus.get(taskId);\n if (taskStatus === \"completed\") {\n completedTasks++;\n }\n }\n });\n }\n // Calculate percentage\n const progressPercentage = totalTasks > 0\n ? Math.round((completedTasks / totalTasks) * 100)\n : 0;\n return (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: \"w-full bg-muted rounded-full h-2\", children: _jsx(\"div\", { className: \"bg-background h-2 rounded-full\", style: { width: `${progressPercentage}%` } }) }), _jsx(\"span\", { className: \"text-xs text-muted\", children: totalTasks > 0 ? `${completedTasks}/${totalTasks}` : \"0/0\" })] }));\n })() })] }), plans.length > 1 && (_jsxs(\"div\", { className: \"mb-3 flex items-center justify-between\", children: [_jsx(Button, { variant: \"ghost\", onClick: () => onChangePlan(Math.min(plans.length - 1, activePlanIndex + 1)), disabled: activePlanIndex >= plans.length - 1, children: \"Older Plan\" }), _jsx(\"div\", { className: \"text-xs text-muted\", children: plans[activePlanIndex]?.timestamp\n ? new Date(plans[activePlanIndex].timestamp).toLocaleTimeString()\n : \"Unknown time\" }), _jsx(Button, { variant: \"ghost\", onClick: () => onChangePlan(Math.max(0, activePlanIndex - 1)), disabled: activePlanIndex <= 0, children: \"Newer Plan\" })] })), _jsxs(\"div\", { className: \"rounded-md border border-muted/30\", children: [_jsx(\"div\", { className: \"p-2 border-b border-muted/30 bg-muted\", children: _jsx(\"div\", { className: \"font-medium text-xs\", children: \"Step-by-Step Plan\" }) }), _jsx(\"div\", { className: \"divide-y divide-muted/20 max-h-[calc(100vh-350px)] overflow-y-auto\", children: plan.plan && plan.plan.length > 0 ? (plan.plan.map((task, index) => {\n // Extract task info with null checks\n const taskId = task.id ? task.id.toString() : `task-${index}`;\n const taskGoal = task.goal || `Task ${index + 1}`;\n // Determine task status - use task.status if available or lookup from workstream\n let status = task.status || \"pending\";\n if (workstreamStatus.has(taskId)) {\n status = workstreamStatus.get(taskId);\n }\n // Determine status icon and style\n let StatusIcon = Circle;\n let statusColor = \"text-muted\";\n if (status === \"in_progress\") {\n StatusIcon = Clock;\n statusColor = \"text-info\";\n }\n else if (status === \"completed\") {\n StatusIcon = CheckCircle;\n statusColor = \"text-success\";\n }\n return (_jsxs(\"div\", { className: `flex p-3 my-1`, children: [_jsx(\"div\", { className: `mr-2 mt-0.5 flex-shrink-0 text-muted`, children: taskId }), _jsxs(\"div\", { className: \"w-full\", children: [_jsx(\"div\", { className: \"text-sm font-medium mb-2 text-muted\", children: taskGoal }), _jsxs(\"div\", { className: \"mt-1 flex justify-end items-center\", children: [_jsx(\"div\", { className: `mr-2 mt-0.5 flex-shrink-0 ${statusColor}`, children: _jsx(StatusIcon, { className: \"size-3.5\" }) }), _jsx(Badge, { variant: status === \"completed\" ? \"success\" : status === \"in_progress\" ? \"info\" : \"default\", children: status === \"completed\"\n ? \"Completed\"\n : status === \"in_progress\"\n ? \"In Progress\"\n : \"Pending\" })] })] })] }, index));\n })) : (_jsxs(\"div\", { className: \"p-3 text-center text-muted italic\", children: [_jsx(AlertCircle, { className: \"size-4 mx-auto mb-2 text-attention\" }), _jsx(\"p\", { className: \"text-xs\", children: \"No plan has been detected yet\" }), _jsx(\"p\", { className: \"text-xs mt-1\", children: \"Plans will appear here when the agent creates one\" })] })) })] }), (() => {\n // Get all task IDs from the plan for filtering\n const planTaskIds = new Set((plan.plan || [])\n .filter((task) => task && task.id)\n .map((task) => task.id.toString()));\n // Filter out 'main' workstream and any IDs that are tasks in the plan\n const workstreamEntries = Array.from(workstreamStatus.entries()).filter(([id]) => id !== \"main\" && !planTaskIds.has(id));\n // Only show the section if there are actual workstreams (not tasks or main)\n return workstreamEntries.length > 0 ? (_jsxs(\"div\", { className: \"mt-3 rounded-md border border-gray-200 dark:border-gray-800\", children: [_jsx(\"div\", { className: \"p-2 border-b border-gray-200 dark:border-gray-800 bg-gray-50 dark:bg-gray-900/50\", children: _jsx(\"div\", { className: \"font-medium text-xs\", children: \"Workstreams\" }) }), _jsx(\"div\", { className: \"p-3\", children: _jsx(\"div\", { className: \"grid grid-cols-1 gap-2\", children: workstreamEntries.map(([id, status]) => {\n let StatusIcon = Circle;\n let statusColor = \"text-gray-400\";\n let statusBg = \"bg-gray-100 dark:bg-gray-800\";\n let statusText = \"Pending\";\n if (status === \"in_progress\") {\n StatusIcon = Clock;\n statusColor = \"text-info\";\n statusBg = \"bg-info/20\";\n statusText = \"In Progress\";\n }\n else if (status === \"completed\") {\n StatusIcon = CheckCircle;\n statusColor = \"text-success\";\n statusBg = \"bg-success/20\";\n statusText = \"Completed\";\n }\n return (_jsxs(\"div\", { className: `flex items-center p-1.5 rounded ${statusBg}`, children: [_jsx(\"div\", { className: `mr-1.5 ${statusColor}`, children: _jsx(StatusIcon, { className: \"h-3.5 w-3.5\" }) }), _jsx(\"div\", { className: \"flex-1\", children: _jsx(\"span\", { className: \"text-xs font-medium text-gray-800 dark:text-gray-300\", children: id }) }), _jsx(\"span\", { className: \"text-xs font-medium\", children: statusText })] }, id));\n }) }) })] })) : null;\n })()] })] }));\n}\nconst InlineSlidingPlanPanel = React.memo(InlineSlidingPlanPanelComponent);\nexport default InlineSlidingPlanPanel;\n//# sourceMappingURL=InlineSlidingPlanPanel.js.map","import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nexport function cn(...inputs) {\n return twMerge(clsx(inputs));\n}\n//# sourceMappingURL=utils.js.map","import { jwtDecode } from 'jwt-decode';\nimport { createContext, useContext } from 'react';\nimport { VertesiaClient } from '@vertesia/client';\nimport { Env } from '@vertesia/ui/env';\nimport { getComposableToken } from './auth/composable';\nimport { getFirebaseAuth } from './auth/firebase';\nimport { TypeRegistry } from './TypeRegistry';\nimport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY } from './constants';\nexport { LastSelectedAccountId_KEY, LastSelectedProjectId_KEY };\nclass UserSession {\n isLoading = true;\n client;\n authError;\n authToken;\n typeRegistry;\n setSession;\n lastSelectedAccount;\n lastSelectedProject;\n onboardingComplete;\n constructor(client, setSession) {\n if (client) {\n this.client = client;\n }\n else {\n this.client = new VertesiaClient({\n serverUrl: Env.endpoints.studio,\n storeUrl: Env.endpoints.zeno,\n tokenServerUrl: Env.endpoints.sts\n });\n }\n if (setSession) {\n this.setSession = setSession;\n }\n this.logout = this.logout.bind(this);\n }\n get store() {\n return this.client.store;\n }\n get user() {\n return this.authToken;\n }\n get account() {\n return this.authToken?.account;\n }\n get project() {\n return this.authToken?.project;\n }\n get accounts() {\n return this.authToken?.accounts;\n }\n get authCallback() {\n return this.rawAuthToken.then(token => `Bearer ${token}`);\n }\n get rawAuthToken() {\n return getComposableToken().then(res => {\n const token = res?.rawToken;\n if (!token) {\n throw new Error('No token available');\n }\n this.authToken = jwtDecode(token);\n return token;\n });\n }\n signOut() {\n this.logout();\n }\n getAccount() {\n return this.authToken?.account;\n }\n async login(token) {\n this.authError = undefined;\n this.isLoading = false;\n this.client.withAuthCallback(() => this.authCallback);\n this.authToken = jwtDecode(token);\n console.log(`Logging in as ${this.authToken?.name} with account ${this.authToken?.account.name} (${this.authToken?.account.id}, and project ${this.authToken?.project?.name} (${this.authToken?.project?.id})`);\n //store selected account in local storage\n localStorage.setItem(LastSelectedAccountId_KEY, this.authToken.account.id);\n localStorage.setItem(LastSelectedProjectId_KEY + '-' + this.authToken.account.id, this.authToken.project?.id ?? '');\n // notify the host app of the login\n Env.onLogin?.(this.authToken);\n // Independent async calls\n await Promise.all([\n this._loadTypes(),\n this.fetchOnboardingStatus(),\n ]);\n return Promise.resolve();\n }\n isLoggedIn() {\n return !!this.authToken;\n }\n logout() {\n console.log('Logging out');\n if (this.authToken) {\n getFirebaseAuth().signOut();\n }\n this.authError = undefined;\n this.isLoading = false;\n this.authToken = undefined;\n this.typeRegistry = undefined;\n this.setSession = undefined;\n this.client.withAuthCallback(undefined);\n }\n async switchAccount(targetAccountId) {\n localStorage.setItem(LastSelectedAccountId_KEY, targetAccountId);\n if (this) {\n if (this.account && this.project) {\n localStorage.setItem(LastSelectedProjectId_KEY + '-' + this.account.id, this.project.id);\n }\n else if (this.account) {\n localStorage.removeItem(LastSelectedProjectId_KEY + '-' + this.account.id);\n }\n }\n window.location.replace('/?a=' + targetAccountId);\n }\n async switchProject(targetProjectId) {\n if (this.account) {\n localStorage.setItem(LastSelectedProjectId_KEY + '-' + this.account.id, targetProjectId);\n }\n window.location.replace('/?a=' + this.account?.id + '&p=' + targetProjectId);\n }\n async _loadTypes() {\n if (this.project) {\n return this.store.types.list({}, { layout: true }).then(types => this.typeRegistry = new TypeRegistry(types)).catch(err => {\n console.error('Failed to fetch object types', err);\n throw err;\n });\n }\n else {\n console.log('No project selected');\n }\n }\n async reloadTypes() {\n return this._loadTypes().then(() => {\n this.setSession?.(this.clone());\n });\n }\n async fetchAccounts() {\n return this.client.accounts.list().then(accounts => {\n if (!this.authToken) {\n throw new Error('No token available');\n }\n this.authToken.accounts = accounts;\n this.setSession?.(this.clone());\n }).catch(err => {\n console.error('Failed to fetch accounts', err);\n throw err;\n });\n }\n async fetchOnboardingStatus() {\n if (this.onboardingComplete) {\n console.log('Onboarding already completed');\n return false;\n }\n const previousStatus = this.onboardingComplete;\n try {\n const onboarding = await this.client.account.onboardingProgress();\n this.onboardingComplete = Object.values(onboarding).every(value => value === true);\n if (previousStatus !== this.onboardingComplete) {\n return true;\n }\n this.setSession?.(this.clone());\n }\n catch (error) {\n console.error('Error fetching onboarding status:', error);\n this.onboardingComplete = false;\n this.setSession?.(this.clone());\n }\n return false;\n }\n clone() {\n const session = new UserSession(this.client);\n session.isLoading = this.isLoading;\n session.authError = this.authError;\n session.authToken = this.authToken;\n session.setSession = this.setSession;\n session.lastSelectedAccount = this.lastSelectedAccount;\n session.switchAccount = this.switchAccount;\n session.typeRegistry = this.typeRegistry;\n session.onboardingComplete = this.onboardingComplete;\n return session;\n }\n}\nconst UserSessionContext = createContext(undefined);\nexport function useUserSession() {\n const session = useContext(UserSessionContext);\n if (!session) {\n throw new Error('useUserSession must be used within a UserSessionProvider');\n }\n return session;\n}\nexport { UserSession, UserSessionContext };\n//# sourceMappingURL=UserSession.js.map","import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Check, Copy, Download, Loader2, Maximize2, Minimize2, X } from 'lucide-react';\nimport Papa from 'papaparse';\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { VegaEmbed } from 'react-vega';\nimport { cn } from '../../../core/components/libs/utils';\nimport { useUserSession } from '../../../session';\nimport { getArtifactCacheKey, getFileCacheKey, useArtifactUrlCache } from './useArtifactUrlCache';\n// Constants\nconst DEFAULT_CHART_HEIGHT = 280;\nconst DEFAULT_DASHBOARD_HEIGHT = 500;\n// Error display component\nfunction VegaErrorDisplay({ error, chartTitle }) {\n return (_jsx(\"div\", { className: \"flex items-center justify-center h-full bg-red-50 dark:bg-red-950 rounded-md p-4\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsxs(\"p\", { className: \"text-sm font-medium text-red-600 dark:text-red-400\", children: [\"Cannot render \", chartTitle || 'Vega-Lite', \" chart\"] }), _jsx(\"p\", { className: \"text-xs text-red-500 dark:text-red-500 mt-1 max-w-xs truncate\", children: error })] }) }));\n}\n// Fullscreen dialog component with smooth animations\nfunction FullscreenDialog({ isOpen, onClose, title, description, children, }) {\n return (_jsx(DialogPrimitive.Root, { open: isOpen, onOpenChange: (open) => !open && onClose(), children: _jsxs(DialogPrimitive.Portal, { children: [_jsx(DialogPrimitive.Overlay, { className: \"fixed inset-0 z-50 bg-black/80 backdrop-blur-sm transition-all duration-300 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\" }), _jsxs(DialogPrimitive.Content, { className: \"fixed inset-2 sm:inset-4 z-50 flex flex-col bg-white dark:bg-gray-900 rounded-xl shadow-2xl transition-all duration-300 ease-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-98 data-[state=open]:zoom-in-98 data-[state=closed]:slide-out-to-bottom-2 data-[state=open]:slide-in-from-bottom-2\", onEscapeKeyDown: onClose, children: [_jsx(DialogPrimitive.Close, { asChild: true, children: _jsx(\"button\", { onClick: onClose, className: \"absolute top-3 right-3 z-10 p-2 rounded-lg bg-white/80 dark:bg-gray-800/80 backdrop-blur-sm hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors duration-150 shadow-sm\", \"aria-label\": \"Close fullscreen\", children: _jsx(X, { className: \"w-5 h-5 text-gray-600 dark:text-gray-300\" }) }) }), _jsx(\"div\", { className: \"flex-1 overflow-auto p-4 sm:p-6 animate-in fade-in-0 duration-500 delay-150\", children: children }), _jsx(\"div\", { className: \"flex items-center justify-between px-4 sm:px-6 py-3 border-t border-gray-200 dark:border-gray-800 bg-gray-50/50 dark:bg-gray-800/50 rounded-b-xl\", children: _jsxs(\"div\", { className: \"flex flex-col\", children: [_jsx(DialogPrimitive.Title, { className: \"text-base font-semibold text-gray-900 dark:text-gray-100\", children: title || 'Dashboard' }), description && (_jsx(DialogPrimitive.Description, { className: \"text-sm text-gray-500 dark:text-gray-400 mt-0.5\", children: description }))] }) })] })] }) }));\n}\n// Calculate height based on spec complexity\nfunction calculateAutoHeight(spec, mode) {\n if (mode === 'chart') {\n return DEFAULT_CHART_HEIGHT;\n }\n // For dashboard mode, try to calculate based on spec structure\n let rowCount = 1;\n if (spec.vconcat) {\n rowCount = Array.isArray(spec.vconcat) ? spec.vconcat.length : 1;\n }\n else if (spec.concat) {\n const columns = spec.columns || 2;\n const items = Array.isArray(spec.concat) ? spec.concat.length : 1;\n rowCount = Math.ceil(items / columns);\n }\n else if (spec.facet) {\n // Faceted charts - estimate based on data\n rowCount = 2; // Default estimate\n }\n // Base height per row + padding\n return Math.max(DEFAULT_DASHBOARD_HEIGHT, rowCount * 280 + 40);\n}\n// Modern color palette - vibrant but professional\nconst CHART_COLORS = {\n // Primary palette - vibrant gradients\n categorical: [\n '#6366f1', // indigo\n '#8b5cf6', // violet\n '#ec4899', // pink\n '#f43f5e', // rose\n '#f97316', // orange\n '#eab308', // yellow\n '#22c55e', // green\n '#14b8a6', // teal\n '#06b6d4', // cyan\n '#3b82f6', // blue\n ],\n // Sequential schemes\n blues: ['#dbeafe', '#93c5fd', '#3b82f6', '#1d4ed8', '#1e3a8a'],\n purples: ['#f3e8ff', '#c4b5fd', '#8b5cf6', '#6d28d9', '#4c1d95'],\n greens: ['#dcfce7', '#86efac', '#22c55e', '#15803d', '#14532d'],\n // Diverging\n diverging: ['#ef4444', '#fca5a5', '#fef3c7', '#86efac', '#22c55e'],\n};\n/**\n * Preprocess a Vega-Lite spec to fix duplicate signal names that occur\n * when params with selections are used in vconcat/hconcat layouts.\n *\n * The issue: Vega-Lite creates internal signals like `paramName_tuple` for\n * point selections. When a param is defined at the root level of a vconcat/hconcat\n * spec, Vega-Lite's compiler creates duplicate signals when propagating the\n * selection to sub-views.\n *\n * Solution: Move selection params from the root level to the first sub-view\n * (where selections typically originate). Cross-view references are preserved\n * so that clicking in one view filters other views.\n */\nfunction fixVegaLiteSelectionParams(spec) {\n // Deep clone the spec to avoid mutations\n const result = JSON.parse(JSON.stringify(spec));\n // Check if this is a concatenated spec with root-level selection params\n const concatKeys = ['vconcat', 'hconcat', 'concat'];\n const hasConcatViews = concatKeys.some(key => Array.isArray(result[key]));\n if (!hasConcatViews) {\n // Not a concatenated spec, no special handling needed\n return result;\n }\n // Check for selection params at the root level\n const rootSelectionParams = [];\n if (Array.isArray(result.params)) {\n for (const param of result.params) {\n if (param && typeof param === 'object' && param.name && param.select) {\n rootSelectionParams.push({ name: param.name, param });\n }\n }\n }\n if (rootSelectionParams.length === 0) {\n // No selection params at root level, no special handling needed\n return result;\n }\n // Strategy: Move the selection param to the first sub-view that has an\n // encoding field matching the selection. Keep cross-view references intact\n // so filtering works across views.\n for (const { name: paramName, param } of rootSelectionParams) {\n const selectFields = param.select?.fields || [];\n const hasLegendBinding = param.select?.bind === 'legend';\n // Find the concat array\n let concatArray = null;\n for (const key of concatKeys) {\n if (Array.isArray(result[key])) {\n concatArray = result[key];\n break;\n }\n }\n if (!concatArray || concatArray.length === 0)\n continue;\n // Find the first view that has the selection field in its encoding\n // This is typically where users click to make selections\n let targetViewIndex = 0;\n for (let i = 0; i < concatArray.length; i++) {\n const view = concatArray[i];\n if (viewHasField(view, selectFields) || (hasLegendBinding && viewHasColorEncoding(view, selectFields))) {\n targetViewIndex = i;\n break;\n }\n }\n // Move the param to the target view\n const targetView = concatArray[targetViewIndex];\n if (!targetView.params) {\n targetView.params = [];\n }\n targetView.params.push(param);\n // Remove the param from root level\n result.params = result.params.filter((p) => p.name !== paramName);\n // Cross-view references are kept intact - Vega-Lite handles signal\n // propagation from the view where the selection is defined to other views\n }\n // Clean up empty params array at root\n if (Array.isArray(result.params) && result.params.length === 0) {\n delete result.params;\n }\n return result;\n}\n/**\n * Apply parameter values to a Vega-Lite spec.\n * Updates the 'value' field of named params, allowing models to set\n * initial values for interactive controls (sliders, dropdowns, etc.).\n * @exported for testing\n */\nexport function applyParameterValues(spec, parameterValues) {\n if (!parameterValues || Object.keys(parameterValues).length === 0) {\n return spec;\n }\n const result = JSON.parse(JSON.stringify(spec));\n // Helper to update params in a view\n const updateParams = (params) => {\n for (const param of params) {\n if (param && typeof param === 'object' && param.name && param.name in parameterValues) {\n param.value = parameterValues[param.name];\n }\n }\n };\n // Update root-level params\n if (Array.isArray(result.params)) {\n updateParams(result.params);\n }\n // Update params in nested views (vconcat, hconcat, concat)\n const updateNestedViews = (views) => {\n if (!Array.isArray(views))\n return;\n for (const view of views) {\n if (view && Array.isArray(view.params)) {\n updateParams(view.params);\n }\n // Recursively handle nested concatenations\n if (view.vconcat)\n updateNestedViews(view.vconcat);\n if (view.hconcat)\n updateNestedViews(view.hconcat);\n if (view.concat)\n updateNestedViews(view.concat);\n // Handle layers\n if (Array.isArray(view.layer)) {\n for (const layer of view.layer) {\n if (layer && Array.isArray(layer.params)) {\n updateParams(layer.params);\n }\n }\n }\n }\n };\n if (result.vconcat)\n updateNestedViews(result.vconcat);\n if (result.hconcat)\n updateNestedViews(result.hconcat);\n if (result.concat)\n updateNestedViews(result.concat);\n if (Array.isArray(result.layer)) {\n for (const layer of result.layer) {\n if (layer && Array.isArray(layer.params)) {\n updateParams(layer.params);\n }\n }\n }\n return result;\n}\n/**\n * Check if a view has encoding using any of the specified fields.\n */\nfunction viewHasField(view, fields) {\n if (!view || !view.encoding)\n return false;\n for (const field of fields) {\n for (const channel of Object.values(view.encoding)) {\n if (channel && typeof channel === 'object' && channel.field === field) {\n return true;\n }\n }\n }\n // Also check nested layers\n if (Array.isArray(view.layer)) {\n for (const layer of view.layer) {\n if (viewHasField(layer, fields))\n return true;\n }\n }\n return false;\n}\n/**\n * Check if a view has color encoding using any of the specified fields.\n */\nfunction viewHasColorEncoding(view, fields) {\n if (!view)\n return false;\n const checkEncoding = (encoding) => {\n if (!encoding)\n return false;\n const colorField = encoding.color?.field;\n return colorField && fields.includes(colorField);\n };\n if (checkEncoding(view.encoding))\n return true;\n // Check nested layers\n if (Array.isArray(view.layer)) {\n for (const layer of view.layer) {\n if (checkEncoding(layer.encoding))\n return true;\n }\n }\n return false;\n}\n/**\n * Walk the Vega-Lite spec and find all artifact: URL references in data.url fields.\n * Returns an array of references with their paths in the spec tree.\n */\nfunction findArtifactReferences(spec, currentPath = []) {\n const references = [];\n if (!spec || typeof spec !== 'object') {\n return references;\n }\n // Check if this object has a data.url that's an artifact reference\n if (spec.data && typeof spec.data === 'object') {\n const url = spec.data.url;\n if (typeof url === 'string' && url.startsWith('artifact:')) {\n references.push({\n path: [...currentPath, 'data'],\n artifactPath: url.replace(/^artifact:/, '').trim(),\n });\n }\n }\n // Recursively check nested objects (layer, vconcat, hconcat, concat, spec, etc.)\n const nestedKeys = ['layer', 'vconcat', 'hconcat', 'concat', 'spec', 'repeat', 'facet'];\n for (const key of nestedKeys) {\n if (key in spec) {\n const value = spec[key];\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n references.push(...findArtifactReferences(item, [...currentPath, key, String(index)]));\n });\n }\n else if (typeof value === 'object' && value !== null) {\n references.push(...findArtifactReferences(value, [...currentPath, key]));\n }\n }\n }\n return references;\n}\n/**\n * Deep clone and update the spec by replacing artifact URLs with resolved data values.\n */\nfunction replaceArtifactData(spec, resolvedData) {\n const result = JSON.parse(JSON.stringify(spec));\n for (const [pathKey, data] of resolvedData) {\n const path = pathKey.split('.');\n let current = result;\n console.log(`Replacing artifact data at path: ${pathKey}, path parts:`, path);\n // Navigate to the parent of the data object\n for (let i = 0; i < path.length - 1; i++) {\n if (current[path[i]] === undefined) {\n console.warn(`Path navigation failed at step ${i}, key \"${path[i]}\" not found in:`, Object.keys(current));\n break;\n }\n current = current[path[i]];\n }\n // Replace data.url with data.values\n const lastKey = path[path.length - 1];\n if (current[lastKey] && typeof current[lastKey] === 'object') {\n const oldUrl = current[lastKey].url;\n delete current[lastKey].url;\n current[lastKey].values = data;\n console.log(`Replaced artifact URL \"${oldUrl}\" with ${data.length} data rows`);\n }\n else {\n console.warn(`Could not find data object at path ${pathKey}. current[${lastKey}]:`, current[lastKey]);\n }\n }\n return result;\n}\n// Get dark mode config for Vega with enhanced styling\nfunction getDarkModeConfig(isDark) {\n const baseConfig = {\n background: 'transparent',\n view: { stroke: 'transparent' },\n // Modern color range\n range: {\n category: CHART_COLORS.categorical,\n diverging: CHART_COLORS.diverging,\n heatmap: CHART_COLORS.purples,\n ramp: CHART_COLORS.blues,\n },\n // Enable tooltips by default for all mark types with enhanced styling\n mark: { tooltip: true },\n bar: {\n tooltip: true,\n cornerRadiusTopLeft: 4,\n cornerRadiusTopRight: 4,\n },\n line: {\n tooltip: true,\n strokeWidth: 2.5,\n strokeCap: 'round',\n },\n point: {\n tooltip: true,\n size: 60,\n filled: true,\n },\n area: {\n tooltip: true,\n fillOpacity: 0.7,\n line: true,\n },\n rect: {\n tooltip: true,\n cornerRadius: 2,\n },\n arc: {\n tooltip: true,\n cornerRadius: 4,\n },\n circle: {\n tooltip: true,\n size: 80,\n },\n };\n if (isDark) {\n return {\n ...baseConfig,\n axis: {\n labelColor: '#a1a1aa',\n titleColor: '#e4e4e7',\n gridColor: '#3f3f46',\n domainColor: '#52525b',\n tickColor: '#52525b',\n labelFont: 'Inter, system-ui, sans-serif',\n titleFont: 'Inter, system-ui, sans-serif',\n labelFontSize: 11,\n titleFontSize: 12,\n titleFontWeight: 500,\n },\n legend: {\n labelColor: '#a1a1aa',\n titleColor: '#e4e4e7',\n labelFont: 'Inter, system-ui, sans-serif',\n titleFont: 'Inter, system-ui, sans-serif',\n labelFontSize: 11,\n titleFontSize: 12,\n symbolSize: 100,\n },\n title: {\n color: '#fafafa',\n font: 'Inter, system-ui, sans-serif',\n fontSize: 14,\n fontWeight: 600,\n },\n };\n }\n return {\n ...baseConfig,\n axis: {\n labelColor: '#71717a',\n titleColor: '#3f3f46',\n gridColor: '#e4e4e7',\n domainColor: '#d4d4d8',\n tickColor: '#d4d4d8',\n labelFont: 'Inter, system-ui, sans-serif',\n titleFont: 'Inter, system-ui, sans-serif',\n labelFontSize: 11,\n titleFontSize: 12,\n titleFontWeight: 500,\n },\n legend: {\n labelColor: '#71717a',\n titleColor: '#3f3f46',\n labelFont: 'Inter, system-ui, sans-serif',\n titleFont: 'Inter, system-ui, sans-serif',\n labelFontSize: 11,\n titleFontSize: 12,\n symbolSize: 100,\n },\n title: {\n color: '#18181b',\n font: 'Inter, system-ui, sans-serif',\n fontSize: 14,\n fontWeight: 600,\n },\n };\n}\nexport const VegaLiteChart = memo(function VegaLiteChart({ spec, artifactRunId }) {\n const { title, description, spec: vegaSpec, options } = spec;\n const [isExporting, setIsExporting] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const [error, setError] = useState(null);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const viewRef = useRef(null);\n const fullscreenViewRef = useRef(null);\n const containerRef = useRef(null);\n // Artifact resolution state\n const { client } = useUserSession();\n const urlCache = useArtifactUrlCache();\n const [resolvedSpec, setResolvedSpec] = useState(null);\n const [isLoadingArtifacts, setIsLoadingArtifacts] = useState(false);\n const [artifactError, setArtifactError] = useState(null);\n // Determine mode and settings\n const mode = options?.mode || 'chart';\n const isDashboard = mode === 'dashboard';\n const showFullscreenButton = options?.enableFullscreen ?? isDashboard;\n // Calculate height\n const baseHeight = options?.height || calculateAutoHeight(vegaSpec, mode);\n // Resolve artifact URLs in the spec\n useEffect(() => {\n const references = findArtifactReferences(vegaSpec);\n // If no artifact references, use original spec\n if (references.length === 0) {\n setResolvedSpec(vegaSpec);\n setIsLoadingArtifacts(false);\n setArtifactError(null);\n return;\n }\n let cancelled = false;\n setIsLoadingArtifacts(true);\n setArtifactError(null);\n const resolveArtifacts = async () => {\n const resolvedData = new Map();\n for (const ref of references) {\n try {\n const pathKey = ref.path.join('.');\n let url;\n // Determine if this is a shorthand path or full path\n if (artifactRunId && !ref.artifactPath.startsWith('agents/')) {\n // Shorthand path - use artifact API\n const cacheKey = getArtifactCacheKey(artifactRunId, ref.artifactPath, 'inline');\n if (urlCache) {\n url = await urlCache.getOrFetch(cacheKey, async () => {\n const result = await client.files.getArtifactDownloadUrl(artifactRunId, ref.artifactPath, 'inline');\n return result.url;\n });\n }\n else {\n const result = await client.files.getArtifactDownloadUrl(artifactRunId, ref.artifactPath, 'inline');\n url = result.url;\n }\n }\n else {\n // Full path - use files API\n const cacheKey = getFileCacheKey(ref.artifactPath);\n if (urlCache) {\n url = await urlCache.getOrFetch(cacheKey, async () => {\n const result = await client.files.getDownloadUrl(ref.artifactPath);\n return result.url;\n });\n }\n else {\n const result = await client.files.getDownloadUrl(ref.artifactPath);\n url = result.url;\n }\n }\n // Fetch the data from the resolved URL\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch artifact data: ${response.statusText}`);\n }\n // Detect CSV files by artifact path extension\n const isCsv = ref.artifactPath.toLowerCase().endsWith('.csv');\n let data;\n if (isCsv) {\n // Parse CSV to JSON array\n const csvText = await response.text();\n const parseResult = Papa.parse(csvText, {\n header: true,\n skipEmptyLines: true,\n dynamicTyping: true, // Auto-convert numbers and booleans\n });\n if (parseResult.errors.length > 0) {\n console.warn(`CSV parse warnings for ${ref.artifactPath}:`, parseResult.errors);\n }\n data = parseResult.data;\n }\n else {\n // Parse as JSON\n const jsonData = await response.json();\n data = Array.isArray(jsonData) ? jsonData : [jsonData];\n }\n // Log for debugging\n console.log(`Artifact ${ref.artifactPath}: loaded ${data.length} rows`);\n // Check for empty data\n if (!data || data.length === 0) {\n console.warn(`Artifact ${ref.artifactPath}: returned empty data`);\n }\n resolvedData.set(pathKey, data);\n }\n catch (err) {\n console.error(`Failed to resolve artifact: ${ref.artifactPath}`, err);\n if (!cancelled) {\n setArtifactError(`Failed to load data from artifact: ${ref.artifactPath}`);\n }\n return;\n }\n }\n if (!cancelled) {\n const newSpec = replaceArtifactData(vegaSpec, resolvedData);\n // Log the resolved spec for debugging\n console.log('Resolved spec with artifact data:', JSON.stringify(newSpec).slice(0, 500) + '...');\n setResolvedSpec(newSpec);\n setIsLoadingArtifacts(false);\n }\n };\n resolveArtifacts();\n return () => {\n cancelled = true;\n };\n }, [vegaSpec, artifactRunId, client, urlCache]);\n // Detect dark mode\n const [isDarkMode, setIsDarkMode] = useState(false);\n useEffect(() => {\n const checkDarkMode = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n };\n checkDarkMode();\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return () => observer.disconnect();\n }, []);\n // Track container width for responsive sizing\n const [containerWidth, setContainerWidth] = useState(0);\n useEffect(() => {\n if (!containerRef.current)\n return;\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n setContainerWidth(entry.contentRect.width);\n }\n });\n resizeObserver.observe(containerRef.current);\n // Initial width\n setContainerWidth(containerRef.current.clientWidth);\n return () => resizeObserver.disconnect();\n }, []);\n // Check if there are artifact references that need resolution\n const hasArtifactReferences = useMemo(() => {\n return findArtifactReferences(vegaSpec).length > 0;\n }, [vegaSpec]);\n // Memoize the processed spec to fix Vega-Lite selection param issues\n // This handles the duplicate signal problem in concatenated views\n const processedSpec = useMemo(() => {\n // If there are artifact references, we must wait for resolvedSpec\n // Don't fall back to vegaSpec which contains artifact: URLs\n if (hasArtifactReferences && !resolvedSpec) {\n return null;\n }\n let specToUse = resolvedSpec || vegaSpec;\n if (!specToUse)\n return null;\n // Apply parameter values if provided (allows model to set initial slider/dropdown values)\n if (options?.parameterValues) {\n specToUse = applyParameterValues(specToUse, options.parameterValues);\n }\n return fixVegaLiteSelectionParams(specToUse);\n }, [resolvedSpec, vegaSpec, hasArtifactReferences, options?.parameterValues]);\n // Scale widths in concatenated views to fit container\n const scaleSpecWidths = useCallback((spec, availableWidth) => {\n if (!spec || typeof spec !== 'object')\n return spec;\n // Handle hconcat - distribute width among children\n if (spec.hconcat && Array.isArray(spec.hconcat)) {\n const childCount = spec.hconcat.length;\n const spacing = spec.spacing ?? 10;\n const totalSpacing = spacing * (childCount - 1);\n const widthPerChild = Math.floor((availableWidth - totalSpacing) / childCount);\n return {\n ...spec,\n hconcat: spec.hconcat.map((child) => scaleSpecWidths(child, widthPerChild)),\n };\n }\n // Handle vconcat - each child gets full width\n if (spec.vconcat && Array.isArray(spec.vconcat)) {\n return {\n ...spec,\n vconcat: spec.vconcat.map((child) => scaleSpecWidths(child, availableWidth)),\n };\n }\n // Handle generic concat with columns\n if (spec.concat && Array.isArray(spec.concat)) {\n const columns = spec.columns ?? spec.concat.length;\n const spacing = spec.spacing ?? 10;\n const totalSpacing = spacing * (columns - 1);\n const widthPerChild = Math.floor((availableWidth - totalSpacing) / columns);\n return {\n ...spec,\n concat: spec.concat.map((child) => scaleSpecWidths(child, widthPerChild)),\n };\n }\n // For leaf views, set width if it's \"container\" or larger than available\n const currentWidth = spec.width;\n if (currentWidth === 'container' || (typeof currentWidth === 'number' && currentWidth > availableWidth)) {\n return { ...spec, width: availableWidth };\n }\n return spec;\n }, []);\n // Build the full Vega-Lite spec with defaults\n const buildFullSpec = useCallback((height, forFullscreen = false) => {\n if (!processedSpec)\n return null;\n const config = getDarkModeConfig(isDarkMode);\n // Use measured container width, window width for fullscreen (capped), or fallback\n const calculatedWidth = forFullscreen\n ? (typeof window !== 'undefined' ? Math.min(window.innerWidth - 80, 1400) : 1200)\n : (containerWidth > 0 ? containerWidth - 24 : 500);\n // Check if this is a concatenated view - autosize 'fit' only works for single/layered views\n const isConcatenatedView = 'vconcat' in processedSpec || 'hconcat' in processedSpec || 'concat' in processedSpec;\n // For concatenated views, use 'pad' which works correctly; for single views use 'fit'\n const autosize = isConcatenatedView\n ? { type: 'pad', contains: 'padding' }\n : { type: 'fit', contains: 'padding' };\n // Scale widths for concatenated views to fit container\n let scaledSpec = processedSpec;\n if (isConcatenatedView && calculatedWidth) {\n scaledSpec = scaleSpecWidths(processedSpec, calculatedWidth);\n }\n // Replace \"container\" width with our measured width - \"container\" relies on CSS which may not be ready\n const specWidth = scaledSpec.width;\n const width = isConcatenatedView ? undefined : (specWidth === 'container' ? calculatedWidth : (specWidth ?? calculatedWidth));\n // Destructure to remove width from spec so we can control it (only for non-concat views)\n const { width: _specWidth, ...specWithoutWidth } = scaledSpec;\n return {\n $schema: 'https://vega.github.io/schema/vega-lite/v6.json',\n ...(!isConcatenatedView && width ? { width } : {}),\n height: forFullscreen ? undefined : height,\n autosize,\n ...(isConcatenatedView ? scaledSpec : specWithoutWidth),\n // Override title if provided at top level\n ...(title && !processedSpec.title ? { title } : {}),\n // Apply theme config\n config: {\n ...config,\n ...processedSpec.config,\n },\n };\n }, [processedSpec, title, isDarkMode, containerWidth, scaleSpecWidths]);\n const handleCopy = useCallback(async () => {\n const view = isFullscreen ? fullscreenViewRef.current : viewRef.current;\n if (!view || isCopied)\n return;\n try {\n const canvas = await view.toCanvas(2);\n canvas.toBlob(async (blob) => {\n if (blob) {\n await navigator.clipboard.write([\n new ClipboardItem({ 'image/png': blob })\n ]);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n }\n }, 'image/png');\n }\n catch (err) {\n console.error('Failed to copy chart:', err);\n }\n }, [isCopied, isFullscreen]);\n const handleExport = useCallback(async () => {\n const view = isFullscreen ? fullscreenViewRef.current : viewRef.current;\n if (!view || isExporting)\n return;\n setIsExporting(true);\n try {\n const url = await view.toImageURL('png', 2);\n const link = document.createElement('a');\n link.download = `${title || 'chart'}.png`;\n link.href = url;\n link.click();\n }\n catch (err) {\n console.error('Failed to export chart:', err);\n }\n finally {\n setIsExporting(false);\n }\n }, [title, isExporting, isFullscreen]);\n const handleNewView = useCallback((view) => {\n viewRef.current = view;\n setError(null);\n }, []);\n const handleFullscreenNewView = useCallback((view) => {\n fullscreenViewRef.current = view;\n }, []);\n const handleError = useCallback((err) => {\n console.error('Vega-Lite rendering error:', err);\n setError(err instanceof Error ? err.message : 'Unknown error');\n }, []);\n const toggleFullscreen = useCallback(() => {\n setIsFullscreen(prev => !prev);\n }, []);\n // Clear error when spec changes\n useEffect(() => {\n setError(null);\n }, [vegaSpec]);\n // Toolbar component (reused in both views)\n const Toolbar = ({ className }) => (_jsxs(\"div\", { className: cn(\"flex items-center gap-2\", className), children: [_jsxs(\"button\", { onClick: handleCopy, disabled: isCopied, className: \"text-xs px-2 py-1 rounded border border-gray-300 dark:border-gray-700 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors disabled:opacity-50 flex items-center gap-1\", title: \"Copy to clipboard\", children: [isCopied ? _jsx(Check, { className: \"w-3 h-3\" }) : _jsx(Copy, { className: \"w-3 h-3\" }), isCopied ? 'Copied' : 'Copy'] }), _jsxs(\"button\", { onClick: handleExport, disabled: isExporting, className: \"text-xs px-2 py-1 rounded border border-gray-300 dark:border-gray-700 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\", title: \"Export as PNG\", children: [_jsx(Download, { className: \"w-3 h-3\" }), isExporting ? 'Exporting...' : 'Export'] }), showFullscreenButton && (_jsxs(\"button\", { onClick: toggleFullscreen, className: \"text-xs px-2 py-1 rounded border border-gray-300 dark:border-gray-700 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors flex items-center gap-1\", title: isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\", children: [isFullscreen ? _jsx(Minimize2, { className: \"w-3 h-3\" }) : _jsx(Maximize2, { className: \"w-3 h-3\" }), isFullscreen ? 'Exit' : 'Fullscreen'] }))] }));\n // Show loading state when resolving artifacts\n // Also show loading if we have artifact refs but haven't resolved them yet\n // (covers the gap before the effect runs)\n if (isLoadingArtifacts || (hasArtifactReferences && !resolvedSpec)) {\n return (_jsx(\"div\", { className: \"bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 shadow-sm\", children: _jsxs(\"div\", { className: \"flex flex-col gap-2 p-3\", children: [_jsx(\"div\", { className: \"flex items-center justify-between\", children: _jsx(\"span\", { className: \"font-medium text-sm text-gray-900 dark:text-gray-100\", children: title || 'Chart' }) }), _jsx(\"div\", { className: \"flex items-center justify-center bg-gray-50 dark:bg-gray-800 rounded\", style: { width: '100%', height: baseHeight }, children: _jsxs(\"div\", { className: \"flex items-center gap-2 text-gray-500 dark:text-gray-400\", children: [_jsx(Loader2, { className: \"w-5 h-5 animate-spin\" }), _jsx(\"span\", { className: \"text-sm\", children: \"Loading data from artifacts...\" })] }) })] }) }));\n }\n // Show artifact error state\n if (artifactError) {\n return (_jsx(\"div\", { className: \"bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 shadow-sm\", children: _jsxs(\"div\", { className: \"flex flex-col gap-2 p-3\", children: [_jsx(\"div\", { className: \"flex items-center justify-between\", children: _jsx(\"span\", { className: \"font-medium text-sm text-gray-900 dark:text-gray-100\", children: title || 'Chart' }) }), _jsx(\"div\", { style: { width: '100%', height: baseHeight }, children: _jsx(VegaErrorDisplay, { error: artifactError, chartTitle: title }) })] }) }));\n }\n if (error) {\n return (_jsx(\"div\", { className: \"bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 shadow-sm\", children: _jsxs(\"div\", { className: \"flex flex-col gap-2 p-3\", children: [_jsx(\"div\", { className: \"flex items-center justify-between\", children: _jsx(\"span\", { className: \"font-medium text-sm text-gray-900 dark:text-gray-100\", children: title || 'Chart' }) }), _jsx(\"div\", { style: { width: '100%', height: baseHeight }, children: _jsx(VegaErrorDisplay, { error: error, chartTitle: title }) })] }) }));\n }\n // Build spec for rendering\n const chartSpec = buildFullSpec(baseHeight);\n const fullscreenSpec = buildFullSpec(0, true);\n // Handle case when spec isn't ready yet\n if (!chartSpec) {\n return null;\n }\n // Debug: Log the final spec being rendered\n console.log('VegaLite rendering with spec:', {\n title,\n hasData: !!chartSpec.data?.values,\n dataLength: chartSpec.data?.values?.length,\n spec: JSON.stringify(chartSpec).slice(0, 1000) + '...'\n });\n // Check if spec has data\n const specData = chartSpec.data;\n const hasNoData = specData && !specData.values && !specData.url;\n if (hasNoData) {\n console.warn('VegaLite spec has no data:', chartSpec);\n }\n return (_jsxs(_Fragment, { children: [_jsx(\"div\", { className: cn(\"bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 shadow-sm\", isDashboard && \"border-2\"), children: _jsxs(\"div\", { className: \"flex flex-col gap-2 p-3\", children: [_jsxs(\"div\", { className: \"flex items-center justify-between\", children: [_jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"span\", { className: \"font-medium text-sm text-gray-900 dark:text-gray-100\", children: title || (isDashboard ? 'Dashboard' : 'Chart') }), isDashboard && (_jsx(\"span\", { className: \"text-xs px-2 py-0.5 rounded-full bg-indigo-100 dark:bg-indigo-900 text-indigo-700 dark:text-indigo-300\", children: \"Interactive\" }))] }), _jsx(Toolbar, {})] }), description && (_jsx(\"span\", { className: \"text-xs text-gray-500 dark:text-gray-400\", children: description })), _jsx(\"div\", { ref: containerRef, className: \"bg-white dark:bg-gray-900 rounded overflow-hidden\", style: { width: '100%', height: baseHeight, minWidth: 0 }, children: _jsx(VegaEmbed, { spec: chartSpec, onEmbed: (result) => handleNewView(result.view), onError: handleError, options: { renderer: options?.renderer || 'canvas', actions: false } }) })] }) }), _jsxs(FullscreenDialog, { isOpen: isFullscreen, onClose: () => setIsFullscreen(false), title: title || (isDashboard ? 'Dashboard' : 'Chart'), description: description, children: [_jsx(\"div\", { className: \"w-full h-full min-h-[calc(100vh-200px)]\", children: fullscreenSpec && (_jsx(VegaEmbed, { spec: fullscreenSpec, onEmbed: (result) => handleFullscreenNewView(result.view), onError: handleError, options: { renderer: options?.renderer || 'canvas', actions: false } })) }), _jsx(\"div\", { className: \"absolute bottom-6 right-6\", children: _jsx(Toolbar, { className: \"bg-white dark:bg-gray-800 rounded-lg shadow-lg p-2 border border-gray-200 dark:border-gray-700\" }) })] })] }));\n}, (prevProps, nextProps) => {\n // Deep compare the spec to prevent re-renders when data hasn't changed\n return JSON.stringify(prevProps.spec) === JSON.stringify(nextProps.spec) &&\n prevProps.artifactRunId === nextProps.artifactRunId;\n});\n//# sourceMappingURL=VegaLiteChart.js.map","import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { Component, memo, useState, useRef, useCallback } from 'react';\nimport { toPng } from 'html-to-image';\nimport { Download, Copy, Check } from 'lucide-react';\nimport { VegaLiteChart } from './VegaLiteChart';\nimport { Area, AreaChart, Bar, BarChart, CartesianGrid, Cell, ComposedChart, Funnel, FunnelChart, LabelList, Legend, Line, LineChart, Pie, PieChart, PolarAngleAxis, PolarGrid, PolarRadiusAxis, Radar, RadarChart, RadialBar, RadialBarChart, ReferenceLine, ResponsiveContainer, Scatter, ScatterChart, Tooltip, Treemap, XAxis, YAxis, } from 'recharts';\n// Default color palette for charts\nconst COLORS = ['#4f46e5', '#06b6d4', '#22c55e', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899', '#14b8a6'];\nclass ChartErrorBoundary extends Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n static getDerivedStateFromError(error) {\n return { hasError: true, error };\n }\n componentDidCatch(error, errorInfo) {\n console.error(`Chart rendering error (${this.props.chartType}):`, error, errorInfo);\n }\n render() {\n if (this.state.hasError) {\n return (_jsx(\"div\", { className: \"flex items-center justify-center h-full bg-red-50 dark:bg-red-950 rounded-md p-4\", children: _jsxs(\"div\", { className: \"text-center\", children: [_jsxs(\"p\", { className: \"text-sm font-medium text-red-600 dark:text-red-400\", children: [\"Cannot render \", this.props.chartType, \" chart\"] }), _jsx(\"p\", { className: \"text-xs text-red-500 dark:text-red-500 mt-1 max-w-xs truncate\", children: this.state.error?.message || 'Unknown error' })] }) }));\n }\n return this.props.children;\n }\n}\n// Type guard to check if spec is Vega-Lite\nexport function isVegaLiteSpec(spec) {\n return spec.library === 'vega-lite';\n}\n// Type guard to check if spec is Recharts (default)\nexport function isRechartsSpec(spec) {\n return (spec.library === 'recharts' || spec.library === undefined) && !('spec' in spec);\n}\nfunction formatNumber(n) {\n if (!isFinite(n))\n return String(n);\n const abs = Math.abs(n);\n if (abs >= 1_000_000_000)\n return (n / 1_000_000_000).toFixed(1) + 'B';\n if (abs >= 1_000_000)\n return (n / 1_000_000).toFixed(1) + 'M';\n if (abs >= 1_000)\n return (n / 1_000).toFixed(1) + 'K';\n return n.toLocaleString();\n}\n// Router component that delegates to the appropriate chart renderer\nexport const AgentChart = memo(function AgentChart({ spec, artifactRunId }) {\n // Route to VegaLiteChart for Vega-Lite specs\n if (isVegaLiteSpec(spec)) {\n return _jsx(VegaLiteChart, { spec: spec, artifactRunId: artifactRunId });\n }\n // Route to RechartsChart for Recharts specs\n return _jsx(RechartsChart, { spec: spec });\n}, (prevProps, nextProps) => {\n // Deep compare the spec to prevent re-renders when data hasn't changed\n return JSON.stringify(prevProps.spec) === JSON.stringify(nextProps.spec) &&\n prevProps.artifactRunId === nextProps.artifactRunId;\n});\n// Map alternative chart type names to our standard names\nfunction normalizeChartType(spec) {\n // If 'chart' is provided, use it directly\n if (spec.chart)\n return spec.chart;\n // Map 'type' field (e.g., \"BarChart\" -> \"bar\")\n const typeMap = {\n 'BarChart': 'bar',\n 'LineChart': 'line',\n 'AreaChart': 'area',\n 'PieChart': 'pie',\n 'ScatterChart': 'scatter',\n 'RadarChart': 'radar',\n 'FunnelChart': 'funnel',\n 'Treemap': 'treemap',\n 'ComposedChart': 'composed',\n 'RadialBarChart': 'radialBar',\n };\n if (spec.type && typeMap[spec.type]) {\n return typeMap[spec.type];\n }\n return 'bar'; // default\n}\n// Recharts implementation component\nconst RechartsChart = memo(function RechartsChart({ spec }) {\n // Normalize spec to handle alternative formats from agents\n const normalizedSpec = {\n ...spec,\n chart: normalizeChartType(spec),\n // Handle x_axis.data_key -> xKey\n xKey: spec.xKey || spec.x_axis?.data_key || 'name',\n // Handle bars/lines -> series\n series: spec.series || spec.bars?.map((b) => ({\n key: b.data_key || b.dataKey,\n color: b.fill || b.color,\n label: b.name,\n })) || spec.lines?.map((l) => ({\n key: l.data_key || l.dataKey,\n color: l.stroke || l.color,\n label: l.name,\n })) || [],\n };\n const { chart, title, description, data, xKey, series, yAxis, options, nameKey, valueKey, yKey, zKey: _zKey, axisKey, dataKey, } = normalizedSpec;\n const [isExporting, setIsExporting] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const chartRef = useRef(null);\n const handleCopy = useCallback(async () => {\n if (!chartRef.current || isCopied)\n return;\n try {\n const dataUrl = await toPng(chartRef.current, {\n backgroundColor: '#ffffff',\n pixelRatio: 2,\n });\n const response = await fetch(dataUrl);\n const blob = await response.blob();\n await navigator.clipboard.write([\n new ClipboardItem({ 'image/png': blob })\n ]);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n }\n catch (err) {\n console.error('Failed to copy chart:', err);\n }\n }, [isCopied]);\n const handleExport = useCallback(async () => {\n if (!chartRef.current || isExporting)\n return;\n setIsExporting(true);\n try {\n const dataUrl = await toPng(chartRef.current, {\n backgroundColor: '#ffffff',\n pixelRatio: 2,\n });\n const link = document.createElement('a');\n link.download = `${title || 'chart'}.png`;\n link.href = dataUrl;\n link.click();\n }\n catch (err) {\n console.error('Failed to export chart:', err);\n }\n finally {\n setIsExporting(false);\n }\n }, [title, isExporting]);\n // Safe arrays - default to empty array if undefined\n const safeSeries = series || [];\n const safeData = data || [];\n const commonAxes = (_jsxs(_Fragment, { children: [_jsx(XAxis, { dataKey: xKey, tick: { fontSize: 12 } }), _jsx(YAxis, { yAxisId: \"left\", tickFormatter: formatNumber, label: yAxis?.left?.label ? { value: yAxis.left.label, angle: -90, position: 'insideLeft' } : undefined }), safeSeries.some((s) => s.yAxisId === 'right') && (_jsx(YAxis, { yAxisId: \"right\", orientation: \"right\", tickFormatter: formatNumber, label: yAxis?.right?.label ? { value: yAxis.right.label, angle: -90, position: 'insideRight' } : undefined }))] }));\n const commonOverlays = (_jsxs(_Fragment, { children: [_jsx(CartesianGrid, { strokeDasharray: \"3 3\" }), _jsx(Tooltip, { formatter: (value) => (typeof value === 'number' ? formatNumber(value) : String(value)) }), _jsx(Legend, {}), options?.referenceZero && _jsx(ReferenceLine, { y: 0, stroke: \"#999\", strokeDasharray: \"3 3\" })] }));\n const renderSeries = () => safeSeries.map((s, idx) => {\n const color = s.color || COLORS[idx % COLORS.length];\n const yAxisId = s.yAxisId || 'left';\n if (chart === 'line') {\n return (_jsx(Line, { type: \"monotone\", dataKey: s.key, name: s.label || s.key, stroke: color, dot: s.dot ?? false, yAxisId: yAxisId }, s.key));\n }\n if (chart === 'area') {\n return (_jsx(Area, { type: \"monotone\", dataKey: s.key, name: s.label || s.key, stroke: color, fill: color, fillOpacity: 0.3, stackId: options?.stacked ? (s.stackId || 'stack') : undefined, yAxisId: yAxisId }, s.key));\n }\n if (chart === 'bar' || s.type === 'bar') {\n return (_jsx(Bar, { dataKey: s.key, name: s.label || s.key, fill: color, stackId: options?.stacked ? (s.stackId || 'stack') : undefined, yAxisId: yAxisId }, s.key));\n }\n if (s.type === 'area') {\n return (_jsx(Area, { type: \"monotone\", dataKey: s.key, name: s.label || s.key, stroke: color, fill: color, fillOpacity: 0.3, stackId: options?.stacked ? (s.stackId || 'stack') : undefined, yAxisId: yAxisId }, s.key));\n }\n // default to line in composed\n return (_jsx(Line, { type: \"monotone\", dataKey: s.key, name: s.label || s.key, stroke: color, dot: s.dot ?? false, yAxisId: yAxisId }, s.key));\n });\n // Render Pie Chart\n const renderPieChart = () => {\n const nKey = nameKey || 'name';\n const vKey = valueKey || 'value';\n const innerRadius = options?.innerRadius || 0;\n return (_jsxs(PieChart, { children: [_jsx(Pie, { data: safeData, dataKey: vKey, nameKey: nKey, cx: \"50%\", cy: \"50%\", innerRadius: innerRadius, outerRadius: 100, label: options?.showLabels !== false, children: safeData.map((_, index) => (_jsx(Cell, { fill: COLORS[index % COLORS.length] }, `cell-${index}`))) }), _jsx(Tooltip, { formatter: (value) => (typeof value === 'number' ? formatNumber(value) : String(value)) }), _jsx(Legend, {})] }));\n };\n // Render Scatter Chart\n const renderScatterChart = () => {\n const xDataKey = xKey;\n const yDataKey = yKey || 'y';\n return (_jsxs(ScatterChart, { children: [_jsx(CartesianGrid, { strokeDasharray: \"3 3\" }), _jsx(XAxis, { dataKey: xDataKey, name: xDataKey, tick: { fontSize: 12 } }), _jsx(YAxis, { dataKey: yDataKey, name: yDataKey, tickFormatter: formatNumber }), _jsx(Tooltip, { formatter: (value) => (typeof value === 'number' ? formatNumber(value) : String(value)) }), _jsx(Legend, {}), safeSeries.length > 0 ? (safeSeries.map((s, idx) => (_jsx(Scatter, { name: s.label || s.key, data: safeData, fill: s.color || COLORS[idx % COLORS.length] }, s.key)))) : (_jsx(Scatter, { name: \"Data\", data: safeData, fill: COLORS[0] }))] }));\n };\n // Render Radar Chart\n const renderRadarChart = () => {\n const aKey = axisKey || xKey || 'axis';\n return (_jsxs(RadarChart, { cx: \"50%\", cy: \"50%\", outerRadius: 100, data: safeData, children: [_jsx(PolarGrid, {}), _jsx(PolarAngleAxis, { dataKey: aKey, tick: { fontSize: 11 } }), _jsx(PolarRadiusAxis, { tickFormatter: formatNumber }), safeSeries.map((s, idx) => (_jsx(Radar, { name: s.label || s.key, dataKey: s.key, stroke: s.color || COLORS[idx % COLORS.length], fill: s.color || COLORS[idx % COLORS.length], fillOpacity: 0.3 }, s.key))), _jsx(Tooltip, { formatter: (value) => (typeof value === 'number' ? formatNumber(value) : String(value)) }), _jsx(Legend, {})] }));\n };\n // Render RadialBar Chart\n const renderRadialBarChart = () => {\n const nKey = nameKey || 'name';\n const vKey = valueKey || 'value';\n const startAngle = options?.startAngle ?? 180;\n const endAngle = options?.endAngle ?? 0;\n const innerRadius = options?.innerRadius ?? 30;\n return (_jsxs(RadialBarChart, { cx: \"50%\", cy: \"50%\", innerRadius: innerRadius, outerRadius: 100, barSize: 15, data: safeData, startAngle: startAngle, endAngle: endAngle, children: [_jsx(RadialBar, { label: { position: 'insideStart', fill: '#fff', fontSize: 11 }, background: true, dataKey: vKey, children: safeData.map((_, index) => (_jsx(Cell, { fill: COLORS[index % COLORS.length] }, `cell-${index}`))) }), _jsx(Tooltip, { formatter: (value) => (typeof value === 'number' ? formatNumber(value) : String(value)) }), _jsx(Legend, { iconSize: 10, layout: \"vertical\", verticalAlign: \"middle\", align: \"right\", formatter: (value, entry) => {\n const item = safeData.find((d) => d[nKey] === value || d[vKey] === entry.payload?.value);\n return item ? item[nKey] : value;\n } })] }));\n };\n // Render Funnel Chart\n const renderFunnelChart = () => {\n const nKey = nameKey || 'name';\n const vKey = valueKey || 'value';\n return (_jsxs(FunnelChart, { children: [_jsx(Tooltip, { formatter: (value) => (typeof value === 'number' ? formatNumber(value) : String(value)) }), _jsxs(Funnel, { dataKey: vKey, data: safeData, isAnimationActive: true, children: [safeData.map((_, index) => (_jsx(Cell, { fill: COLORS[index % COLORS.length] }, `cell-${index}`))), options?.showLabels !== false && (_jsx(LabelList, { position: \"center\", fill: \"#fff\", stroke: \"none\", dataKey: nKey }))] })] }));\n };\n // Render Treemap\n const renderTreemap = () => {\n const dKey = dataKey || valueKey || 'value';\n return (_jsx(Treemap, { data: safeData, dataKey: dKey, aspectRatio: 4 / 3, stroke: \"#fff\", fill: \"#4f46e5\", content: ({ x, y, width, height, name, value, index }) => {\n const fill = COLORS[index % COLORS.length];\n return (_jsxs(\"g\", { children: [_jsx(\"rect\", { x: x, y: y, width: width, height: height, style: { fill, stroke: '#fff', strokeWidth: 2 } }), width > 50 && height > 30 && (_jsxs(_Fragment, { children: [_jsx(\"text\", { x: x + width / 2, y: y + height / 2 - 7, textAnchor: \"middle\", fill: \"#fff\", fontSize: 12, children: name }), _jsx(\"text\", { x: x + width / 2, y: y + height / 2 + 10, textAnchor: \"middle\", fill: \"#fff\", fontSize: 11, children: formatNumber(value) })] }))] }));\n } }));\n };\n // Render chart based on type\n const renderChart = () => {\n switch (chart) {\n case 'bar':\n return (_jsxs(BarChart, { data: safeData, children: [commonAxes, commonOverlays, renderSeries()] }));\n case 'line':\n return (_jsxs(LineChart, { data: safeData, children: [commonAxes, commonOverlays, renderSeries()] }));\n case 'area':\n return (_jsxs(AreaChart, { data: safeData, children: [commonAxes, commonOverlays, renderSeries()] }));\n case 'composed':\n return (_jsxs(ComposedChart, { data: safeData, children: [commonAxes, commonOverlays, renderSeries()] }));\n case 'pie':\n return renderPieChart();\n case 'scatter':\n return renderScatterChart();\n case 'radar':\n return renderRadarChart();\n case 'radialBar':\n return renderRadialBarChart();\n case 'funnel':\n return renderFunnelChart();\n case 'treemap':\n return renderTreemap();\n default:\n return (_jsxs(ComposedChart, { data: safeData, children: [commonAxes, commonOverlays, renderSeries()] }));\n }\n };\n return (_jsx(\"div\", { className: \"bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 shadow-sm\", children: _jsxs(\"div\", { className: \"flex flex-col gap-2 p-3\", children: [_jsxs(\"div\", { className: \"flex items-center justify-between\", children: [_jsx(\"span\", { className: \"font-medium text-sm text-gray-900 dark:text-gray-100\", children: title || 'Chart' }), _jsxs(\"div\", { className: \"flex items-center gap-2 print:hidden chart-actions\", children: [_jsxs(\"button\", { onClick: handleCopy, disabled: isCopied, className: \"text-xs px-2 py-1 rounded border border-gray-300 dark:border-gray-700 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors disabled:opacity-50 flex items-center gap-1\", title: \"Copy to clipboard\", children: [isCopied ? _jsx(Check, { className: \"w-3 h-3\" }) : _jsx(Copy, { className: \"w-3 h-3\" }), isCopied ? 'Copied' : 'Copy'] }), _jsxs(\"button\", { onClick: handleExport, disabled: isExporting, className: \"text-xs px-2 py-1 rounded border border-gray-300 dark:border-gray-700 bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 cursor-pointer transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\", title: \"Export as PNG\", children: [_jsx(Download, { className: \"w-3 h-3\" }), isExporting ? 'Exporting...' : 'Export'] })] })] }), description && (_jsx(\"span\", { className: \"text-xs text-gray-500 dark:text-gray-400\", children: description })), _jsx(\"div\", { ref: chartRef, className: \"bg-white dark:bg-gray-900 rounded\", style: { width: '100%', height: 280, minWidth: 0 }, children: _jsx(ChartErrorBoundary, { chartType: chart, children: _jsx(ResponsiveContainer, { width: \"100%\", height: \"100%\", children: renderChart() }) }) })] }) }));\n}, (prevProps, nextProps) => {\n // Deep compare the spec to prevent re-renders when data hasn't changed\n return JSON.stringify(prevProps.spec) === JSON.stringify(nextProps.spec);\n});\n//# sourceMappingURL=AgentChart.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { normalizeToolCollection } from \"@vertesia/common\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { CodeBlockRendererProvider } from \"@vertesia/ui/widgets\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { AgentChart } from \"./AgentChart\";\nconst AgentChartWidget = ({ code }) => {\n const spec = useMemo(() => {\n return JSON.parse(code);\n }, [code]);\n return _jsx(AgentChart, { spec: spec });\n};\nconst defaultComponents = {\n \"chart\": AgentChartWidget\n};\nfunction RemoteWidgetComponent({ url, code }) {\n const [Component, setComponent] = useState(null);\n useEffect(() => {\n import(/* @vite-ignore */ url).then(module => {\n // register the component\n // Wrap in arrow function to prevent React from calling it as a state updater\n setComponent(() => module.default);\n }).catch(err => {\n console.error(\"Failed to load remote widget component from \", url, err);\n });\n }, [url]);\n return Component ? _jsx(Component, { code: code }) : null;\n}\nasync function fetchSkillWidgets(client) {\n const installedApps = await client.apps.getInstalledApps(\"tools\");\n const urls = new Set();\n for (const app of installedApps) {\n for (const item of app.manifest.tool_collections || []) {\n const collection = normalizeToolCollection(item);\n const collUrl = collection.url;\n if (collUrl.startsWith(\"http://\") || collUrl.startsWith(\"https://\")) {\n const i = collUrl.indexOf(\"/api/\");\n if (i > 0) {\n const url = collUrl.substring(0, i);\n urls.add(url + '/api/widgets');\n }\n }\n }\n }\n const allWidgets = await Promise.all(Array.from(urls).map(url => {\n return fetch(url).then(r => {\n if (!r.ok) {\n throw new Error(`Failed to fetch widgets: ${r.status} ${r.statusText}`);\n }\n return r.json();\n }).then(data => {\n const widgets = [];\n const widgetsMap = data.widgets;\n for (const [name, value] of Object.entries(widgetsMap)) {\n widgets.push({ name, component: (props) => _jsx(RemoteWidgetComponent, { url: value.url, code: props.code }) });\n }\n return widgets;\n }).catch(() => {\n console.error(\"Failed to fetch skill widgets from \", url);\n return null;\n });\n }));\n const widgets = {};\n for (const widgetSpec of allWidgets.flat()) {\n if (widgetSpec) {\n widgets[widgetSpec.name] = widgetSpec.component;\n }\n }\n return widgets;\n}\n/**\n * Provides code block components depending on lagauge form the installed skills\n * @param param0\n * @returns\n */\nexport function SkillWidgetProvider({ children }) {\n const { client } = useUserSession();\n const [components, setComponents] = useState(defaultComponents);\n useEffect(() => {\n // fetch all skill components\n fetchSkillWidgets(client).then(widgets => {\n setComponents({\n ...defaultComponents,\n ...widgets,\n });\n });\n }, []);\n return (_jsx(CodeBlockRendererProvider, { components: components, children: children }));\n}\n//# sourceMappingURL=SkillWidgetProvider.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Bot, Cpu, FileTextIcon, SendIcon, UploadIcon, XIcon } from \"lucide-react\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { AgentMessageType, FileProcessingStatus, } from \"@vertesia/common\";\nimport { Button, MessageBox, Spinner, useToast, VModal, VModalBody, VModalFooter, VModalTitle } from \"@vertesia/ui/core\";\nimport { AnimatedThinkingDots, PulsatingCircle } from \"./AnimatedThinkingDots\";\nimport { ImageLightboxProvider } from \"./ImageLightbox\";\nimport AllMessagesMixed from \"./ModernAgentOutput/AllMessagesMixed\";\nimport Header from \"./ModernAgentOutput/Header\";\nimport MessageInput from \"./ModernAgentOutput/MessageInput\";\nimport { getWorkstreamId, insertMessageInTimeline, isInProgress } from \"./ModernAgentOutput/utils\";\nimport { ThinkingMessages } from \"./WaitingMessages\";\nimport InlineSlidingPlanPanel from \"./ModernAgentOutput/InlineSlidingPlanPanel\";\nimport { SkillWidgetProvider } from \"./SkillWidgetProvider\";\nimport { ArtifactUrlCacheProvider } from \"./useArtifactUrlCache.js\";\nfunction printElementToPdf(sourceElement, title) {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return false;\n }\n // Use a hidden iframe to avoid opening a new window\n const iframe = document.createElement(\"iframe\");\n iframe.style.position = \"fixed\";\n iframe.style.right = \"0\";\n iframe.style.bottom = \"0\";\n iframe.style.width = \"0\";\n iframe.style.height = \"0\";\n iframe.style.border = \"0\";\n iframe.style.visibility = \"hidden\";\n document.body.appendChild(iframe);\n const iframeWindow = iframe.contentWindow;\n if (!iframeWindow) {\n iframe.parentNode?.removeChild(iframe);\n return false;\n }\n const doc = iframeWindow.document;\n doc.open();\n doc.write(`<!doctype html><html><head><title>${title}</title></head><body></body></html>`);\n doc.close();\n doc.title = title;\n const styles = document.querySelectorAll(\"link[rel=\\\"stylesheet\\\"], style\");\n styles.forEach((node) => {\n doc.head.appendChild(node.cloneNode(true));\n });\n doc.body.innerHTML = sourceElement.innerHTML;\n iframeWindow.focus();\n iframeWindow.print();\n setTimeout(() => {\n iframe.parentNode?.removeChild(iframe);\n }, 1000);\n return true;\n}\nexport function ModernAgentConversation(props) {\n const { run, startWorkflow } = props;\n if (run) {\n // If we have a run, convert it to AsyncExecutionResult format if needed\n const execRun = \"runId\" in run\n ? run\n : {\n runId: run.run_id,\n workflowId: run.workflow_id,\n };\n return (_jsx(SkillWidgetProvider, { children: _jsx(ModernAgentConversationInner, { ...props, run: execRun }) }));\n }\n else if (startWorkflow) {\n // If we have startWorkflow capability but no run yet\n return _jsx(StartWorkflowView, { ...props });\n }\n else {\n // Empty state\n return _jsx(EmptyState, {});\n }\n}\n// Empty state when no agent is running\nfunction EmptyState() {\n return (_jsxs(MessageBox, { status: \"info\", icon: _jsx(Bot, { className: \"size-16 text-muted mb-4\" }), children: [_jsx(\"div\", { className: \"text-base font-medium text-muted\", children: \"No agent currently running\" }), _jsx(\"div\", { className: \"mt-3 text-sm text-muted\", children: \"Select an interaction and click Start to start an agent\" })] }));\n}\n// Start workflow view - allows initiating a new agent conversation\n// Files can be staged locally before workflow starts, then uploaded when the workflow is created\nfunction StartWorkflowView({ initialMessage, startWorkflow, onClose, isModal = false, fullWidth = false, placeholder = \"Type your message...\", startButtonText = \"Start Agent\", title = \"Start New Conversation\", \n// Attachment callback - used to include existing document attachments in the first message\ngetAttachedDocs, onAttachmentsSent, \n// File upload props\nacceptedFileTypes = \".pdf,.doc,.docx,.txt,.csv,.xlsx,.xls,.png,.jpg,.jpeg,.gif,.webp\", maxFiles = 5, }) {\n const { client } = useUserSession();\n const [inputValue, setInputValue] = useState(\"\");\n const [isSending, setIsSending] = useState(false);\n const [run, setRun] = useState();\n const toast = useToast();\n const inputRef = useRef(null);\n const fileInputRef = useRef(null);\n // Staged files - stored locally until workflow starts\n const [stagedFiles, setStagedFiles] = useState([]);\n // Drag and drop state\n const [isDragOver, setIsDragOver] = useState(false);\n const dragCounterRef = useRef(0);\n // Drag and drop handlers for file staging\n const handleDragEnter = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current++;\n if (e.dataTransfer?.types?.includes('Files')) {\n setIsDragOver(true);\n }\n }, []);\n const handleDragOver = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n const handleDragLeave = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current--;\n if (dragCounterRef.current === 0) {\n setIsDragOver(false);\n }\n }, []);\n const handleDrop = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current = 0;\n setIsDragOver(false);\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n const filesArray = Array.from(e.dataTransfer.files);\n setStagedFiles(prev => {\n const newFiles = [...prev, ...filesArray].slice(0, maxFiles);\n return newFiles;\n });\n }\n }, [maxFiles]);\n const handleFileInputChange = useCallback((e) => {\n if (e.target.files && e.target.files.length > 0) {\n const filesArray = Array.from(e.target.files);\n setStagedFiles(prev => {\n const newFiles = [...prev, ...filesArray].slice(0, maxFiles);\n return newFiles;\n });\n }\n // Reset input so the same file can be selected again\n e.target.value = '';\n }, [maxFiles]);\n const removeStagedFile = useCallback((index) => {\n setStagedFiles(prev => prev.filter((_, i) => i !== index));\n }, []);\n useEffect(() => {\n // Focus the input field when component mounts\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, []);\n // Start a new workflow with the message\n const startWorkflowWithMessage = async () => {\n if (!startWorkflow)\n return;\n const message = inputValue.trim();\n if (!message || isSending)\n return;\n setIsSending(true);\n try {\n // Reset plan panel state when starting a new agent\n sessionStorage.removeItem(\"plan-panel-shown\");\n toast({\n title: stagedFiles.length > 0 ? \"Starting agent and uploading files...\" : \"Starting agent...\",\n status: \"info\",\n duration: 3000,\n });\n // Get attached document IDs if callback provided\n const attachedDocs = getAttachedDocs?.() || [];\n // Build message content with attachment references if present\n let messageContent = message;\n if (attachedDocs.length > 0 && !/store:\\S+/.test(message)) {\n const lines = attachedDocs.map((id) => `store:${id}`);\n messageContent = [message, '', 'Attachments:', ...lines].join('\\n');\n }\n const newRun = await startWorkflow(messageContent);\n if (newRun) {\n // Upload staged files to the new run's artifact space and signal workflow\n if (stagedFiles.length > 0) {\n for (const file of stagedFiles) {\n try {\n const artifactPath = `files/${file.name}`;\n await client.files.uploadArtifact(newRun.run_id, artifactPath, file);\n // Signal workflow that file was uploaded\n await client.store.workflows.sendSignal(newRun.workflow_id, newRun.run_id, \"FileUploaded\", {\n id: `file-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n name: file.name,\n content_type: file.type || 'application/octet-stream',\n reference: `artifact:${artifactPath}`,\n artifact_path: artifactPath,\n });\n }\n catch (uploadErr) {\n console.error(`Failed to upload staged file ${file.name}:`, uploadErr);\n // Continue with other files\n }\n }\n setStagedFiles([]);\n }\n // Clear attachments after successful start\n onAttachmentsSent?.();\n setRun({\n runId: newRun.run_id,\n workflowId: newRun.workflow_id,\n });\n setInputValue(\"\");\n toast({\n title: \"Agent started\",\n status: \"success\",\n duration: 3000,\n });\n }\n }\n catch (err) {\n toast({\n title: \"Error starting workflow\",\n status: \"error\",\n duration: 3000,\n description: err instanceof Error ? err.message : \"Unknown error\",\n });\n }\n finally {\n setIsSending(false);\n }\n };\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n startWorkflowWithMessage();\n }\n };\n // If a run has been started, show the conversation\n if (run) {\n return (_jsx(ModernAgentConversationInner, { onClose, isModal, initialMessage, placeholder, run: run, title: title }));\n }\n return (_jsxs(\"div\", { className: `flex flex-col h-full bg-white dark:bg-gray-900 overflow-hidden border-0 relative ${isDragOver ? 'ring-2 ring-blue-400 ring-inset' : ''}`, onDragEnter: handleDragEnter, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: [isDragOver && (_jsx(\"div\", { className: \"absolute inset-0 flex items-center justify-center bg-blue-100/80 dark:bg-blue-900/40 z-50 pointer-events-none rounded-lg\", children: _jsxs(\"div\", { className: \"text-blue-600 dark:text-blue-400 font-medium flex items-center gap-2 text-lg\", children: [_jsx(UploadIcon, { className: \"size-6\" }), \"Drop files to stage for upload\"] }) })), _jsx(\"input\", { ref: fileInputRef, type: \"file\", multiple: true, accept: acceptedFileTypes, onChange: handleFileInputChange, className: \"hidden\" }), _jsxs(\"div\", { className: \"flex items-center justify-between py-2 px-3 border-b border-gray-100 dark:border-gray-800 bg-white dark:bg-gray-900\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-2\", children: [_jsx(\"div\", { className: \"p-1\", children: _jsx(Cpu, { className: \"size-3.5 text-muted\" }) }), _jsx(\"span\", { className: \"font-medium text-sm text-gray-700 dark:text-gray-300\", children: title })] }), onClose && !isModal && (_jsx(Button, { size: \"xs\", variant: \"ghost\", onClick: onClose, title: \"Close\", className: \"text-slate-500 hover:text-slate-700\", children: _jsx(XIcon, { className: \"size-4\" }) }))] }), _jsxs(\"div\", { className: `flex-1 overflow-y-auto px-4 py-6 bg-white dark:bg-gray-900 flex flex-col ${fullWidth ? 'items-start justify-start' : 'items-center justify-center'}`, children: [initialMessage && (_jsx(\"div\", { className: `px-4 py-3 mb-4 bg-blue-50/80 dark:bg-blue-900/30 border-l-2 border-blue-400 dark:border-blue-500 text-blue-700 dark:text-blue-300 ${fullWidth ? 'w-full' : 'max-w-md'}`, children: initialMessage })), _jsxs(\"div\", { className: `bg-white dark:bg-slate-800 p-4 border-l-2 border-blue-400 dark:border-blue-500 ${fullWidth ? 'w-full' : 'max-w-md'}`, children: [_jsx(\"div\", { className: \"text-base text-slate-600 dark:text-slate-300 font-medium\", children: \"Enter a message to start a conversation\" }), _jsxs(\"div\", { className: \"mt-3 text-sm text-slate-500 dark:text-slate-400\", children: [\"Type your question below and press Enter or click \", startButtonText, \" \", \"to begin\"] })] })] }), _jsxs(\"div\", { className: \"py-3 px-3 border-t border-gray-100 dark:border-gray-800 bg-white dark:bg-gray-900\", children: [stagedFiles.length > 0 && (_jsx(\"div\", { className: \"flex flex-wrap gap-2 mb-3\", children: stagedFiles.map((file, index) => (_jsxs(\"div\", { className: \"flex items-center gap-1.5 px-2 py-1 bg-attention/10 text-attention rounded-md text-sm\", children: [_jsx(FileTextIcon, { className: \"size-3.5\" }), _jsx(\"span\", { className: \"max-w-[120px] truncate\", children: file.name }), _jsx(\"span\", { className: \"text-xs opacity-70\", children: \"Staged\" }), _jsx(\"button\", { onClick: () => removeStagedFile(index), className: \"ml-1 p-0.5 hover:bg-attention/20 rounded\", children: _jsx(XIcon, { className: \"size-3\" }) })] }, `${file.name}-${index}`))) })), _jsx(\"div\", { className: \"flex gap-2 mb-2\", children: _jsxs(Button, { variant: \"outline\", size: \"sm\", onClick: () => fileInputRef.current?.click(), disabled: isSending || stagedFiles.length >= maxFiles, className: \"text-xs\", children: [_jsx(UploadIcon, { className: \"size-3.5 mr-1.5\" }), \"Upload\"] }) }), _jsxs(\"div\", { className: \"flex items-center gap-2\", children: [_jsx(\"div\", { className: \"flex-1\", children: _jsx(\"input\", { ref: inputRef, value: inputValue, onChange: (e) => setInputValue(e.target.value), onKeyDown: handleKeyDown, placeholder: placeholder, disabled: isSending, className: \"w-full py-2 px-3 text-sm border border-gray-200 dark:border-gray-700 dark:bg-gray-800 dark:text-white focus:border-gray-300 dark:focus:border-gray-600 focus:ring-0 rounded-md\" }) }), _jsxs(Button, { onClick: startWorkflowWithMessage, disabled: !inputValue.trim() || isSending, className: \"px-3 py-2 bg-gray-800 dark:bg-gray-700 hover:bg-gray-700 dark:hover:bg-gray-600 text-white text-xs rounded-md transition-colors\", children: [isSending ? (_jsx(Spinner, { size: \"sm\", className: \"mr-1.5\" })) : (_jsx(SendIcon, { className: \"size-3.5 mr-1.5\" })), startButtonText] })] }), _jsx(\"div\", { className: \"text-xs text-gray-400 dark:text-gray-500 mt-2 text-center\", children: stagedFiles.length > 0\n ? `${stagedFiles.length} file${stagedFiles.length > 1 ? 's' : ''} staged - will upload when conversation starts`\n : 'Type a message to start the conversation' })] })] }));\n}\n// Inner component that handles the agent conversation - similar to ModernAgentOutput\nfunction ModernAgentConversationInner({ run, title, interactive = true, onClose, isModal = false, fullWidth = false, placeholder = \"Type your message...\", resetWorkflow, \n// File upload props (onFilesSelected handled internally by handleFileUpload)\nuploadedFiles, onRemoveFile, acceptedFileTypes, maxFiles, \n// Document search props\nrenderDocumentSearch, selectedDocuments, onRemoveDocument, \n// Object linking\nhideObjectLinking, \n// Attachment callback\ngetAttachedDocs, onAttachmentsSent, \n// Upload state\nisUploading = false, \n// Styling props\ninputContainerClassName, inputClassName, }) {\n const { client } = useUserSession();\n const bottomRef = useRef(null);\n const conversationRef = useRef(null);\n const [messages, setMessages] = useState([]);\n const [isCompleted, setIsCompleted] = useState(false);\n const [isSending, setIsSending] = useState(false);\n const [viewMode, setViewMode] = useState(\"sliding\");\n const [showSlidingPanel, setShowSlidingPanel] = useState(!isModal);\n const [isStopping, setIsStopping] = useState(false);\n // Keep track of multiple plans and their timestamps\n const [plans, setPlans] = useState([]);\n // Track which plan is currently active in the UI\n const [activePlanIndex, setActivePlanIndex] = useState(0);\n // Store workstream status for each plan separately\n const [workstreamStatusMap, setWorkstreamStatusMap] = useState(new Map());\n const [thinkingMessageIndex, setThinkingMessageIndex] = useState(0);\n const toast = useToast();\n const [showInput, setShowInput] = useState(interactive);\n const [workflowStatus, setWorkflowStatus] = useState(null);\n // Track streaming messages by streaming_id for real-time chunk aggregation\n // Include startTimestamp to preserve chronological order when converting to regular messages\n const [streamingMessages, setStreamingMessages] = useState(new Map());\n // Track files being processed by the workflow\n const [processingFiles, setProcessingFiles] = useState(new Map());\n // Check if any files are still uploading or processing\n const hasProcessingFiles = useMemo(() => Array.from(processingFiles.values()).some(f => f.status === FileProcessingStatus.UPLOADING || f.status === FileProcessingStatus.PROCESSING), [processingFiles]);\n // Performance optimization: Batch streaming updates using RAF\n // Instead of updating state on every chunk (100+ times/sec), batch them per animation frame\n const pendingStreamingChunks = useRef(new Map());\n const streamingFlushScheduled = useRef(null);\n // Debug: Track chunk arrivals and renders\n const [_debugChunkCount, setDebugChunkCount] = useState(0);\n const [_debugRenderCount, setDebugRenderCount] = useState(0);\n const [debugChunkFlash, setDebugChunkFlash] = useState(false);\n const debugFlashTimeout = useRef(null);\n const flushStreamingChunks = useCallback(() => {\n if (pendingStreamingChunks.current.size > 0) {\n setStreamingMessages(new Map(pendingStreamingChunks.current));\n setDebugRenderCount(c => c + 1);\n }\n streamingFlushScheduled.current = null;\n }, []);\n // Drag and drop state for full-panel file upload\n const [isDragOver, setIsDragOver] = useState(false);\n const dragCounterRef = useRef(0);\n // Helper function to get the current active plan and its workstream status\n const getActivePlan = useMemo(() => {\n const currentPlanData = plans[activePlanIndex] || {\n plan: { plan: [] },\n timestamp: 0,\n };\n const currentWorkstreamStatus = workstreamStatusMap.get(currentPlanData.timestamp) || new Map();\n return {\n plan: currentPlanData.plan,\n workstreamStatus: currentWorkstreamStatus,\n };\n }, [plans, activePlanIndex, workstreamStatusMap]);\n // PERFORMANCE: Stabilize callback props to prevent child re-renders\n const handleTogglePlanPanel = useCallback(() => {\n setShowSlidingPanel((prev) => {\n if (!prev) {\n sessionStorage.setItem(\"plan-panel-shown\", \"true\");\n }\n return !prev;\n });\n }, []);\n const handleChangePlan = useCallback((index) => {\n setActivePlanIndex(index);\n }, []);\n const handleClosePlanPanel = useCallback(() => {\n setShowSlidingPanel(false);\n }, []);\n // Show rotating thinking messages\n useEffect(() => {\n if (!isCompleted) {\n const interval = setInterval(() => {\n setThinkingMessageIndex(() => Math.floor(Math.random() * (ThinkingMessages.length - 1)));\n }, 4000);\n return () => clearInterval(interval);\n }\n }, [isCompleted]);\n const checkWorkflowStatus = async () => {\n try {\n const statusResult = await client.store.workflows.getRunDetails(run.runId, run.workflowId);\n setWorkflowStatus(statusResult.status);\n }\n catch (error) {\n console.error('Failed to check workflow status:', error);\n }\n };\n // Stream messages from the agent\n useEffect(() => {\n // Reset all state when runId changes (new agent)\n setMessages([]);\n setPlans([]);\n setActivePlanIndex(0);\n setWorkstreamStatusMap(new Map());\n setShowSlidingPanel(false);\n setWorkflowStatus(null);\n setStreamingMessages(new Map());\n checkWorkflowStatus();\n client.store.workflows.streamMessages(run.workflowId, run.runId, (message) => {\n // Client now converts compact wire format to AgentMessage internally\n // Handle streaming chunks separately for real-time aggregation\n // PERFORMANCE: Batch updates using RAF instead of immediate state updates\n if (message.type === AgentMessageType.STREAMING_CHUNK) {\n const details = message.details;\n if (!details?.streaming_id)\n return;\n // Debug: Track chunk arrival with flash\n setDebugChunkCount(c => c + 1);\n setDebugChunkFlash(true);\n if (debugFlashTimeout.current)\n clearTimeout(debugFlashTimeout.current);\n debugFlashTimeout.current = setTimeout(() => setDebugChunkFlash(false), 50);\n // Accumulate chunks in the ref (no state update yet)\n const current = pendingStreamingChunks.current.get(details.streaming_id) || {\n text: '',\n workstreamId: message.workstream_id,\n startTimestamp: Date.now()\n };\n const newText = current.text + (message.message || '');\n pendingStreamingChunks.current.set(details.streaming_id, {\n text: newText,\n workstreamId: message.workstream_id,\n isComplete: details.is_final,\n startTimestamp: current.startTimestamp,\n });\n // Schedule a flush if not already scheduled (batches ~60 updates/sec max)\n if (streamingFlushScheduled.current === null) {\n streamingFlushScheduled.current = requestAnimationFrame(flushStreamingChunks);\n }\n return;\n }\n // Handle file processing status updates (SYSTEM messages with system_type: 'file_processing')\n if (message.type === AgentMessageType.SYSTEM) {\n const details = message.details;\n if (details?.system_type === 'file_processing' && details.files) {\n setProcessingFiles(prev => {\n const newMap = new Map(prev);\n for (const file of details.files) {\n newMap.set(file.id, file);\n }\n return newMap;\n });\n return; // Don't add to messages array - this is status only\n }\n // Other SYSTEM messages fall through to normal handling\n }\n // When ANSWER arrives, clear streaming messages (they contain the same content)\n // This prevents showing the message twice: once as streaming, once as final ANSWER\n if (message.type === AgentMessageType.ANSWER) {\n pendingStreamingChunks.current.clear();\n if (streamingFlushScheduled.current !== null) {\n cancelAnimationFrame(streamingFlushScheduled.current);\n streamingFlushScheduled.current = null;\n }\n setStreamingMessages(new Map());\n }\n // When COMPLETE arrives, clear any remaining streaming messages\n // (don't convert to THOUGHT since the content is already in the ANSWER message)\n if (message.type === AgentMessageType.COMPLETE) {\n pendingStreamingChunks.current.clear();\n if (streamingFlushScheduled.current !== null) {\n cancelAnimationFrame(streamingFlushScheduled.current);\n streamingFlushScheduled.current = null;\n }\n setStreamingMessages(new Map());\n }\n if (message.message) {\n setMessages((prev_messages) => {\n // Check for duplicate by timestamp\n if (prev_messages.find((m) => m.timestamp === message.timestamp)) {\n return prev_messages;\n }\n // For QUESTION messages from server, replace any optimistic version\n if (message.type === AgentMessageType.QUESTION && !message.details?._optimistic) {\n const withoutOptimistic = prev_messages.filter((m) => !(m.type === AgentMessageType.QUESTION &&\n m.details?._optimistic &&\n m.message === message.message));\n insertMessageInTimeline(withoutOptimistic, message);\n return [...withoutOptimistic];\n }\n insertMessageInTimeline(prev_messages, message);\n return [...prev_messages];\n });\n }\n });\n // Clear messages and unsubscribe when component unmounts or runId changes\n return () => {\n setMessages([]);\n // Cancel any pending streaming flush\n if (streamingFlushScheduled.current !== null) {\n cancelAnimationFrame(streamingFlushScheduled.current);\n streamingFlushScheduled.current = null;\n }\n pendingStreamingChunks.current.clear();\n // Client handles unsubscribing from the message stream internally\n };\n }, [run.runId, client.store.workflows, flushStreamingChunks]);\n // Update completion status when messages change\n // This now accounts for multiple workstreams\n useEffect(() => {\n setIsCompleted(!isInProgress(messages));\n // Only automatically hide the panel when there are no plans\n // But don't auto-show it when plans appear\n if (plans.length === 0) {\n // If there are no plans, make sure the plan panel is hidden\n setShowSlidingPanel(false);\n }\n // We removed the auto-show functionality to allow users to keep the panel closed if they want\n }, [messages, plans.length]);\n // Update plans and workstream status based on incoming messages\n useEffect(() => {\n // Only show the sliding panel for the very first plan and only once\n if (plans.length === 1 &&\n !showSlidingPanel &&\n !sessionStorage.getItem(\"plan-panel-shown\")) {\n // For first-time plan detection only, show the panel with a delay\n const notificationTimeout = setTimeout(() => {\n setShowSlidingPanel(true);\n // Mark that we've shown the panel once\n sessionStorage.setItem(\"plan-panel-shown\", \"true\");\n }, 500); // Short delay to ensure the UI has fully rendered\n return () => clearTimeout(notificationTimeout);\n }\n // Process messages to extract plan information\n messages.forEach((message) => {\n if (message.type === AgentMessageType.PLAN) {\n try {\n // Log message details for debugging\n console.log(\"PLAN message received:\", message.type);\n let newPlanDetails = null;\n // Extract the plan from the message details object\n if (message.details && typeof message.details === \"object\") {\n // For a PLAN type message like the example you provided\n if (message.details.plan && Array.isArray(message.details.plan)) {\n console.log(\"Valid plan array found in message.details.plan\");\n newPlanDetails = { plan: message.details.plan };\n }\n }\n // Only proceed if we have a valid plan\n if (newPlanDetails) {\n const timestamp = typeof message.timestamp === \"number\"\n ? message.timestamp\n : new Date(message.timestamp).getTime();\n // Check if we already have this plan\n const existingPlanIndex = plans.findIndex((p) => p.timestamp === timestamp);\n if (existingPlanIndex === -1 && newPlanDetails) {\n console.log(\"Adding new plan to plans array\");\n // This is a new plan - add it to our plans array\n const newPlan = {\n plan: newPlanDetails,\n timestamp,\n };\n // Add new plan to the beginning of the array (newest first)\n console.log(\"Adding plan to plans array:\", newPlan);\n setPlans((prev) => {\n const newPlans = [newPlan, ...prev];\n console.log(\"New plans array:\", newPlans);\n return newPlans;\n });\n // Set this as the active plan\n setActivePlanIndex(0);\n // Automatically show sliding plan panel when a plan is detected\n console.log(\"Setting showSlidingPanel to true\");\n setShowSlidingPanel(true);\n // Initialize workstreams as pending based on the plan tasks\n const newWorkstreamStatus = new Map();\n // Always initialize main workstream\n newWorkstreamStatus.set(\"main\", \"in_progress\");\n // Initialize each task in the plan with its status\n if (Array.isArray(newPlanDetails.plan)) {\n newPlanDetails.plan.forEach((task) => {\n if (task && typeof task === \"object\" && task.id) {\n const taskId = task.id.toString();\n // Use the task's status if available, otherwise default to pending\n newWorkstreamStatus.set(taskId, task.status || \"pending\");\n }\n });\n }\n // Update the workstream status map with the new status for this plan\n setWorkstreamStatusMap((prev) => {\n const newMap = new Map(prev);\n newMap.set(timestamp, newWorkstreamStatus);\n return newMap;\n });\n }\n }\n }\n catch (error) {\n console.error(\"Failed to parse plan from message:\", error);\n }\n }\n // Handle UPDATE type messages with plan updates\n if (message.type === AgentMessageType.UPDATE && message.details) {\n // We no longer process UPDATE messages with details.updates\n // Instead, we rely on the PLAN message that follows with the complete plan\n if (message.details.updates && Array.isArray(message.details.updates)) {\n console.log(\"Ignoring UPDATE message with details.updates - waiting for PLAN message with full plan\");\n // This is an initial update notification, but we'll wait for the PLAN message that follows\n // with the complete updated plan before making any UI changes\n }\n }\n });\n const lastMessage = messages[messages.length - 1];\n if (lastMessage) {\n if (lastMessage.type === AgentMessageType.TERMINATED) {\n setShowInput(false);\n setWorkflowStatus(\"TERMINATED\");\n }\n else {\n if (interactive) {\n setShowInput(true);\n }\n else {\n setShowInput(lastMessage.type === AgentMessageType.REQUEST_INPUT);\n }\n }\n }\n }, [messages, plans, activePlanIndex]);\n // Send a message to the agent\n const handleSendMessage = (message) => {\n const trimmed = message.trim();\n if (!trimmed || isSending)\n return;\n // Block if files are still processing\n if (hasProcessingFiles) {\n toast({\n status: \"warning\",\n title: \"Files Still Processing\",\n description: \"Please wait for all files to finish processing before sending\",\n duration: 3000,\n });\n return;\n }\n setIsSending(true);\n // Add optimistic QUESTION message immediately for better UX\n const optimisticTimestamp = Date.now();\n const optimisticMessage = {\n timestamp: optimisticTimestamp,\n workflow_run_id: run.runId,\n type: AgentMessageType.QUESTION,\n message: trimmed,\n workstream_id: \"main\",\n details: { _optimistic: true },\n };\n console.log(\"[Optimistic] Adding user message:\", trimmed);\n setMessages((prev) => {\n const newMessages = [...prev, optimisticMessage];\n // Sort by timestamp to maintain order\n newMessages.sort((a, b) => {\n const timeA = typeof a.timestamp === \"number\" ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === \"number\" ? b.timestamp : new Date(b.timestamp).getTime();\n return timeA - timeB;\n });\n console.log(\"[Optimistic] Messages after add:\", newMessages.length, \"messages\");\n return newMessages;\n });\n // Get attached document IDs if callback provided\n const attachedDocs = getAttachedDocs?.() || [];\n // Build message content with attachment references if present\n let messageContent = trimmed;\n if (attachedDocs.length > 0 && !/store:\\S+/.test(trimmed)) {\n const lines = attachedDocs.map((id) => `store:${id}`);\n messageContent = [trimmed, '', 'Attachments:', ...lines].join('\\n');\n }\n client.store.workflows\n .sendSignal(run.workflowId, run.runId, \"UserInput\", {\n message: messageContent,\n metadata: attachedDocs.length > 0 ? { attached_docs: attachedDocs } : undefined,\n })\n .then(() => {\n setIsCompleted(false);\n // Clear attachments after successful send\n onAttachmentsSent?.();\n })\n .catch((err) => {\n // Remove optimistic message on failure\n setMessages((prev) => prev.filter((m) => m.timestamp !== optimisticTimestamp));\n toast({\n status: \"error\",\n title: \"Failed to Send Message\",\n description: err instanceof Error ? err.message : \"Unknown error\",\n duration: 3000,\n });\n })\n .finally(() => {\n setIsSending(false);\n });\n };\n // Handle file uploads - upload to artifact storage and signal workflow\n const handleFileUpload = useCallback(async (files) => {\n for (const file of files) {\n const fileId = `file-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const artifactPath = `files/${file.name}`;\n // Add to local state immediately (optimistic - uploading status)\n const fileState = {\n id: fileId,\n name: file.name,\n content_type: file.type || 'application/octet-stream',\n size: file.size,\n status: FileProcessingStatus.UPLOADING,\n started_at: Date.now(),\n };\n setProcessingFiles(prev => new Map(prev).set(fileId, fileState));\n try {\n // Upload to artifact storage\n await client.files.uploadArtifact(run.runId, artifactPath, file);\n // Update local state to processing\n setProcessingFiles(prev => {\n const newMap = new Map(prev);\n const f = newMap.get(fileId);\n if (f) {\n f.status = FileProcessingStatus.PROCESSING;\n f.artifact_path = artifactPath;\n f.reference = `artifact:${artifactPath}`;\n }\n return newMap;\n });\n // Signal workflow that file was uploaded\n await client.store.workflows.sendSignal(run.workflowId, run.runId, \"FileUploaded\", {\n id: fileId,\n name: file.name,\n content_type: file.type || 'application/octet-stream',\n reference: `artifact:${artifactPath}`,\n artifact_path: artifactPath,\n });\n }\n catch (error) {\n // Update local state to error\n setProcessingFiles(prev => {\n const newMap = new Map(prev);\n const f = newMap.get(fileId);\n if (f) {\n f.status = FileProcessingStatus.ERROR;\n f.error = error instanceof Error ? error.message : 'Upload failed';\n f.completed_at = Date.now();\n }\n return newMap;\n });\n toast({\n status: \"error\",\n title: \"Upload Failed\",\n description: error instanceof Error ? error.message : \"Failed to upload file\",\n duration: 3000,\n });\n }\n }\n }, [client, run, toast]);\n // Drag and drop handlers for full-panel file upload\n const handleDragEnter = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current++;\n // Enable drag if we have a run (for internal file processing)\n if (run && e.dataTransfer?.types?.includes('Files')) {\n setIsDragOver(true);\n }\n }, [run]);\n const handleDragOver = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n const handleDragLeave = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current--;\n if (dragCounterRef.current === 0) {\n setIsDragOver(false);\n }\n }, []);\n const handleDrop = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounterRef.current = 0;\n setIsDragOver(false);\n // Use internal handleFileUpload for proper workflow signaling and status tracking\n if (run && e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n const filesArray = Array.from(e.dataTransfer.files);\n handleFileUpload(filesArray);\n }\n }, [run, handleFileUpload]);\n // Stop/interrupt the active workflow\n const handleStopWorkflow = async () => {\n if (isStopping)\n return;\n setIsStopping(true);\n try {\n await client.store.workflows.sendSignal(run.workflowId, run.runId, \"Stop\", {\n message: \"User requested stop\",\n });\n toast({\n status: \"info\",\n title: \"Agent Interrupted\",\n description: \"Type your message to give new instructions\",\n duration: 3000,\n });\n setIsCompleted(true);\n }\n catch (err) {\n toast({\n status: \"error\",\n title: \"Failed to Interrupt\",\n description: err instanceof Error ? err.message : \"Unknown error\",\n duration: 3000,\n });\n }\n finally {\n setIsStopping(false);\n }\n };\n // Calculate number of active tasks for the status indicator\n const getActiveTaskCount = () => {\n if (!messages.length)\n return 0;\n // Group messages by workstream\n const workstreamMessages = new Map();\n messages.forEach((message) => {\n const workstreamId = getWorkstreamId(message);\n if (workstreamId !== \"main\" && workstreamId !== \"all\") {\n if (!workstreamMessages.has(workstreamId)) {\n workstreamMessages.set(workstreamId, []);\n }\n workstreamMessages.get(workstreamId).push(message);\n }\n });\n // Count workstreams that don't have completion messages\n let activeCount = 0;\n for (const [_, msgs] of workstreamMessages.entries()) {\n if (msgs.length > 0) {\n const lastMessage = msgs[msgs.length - 1];\n // If the last message isn't a completion message, the workstream is active\n if (![AgentMessageType.COMPLETE, AgentMessageType.IDLE].includes(lastMessage.type)) {\n activeCount++;\n }\n }\n }\n return activeCount;\n };\n const actualTitle = title || run.workflowId.split(\":\")[2] || \"Agent Conversation\";\n // Handle downloading conversation\n const downloadConversation = async () => {\n try {\n const url = await getConversationUrl(client, run.runId);\n if (url)\n window.open(url, \"_blank\");\n }\n catch (err) {\n console.error(\"Failed to download conversation\", err);\n toast({\n status: \"error\",\n title: \"Failed to download conversation\",\n duration: 3000,\n });\n }\n };\n // Handle copying run ID\n const copyRunId = () => {\n navigator.clipboard.writeText(run.runId);\n toast({\n status: \"success\",\n title: \"Run ID copied\",\n duration: 2000,\n });\n };\n const [isPdfModalOpen, setIsPdfModalOpen] = useState(false);\n const exportConversationPdf = () => {\n if (!conversationRef.current) {\n toast({\n status: \"error\",\n title: \"PDF export failed\",\n description: \"No conversation content available to export\",\n duration: 3000,\n });\n return;\n }\n setIsPdfModalOpen(true);\n };\n const handleConfirmExportPdf = () => {\n if (!conversationRef.current) {\n toast({\n status: \"error\",\n title: \"PDF export failed\",\n description: \"No conversation content available to export\",\n duration: 3000,\n });\n return;\n }\n const pdfTitle = `${actualTitle} - ${run.runId}`;\n const success = printElementToPdf(conversationRef.current, pdfTitle);\n if (!success) {\n toast({\n status: \"error\",\n title: \"PDF export failed\",\n description: \"Unable to open print preview\",\n duration: 4000,\n });\n return;\n }\n toast({\n status: \"success\",\n title: \"PDF export ready\",\n description: \"Use your browser's Print dialog to save as PDF\",\n duration: 4000,\n });\n setIsPdfModalOpen(false);\n };\n return (_jsx(ArtifactUrlCacheProvider, { children: _jsx(ImageLightboxProvider, { children: _jsxs(\"div\", { className: `flex gap-2 h-full relative overflow-hidden ${isDragOver ? 'ring-2 ring-blue-400 ring-inset' : ''}`, onDragEnter: handleDragEnter, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: [isDragOver && (_jsx(\"div\", { className: \"absolute inset-0 flex items-center justify-center bg-blue-100/80 dark:bg-blue-900/40 z-50 pointer-events-none rounded-lg\", children: _jsxs(\"div\", { className: \"text-blue-600 dark:text-blue-400 font-medium flex items-center gap-2 text-lg\", children: [_jsx(UploadIcon, { className: \"size-6\" }), \"Drop files to upload\"] }) })), _jsxs(\"div\", { ref: conversationRef, className: `flex flex-col h-full min-h-0 border-0 ${showSlidingPanel\n ? 'lg:w-2/3 flex-1'\n : fullWidth\n ? 'flex-1 w-full'\n : `flex-1 mx-auto ${!isModal ? 'max-w-4xl' : ''}`}`, children: [debugChunkFlash && (_jsx(\"div\", { className: \"absolute top-2 right-2 z-50\", children: _jsx(\"div\", { className: \"w-3 h-3 rounded-full bg-green-400 shadow-[0_0_8px_2px_rgba(74,222,128,0.8)]\" }) })), _jsx(\"div\", { className: \"flex-shrink-0\", children: _jsx(Header, { title: actualTitle, isCompleted: isCompleted, onClose: onClose, isModal: isModal, run: run, viewMode: viewMode, onViewModeChange: setViewMode, showPlanPanel: showSlidingPanel, hasPlan: plans.length > 0, onTogglePlanPanel: handleTogglePlanPanel, onDownload: downloadConversation, onCopyRunId: copyRunId, resetWorkflow: resetWorkflow, onExportPdf: exportConversationPdf }) }), messages.length === 0 && !isCompleted ? (_jsx(\"div\", { className: \"flex-1 flex flex-col items-center justify-center h-full text-center py-6\", children: _jsxs(\"div\", { className: \"p-5 max-w-md border border-info rounded-lg shadow-sm\", children: [_jsxs(\"div\", { className: \"flex items-center space-x-3 mb-3\", children: [_jsx(PulsatingCircle, { size: \"sm\", color: \"blue\" }), _jsx(\"div\", { className: \"text-sm text-muted font-medium\", children: ThinkingMessages[thinkingMessageIndex] })] }), _jsx(\"div\", { className: \"mt-4 flex justify-center\", children: _jsx(AnimatedThinkingDots, { color: \"blue\", className: \"mt-1\" }) })] }) })) : (_jsx(AllMessagesMixed, { messages: messages, bottomRef: bottomRef, viewMode: viewMode, isCompleted: isCompleted, plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, showPlanPanel: showSlidingPanel, onTogglePlanPanel: handleTogglePlanPanel, plans: plans, activePlanIndex: activePlanIndex, onChangePlan: handleChangePlan, taskLabels: getActivePlan.plan.plan?.reduce((acc, task) => {\n if (task.id && task.goal) {\n acc.set(task.id.toString(), task.goal);\n }\n return acc;\n }, new Map()), streamingMessages: streamingMessages, onSendMessage: handleSendMessage, thinkingMessageIndex: thinkingMessageIndex })), _jsx(\"div\", { className: \"flex-shrink-0\", style: { paddingBottom: 'env(safe-area-inset-bottom, 0px)' }, children: workflowStatus && workflowStatus !== \"RUNNING\" ? (_jsxs(MessageBox, { status: workflowStatus === \"COMPLETED\" ? 'success' : 'done', icon: null, className: \"m-2\", children: [\"This Workflow is \", workflowStatus] })) : showInput && (_jsx(MessageInput, { onSend: handleSendMessage, onStop: handleStopWorkflow, disabled: isUploading, isSending: isSending || isUploading, isStopping: isStopping, isStreaming: !isCompleted, isCompleted: isCompleted, activeTaskCount: getActiveTaskCount(), placeholder: placeholder, \n // File upload props - use internal handler that signals workflow\n onFilesSelected: handleFileUpload, uploadedFiles: uploadedFiles, onRemoveFile: onRemoveFile, acceptedFileTypes: acceptedFileTypes, maxFiles: maxFiles, \n // File processing state\n processingFiles: processingFiles, hasProcessingFiles: hasProcessingFiles, \n // Document search props\n renderDocumentSearch: renderDocumentSearch, selectedDocuments: selectedDocuments, onRemoveDocument: onRemoveDocument, \n // Object linking\n hideObjectLinking: hideObjectLinking, \n // Styling props\n className: inputContainerClassName, inputClassName: inputClassName })) })] }), showSlidingPanel && (_jsx(\"div\", { className: \"h-full lg:w-1/3 border-l\", children: _jsx(InlineSlidingPlanPanel, { plan: getActivePlan.plan, workstreamStatus: getActivePlan.workstreamStatus, isOpen: showSlidingPanel, onClose: handleClosePlanPanel, plans: plans, activePlanIndex: activePlanIndex, onChangePlan: handleChangePlan }) })), _jsxs(VModal, { isOpen: isPdfModalOpen, onClose: () => setIsPdfModalOpen(false), children: [_jsx(VModalTitle, { children: \"Export conversation as PDF\" }), _jsxs(VModalBody, { children: [_jsx(\"p\", { className: \"mb-2\", children: \"This will open your browser's print dialog with the current conversation.\" }), _jsx(\"p\", { className: \"text-sm text-muted\", children: \"To save a PDF, choose \\\"Save as PDF\\\" or a similar option in the print dialog.\" })] }), _jsxs(VModalFooter, { align: \"right\", children: [_jsx(Button, { variant: \"ghost\", size: \"sm\", onClick: () => setIsPdfModalOpen(false), children: \"Cancel\" }), _jsx(Button, { size: \"sm\", onClick: handleConfirmExportPdf, children: \"Open print dialog\" })] })] })] }) }) }));\n}\n// Helper function to get conversation URL - used by other components\nexport async function getConversationUrl(vertesia, workflowRunId) {\n return vertesia.files\n .getDownloadUrl(`agents/${workflowRunId}/conversation.json`)\n .then((r) => r.url);\n}\n//# sourceMappingURL=ModernAgentConversation.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport React from \"react\";\nimport MessageItem from \"./MessageItem\";\nexport default function StackedMessages({ messages }) {\n // Sort all messages in ascending chronological order (oldest first)\n const sortedMessages = React.useMemo(() => [...messages].sort((a, b) => {\n const timeA = typeof a.timestamp === \"number\" ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === \"number\" ? b.timestamp : new Date(b.timestamp).getTime();\n return timeA - timeB;\n }), [messages]);\n return (_jsx(\"div\", { className: \"flex flex-col overflow-y-auto space-y-6 py-4\", children: sortedMessages.map((message, index) => (_jsx(MessageItem, { message: message, showPulsatingCircle: false }, `${message.timestamp}-${index}`))) }));\n}\n//# sourceMappingURL=StackedMessages.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport React, { useEffect } from \"react\";\nimport StackedMessages from \"./StackedMessages\";\nexport default function MessagesContainer({ messages, bottomRef, className, messagesClassName, emptyClassName, }) {\n const containerRef = React.useRef(null);\n // Auto-scroll to bottom when messages change\n useEffect(() => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages, bottomRef]);\n // Sort all messages chronologically\n const sortedMessages = React.useMemo(() => [...messages].sort((a, b) => {\n const timeA = typeof a.timestamp === \"number\" ? a.timestamp : new Date(a.timestamp).getTime();\n const timeB = typeof b.timestamp === \"number\" ? b.timestamp : new Date(b.timestamp).getTime();\n return timeA - timeB;\n }), [messages]);\n return (_jsx(\"div\", { ref: containerRef, className: `flex-1 min-h-0 h-full overflow-y-auto py-4 px-4 sm:px-6 lg:px-8 bg-white flex flex-col ${className || \"\"}`, \"data-testid\": \"messages-container\", children: sortedMessages.length === 0 ? (_jsx(\"div\", { className: `flex items-center justify-center h-full text-center py-8 ${emptyClassName || \"\"}`, children: _jsx(\"div\", { className: \"flex items-center px-4 py-3 text-gray-500\", children: \"Waiting for agent response...\" }) })) : (_jsx(\"div\", { className: `flex-1 flex flex-col justify-start h-full min-h-0 ${messagesClassName || \"\"}`, children: _jsx(StackedMessages, { messages: sortedMessages, isCompleted: false }) })) }));\n}\n//# sourceMappingURL=MessagesContainer.js.map","/**\n * Visualization helpers for tools to emit chart specs that the UI can render.\n *\n * Format: ChartSpec v1 rendered by AgentChart component\n */\n/**\n * Build a side-by-side bar chart comparing two scenarios across numeric metrics.\n */\nexport function buildScenarioComparisonBarChart(params) {\n const { title, leftLabel, rightLabel, metrics, description, collapseInitially } = params;\n const data = metrics.map((m) => ({ label: m.label, left: m.left, right: m.right }));\n const spec = {\n version: '1.0',\n library: 'recharts',\n chart: 'bar',\n title: title || 'Scenario Comparison',\n description,\n data,\n xKey: 'label',\n series: [\n { key: 'left', label: leftLabel, type: 'bar' },\n { key: 'right', label: rightLabel, type: 'bar' },\n ],\n yAxis: { left: { label: 'Value' } },\n options: { stacked: false, referenceZero: false, collapseInitially },\n };\n return spec;\n}\n/**\n * Build a delta percentage bar chart to visualize changes between scenarios.\n */\nexport function buildScenarioDeltaPercentChart(params) {\n const { title, metrics, description, collapseInitially } = params;\n const data = metrics.map((m) => ({\n label: m.label,\n deltaPct: m.left !== 0 ? ((m.right - m.left) / m.left) * 100 : 0,\n }));\n const spec = {\n version: '1.0',\n library: 'recharts',\n chart: 'bar',\n title: title || 'Change vs. Baseline (%)',\n description,\n data,\n xKey: 'label',\n series: [\n { key: 'deltaPct', label: '% Change', type: 'bar' },\n ],\n yAxis: { left: { label: '% Change' } },\n options: { stacked: false, referenceZero: true, collapseInitially },\n };\n return spec;\n}\n/**\n * Helper to wrap a chart spec in a markdown code fence the UI will render.\n */\nexport function toChartMarkdown(spec) {\n const json = JSON.stringify(spec, null, 2);\n return [\n '```chart',\n json,\n '```',\n ].join('\\n');\n}\n/**\n * Build a cashflow composed chart (Calls/Distributions bars + Net Cashflow line)\n */\nexport function buildCashflowComposedChart(params) {\n const { title, description, rows, collapseInitially } = params;\n const spec = {\n version: '1.0',\n library: 'recharts',\n chart: 'composed',\n title: title || 'Cashflow Timeline',\n description,\n data: rows.map((r) => ({\n period: r.period,\n calls: r.calls,\n distributions: r.distributions,\n netCashflow: r.netCashflow ?? (r.distributions - r.calls),\n })),\n xKey: 'period',\n series: [\n { key: 'calls', label: 'Calls', type: 'bar', color: '#ef4444' },\n { key: 'distributions', label: 'Distributions', type: 'bar', color: '#22c55e' },\n { key: 'netCashflow', label: 'Net Cashflow', type: 'line', color: '#0ea5e9', yAxisId: 'right', dot: false },\n ],\n yAxis: { left: { label: 'Amount' }, right: { label: 'Net' } },\n options: { stacked: false, referenceZero: true, collapseInitially },\n };\n return spec;\n}\n/**\n * Build a multi-line performance chart (TVPI/DPI/RVPI)\n */\nexport function buildPerformanceLineChart(params) {\n const { title, description, rows, collapseInitially } = params;\n const data = rows.map((r) => ({\n period: r.period,\n tvpi: r.tvpi ?? null,\n dpi: r.dpi ?? null,\n rvpi: r.rvpi ?? null,\n }));\n const spec = {\n version: '1.0',\n library: 'recharts',\n chart: 'line',\n title: title || 'Performance (J‑Curve)',\n description,\n data,\n xKey: 'period',\n series: [\n { key: 'tvpi', label: 'TVPI', type: 'line', color: '#4f46e5', dot: false },\n { key: 'dpi', label: 'DPI', type: 'line', color: '#16a34a', dot: false },\n { key: 'rvpi', label: 'RVPI', type: 'line', color: '#f59e0b', dot: false },\n ],\n yAxis: { left: { label: 'Multiple (x)' } },\n options: { stacked: false, referenceZero: true, collapseInitially },\n };\n return spec;\n}\n/**\n * Build a TVPI-only overlay chart (two series, e.g., left vs right scenario)\n */\nexport function buildTvpiOverlayChart(params) {\n const { title, description, rows, leftLabel, rightLabel, collapseInitially } = params;\n const spec = {\n version: '1.0',\n library: 'recharts',\n chart: 'line',\n title: title || 'TVPI Over Time',\n description,\n data: rows,\n xKey: 'period',\n series: [\n { key: 'tvpi_left', label: `TVPI – ${leftLabel}`, type: 'line', color: '#4f46e5', dot: false },\n { key: 'tvpi_right', label: `TVPI – ${rightLabel}`, type: 'line', color: '#6366f1', dot: false },\n ],\n yAxis: { left: { label: 'Multiple (x)' } },\n options: { stacked: false, referenceZero: true, collapseInitially },\n };\n return spec;\n}\n/**\n * Build a NAV over time line chart (single line, right or left axis)\n */\nexport function buildNavLineChart(params) {\n const { title, description, rows, collapseInitially } = params;\n const spec = {\n version: '1.0',\n library: 'recharts',\n chart: 'line',\n title: title || 'NAV Over Time',\n description,\n data: rows.map(r => ({ period: r.period, nav: r.nav })),\n xKey: 'period',\n series: [\n { key: 'nav', label: 'NAV', type: 'line', color: '#0ea5e9', dot: false },\n ],\n yAxis: { left: { label: 'NAV' } },\n options: { stacked: false, referenceZero: true, collapseInitially },\n };\n return spec;\n}\n//# sourceMappingURL=visualization.js.map","/**\n * Chart creation tool definition for AI agents.\n *\n * This provides a tool schema that AI agents can use to understand\n * how to create charts in their responses.\n */\n/**\n * Tool definition for creating charts.\n * Can be used with Claude, OpenAI, or other LLM tool-calling systems.\n */\nexport const createChartToolDefinition = {\n name: 'create_chart',\n description: `Create an interactive chart visualization that will be rendered in the UI.\n\nIMPORTANT: You don't actually \"call\" this tool. Instead, you include a markdown code block with language \"chart\" in your response.\n\n## CHART LIBRARIES\n\nTwo chart libraries are available:\n\n### 1. Recharts (Default) - Simple Charts\nFor standard bar, line, pie, area charts. Use when you need quick, simple visualizations.\n\n\\`\\`\\`chart\n{\n \"library\": \"recharts\",\n \"chart\": \"bar|line|area|composed|pie|scatter|radar|radialBar|funnel|treemap\",\n \"title\": \"Chart Title\",\n \"data\": [...],\n \"xKey\": \"...\",\n \"series\": [...]\n}\n\\`\\`\\`\n\n### 2. Vega-Lite (Advanced) - Complex Visualizations\nFor heatmaps, geographic maps, layered charts, faceted charts, statistical plots.\n\n\\`\\`\\`chart\n{\n \"library\": \"vega-lite\",\n \"title\": \"Chart Title\",\n \"spec\": {\n \"data\": {\"values\": [...]},\n \"mark\": \"bar|line|point|rect|arc|...\",\n \"encoding\": {...}\n }\n}\n\\`\\`\\`\n\n## WHEN TO USE EACH LIBRARY\n\n| Use Case | Library |\n|----------|---------|\n| Simple bar, line, pie charts | recharts (default) |\n| Heatmaps / correlation matrices | **vega-lite** |\n| Geographic maps | **vega-lite** |\n| Faceted / small multiples | **vega-lite** |\n| Layered charts (scatter + regression) | **vega-lite** |\n| Statistical plots (boxplot, violin) | **vega-lite** |\n| Standard business charts | recharts |\n\n---\n\n## RECHARTS EXAMPLES\n\n## CHART TYPES & WHEN TO USE\n\n| Type | Use Case | Data Shape |\n|------|----------|------------|\n| bar | Category comparisons | \\`[{x, y1, y2}]\\` |\n| line | Trends over time | \\`[{x, y1, y2}]\\` |\n| area | Trends with volume emphasis | \\`[{x, y1, y2}]\\` |\n| composed | Mix bars + lines | \\`[{x, y1, y2}]\\` with series.type |\n| pie | Part-to-whole (%) | \\`[{name, value}]\\` |\n| scatter | Correlation analysis | \\`[{x, y}]\\` |\n| radar | Multi-dimensional comparison | \\`[{axis, A, B}]\\` |\n| radialBar | Progress/gauges | \\`[{name, value}]\\` |\n| funnel | Conversion stages | \\`[{name, value}]\\` |\n| treemap | Hierarchical proportions | \\`[{name, value}]\\` |\n\n## EXAMPLES\n\n### Bar Chart\n\\`\\`\\`chart\n{\"chart\":\"bar\",\"title\":\"Revenue by Quarter\",\"data\":[{\"quarter\":\"Q1\",\"revenue\":100000},{\"quarter\":\"Q2\",\"revenue\":150000}],\"xKey\":\"quarter\",\"series\":[{\"key\":\"revenue\",\"label\":\"Revenue\"}]}\n\\`\\`\\`\n\n### Line Chart\n\\`\\`\\`chart\n{\"chart\":\"line\",\"title\":\"Performance\",\"data\":[{\"period\":\"Q1\",\"tvpi\":1.2},{\"period\":\"Q2\",\"tvpi\":1.5}],\"xKey\":\"period\",\"series\":[{\"key\":\"tvpi\",\"label\":\"TVPI\",\"color\":\"#4f46e5\"}]}\n\\`\\`\\`\n\n### Area Chart\n\\`\\`\\`chart\n{\"chart\":\"area\",\"title\":\"Sales Volume\",\"data\":[{\"month\":\"Jan\",\"sales\":1000},{\"month\":\"Feb\",\"sales\":1500}],\"xKey\":\"month\",\"series\":[{\"key\":\"sales\",\"label\":\"Sales\"}],\"options\":{\"stacked\":true}}\n\\`\\`\\`\n\n### Composed Chart (Bar + Line)\n\\`\\`\\`chart\n{\"chart\":\"composed\",\"title\":\"Cashflow\",\"data\":[{\"period\":\"Q1\",\"calls\":1000000,\"net\":-500000}],\"xKey\":\"period\",\"series\":[{\"key\":\"calls\",\"type\":\"bar\",\"color\":\"#ef4444\"},{\"key\":\"net\",\"type\":\"line\",\"yAxisId\":\"right\"}],\"yAxis\":{\"left\":{\"label\":\"Amount\"},\"right\":{\"label\":\"Net\"}}}\n\\`\\`\\`\n\n### Pie Chart\n\\`\\`\\`chart\n{\"chart\":\"pie\",\"title\":\"Market Share\",\"data\":[{\"name\":\"Product A\",\"value\":400},{\"name\":\"Product B\",\"value\":300},{\"name\":\"Product C\",\"value\":200}],\"nameKey\":\"name\",\"valueKey\":\"value\"}\n\\`\\`\\`\n\n### Donut Chart (Pie with innerRadius)\n\\`\\`\\`chart\n{\"chart\":\"pie\",\"title\":\"Revenue Split\",\"data\":[{\"name\":\"Services\",\"value\":60},{\"name\":\"Products\",\"value\":40}],\"nameKey\":\"name\",\"valueKey\":\"value\",\"options\":{\"innerRadius\":50}}\n\\`\\`\\`\n\n### Scatter Chart\n\\`\\`\\`chart\n{\"chart\":\"scatter\",\"title\":\"Price vs Volume\",\"data\":[{\"price\":100,\"volume\":500},{\"price\":150,\"volume\":400}],\"xKey\":\"price\",\"yKey\":\"volume\",\"series\":[{\"key\":\"data\",\"label\":\"Products\"}]}\n\\`\\`\\`\n\n### Radar Chart\n\\`\\`\\`chart\n{\"chart\":\"radar\",\"title\":\"Skills Comparison\",\"data\":[{\"skill\":\"Speed\",\"A\":120,\"B\":110},{\"skill\":\"Power\",\"A\":98,\"B\":130}],\"axisKey\":\"skill\",\"series\":[{\"key\":\"A\",\"label\":\"Team A\"},{\"key\":\"B\",\"label\":\"Team B\"}]}\n\\`\\`\\`\n\n### RadialBar Chart (Progress)\n\\`\\`\\`chart\n{\"chart\":\"radialBar\",\"title\":\"Goal Progress\",\"data\":[{\"name\":\"Sales\",\"value\":80},{\"name\":\"Users\",\"value\":65}],\"nameKey\":\"name\",\"valueKey\":\"value\"}\n\\`\\`\\`\n\n### Funnel Chart\n\\`\\`\\`chart\n{\"chart\":\"funnel\",\"title\":\"Conversion Funnel\",\"data\":[{\"name\":\"Visits\",\"value\":5000},{\"name\":\"Cart\",\"value\":2500},{\"name\":\"Purchase\",\"value\":1000}],\"nameKey\":\"name\",\"valueKey\":\"value\"}\n\\`\\`\\`\n\n### Treemap\n\\`\\`\\`chart\n{\"chart\":\"treemap\",\"title\":\"Budget Allocation\",\"data\":[{\"name\":\"Engineering\",\"value\":500000},{\"name\":\"Marketing\",\"value\":200000},{\"name\":\"Sales\",\"value\":300000}],\"nameKey\":\"name\",\"dataKey\":\"value\"}\n\\`\\`\\`\n\n## CONFIGURATION\n\n### Series (for bar/line/area/composed/radar)\n- key: (required) Field name in data\n- label: Display name\n- type: \"bar\"|\"line\"|\"area\" (composed only)\n- color: Hex color\n- yAxisId: \"left\"|\"right\"\n- dot: Show dots on lines\n\n### Keys (for pie/scatter/radar/funnel/treemap)\n- nameKey: Field for labels (default: \"name\")\n- valueKey: Field for values (default: \"value\")\n- xKey/yKey: For scatter charts\n- axisKey: For radar axis labels\n- dataKey: For treemap values\n\n### Options\n- stacked: Stack bars/areas\n- referenceZero: Show y=0 line\n- innerRadius: For donut charts (0-100)\n- showLabels: Show value labels\n- startAngle/endAngle: For radialBar\n\n## COLORS\n- Blue #4f46e5 - Primary\n- Cyan #06b6d4 - Secondary\n- Green #22c55e - Positive\n- Amber #f59e0b - Warning\n- Red #ef4444 - Negative\n- Purple #8b5cf6 - Accent\n- Pink #ec4899 - Highlight\n- Teal #14b8a6 - Alternative\n\nNumbers auto-format: 1K, 1M, 1B\n\n---\n\n## VEGA-LITE EXAMPLES\n\n### Heatmap\n\\`\\`\\`chart\n{\"library\":\"vega-lite\",\"title\":\"Correlation Matrix\",\"spec\":{\"data\":{\"values\":[{\"x\":\"A\",\"y\":\"A\",\"v\":1},{\"x\":\"A\",\"y\":\"B\",\"v\":0.7},{\"x\":\"B\",\"y\":\"A\",\"v\":0.7},{\"x\":\"B\",\"y\":\"B\",\"v\":1}]},\"mark\":\"rect\",\"encoding\":{\"x\":{\"field\":\"x\",\"type\":\"nominal\"},\"y\":{\"field\":\"y\",\"type\":\"nominal\"},\"color\":{\"field\":\"v\",\"type\":\"quantitative\",\"scale\":{\"scheme\":\"redblue\",\"domain\":[-1,1]}}}}}\n\\`\\`\\`\n\n### Layered Chart (Scatter + Trend Line)\n\\`\\`\\`chart\n{\"library\":\"vega-lite\",\"title\":\"Sales Trend\",\"spec\":{\"data\":{\"values\":[{\"x\":1,\"y\":10},{\"x\":2,\"y\":18},{\"x\":3,\"y\":25},{\"x\":4,\"y\":31}]},\"layer\":[{\"mark\":\"point\",\"encoding\":{\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}}},{\"mark\":{\"type\":\"line\",\"color\":\"red\"},\"transform\":[{\"regression\":\"y\",\"on\":\"x\"}],\"encoding\":{\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}}}]}}\n\\`\\`\\`\n\n### Faceted Chart\n\\`\\`\\`chart\n{\"library\":\"vega-lite\",\"title\":\"Sales by Category\",\"spec\":{\"data\":{\"values\":[{\"cat\":\"A\",\"region\":\"N\",\"val\":10},{\"cat\":\"A\",\"region\":\"S\",\"val\":15},{\"cat\":\"B\",\"region\":\"N\",\"val\":8},{\"cat\":\"B\",\"region\":\"S\",\"val\":12}]},\"mark\":\"bar\",\"encoding\":{\"x\":{\"field\":\"region\"},\"y\":{\"field\":\"val\"},\"color\":{\"field\":\"region\"}},\"facet\":{\"field\":\"cat\",\"columns\":2}}}\n\\`\\`\\`\n\n### Box Plot\n\\`\\`\\`chart\n{\"library\":\"vega-lite\",\"title\":\"Distribution\",\"spec\":{\"data\":{\"values\":[{\"group\":\"A\",\"val\":10},{\"group\":\"A\",\"val\":15},{\"group\":\"A\",\"val\":12},{\"group\":\"B\",\"val\":20},{\"group\":\"B\",\"val\":25}]},\"mark\":\"boxplot\",\"encoding\":{\"x\":{\"field\":\"group\"},\"y\":{\"field\":\"val\",\"type\":\"quantitative\"}}}}\n\\`\\`\\`\n\n## VEGA-LITE REFERENCE\n\n### Mark Types\n- bar, line, point, area, rect, arc, circle, text, boxplot, errorbar\n\n### Encoding Types\n- quantitative (Q): Numbers\n- nominal (N): Categories\n- ordinal (O): Ordered categories\n- temporal (T): Dates\n\n### Color Schemes\n- Sequential: blues, greens, viridis\n- Diverging: redblue, redyellowgreen\n- Categorical: category10, tableau10\n\n---\n\n## INTERACTIVE DASHBOARDS\n\nFor interactive dashboards with cross-filtering and linked views, use \\`options.mode: \"dashboard\"\\`.\nDashboard mode enables:\n- Larger default height (500px vs 280px)\n- Fullscreen button for exploration\n- \"Interactive\" badge indicator\n\n### Dashboard with Cross-Filter Selection\nClick on a bar to filter the line chart below:\n\n\\`\\`\\`chart\n{\n \"library\": \"vega-lite\",\n \"title\": \"Sales Dashboard\",\n \"description\": \"Click a category to filter the trend\",\n \"options\": {\"mode\": \"dashboard\", \"height\": 600},\n \"spec\": {\n \"data\": {\"values\": [\n {\"category\": \"Electronics\", \"month\": \"Jan\", \"sales\": 100},\n {\"category\": \"Electronics\", \"month\": \"Feb\", \"sales\": 120},\n {\"category\": \"Electronics\", \"month\": \"Mar\", \"sales\": 140},\n {\"category\": \"Clothing\", \"month\": \"Jan\", \"sales\": 80},\n {\"category\": \"Clothing\", \"month\": \"Feb\", \"sales\": 95},\n {\"category\": \"Clothing\", \"month\": \"Mar\", \"sales\": 110},\n {\"category\": \"Food\", \"month\": \"Jan\", \"sales\": 60},\n {\"category\": \"Food\", \"month\": \"Feb\", \"sales\": 70},\n {\"category\": \"Food\", \"month\": \"Mar\", \"sales\": 85}\n ]},\n \"params\": [{\"name\": \"categorySelect\", \"select\": {\"type\": \"point\", \"fields\": [\"category\"]}}],\n \"vconcat\": [\n {\n \"mark\": \"bar\",\n \"encoding\": {\n \"x\": {\"field\": \"category\", \"type\": \"nominal\"},\n \"y\": {\"aggregate\": \"sum\", \"field\": \"sales\"},\n \"color\": {\"condition\": {\"param\": \"categorySelect\", \"field\": \"category\"}, \"value\": \"lightgray\"},\n \"opacity\": {\"condition\": {\"param\": \"categorySelect\", \"value\": 1}, \"value\": 0.5}\n }\n },\n {\n \"mark\": \"line\",\n \"transform\": [{\"filter\": {\"param\": \"categorySelect\"}}],\n \"encoding\": {\n \"x\": {\"field\": \"month\", \"type\": \"ordinal\"},\n \"y\": {\"field\": \"sales\", \"type\": \"quantitative\"},\n \"color\": {\"field\": \"category\", \"type\": \"nominal\"}\n }\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Dashboard with Interval Brush Selection\nBrush to select a time range in the overview, detail view updates:\n\n\\`\\`\\`chart\n{\n \"library\": \"vega-lite\",\n \"title\": \"Focus + Context\",\n \"options\": {\"mode\": \"dashboard\", \"height\": 500},\n \"spec\": {\n \"data\": {\"values\": [\n {\"date\": \"2024-01-01\", \"value\": 28}, {\"date\": \"2024-02-01\", \"value\": 55},\n {\"date\": \"2024-03-01\", \"value\": 43}, {\"date\": \"2024-04-01\", \"value\": 91},\n {\"date\": \"2024-05-01\", \"value\": 81}, {\"date\": \"2024-06-01\", \"value\": 53},\n {\"date\": \"2024-07-01\", \"value\": 19}, {\"date\": \"2024-08-01\", \"value\": 87},\n {\"date\": \"2024-09-01\", \"value\": 52}, {\"date\": \"2024-10-01\", \"value\": 48}\n ]},\n \"vconcat\": [\n {\n \"height\": 250,\n \"mark\": \"area\",\n \"encoding\": {\n \"x\": {\"field\": \"date\", \"type\": \"temporal\", \"scale\": {\"domain\": {\"param\": \"brush\"}}, \"axis\": {\"title\": \"\"}},\n \"y\": {\"field\": \"value\", \"type\": \"quantitative\"}\n }\n },\n {\n \"height\": 60,\n \"params\": [{\"name\": \"brush\", \"select\": {\"type\": \"interval\", \"encodings\": [\"x\"]}}],\n \"mark\": \"area\",\n \"encoding\": {\n \"x\": {\"field\": \"date\", \"type\": \"temporal\"},\n \"y\": {\"field\": \"value\", \"type\": \"quantitative\", \"axis\": {\"tickCount\": 3}}\n }\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Dashboard with Legend Filter\nClick legend items to filter:\n\n\\`\\`\\`chart\n{\n \"library\": \"vega-lite\",\n \"title\": \"Multi-Series with Legend Filter\",\n \"options\": {\"mode\": \"dashboard\"},\n \"spec\": {\n \"data\": {\"values\": [\n {\"series\": \"A\", \"x\": 1, \"y\": 10}, {\"series\": \"A\", \"x\": 2, \"y\": 15},\n {\"series\": \"B\", \"x\": 1, \"y\": 20}, {\"series\": \"B\", \"x\": 2, \"y\": 12},\n {\"series\": \"C\", \"x\": 1, \"y\": 8}, {\"series\": \"C\", \"x\": 2, \"y\": 18}\n ]},\n \"params\": [{\"name\": \"seriesFilter\", \"select\": {\"type\": \"point\", \"fields\": [\"series\"]}, \"bind\": \"legend\"}],\n \"mark\": \"line\",\n \"encoding\": {\n \"x\": {\"field\": \"x\", \"type\": \"quantitative\"},\n \"y\": {\"field\": \"y\", \"type\": \"quantitative\"},\n \"color\": {\"field\": \"series\", \"type\": \"nominal\"},\n \"opacity\": {\"condition\": {\"param\": \"seriesFilter\", \"value\": 1}, \"value\": 0.2}\n }\n }\n}\n\\`\\`\\`\n\n### Dashboard with Input Widgets\nBind parameters to sliders and dropdowns:\n\n\\`\\`\\`chart\n{\n \"library\": \"vega-lite\",\n \"title\": \"Interactive Controls\",\n \"options\": {\"mode\": \"dashboard\"},\n \"spec\": {\n \"params\": [\n {\"name\": \"threshold\", \"value\": 50, \"bind\": {\"input\": \"range\", \"min\": 0, \"max\": 100, \"step\": 5}},\n {\"name\": \"colorScheme\", \"value\": \"category10\", \"bind\": {\"input\": \"select\", \"options\": [\"category10\", \"tableau10\", \"set1\"]}}\n ],\n \"data\": {\"values\": [{\"x\": \"A\", \"y\": 30}, {\"x\": \"B\", \"y\": 60}, {\"x\": \"C\", \"y\": 80}, {\"x\": \"D\", \"y\": 45}]},\n \"mark\": \"bar\",\n \"encoding\": {\n \"x\": {\"field\": \"x\", \"type\": \"nominal\"},\n \"y\": {\"field\": \"y\", \"type\": \"quantitative\"},\n \"color\": {\n \"condition\": {\"test\": \"datum.y > threshold\", \"value\": \"steelblue\"},\n \"value\": \"lightgray\"\n }\n }\n }\n}\n\\`\\`\\`\n\n### DASHBOARD OPTIONS\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| mode | \"chart\" \\\\| \"dashboard\" | \"chart\" | Dashboard mode enables fullscreen + larger height |\n| height | number | 280/500 | Explicit height (auto-calculated for vconcat) |\n| enableFullscreen | boolean | true (dashboard) | Show fullscreen button |\n| renderer | \"canvas\" \\\\| \"svg\" | \"canvas\" | SVG for print quality |\n| parameterValues | object | {} | Set initial param values (see below) |\n\n### SETTING PARAMETER VALUES\n\nOverride default param values to test different configurations:\n\n\\`\\`\\`chart\n{\n \"library\": \"vega-lite\",\n \"options\": {\n \"mode\": \"dashboard\",\n \"parameterValues\": {\"threshold\": 75, \"colorScheme\": \"tableau10\"}\n },\n \"spec\": {\n \"params\": [\n {\"name\": \"threshold\", \"value\": 50, \"bind\": {\"input\": \"range\", \"min\": 0, \"max\": 100}},\n {\"name\": \"colorScheme\", \"value\": \"category10\", \"bind\": {\"input\": \"select\", \"options\": [\"category10\", \"tableau10\"]}}\n ],\n ...\n }\n}\n\\`\\`\\`\n\nThe chart renders with threshold=75 (instead of default 50). Interactive controls still work.\n\n### INTERACTIVE FEATURES (params)\n\n| Selection Type | Use Case | Example |\n|---------------|----------|---------|\n| point | Click to select | \\`{\"select\": {\"type\": \"point\", \"fields\": [\"category\"]}}\\` |\n| interval | Brush selection | \\`{\"select\": {\"type\": \"interval\", \"encodings\": [\"x\"]}}\\` |\n| bind: \"legend\" | Legend toggle | \\`{\"select\": {...}, \"bind\": \"legend\"}\\` |\n| bind: input | Widgets | \\`{\"bind\": {\"input\": \"range\", \"min\": 0, \"max\": 100}}\\` |`,\n input_schema: {\n type: 'object',\n properties: {\n chart: {\n type: 'string',\n enum: ['bar', 'line', 'area', 'composed', 'pie', 'scatter', 'radar', 'radialBar', 'funnel', 'treemap'],\n description: 'Type of chart to create',\n },\n title: {\n type: 'string',\n description: 'Chart title',\n },\n description: {\n type: 'string',\n description: 'Optional description shown below the title',\n },\n data: {\n type: 'array',\n description: 'Array of data objects',\n items: {\n type: 'object',\n additionalProperties: true,\n },\n },\n xKey: {\n type: 'string',\n description: 'Field name to use for X-axis (for bar/line/area/composed/scatter)',\n },\n yKey: {\n type: 'string',\n description: 'Field name for Y values (for scatter charts)',\n },\n nameKey: {\n type: 'string',\n description: 'Field name for labels (for pie/funnel/radialBar/treemap, default: \"name\")',\n },\n valueKey: {\n type: 'string',\n description: 'Field name for values (for pie/funnel/radialBar, default: \"value\")',\n },\n axisKey: {\n type: 'string',\n description: 'Field name for radar axis labels',\n },\n dataKey: {\n type: 'string',\n description: 'Field name for treemap values',\n },\n series: {\n type: 'array',\n description: 'Array of series to plot (for bar/line/area/composed/radar)',\n items: {\n type: 'object',\n properties: {\n key: {\n type: 'string',\n description: 'Field name in data',\n },\n label: {\n type: 'string',\n description: 'Display name',\n },\n type: {\n type: 'string',\n enum: ['bar', 'line', 'area'],\n description: 'Series type (for composed charts)',\n },\n color: {\n type: 'string',\n description: 'Hex color code',\n },\n yAxisId: {\n type: 'string',\n enum: ['left', 'right'],\n description: 'Which Y-axis to use',\n },\n dot: {\n type: 'boolean',\n description: 'Show dots on line (default: false)',\n },\n },\n required: ['key'],\n },\n },\n yAxis: {\n type: 'object',\n description: 'Y-axis configuration',\n properties: {\n left: {\n type: 'object',\n properties: {\n label: { type: 'string' },\n },\n },\n right: {\n type: 'object',\n properties: {\n label: { type: 'string' },\n },\n },\n },\n },\n options: {\n type: 'object',\n description: 'Chart options',\n properties: {\n stacked: {\n type: 'boolean',\n description: 'Stack bars/areas',\n },\n referenceZero: {\n type: 'boolean',\n description: 'Show reference line at y=0',\n },\n collapsible: {\n type: 'boolean',\n description: 'Allow user to collapse chart',\n },\n collapseInitially: {\n type: 'boolean',\n description: 'Start collapsed',\n },\n innerRadius: {\n type: 'number',\n description: 'Inner radius for donut/radialBar charts (0-100)',\n },\n showLabels: {\n type: 'boolean',\n description: 'Show value labels on pie/funnel',\n },\n startAngle: {\n type: 'number',\n description: 'Start angle for radialBar (default: 180)',\n },\n endAngle: {\n type: 'number',\n description: 'End angle for radialBar (default: 0)',\n },\n },\n },\n },\n required: ['chart', 'data'],\n },\n};\n/**\n * System prompt addition for chart capabilities.\n * Include this in your agent's system prompt to enable chart creation.\n */\nexport const chartSystemPromptAddition = `\n# Chart Visualization Capability\n\nYou can create interactive charts by including markdown code blocks with the language \"chart\".\n\n## Chart Types\n\n| Type | Use Case | Required Fields |\n|------|----------|-----------------|\n| bar | Category comparisons | xKey, series |\n| line | Trends over time | xKey, series |\n| area | Trends with volume | xKey, series |\n| composed | Mix bars + lines | xKey, series with type |\n| pie | Part-to-whole | nameKey, valueKey |\n| scatter | Correlation | xKey, yKey |\n| radar | Multi-dimensional | axisKey, series |\n| radialBar | Progress/gauges | nameKey, valueKey |\n| funnel | Conversion stages | nameKey, valueKey |\n| treemap | Hierarchical data | nameKey, dataKey |\n\n## Quick Examples\n\nBar: \\`{\"chart\":\"bar\",\"data\":[{\"x\":\"A\",\"y\":10}],\"xKey\":\"x\",\"series\":[{\"key\":\"y\"}]}\\`\nPie: \\`{\"chart\":\"pie\",\"data\":[{\"name\":\"A\",\"value\":60},{\"name\":\"B\",\"value\":40}]}\\`\nScatter: \\`{\"chart\":\"scatter\",\"data\":[{\"x\":1,\"y\":2}],\"xKey\":\"x\",\"yKey\":\"y\"}\\`\n\nUse charts when:\n- User requests visualization\n- 3+ data points to display\n- Visual form clarifies comparisons/trends\n\nColors: Blue #4f46e5 (primary), Green #22c55e (positive), Red #ef4444 (negative)\n`;\n/**\n * Type-safe chart specification builder.\n * Use this when you want to build charts programmatically.\n */\nexport function buildChartSpec(spec) {\n // Check if it's a Vega-Lite spec\n if (spec.library === 'vega-lite') {\n const vegaSpec = spec;\n if (!vegaSpec.spec) {\n throw new Error('Invalid Vega-Lite chart spec: missing required \"spec\" field');\n }\n const json = JSON.stringify(spec, null, 2);\n return `\\`\\`\\`chart\\n${json}\\n\\`\\`\\``;\n }\n // Recharts validation\n const rechartsSpec = spec;\n if (!rechartsSpec.chart || !rechartsSpec.data || !rechartsSpec.xKey || !rechartsSpec.series) {\n throw new Error('Invalid chart spec: missing required fields (chart, data, xKey, series)');\n }\n if (!Array.isArray(rechartsSpec.data)) {\n throw new Error('Invalid chart spec: data must be an array');\n }\n if (!Array.isArray(rechartsSpec.series) || rechartsSpec.series.length === 0) {\n throw new Error('Invalid chart spec: series must be a non-empty array');\n }\n // Return as markdown code block\n const json = JSON.stringify(spec, null, 2);\n return `\\`\\`\\`chart\\n${json}\\n\\`\\`\\``;\n}\n/**\n * Extract chart specifications from markdown text.\n * Useful for parsing agent responses.\n */\nexport function extractChartSpecs(markdown) {\n const chartBlockRegex = /```chart\\s*\\n([\\s\\S]*?)\\n```/g;\n const specs = [];\n let match;\n while ((match = chartBlockRegex.exec(markdown)) !== null) {\n try {\n const spec = JSON.parse(match[1]);\n specs.push(spec);\n }\n catch (e) {\n console.warn('Failed to parse chart spec:', e);\n }\n }\n return specs;\n}\n//# sourceMappingURL=createChartTool.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nexport function VertesiaErrorBoundary({ children, fallback }) {\n if (ErrorBoundaryInstance) { // custom error boundary?\n return _jsx(ErrorBoundaryInstance, { fallback: fallback, children: children });\n }\n else {\n return _jsx(ErrorBoundary, { FallbackComponent: fallback, children: children });\n }\n}\nlet ErrorBoundaryInstance = null;\nexport function setErrorBoundaryComponent(ErrorBoundaryComponent) {\n ErrorBoundaryInstance = ErrorBoundaryComponent;\n}\n//# sourceMappingURL=VertesiaErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { MessageBox } from '@vertesia/ui/core';\nimport { VertesiaErrorBoundary } from './VertesiaErrorBoundary';\nexport function PanelErrorBoundary({ children }) {\n return (_jsx(VertesiaErrorBoundary, { fallback: PanelErrorFallback, children: children }));\n}\nfunction PanelErrorFallback({ error }) {\n return (_jsxs(MessageBox, { status: \"error\", title: \"Sorry, something went wrong...\", children: [_jsxs(\"div\", { className: 'mb-4', children: [\"Our team has been notified and will be quickly working on resolving it. If you'd like to escalate or simply contact us, please email us at\\u00A0\", _jsx(\"a\", { className: 'text-info', href: \"mailto:support@vertesiahq.com\", children: \"support@vertesiahq.com\" }), \".\"] }), error?.message &&\n _jsx(\"code\", { className: 'w-full mt-4 text-sm text-muted break-words', children: error.message })] }));\n}\n//# sourceMappingURL=PanelErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VertesiaErrorBoundary } from \"./VertesiaErrorBoundary\";\nexport function RowErrorBoundary({ children }) {\n return (_jsx(VertesiaErrorBoundary, { fallback: RowErrorFallback, children: children }));\n}\nfunction RowErrorFallback({ error }) {\n return (_jsx(\"tr\", { children: _jsxs(\"td\", { colSpan: 100, children: [_jsx(\"span\", { className: \"text-xs\", children: \" Cannot display row\" }), _jsx(\"br\", {}), _jsx(\"span\", { className: \"bg-gray-400\", children: error?.message })] }) }));\n}\n//# sourceMappingURL=RowErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { VertesiaErrorBoundary } from './VertesiaErrorBoundary';\nexport function WidgetErrorBoundary({ children }) {\n return (_jsx(VertesiaErrorBoundary, { fallback: WidgetErrorFallback, children: children }));\n}\nfunction WidgetErrorFallback({ error }) {\n console.log('WidgetError', error);\n return (_jsxs(\"div\", { className: \"text-sm\", children: [\"Sorry, this area cannot be loaded or rendered.\", error?.message &&\n _jsx(\"pre\", { children: error.message })] }));\n}\n//# sourceMappingURL=WidgetErrorBoundary.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport clsx from 'clsx';\nimport { ChevronRight, Info } from 'lucide-react';\nimport { VTooltip, Breadcrumbs } from '@vertesia/ui/core';\nimport { capitalize } from 'lodash-es';\nimport { useNavigate } from '@vertesia/ui/router';\nexport function GenericPageNavHeader({ className, children, title, description, actions, breadcrumbs, isCompact = false, useDynamicBreadcrumbs = true }) {\n const navigate = useNavigate();\n function formatTitle(title) {\n return title\n .replace(/[-_]/g, ' ')\n .split(' ')\n .map(word => capitalize(word))\n .join(' ');\n }\n const buildBreadcrumbLabel = (entry) => {\n const href = entry?.href || '';\n if (!href)\n return 'Page';\n const cleanHref = href.split('#')[0].split('?')[0];\n const pathSegments = cleanHref.split('/').filter((segment) => segment.length > 0);\n if (pathSegments.length === 3) {\n if (entry.title !== document.title && entry.title) {\n return entry.title;\n }\n const secondSegment = pathSegments[1];\n return `${formatTitle(secondSegment)} Detail (...${pathSegments[2].slice(-6)})`;\n }\n else if (pathSegments.length >= 2) {\n return formatTitle(pathSegments[pathSegments.length - 1]);\n }\n else if (pathSegments.length === 1) {\n return formatTitle(pathSegments[0]);\n }\n return 'Page';\n };\n // Build breadcrumb items from history chain and current breadcrumbs\n const buildBreadcrumbItems = () => {\n const items = [];\n // Add items from history chain\n if (useDynamicBreadcrumbs && typeof window !== 'undefined' && window.history.state?.historyChain) {\n const historyChain = window.history.state.historyChain;\n historyChain.forEach((entry, index) => {\n const stepsBack = historyChain.length - index;\n items.push({\n label: buildBreadcrumbLabel(entry),\n href: entry.href,\n onClick: () => navigate(entry.href, { stepsBack: stepsBack })\n });\n });\n }\n // Add current page breadcrumbs\n if (breadcrumbs && breadcrumbs.length > 0) {\n breadcrumbs.forEach((breadcrumb) => {\n // Extract text content from React element\n const label = typeof breadcrumb?.props?.children === 'string'\n ? breadcrumb.props.children\n : 'Page';\n items.push((breadcrumb?.props?.href) ? {\n href: breadcrumb?.props?.href,\n label: label,\n onClick: () => navigate(breadcrumb.props.href, { replace: breadcrumb.props.clearBreadcrumbs }),\n } : {\n label: label\n });\n });\n }\n return items;\n };\n const breadcrumbItems = buildBreadcrumbItems();\n return (_jsxs(\"div\", { className: clsx(isCompact ? 'pb-0' : 'pb-2', 'p-4 flex flex-col', className), children: [_jsxs(\"div\", { className: 'flex items-start gap-4', children: [_jsxs(\"div\", { className: \"w-full flex place-content-between h-auto min-h-8 flex-col items-start\", children: [_jsx(\"nav\", { className: \"flex-1 flex justify-start text-xs\", children: breadcrumbItems.length > 0 && (_jsx(Breadcrumbs, { path: breadcrumbItems, separator: _jsx(ChevronRight, { className: \"w-3.5 h-3.5\" }), maxItems: 4 })) }), _jsxs(\"div\", { className: 'flex gap-2 items-center', children: [_jsx(\"h1\", { className: \"text-xl font-semibold break-all\", children: title }), description &&\n _jsx(VTooltip, { description: description, children: _jsx(Info, { className: \"size-4 text-muted\" }) })] })] }), _jsx(\"div\", { className: \"flex gap-x-2 shrink-0\", children: actions })] }), children && _jsx(\"div\", { className: \"w-full flex items-center\", children: children })] }));\n}\n//# sourceMappingURL=GenericPageNavHeader.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function NotFoundView({}) {\n return (_jsxs(\"div\", { className: \"text-center pt-32\", children: [_jsx(\"h1\", { className: \"text-3xl font-bold text-red-500\", children: \"404\" }), _jsx(\"p\", { className: \"text-2xl\", children: \"Page Not Found\" })] }));\n}\n//# sourceMappingURL=NotFoundView.js.map","export function AnyOf(...permissions) {\n const p = Array.from(permissions);\n p.__AnyOf__ = true;\n return p;\n}\nexport function AllOf(...permissions) {\n return Array.from(permissions);\n}\nexport function isAnyOf(permissions) {\n return permissions.__AnyOf__ === true;\n}\n//# sourceMappingURL=helpers.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { ErrorBox, useFetch } from \"@vertesia/ui/core\";\nimport { useUserSession } from \"@vertesia/ui/session\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { isAnyOf } from \"./helpers\";\nexport class UserPermissions {\n system_roles; // all roles defined in the system\n roles; // all roles of the current user\n permissions; // all permissions of the current user\n constructor(session, roles) {\n if (!session.authToken) {\n throw new Error('No auth token found in user session');\n }\n this.system_roles = roles;\n const userRoles = new Set(session.authToken.account_roles || []);\n if (session.authToken.project_roles) {\n for (const role of session.authToken.project_roles) {\n userRoles.add(role);\n }\n }\n this.roles = userRoles;\n // build a temporary role to permissions map\n const map = {};\n for (const role of roles) {\n map[role.name] = role.permissions;\n }\n const permissions = new Set();\n for (const role of userRoles) {\n const rolePermissions = map[role];\n if (rolePermissions) {\n for (const permission of rolePermissions) {\n permissions.add(permission);\n }\n }\n }\n this.permissions = permissions;\n }\n hasPermission(permission) {\n if (typeof permission === 'string') {\n return this.permissions.has(permission);\n }\n else if (isAnyOf(permission)) {\n return permission.some(p => this.permissions.has(p));\n }\n else { // all of\n for (const p of permission) {\n if (!this.permissions.has(p)) {\n return false;\n }\n }\n return true;\n }\n }\n}\nconst UserPermissionsContext = createContext(undefined);\nexport { UserPermissionsContext };\nexport function useUserPermissions() {\n const perms = useContext(UserPermissionsContext);\n if (!perms) {\n throw new Error('UserPermissionContext cannot be used outside UserPermissionProvider');\n }\n return perms;\n}\nexport function UserPermissionProvider({ children }) {\n const session = useUserSession();\n const { data, error, isLoading } = useFetch(() => {\n if (session.user) {\n return session.client.iam.roles.list();\n }\n else {\n return Promise.resolve(undefined);\n }\n }, [session.user]);\n const perms = useMemo(() => {\n if (session.authToken && data && !isLoading) {\n return new UserPermissions(session, data);\n }\n else {\n return undefined;\n }\n }, [session, data, isLoading]);\n if (error) {\n return _jsx(ErrorBox, { title: \"Failed to fetch role mappings\", children: error.message });\n }\n return perms && (_jsx(UserPermissionsContext.Provider, { value: perms, children: children }));\n}\n//# sourceMappingURL=UserPermissionsProvider.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Button } from \"@vertesia/ui/core\";\nimport { useUserPermissions } from \"./UserPermissionsProvider\";\nexport function SecureButton({ permission, isDisabled, title, children, ...others }) {\n const perms = useUserPermissions();\n const hasPermission = perms.hasPermission(permission);\n if (!hasPermission) {\n isDisabled = true;\n title = 'You do not have permission to perform this action';\n }\n return (_jsx(Button, { isDisabled: isDisabled, title: title, ...others, children: children }));\n}\n//# sourceMappingURL=SecureButton.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { SidebarItem } from \"@vertesia/ui/layout\";\nimport { useUserPermissions } from \"./UserPermissionsProvider\";\nexport function SecureSidebarItem({ permission, ...others }) {\n const perms = useUserPermissions();\n const hasPermission = perms.hasPermission(permission);\n if (!hasPermission) {\n return null;\n }\n else {\n return (_jsx(SidebarItem, { ...others }));\n }\n}\n//# sourceMappingURL=SecureSidebarItem.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * UserAvatar\n * Show user picture, name and email\n **/\nexport function UserAvatar({ user }) {\n const userPicture = () => {\n if (!user.picture) {\n const initials = user.name.split(' ').map((n) => n[0]).join('');\n return _jsx(\"span\", { className: \"inline-flex h-8 w-8 items-center justify-center rounded-full bg-indigo-600\", children: _jsx(\"span\", { className: \"text-sm font-medium leading-none text-white\", children: initials }) });\n }\n else {\n return _jsx(\"img\", { className: \"inline-block h-9 w-9 rounded-full\", src: user.picture, alt: user.name });\n }\n };\n return (_jsxs(\"div\", { className: \"flex items-center\", children: [_jsx(\"div\", { className: \"w-9 h-9\", children: userPicture() }), _jsxs(\"div\", { className: \"ml-3\", children: [_jsx(\"p\", { className: \"text-sm font-medium text-gray-700 dark:text-slate-50 group-hover:text-gray-900\", children: user.name ?? 'Deleted User' }), _jsx(\"p\", { className: \"text-xs font-medium text-gray-500 dark:text-slate-300 group-hover:text-gray-700\", children: user.email ?? 'Deleted User' })] })] }));\n}\n//# sourceMappingURL=UserAvatar.js.map"],"names":["Badge","children","secondary","_jsx","className","resolveInnerType","innerType","name","PropertySignature","property","_jsxs","optional","type","value","ActivitiesDoc","activities","map","activity","ActivityDoc","ActivitySectionTitle","code","headingClass","headingRef","id","ref","title","doc","paramsType","params","prop","PropertyDetails","returnType","expandable","useMemo","members","ObjectMembersPanel","enum","EnumValuesPanel","values","clsx","v","i","ExpandablePanel","button","isOn","ExpandIcon","isOpen","body","NestedPropertiesDetails","properties","isInitiallyOpen","isExpanded","setExpanded","useState","onClick","AnimatePresence","motion","div","initial","height","opacity","animate","exit","transition","duration","ease","propagate","mode","rotate","JumpingDots","inline","cn","style","transform","animationRange","AnimatedThinkingDots","color","gradientClass","blue","purple","teal","green","amber","PulsatingCircle","size","colorClasses","left","top","animationDuration","sm","md","lg","TypedDots","dots","setDots","useEffect","intervalId","setInterval","prev","clearInterval","PulsingMessageLoader","message","dot","text","animationDelay","ThinkingBar","width","progress","setProgress","direction","setDirection","speed","setSpeed","animationFrameId","lastUpdateTime","Date","now","updateProgressBar","deltaTime","timeBasedChange","next","Math","random","max","min","requestAnimationFrame","cancelAnimationFrame","xl","full","WavyThinking","barHeights","setBarHeights","Array","fill","sizeClasses","barWidth","gap","speeds","phases","time","animateBars","newHeights","_","index","sin","ImageLightboxContext","createContext","useImageLightbox","ctx","useContext","openImage","src","window","open","closeImage","ImageLightboxProvider","image","setImage","useCallback","alt","Provider","X","href","target","rel","e","stopPropagation","ExternalLink","BatchProgressPanel","memo","batchData","isRunning","setIsExpanded","toast","useToast","tool_name","total","completed","succeeded","failed","items","started_at","completed_at","hasErrors","isComplete","overallStatus","durationSec","toFixed","CheckCircle","AlertCircle","Layers","ChevronDown","ChevronRight","dayjs","format","Button","variant","content","JSON","stringify","navigator","clipboard","writeText","then","status","copyToClipboard","CopyIcon","Loader2","length","item","undefined","duration_ms","prevProps","nextProps","VARIANT_STYLES","default","border","bg","icon","warning","info","success","VARIANT_ICONS","HelpCircle","MessageSquare","AskUserWidget","question","description","options","onSelect","onMultiSelect","onSubmit","allowFreeResponse","multiSelect","placeholder","isLoading","hideIcon","hideBorder","cardClassName","headerClassName","iconClassName","questionClassName","descriptionClassName","optionsClassName","buttonClassName","inputContainerClassName","inputClassName","submitButtonClassName","inputValue","setInputValue","React","selectedOptions","setSelectedOptions","Set","inputRef","useRef","styles","DefaultIcon","handleSubmit","trim","borderClass","option","checkbox","has","checked","onChange","toggleOption","optionId","delete","add","disabled","label","VTooltip","placement","asChild","Fragment","from","Send","onKeyDown","key","shiftKey","preventDefault","ConfirmationWidget","onConfirm","onCancel","confirmLabel","cancelLabel","XCircle","ThinkingMessages","insertMessageInTimeline","arr","m","t","timestamp","getTime","idx","findIndex","a","push","splice","DONE_STATES","AgentMessageType","COMPLETE","IDLE","REQUEST_INPUT","TERMINATED","getWorkstreamId","workstream_id","console","log","isToolCallMessage","THOUGHT","details","tool","getToolRunId","tool_run_id","getToolIteration","tool_iteration","getToolStatus","tool_status","getTimestampMs","groupMessagesWithStreaming","messages","streamingMessages","activeWorkstream","iterationGroups","Map","toolRunGroups","standaloneMessages","toolIteration","toolRunId","set","firstTimestamp","get","forEach","group","iteration","kind","data","streamingId","streamWorkstream","workstreamId","startTimestamp","sort","b","groups","currentToolGroup","flushToolGroup","sortedMessages","latestStatus","reduce","msg","toolStatus","ArtifactUrlCacheContext","ArtifactUrlCacheProvider","cacheRef","pendingRef","getUrl","current","setUrl","url","getOrFetch","async","fetcher","cached","pending","promise","catch","err","useArtifactUrlCache","getArtifactCacheKey","runId","path","disposition","getFileCacheKey","MESSAGE_STYLES","ANSWER","borderColor","bgColor","iconColor","sender","Icon","Bot","Clock","User","QUESTION","ERROR","UPDATE","Info","PLAN","WARNING","SYSTEM","STREAMING_CHUNK","BATCH_PROGRESS","MessageItem","showPulsatingCircle","onSendMessage","contentClassName","timestampClassName","senderClassName","detailsClassName","artifactsClassName","showDetails","setShowDetails","client","useUserSession","urlCache","messageContent","String","includes","randomIndex","floor","replace","processedContent","messageType","originalMessage","toLowerCase","formattedContent","test","processContentForMarkdown","renderContent","workflow_run_id","MarkdownRenderer","artifactRunId","onProposalSelect","onProposalSubmit","components","node","props","NavLink","topLevelNav","img","loading","artifactLinks","setArtifactLinks","outputFiles","files","outputFilesKey","isArray","join","entries","Promise","all","trimmed","artifactPath","startsWith","ext","split","pop","isImage","cacheKey","getArtifactDownloadUrl","displayName","error","filter","loadArtifacts","detailsContent","textToCopy","ux","uxConfig","optionIds","overflowWrap","some","xmlns","viewBox","stroke","strokeLinecap","strokeLinejoin","strokeWidth","d","StreamingMessage","revealSpeed","displayedLength","setDisplayedLength","throttledText","setThrottledText","animationRef","targetLengthRef","displayedLengthRef","startTime","textRef","lastTextLengthRef","lastTextTimeRef","performance","modelRateRef","fractionalCharsRef","newChars","elapsed","instantRate","alpha","lastTime","step","currentTime","buffer","targetRate","charsFloat","charsToAdd","throttleIntervalRef","lastThrottledLengthRef","slice","isStreaming","currentLength","formattedTime","isTyping","displayTextWithCursor","baseText","isImageUrl","FileDisplay","file","fileName","ToolCallItem","onToggle","resolvedFiles","setResolvedFiles","toolName","cancelled","resolved","f","resolveFiles","imageFiles","nonImageFiles","CollapsedItemFiles","_Fragment","ToolCallGroup","_toolRunId","isCollapsed","setIsCollapsed","expandedItems","setExpandedItems","animatingIndices","setAnimatingIndices","prevCountRef","find","prevCount","currentCount","newIndices","timer","setTimeout","clearTimeout","firstMessage","lastMessage","lastTimestamp","toolNames","toolSummary","toggleItem","AlertTriangle","allContent","copyAllToClipboard","fullMessage","isAnimating","isItemExpanded","transitionDelay","animation","Object","keys","WorkstreamTabs","workstreams","onSelectWorkstream","count","completionStatus","filteredWorkstreams","sortedWorkstreams","idA","idB","localeCompare","hasMultipleWorkstreams","substring","filterMessagesByWorkstream","processThinkingPlaceholder","thinkingMessageIndex","isBatchProgressMessage","batch_id","MessageErrorBoundary","Component","constructor","super","this","state","hasError","getDerivedStateFromError","render","AllMessagesMixed","bottomRef","viewMode","isCompleted","containerRef","setActiveWorkstream","lastScrollTimeRef","scrollScheduledRef","streamingContentBucket","performScroll","scrollIntoView","behavior","timeSinceLastScroll","delay","toString","isSystemMetadataMessage","extractedWorkstreams","extractWorkstreams","workstreamCounts","counts","mainMessages","displayMessages","importantMessages","recentThinking","hasStreaming","system_type","groupedMessages","groupedImportantMessages","isAgentWorking","workstreamCompletionStatus","statusMap","workstreamMessages","msgs","groupIndex","isLastGroup","isLatest","isLatestMessage","thinking","PayloadBuilder","vertesia","updateState","_interactive","_debug_mode","_user_channels","_collection","_start","_preserveRunValues","_interaction","_environment","_model","_tool_names","_data","_interactionParamsSchema","_inputValidator","onStateChanged","newInstance","clone","builder","interactive","debug_mode","user_channels","collection","search_scope","AgentSearchScope","Collection","restoreConversation","context","interactionRef","interaction","version","inter","interactions","catalog","resolve","envId","runtime","environment","config","model","env","environments","retrieve","interactionParamsSchema","tool_names","collection_id","mergeInCodePromptSchemas","prompts","interactionModel","supportsToolUse","provider","default_model","tools","prompt_data","run","start","preserveRunValues","schema","reset","location","hash","urlWithoutHash","origin","pathname","search","history","replaceState","validateInput","isValid","ajv","Ajv","strict","validate","compile","errorMessage","errors","instancePath","PayloadContext","PayloadBuilderProvider","setBuilder","usePayloadBuilder","Error","Header","onClose","isModal","onViewModeChange","showPlanPanel","hasPlan","onTogglePlanPanel","onDownload","onCopyRunId","resetWorkflow","onExportPdf","titleClassName","actionsClassName","ClipboardList","MoreDropdown","XIcon","Popover","hover","PopoverTrigger","MoreVertical","PopoverContent","align","Command","CommandList","CommandGroup","CommandItem","openUrl","workflowId","workflowRunId","getDownloadUrl","r","getConversationUrl","DownloadCloudIcon","store","workflows","terminate","cancelWorkflow","LAST_DISPLAYED_VIEW","ContentDispositionButton","onUpdate","isGridView","setIsGridView","localStorage","getItem","toggleGridView","setItem","toggleTableView","TableProperties","LayoutGrid","shortId","shortenString","str","CSV_PREFIX","IMAGE_PREFIX","PDF_PREFIX","VIDEO_PREFIX","PREVIEWABLE_AS_PDF_TYPES","isCsv","isPdf","isVideo","isPreviewableAsPdf","RENDITION_OPTIONS","max_hw","VITE_RENDITION_HW","ImageRenditionFormat","jpeg","generate_if_missing","RENDITION_ID","retrieveRendition","setRenditionUrl","setRenditionAlt","setRenditionStatus","savedId","elapsedTime","abs","parseInt","objects","getRendition","response","renditions","rendition","warn","printElementToPdf","sourceElement","document","iframe","createElement","position","right","bottom","visibility","appendChild","iframeWindow","contentWindow","parentNode","removeChild","write","close","querySelectorAll","head","cloneNode","printStyle","textContent","innerHTML","focus","print","getWorkflowStatusColor","WorkflowExecutionStatus","RUNNING","COMPLETED","FAILED","CANCELED","getWorkflowStatusName","CONTINUED_AS_NEW","TIMED_OUT","SaveOptionAdapter","RadioOptionAdapter","labelOf","idOf","renderOption","SaveVersionConfirmModal","uploadedFileName","saveOptions","defaultOption","selectedOption","setSelectedOption","versionLabel","setVersionLabel","optionAdapter","createVersion","Modal","ModalTitle","ModalBody","RadioGroup","adapter","FormItem","Input","ModalFooter","PropertiesEditorModal","object","refetch","navigate","useNavigate","setIsLoading","propertiesJson","setPropertiesJson","showConfirmation","setShowConfirmation","parsedProperties","setParsedProperties","editorRef","monacoRef","jsonSchema","setJsonSchema","_newVersionId","setNewVersionId","setMonacoJsonSchema","monaco","languages","json","jsonDefaults","setDiagnosticsOptions","schemas","uri","fileMatch","typeId","typeDetails","types","object_schema","fetchJsonSchema","Editor","language","onMount","editor","minimap","enabled","scrollBeyondLastLine","formatOnPaste","formatOnType","automaticLayout","wordWrap","editorValue","getValue","parse","update","createRevision","revisionLabel","LoadingSpinner","PdfPageRenderer","pdfUrl","pageNumber","renderTextLayer","renderAnnotationLayer","onLoadSuccess","onError","setLoading","setError","Document","numPages","onLoadError","Page","pdfjs","GlobalWorkerOptions","workerSrc","SharedPdfContext","SharedPdfProvider","urlLoading","setNumPages","pageDimensions","setPageDimensions","pdf","viewport","getPage","getViewport","scale","aspectRatio","useSharedPdf","A4_ASPECT_RATIO","SimplePdfPage","placeholderHeight","round","VirtualizedThumbnail","isSelected","renderThumbnail","rootMargin","hasBeenVisible","setHasBeenVisible","container","observer","IntersectionObserver","entry","isIntersecting","threshold","observe","disconnect","pageElement","PdfThumbnailList","pageCount","currentPage","thumbnailWidth","onPageSelect","scrollContainerRef","onAspectRatioChange","onItemHeightChange","calculateItemHeight","onPageCountChange","visibleRange","setVisibleRange","end","setAspectRatio","handleError","handleLoadSuccess","ratio","effectiveAspectRatio","itemHeight","element","parentElement","overflowY","getComputedStyle","findScrollableAncestor","updateVisibleRange","scrollTop","viewportHeight","clientHeight","firstVisible","lastVisible","ceil","addEventListener","passive","removeEventListener","topSpacerHeight","bottomSpacerHeight","hasAspectRatio","overflow","PdfDocumentRenderer","onPageChange","pages","ZOOM_LEVELS","PdfPageSlider","pdfUrlLoading","compact","headerExtra","baseWidth","setBaseWidth","zoom","setZoom","setItemHeight","prevItemHeightRef","zoomIn","currentIndex","level","nextIndex","zoomOut","prevIndex","fitToView","getItemHeight","debounceTimer","getAvailableWidth","clientWidth","updateWidth","newWidth","oldItemHeight","currentScrollTop","currentTopPage","newItemHeight","newScrollTop","scrollTo","initialWidth","resizeObserver","ResizeObserver","isProgrammaticScrollRef","pendingZoomScrollRef","prevZoomRef","targetPage","pendingScroll","targetScrollTop","hasInitialScrolledRef","prevPageRef","scrollDebounceTimer","handleScroll","calculatedPage","clampedPage","ChevronsUp","ZoomControls","onZoomIn","onZoomOut","onFitToView","canZoomIn","canZoomOut","PageNavigator","totalPages","Center","ChevronsDown","page","isNaN","blur","onBlur","Minus","Plus","Maximize","ADVANCED_PROCESSING_PREFIX","ImageType","PageImageProvider","objectId","cache","getCacheKey","getPageImageUrl","fetchImageUrl","getImagePath","basePath","original","instrumented","PageLayoutProvider","getPageLayout","fetchPageLayout","result","fetch","method","ok","statusText","PageMarkdownProvider","initFromContent","markdownContent","pageDelimiterRegex","markers","match","exec","marker","pageIndex","startIndex","nextDelimiterMatch","actualEndIndex","pageContent","extractMarkdownPages","loadUrls","_vertesia","_objectId","getPageMarkdown","MagicPdfContext","MagicPdfProvider","page_count","metadata","isMarkdownProcessor","content_processor","setInfo","markdownProvider","xml","cleanXml","layoutProvider","imageProvider","xmlPages","extractXmlPages","pdfRendition","PDF_RENDITION_NAME","isPdfSource","sourceToResolve","source","useMagicPdfContext","DOMParser","parseFromString","getElementsByTagName","serializer","XMLSerializer","p","serializeToString","DEFAULT_ASPECT_RATIO","AnnotatedImageSlider","imageType","setImageType","loadedUrls","setLoadedUrls","loadedPagesRef","Image","onload","prevImageTypeRef","loadOrder","order","offset","getPageLoadOrder","loadPage","thumbnail","querySelector","block","containerRect","getBoundingClientRect","containerCenter","closestPage","closestDistance","Infinity","pageEl","pageRect","pageCenter","distance","ImageTypeButton","currentType","tooltip","ScanSearch","PageThumbnail","DownloadPopover","getResourceUrl","buttonClass","docMetadata","getProcessorType","Download","strategy","zIndex","Trigger","click","Content","ExtractedContentView","viewType","JsonPageLayoutView","MarkdownPageView","XmlPageView","XMLViewer","collapsible","setContent","layoutContent","JSONCode","PdfViewErrorBoundary","componentDidCatch","errorInfo","ErrorBox","MagicPdfView","useFetch","MagicPdfViewImpl","setPageNumber","processorType","ResizablePanelGroup","ResizablePanel","defaultSize","minSize","maxSize","ResizableHandle","SimplePdfViewer","setCurrentPage","setPdfUrl","setPdfUrlLoading","setPageCount","isFullscreen","setIsFullscreen","finally","handlePageCountChange","Spinner","Maximize2","MAX_TEXT_DISPLAY_SIZE","WEB_SUPPORTED_IMAGE_FORMATS","WEB_SUPPORTED_VIDEO_FORMATS","WEB_SUPPORTED_AUDIO_FORMATS","PANEL_HEIGHTS","isCreatedOrProcessingStatus","ContentObjectStatus","created","processing","getContentProcessorType","getPanelVisibility","isVisible","PanelView","ContentOverview","loadText","handleCopyContent","PropertiesPanel","withHandle","DataPanel","viewCode","setViewCode","isPropertiesModalOpen","setPropertiesModalOpen","Copy","SquarePen","JSONDisplay","ContentNature","Video","isAudio","Audio","isPreviewableAsPdfDoc","isCreatedOrProcessing","hasTranscript","transcript","currentPanel","setCurrentPanel","Text","fullText","displayText","isLoadingText","isCropped","isTextCropped","initialText","loadOnMount","setFullText","setDisplayText","setIsCropped","getObjectText","res","useObjectText","shouldPollProgress","pdfProgress","pdfStatus","outputFormat","pdfOutputFormat","processingComplete","shouldPoll","setStatus","setOutputFormat","setIsComplete","interrupted","poll","analyze","getStatus","output_format","usePdfProcessingStatus","officePdfUrl","isConverting","officePdfConverting","officePdfError","triggerConversion","triggerOfficePdfConversion","setIsConverting","pollForPdf","isFirstCall","MarkdownRenditionFormat","sign_url","block_on_generation","useOfficePdfConversion","showProcessingPanel","textContainerRef","Transcript","Pdf","PdfActions","TextActions","OfficePdfActions","ImagePanel","VideoPanel","AudioPanel","TranscriptPanel","PdfPreviewPanel","OfficePdfPreviewPanel","onConvert","PdfProcessingPanel","TextPanel","loadingFormat","setLoadingFormat","isPdfModalOpen","setIsPdfModalOpen","isMarkdown","contentProcessorType","handleExportDocument","toUpperCase","downloadUrl","link","download","mimeType","blob","Blob","URL","createObjectURL","filename","display","revokeObjectURL","VModal","VModalTitle","VModalBody","VModalFooter","pdfTitle","isXml","isMarkdownOrText","shouldRenderAsMarkdown","looksLikeMarkdown","pre","h1","h2","h3","li","imageUrl","setImageUrl","isOriginalWebSupported","loadImage","videoUrl","setVideoUrl","posterUrl","setPosterUrl","webRendition","poster","POSTER_RENDITION_NAME","loadPoster","loadVideoUrl","controls","audioUrl","setAudioUrl","audioRendition","AUDIO_RENDITION_NAME","loadAudioUrl","formatDuration","seconds","hours","minutes","secs","padStart","transcriptText","segments","s","formatTimestamp","segment","isPdfPreviewOpen","setPdfPreviewOpen","FileSearch","Portal","isDownloading","setIsDownloading","statusColor","statusName","isXmlProcessing","percent","ProgressLine","tables","images","visuals","Progress","processed","DocumentIconSkeleton","Card","Separator","CardContent","DocumentIcon","selection","onSelectionChange","onRowClick","previewObject","selectedObject","renditionUrl","renditionAlt","renditionStatus","ev","Eye","score","facetOptionLabel","bucket","_id","facetOptionNameLabel","StringFacet","buckets","filterValue","getFilterValue","SelectBox","filterBy","isClearable","optionLabel","setFilterValue","by","StringListFacet","tags","setTags","InputList","TypeFacet","setOptions","typeRegistry","getTypeName","VStringFacet","multiple","charAt","allowCreate","createStringFilterGroup","VTypeFacet","typeDataMap","actualId","displayKey","typeData","labelRenderer","optionValue","searchText","USER_CACHE","GROUP_CACHE","useFetchUserInfo","userId","user","users","useFetchGroupInfo","groupId","iam","AvatarPlaceholder","SystemAvatar","showTitle","UserPopoverPanel","Avatar","ServiceAccountAvatar","accountId","ErrorAvatar","UnknownAvatar","UserInfo","userRef","PrincipalType","UserAvatar","Group","GroupAvatar","ServiceAccount","Agent","ApiKey","ApiKeyAvatar","keyId","tag","Users","email","username","picture","apikeys","avatar","Table","account","project","sideOffset","side","VUserFacet","createUserFilterGroup","EnvironmentFacet","resolvedOptions","useRunsFilterGroups","facets","customFilterGroups","interactionFilterGroup","interactionId","badgeVariant","InteractionStatus","published","archived","badgeText","VInteractionFacet","environmentFilterGroup","environmentId","VEnvironmentFacet","models","modelFilterGroup","statuses","statusFilterGroup","finish_reason","finishReasonFilterGroup","created_by","createdByFilterGroup","useRunsFilterHandler","newFilters","clearFilters","filterName","query","RunsFacetsNav","filters","setFilters","filterGroups","handleFilterLogic","FilterProvider","FilterBtn","RefreshCw","FilterBar","FilterClear","useWorkflowExecutionsFilterGroups","initiated_by","initiatedByFilterGroup","useWorkflowExecutionsFilterHandler","search_term","WorkflowExecutionsFacetsNav","useDocumentFilterGroups","typeFilterGroup","useDocumentFilterHandler","dateValue","gte","lte","DocumentsFacetsNav","useInteractionsFilterGroups","useInteractionsFilterHandler","InteractionsFacetsNav","usePromptsFilterGroups","role","rolesFilterGroup","facet","usePromptsFilterHandler","PromptsFacetsNav","useCollectionsFilterGroups","typeOptions","opt","useCollectionsFilterHandler","CollectionsFacetsNav","DocumentSelection","setState","collectionId","singleSelection","isSingleSelection","hasSelection","getObjectIds","getObjectId","remove","addAll","obj","removeAll","DocumentSelectionContext","useDocumentSelection","useOptionalDocumentSelection","DocumentSelectionProvider","setSelection","extend","RelativeTime","LocalizedFormat","renderers","string","_onClick","transforms","max_length","fileSize","_params","bytes","Number","sizes","pow","number","currency","decimals","digits","Intl","NumberFormat","maximumFractionDigits","hasSlice","displayValue","objectName","objectLink","typeLink","date","arg","localized","relative","defaultRenderer","resolveField","last","splitPath","DocumentTableColumn","layout","renderer","fallbackPath","field","fallback","_value","_index","indexOf","URLSearchParams","resolveValue","baseType","DocumentTableView","columns","toggleAll","col","TBody","colSpan","DocumentGridView","DocumentSearch","limit","SharedState","facetSpecs","withFacets","hasMore","setDefaultKeys","autoSearch","parent","full_text","vector","weights","score_aggregation","dynamic_scaling","all_revisions","getFacetBuckets","resetFacets","_updateRunningState","_searchRequest","includeFacets","payload","collections","searchMembers","_facetsRequest","computeFacets","_query","_search","loadMore","noFacets","results","concat","DocumentSearchContext","useDocumentSearch","useWatchDocumentSearchFacets","useWatchSharedState","useWatchDocumentSearchResult","useDocumentSearchCount","FileUploadAction","calculateFileHash","arrayBuffer","md5","Md5","appendByteArray","Uint8Array","useSmartFileUploadProcessing","checkDocumentProcessing","selectedFolder","limitToCollectionId","filesWithMetadata","batch","metadataResults","webkitRelativePath","pathParts","folderPath","prepareFilesWithMetadata","identifyExistingHash","$in","select","etag","existingId","action","SKIP","identifyExistingIds","unskippedFiles","allLocations","uniqueLocations","queries","flat","CREATE","totalFiles","toCreate","toUpdate","toSkip","DocumentUploadModal","initialFiles","onUploadComplete","hideFileSelection","showTypeSelectionOnly","allowFolders","setFiles","processedFiles","setProcessedFiles","processingDone","setProcessingDone","selectedType","setSelectedType","fileStatuses","setFileStatuses","isUploading","setIsUploading","uploadComplete","setUploadComplete","overallProgress","setOverallProgress","modalKey","setModalKey","collectionData","setCollectionData","setResult","_title","setTitle","_description","setDescription","renderLocationInfo","MessageBox","FolderIcon","processingStats","setProcessingStats","processFiles","handleClose","handleFileSelect","newFiles","filesToProcess","handleUpload","initialStatuses","fileInfo","filesToSkip","filesToUpdate","filesToCreate","objectIds","uploadedFiles","skippedFiles","failedFiles","processBatch","batches","batchIndex","filesProcessedInBatch","toISOString","createResult","create","currentStatuses","completedFiles","missingStatuses","createdCount","updatedCount","skippedCount","failedCount","statusMessage","typeSelection","VSelectBox","selected","CheckCircleIcon","disableCloseOnClickOutside","fileStatus","FileIcon","XCircleIcon","UploadSummary","UploadIcon","AlertCircleIcon","DropZone","onDrop","buttonLabel","canUpload","renderModalFooter","useDocumentUploadHandler","onUploadDone","projectRef","filesToUpload","skippedFilesInfo","uploadedFilesInfo","failedFilesInfo","batchSize","processBatches","processedCount","processResults","updateResult","creates","updates","failures","uploadedCount","totalObjectIds","updatedFiles","defaultLayout","DocumentTable","onUpload","others","ObjectTableWithDropZone","DocumentTableImpl","skipTypeModal","isDragging","setIsDragging","typeSelectionOpen","setTypeSelectionOpen","handleFileDrop","droppedFiles","feedback","filesLength","processedFilesLength","uploadPromise","onDoUpload","filesCount","hasProcessingResults","handleDragOver","onDragOver","onDragEnter","onDragLeave","currentTarget","contains","relatedTarget","dataTransfer","getAsFile","updated","skipped","_onSelectionChange","isShift","nativeEvent","findPreviousSelected","toSelect","findNextSelected","DocumentSearchProvider","unshift","SearchContext","SelectDocument","SelectDocumentImpl","isReady","setIsReady","loadMoreRef","useIntersectionObserver","deps","facetSearch","SelectDocumentModal","STORE_REGEX","DocumentInput","off","on","useFlag","actualValue","setValue","setDoc","clearValue","event","Styles","INPUT","ChevronsUpDown","useDownloadDocument","getDownloadUrlWithOptions","DocumentPreviewPanel","setObject","loadingText","setLoadingText","setText","currentTab","setCurrentTab","loadObjectText","loadImageUrl","downloadUrlResult","handleViewFullDocument","seemsMarkdown","FileText","formatFileSize","created_at","toLocaleString","updated_at","parseFloat","allTypes","SearchTypes","embeddingTypes","SupportedEmbeddingTypes","VectorSearchWidget","refresh","searchTypes","setSearchText","setConfig","embeddings","showSettings","setShowSettings","selectedTypes","setSelectedTypes","setLimit","embeddingSearchTypes","fullTextEnabled","vectorSearchEnabled","projects","configuration","fireSearch","handleCheckboxChange","Settings","Checkbox","onCheckedChange","NumberInput","isDisabled","DocumentSearchResultsWithDropZone","uploadHandler","DocumentSearchResults","allowFilter","allowSearch","searchContext","setSelectedObject","actualLayout","setActualLayout","registry","getTypeLayout","refreshTrigger","_setRefreshTrigger","loaded","setLoaded","filtersParam","searchParams","filterPairs","validFilterPairs","pair","encodedName","decodeURIComponent","newFiltersParam","OverviewDrawer","Toolsbar","handleFilterChange","handleVectorSearch","c","handleRefetch","o","SidePanel","Divider","ExportTypes","ExportPropertiesModal","isExporting","SelectPanel","WaitingPanel","exportType","setExportType","exportAll","setExportAll","selectionOption","BrowseCollectionView","tableLayout","table_layout","getTableLayout","dynamic","addMembers","SelectContentType","defaultValue","session","isMounted","setIsMounted","_onChangeMultiple","CreateCollectionForm","redirect","onAddToCollection","isProcessing","setProcessing","setPayload","setPayloadProp","required","Textarea","Switch","allowed_types","CreateCollectionModal","CollectionsTable","collectionToDelete","setCollectionToDelete","setOpen","TR","collectionIcon","fromNow","Trash2","EmptyCollection","ConfirmModal","isDynamic","tooltipText","Search","FolderClosed","ContentObjectTypesTable","THead","strict_mode","is_chunkable","relativeTime","ObjectTypeSearch","list","ObjectTypeSearchContext","useSearch","useWatchSearchResult","useSearchCount","CreateOrUpdateTypeModal","okLabel","initialPayload","setName","strictMode","setStrictMode","onSave","ChunkableOptions","ContentObjectTypesSearch","isDirty","searchTerm","setSearchTerm","debounceValue","useDebounce","chunkable","setChunkable","showCreateModal","setShowCreateModal","reloadTypes","CODE_MIRROR_EXTENSIONS","basicSetup","ObjectSchemaEditor","objectType","onSchemaUpdate","isUpdating","setUpdating","useSchema","displayJson","setDisplayJson","jsonToContent","updateSchemaFromJson","newSchema","contentToJson","validateSchema","replaceSchema","CodeMirrorEditor","extensions","SchemaEditor","ObjectTypeSearchProvider","SelectContentTypeModal","initialSelectedType","allowNone","TableLayoutEditor","onLayoutUpdate","stringifyTableLayout","validationError","EditCollectionView","tableLayoutRef","setMetadata","tableLayoutValue","setField","Panel","updated_by","PropertiesEditor","SyncMemberHeadsToggle","SharedPropsEditor","formData","setFormData","setIsUpdating","ManagedObject","_onSave","GeneratedForm","SelectCollection","searchPlaceholder","filterOut","allowDynamic","searchQuery","setSearchQuery","isSearching","setIsSearching","useServerSearch","setUseServerSearch","debouncedSearchQuery","searchCollections","trimmedQuery","selectedCollection","handleSelect","currentValues","newValues","newCollections","handleClear","handleSearchChange","hasSearchQuery","filteredCollections","queryLower","showClearOption","shouldFilter","CommandInput","onValueChange","CommandEmpty","Check","colType","setColType","sharedProps","setSharedProps","shared_properties","TagsInput","skipHeadSync","setSkipHeadSync","skip_head_sync","isSaving","setIsSaving","enableSyncHeads","ChangeTypeActionComponent","callback","useObjectsActionCallback","runOperation","ids","ChangeTypeAction","confirm","component","ConfirmAction","showConfirmModal","setShowConfirmModal","confirmationText","_callback","DeleteObjectsActionComponent","useObjectsActionContext","limitFilesName","names","maxLength","extIndex","lastIndexOf","plural","DeleteObjectsAction","destructive","DeleteObjectsFromCollectionsAction","ExportPropertiesComponent","setIsExporting","search_objectIds","getChildObjects","Ids","exportProperties","CSV","responseData","ExportPropertiesAction","RemoveFromCollectionActionComponent","deleteMembers","RemoveFromCollectionAction","StartWorkflowComponent","StartWorkflowModal","rules","execute","StartWorkflowAction","hideInList","StartWorkflowBody","optionLayout","reverse","setSelected","SelectList","wfRules","ObjectsActionContext","allActions","AddToCollectionAction","callbacks","startWorkflow","actions","loadWorkflows","rule","isWorkflow","registerCallback","cb","unregisterCallback","findAction","actionId","ObjectsActionContextReact","ObjectsActionContextProvider","Actions","useStartWorkflowCallback","AddToCollectionActionComponent","showModal","setShowModal","SelectCollectionModal","DialogDescription","AddToCollectionForm","selectedCollectionId","setSelectedCollectionId","tabs","Heading","VTabs","fullWidth","VTabsBar","VTabsPanel","SelectionActions","hasSingleSelection","SelectionActionsPopover","EllipsisVertical","ActionsWrapper","StartWorkflowButton","UploadObjectsButton","setIsOpen","PopoverBody","executeAction","_selection","noCheck","MessageInput","onSend","onStop","isSending","isStopping","activeTaskCount","onFilesSelected","onRemoveFile","acceptedFileTypes","maxFiles","processingFiles","hasProcessingFiles","renderDocumentSearch","selectedDocuments","onRemoveDocument","hideObjectLinking","fileInputRef","isObjectModalOpen","setIsObjectModalOpen","isDocSearchOpen","setIsDocSearchOpen","isDragOver","setIsDragOver","handleFiles","fileArray","remainingSlots","filesToAdd","handleDragLeave","handleDrop","handlePaste","clipboardData","extension","namedFile","File","handleFileInputChange","openFileDialog","handleDocumentSelect","markdownLink","currentValue","cursorPos","selectionStart","newValue","handleSend","handleStop","lastEscapeRef","adjustTextareaHeight","textarea","scrollHeight","hasAttachments","minHeight","accept","HelpCircleIcon","FileTextIcon","FileProcessingStatus","READY","UPLOADING","PROCESSING","CheckIcon","onPaste","rows","maxHeight","PaperclipIcon","StopCircleIcon","SendIcon","Activity","newCursorPos","setSelectionRange","InlineSlidingPlanPanel","plan","workstreamStatus","plans","activePlanIndex","onChangePlan","planTasks","totalTasks","completedTasks","task","taskId","progressPercentage","toLocaleTimeString","taskGoal","goal","StatusIcon","Circle","planTaskIds","workstreamEntries","statusBg","inputs","twMerge","UserSessionContext","VegaErrorDisplay","chartTitle","FullscreenDialog","DialogPrimitive","Root","onOpenChange","Overlay","onEscapeKeyDown","Close","Title","Description","CHART_COLORS","categorical","blues","purples","diverging","viewHasField","view","fields","encoding","channel","layer","viewHasColorEncoding","checkEncoding","colorField","findArtifactReferences","spec","currentPath","references","nestedKeys","VegaLiteChart","vegaSpec","isCopied","setIsCopied","viewRef","fullscreenViewRef","resolvedSpec","setResolvedSpec","isLoadingArtifacts","setIsLoadingArtifacts","artifactError","setArtifactError","isDashboard","showFullscreenButton","enableFullscreen","baseHeight","rowCount","vconcat","calculateAutoHeight","resolvedData","pathKey","endsWith","csvText","parseResult","Papa","header","skipEmptyLines","dynamicTyping","jsonData","newSpec","lastKey","oldUrl","replaceArtifactData","resolveArtifacts","isDarkMode","setIsDarkMode","checkDarkMode","documentElement","classList","MutationObserver","attributes","attributeFilter","containerWidth","setContainerWidth","contentRect","hasArtifactReferences","processedSpec","specToUse","parameterValues","updateParams","param","updateNestedViews","views","hconcat","applyParameterValues","concatKeys","rootSelectionParams","paramName","selectFields","hasLegendBinding","bind","concatArray","targetViewIndex","targetView","fixVegaLiteSelectionParams","scaleSpecWidths","availableWidth","childCount","totalSpacing","spacing","widthPerChild","child","currentWidth","buildFullSpec","forFullscreen","isDark","baseConfig","background","range","category","heatmap","ramp","mark","bar","cornerRadiusTopLeft","cornerRadiusTopRight","line","strokeCap","point","filled","area","fillOpacity","rect","cornerRadius","arc","circle","axis","labelColor","titleColor","gridColor","domainColor","tickColor","labelFont","titleFont","labelFontSize","titleFontSize","titleFontWeight","legend","symbolSize","font","fontSize","fontWeight","getDarkModeConfig","calculatedWidth","innerWidth","isConcatenatedView","autosize","scaledSpec","specWidth","_specWidth","specWithoutWidth","$schema","handleCopy","toCanvas","toBlob","ClipboardItem","handleExport","toImageURL","handleNewView","handleFullscreenNewView","toggleFullscreen","Toolbar","Minimize2","chartSpec","fullscreenSpec","hasData","dataLength","specData","minWidth","VegaEmbed","onEmbed","COLORS","ChartErrorBoundary","chartType","isVegaLiteSpec","library","isRechartsSpec","formatNumber","n","isFinite","AgentChart","RechartsChart","normalizeChartType","chart","typeMap","BarChart","LineChart","AreaChart","PieChart","ScatterChart","RadarChart","FunnelChart","Treemap","ComposedChart","RadialBarChart","normalizedSpec","xKey","x_axis","data_key","series","bars","dataKey","lines","l","yAxis","nameKey","valueKey","yKey","axisKey","chartRef","dataUrl","toPng","backgroundColor","pixelRatio","safeSeries","safeData","commonAxes","XAxis","tick","YAxis","yAxisId","tickFormatter","angle","orientation","commonOverlays","CartesianGrid","strokeDasharray","Tooltip","formatter","Legend","referenceZero","ReferenceLine","y","renderSeries","Line","Area","stackId","stacked","Bar","ResponsiveContainer","Pie","cx","cy","innerRadius","outerRadius","showLabels","Cell","xDataKey","yDataKey","Scatter","renderScatterChart","aKey","PolarGrid","PolarAngleAxis","PolarRadiusAxis","Radar","renderRadarChart","nKey","vKey","startAngle","endAngle","barSize","RadialBar","iconSize","verticalAlign","renderRadialBarChart","Funnel","isAnimationActive","LabelList","renderFunnelChart","x","textAnchor","renderChart","defaultComponents","RemoteWidgetComponent","setComponent","import","module","SkillWidgetProvider","setComponents","installedApps","apps","getInstalledApps","urls","app","manifest","tool_collections","collUrl","normalizeToolCollection","allWidgets","widgets","widgetsMap","widgetSpec","fetchSkillWidgets","CodeBlockRendererProvider","ModernAgentConversation","execRun","run_id","workflow_id","ModernAgentConversationInner","StartWorkflowView","EmptyState","initialMessage","startButtonText","getAttachedDocs","onAttachmentsSent","setIsSending","setRun","stagedFiles","setStagedFiles","dragCounterRef","handleDragEnter","filesArray","removeStagedFile","startWorkflowWithMessage","sessionStorage","removeItem","attachedDocs","newRun","uploadArtifact","sendSignal","substr","content_type","reference","artifact_path","uploadErr","Cpu","conversationRef","setMessages","setIsCompleted","setViewMode","showSlidingPanel","setShowSlidingPanel","setIsStopping","setPlans","setActivePlanIndex","workstreamStatusMap","setWorkstreamStatusMap","setThinkingMessageIndex","showInput","setShowInput","workflowStatus","setWorkflowStatus","setStreamingMessages","setProcessingFiles","pendingStreamingChunks","streamingFlushScheduled","_debugChunkCount","setDebugChunkCount","_debugRenderCount","setDebugRenderCount","debugChunkFlash","setDebugChunkFlash","debugFlashTimeout","flushStreamingChunks","getActivePlan","currentPlanData","currentWorkstreamStatus","handleTogglePlanPanel","handleChangePlan","handleClosePlanPanel","interval","statusResult","getRunDetails","checkWorkflowStatus","streamMessages","streaming_id","newText","is_final","newMap","clear","prev_messages","_optimistic","withoutOptimistic","onlyWorkstreamId","onlyWorkstreamMsgs","mainWorkstreamMsgs","lastMainMessage","isInProgress","notificationTimeout","newPlanDetails","newPlan","newPlans","newWorkstreamStatus","handleSendMessage","optimisticTimestamp","optimisticMessage","newMessages","attached_docs","handleFileUpload","fileId","fileState","actualTitle","taskLabels","acc","paddingBottom","activeCount","getActiveTaskCount","StackedMessages","MessagesContainer","messagesClassName","emptyClassName","buildScenarioComparisonBarChart","leftLabel","rightLabel","metrics","collapseInitially","buildScenarioDeltaPercentChart","deltaPct","toChartMarkdown","buildCashflowComposedChart","period","calls","distributions","netCashflow","buildPerformanceLineChart","tvpi","dpi","rvpi","buildTvpiOverlayChart","buildNavLineChart","nav","createChartToolDefinition","input_schema","additionalProperties","chartSystemPromptAddition","buildChartSpec","rechartsSpec","extractChartSpecs","markdown","chartBlockRegex","specs","VertesiaErrorBoundary","ErrorBoundaryInstance","ErrorBoundary","FallbackComponent","setErrorBoundaryComponent","ErrorBoundaryComponent","PanelErrorBoundary","PanelErrorFallback","RowErrorBoundary","RowErrorFallback","WidgetErrorBoundary","WidgetErrorFallback","GenericPageNavHeader","breadcrumbs","isCompact","useDynamicBreadcrumbs","formatTitle","word","capitalize","buildBreadcrumbLabel","pathSegments","breadcrumbItems","historyChain","stepsBack","breadcrumb","clearBreadcrumbs","buildBreadcrumbItems","Breadcrumbs","separator","maxItems","NotFoundView","AnyOf","permissions","__AnyOf__","AllOf","isAnyOf","UserPermissions","system_roles","roles","authToken","userRoles","account_roles","project_roles","rolePermissions","permission","hasPermission","UserPermissionsContext","useUserPermissions","perms","UserPermissionProvider","SecureButton","SecureSidebarItem","SidebarItem","initials","userPicture"],"mappings":"owJAIA,SAASA,IAAMC,SAAEA,EAAQC,UAAEA,GAAY,IAEnC,OAAOC,EAAK,OAAQ,CAAEC,UADJF,EAAY,4BAA8B,2BAChBD,SAAUA,GAC1D,CAKA,SAASI,GAAiBC,GACtB,OAAKA,EAGuB,UAAnBA,EAAUC,KACRF,GAAiBC,EAAUA,WAG3BA,OANP,CAQR,CACA,SAASE,IAAkBC,SAAEA,IACzB,OAAQC,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,8BAA+BH,SAAUQ,EAASF,OAASE,EAASE,UAAYR,EAAKH,GAAO,CAAEC,SAAU,aAAeE,EAAKH,GAAO,CAAEC,SAAUQ,EAASG,KAAKC,UACpQ,CACO,SAASC,IAAcC,WAAEA,IAC5B,OAAQZ,EAAK,MAAO,CAAEC,UAAW,iDAAkDH,SAAUc,EAAWC,IAAIC,GAAYd,EAAKe,GAAa,CAAED,SAAUA,GAAYA,EAASV,QAC/K,CACA,SAASY,IAAqBC,KAAEA,EAAInB,SAAEA,IAClC,OAAQS,EAAM,MAAO,CAAEN,UAAW,0DAA2DH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,0CAA2CH,SAAUA,IAAamB,GAAQjB,EAAK,MAAO,CAAEF,SAAUE,EAAKH,GAAO,CAAEC,SAAUmB,QAC/P,CACO,SAASF,IAAYD,SAAEA,EAAQI,aAAEA,EAAYC,WAAEA,IAClD,OAAQZ,EAAM,MAAO,CAAEN,UAAWiB,EAAcE,GAAIN,EAASV,KAAMiB,IAAKF,EAAYrB,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,6BAA8BH,SAAUgB,EAASQ,QAAUtB,EAAK,MAAO,CAAEC,UAAW,OAAQH,SAAUE,EAAKH,GAAO,CAAEC,SAAUgB,EAASV,SAAYU,EAASS,KACxQvB,EAAK,MAAO,CAAEC,UAAW,qBAAsBH,SAAUgB,EAASS,MAAQhB,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAACE,EAAKgB,GAAsB,CAAEC,KAAMH,EAASU,WAAY1B,SAAU,eAAiBE,EAAK,MAAO,CAAEC,UAAW,2BAA4BH,SAAUgB,EAASW,OAAOZ,IAAIa,GAAQ1B,EAAK2B,GAAiB,CAAErB,SAAUoB,GAAQA,EAAKtB,YAAeG,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAACE,EAAKgB,GAAsB,CAAElB,SAAU,YAAcE,EAAK,MAAO,CAAEF,SAAUgB,EAASc,WAAad,EAASc,WAAWlB,MAAQ,cAC/hB,CACA,SAASiB,IAAgBrB,SAAEA,EAAQL,UAAEA,IACjC,MAAM4B,EAAaC,EAAQ,KACvB,MAAMrB,EAAOP,GAAiBI,EAASG,KAAKN,YAAcG,EAASG,KACnE,MAAkB,WAAdA,EAAKL,MAAqBK,EAAKsB,QACxB/B,EAAKgC,GAAoB,CAAED,QAAStB,EAAKsB,UAE7B,SAAdtB,EAAKL,MAAmBK,EAAKwB,KAC3BjC,EAAKkC,GAAiB,CAAEC,OAAQ1B,EAAKwB,OAGrC,MAEZ,CAAC3B,EAASG,KAAKN,YAClB,OAAQI,EAAM,MAAO,CAAEN,UAAWmC,EAAK,OAAQnC,GAAYH,SAAU,CAACE,EAAKK,GAAmB,CAAEC,SAAUA,IAAaA,EAASiB,KAAOvB,EAAK,MAAO,CAAEC,UAAW,6BAA8BH,SAAUQ,EAASiB,MAAQM,GAAc7B,EAAK,MAAO,CAAEC,UAAW,uBAAwBH,SAAU+B,MACtS,CACA,SAASK,IAAgBC,OAAEA,IACvB,OAAOnC,EAAK,MAAO,CAAEC,UAAW,oCAAqCH,SAAUqC,EAAOtB,IAAI,CAACwB,EAAGC,IAAMtC,EAAKH,GAAO,CAAEE,WAAW,EAAMD,SAAUuC,GAAKC,KACtJ,CACA,SAASN,IAAmBD,QAAEA,IAC1B,OAAO/B,EAAKuC,GAAiB,CAAEtC,UAAW,oCAAqCuC,OAASC,GAAUlC,EAAM,MAAO,CAAEN,UAAW,8EAA+EH,SAAU,CAACE,EAAK0C,GAAY,CAAEC,OAAQF,IACjOzC,EAAK,MADqOyC,EAC9N,CAAE3C,SAAU,yBAER,CAAEA,SAAU,6BAAiC8C,KAAM5C,EAAK6C,GAAyB,CAAEC,WAAYf,KACnI,CACA,SAASc,IAAwBC,WAAEA,IAC/B,OAAQ9C,EAAK,MAAO,CAAEC,UAAW,iGAAkGH,SAAUgD,EAAWjC,IAAIa,GAAQ1B,EAAK2B,GAAiB,CAAErB,SAAUoB,EAAMzB,UAAW,aAAeyB,EAAKtB,QAC/O,CACA,SAASmC,IAAgBC,OAAEA,EAAMI,KAAEA,EAAI3C,UAAEA,EAAS8C,gBAAEA,IAChD,MAAOC,EAAYC,GAAeC,EAASH,IAAmB,GAC9D,OAAQxC,EAAM,MAAO,CAAEN,UAAWmC,EAAKY,EAAa,QAAU,eAAgB/C,GAAYH,SAAU,CAACE,EAAK,SAAU,CAAEC,UAAW,yBAA0BkD,QAAS,IAAMF,GAAaD,GAAalD,SAAUE,EAAKoD,EAAiB,CAAEtD,SAAU0C,EAAOQ,OAAmBhD,EAAKoD,EAAiB,CAAEtD,SAAUkD,GAAchD,EAAKqD,EAAOC,IAAK,CAAErD,UAAW,kBAAmBsD,QAAS,CAAEC,OAAQ,EAAGC,QAAS,GAAKC,QAAS,CAAEF,OAAQ,OAAQC,QAAS,GAAKE,KAAM,CAAEH,OAAQ,EAAGC,QAAS,GAAKG,WAAY,CAAEC,SAAU,GAAKC,KAAM,WAAahE,SAAU8C,QACvhB,CACA,SAASF,IAAWC,OAAEA,IAClB,OAAQ3C,EAAKoD,EAAiB,CAAEW,WAAW,EAAMC,KAAM,OAAQlE,SAAUE,EAAKqD,EAAOC,IAAK,CAAErD,UAAW,gDAAiDsD,QAAS,CAAEU,OAAQ,GAAKP,QAAS,CAAEO,OAAQtB,EAAS,GAAK,GAAKiB,WAAY,CAAEC,SAAU,IAAO/D,SAAU,KAAO,cAC1Q,CCnEO,SAASoE,IAAYjE,UAAEA,EAASkE,OAAEA,GAAS,IAC9C,OAAQ5D,EAAM,MAAO,CAAEN,UAAWmE,EAAG,0BAA2BD,EAAS,cAAgB,GAAIlE,GAAYH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,+FAAgGoE,MAAO,CAAEC,UAAW,gBAAiBC,eAAgB,cAAiBvE,EAAK,MAAO,CAAEC,UAAW,oGAAqGoE,MAAO,CAAEC,UAAW,gBAAiBC,eAAgB,cAAiBvE,EAAK,MAAO,CAAEC,UAAW,oGAAqGoE,MAAO,CAAEC,UAAW,gBAAiBC,eAAgB,gBAC9qB,CCDO,SAASC,IAAqBvE,UAAEA,EAASkE,OAAEA,GAAS,EAAKM,MAAEA,EAAQ,SAEtE,MAOMC,EAPiB,CACnBC,KAAM,oEACNC,OAAQ,wEACRC,KAAM,sEACNC,MAAO,wEACPC,MAAO,uEAE0BN,GACrC,OAAQlE,EAAM,MAAO,CAAEN,UAAWmE,EAAG,4BAA6BD,EAAS,cAAgB,GAAIlE,GAAYH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,4BAA4ByE,8DAA4E1E,EAAK,MAAO,CAAEC,UAAW,4BAA4ByE,mEAAiF1E,EAAK,MAAO,CAAEC,UAAW,4BAA4ByE,qEACtb,CACO,SAASM,IAAgB/E,UAAEA,EAASgF,KAAEA,EAAO,KAAIR,MAAEA,EAAQ,SAE9D,MAMMS,EAAe,CACjBP,KAAM,+BACNC,OAAQ,mCACRC,KAAM,+BACNC,MAAO,iCACPC,MAAO,kCAGX,OAAQxE,EAAM,OAAQ,CAAEN,UAAWmE,EAAG,gBAAiBnE,GAAYH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAWmE,EAAG,0EAA2Ec,EAAaT,MAAYzE,EAAK,OAAQ,CAAEC,UAAWmE,EAAG,6EAA8Ec,EAAaT,IAASJ,MAAO,CACvUc,KAAM,MACNC,IAAK,MACLC,kBAAmB,QACjBrF,EAAK,OAAQ,CAAEC,UAAWmE,EAAG,oCAAqCc,EAAaT,GAlB7E,CAChBa,GAAI,UACJC,GAAI,UACJC,GAAI,WAe6GP,QACzH,CACO,SAASQ,IAAUxF,UAAEA,EAASwE,MAAEA,EAAQ,SAC3C,MAAOiB,EAAMC,GAAWzC,EAAS,KAejC,OAPA0C,EAAU,KACN,MAAMC,EAAaC,YAAY,KAC3BH,EAAQI,GAAiB,MAATA,EAAe,KAClB,OAATA,EAAgB,MAAQ,MAC7B,KACH,MAAO,IAAMC,cAAcH,IAC5B,IACI7F,EAAK,OAAQ,CAAEC,UAAWmE,EAdZ,CACjBO,KAAM,mCACNC,OAAQ,uCACRC,KAAM,mCACNC,MAAO,qCACPC,MAAO,sCASsCN,GAAQ,YAAaxE,GAAYH,SAAU4F,GAChG,CACO,SAASO,IAAqBC,QAAEA,EAAOjG,UAAEA,EAASwE,MAAEA,EAAQ,SAC/D,MAAMS,EAAe,CACjBP,KAAM,CACFwB,IAAK,+BACLC,KAAM,oCAEVxB,OAAQ,CACJuB,IAAK,mCACLC,KAAM,wCAEVvB,KAAM,CACFsB,IAAK,+BACLC,KAAM,oCAEVtB,MAAO,CACHqB,IAAK,iCACLC,KAAM,sCAEVrB,MAAO,CACHoB,IAAK,iCACLC,KAAM,uCAGd,OAAQ7F,EAAM,MAAO,CAAEN,UAAWmE,EAAG,+BAAgCnE,GAAYH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,iBAAkBH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,eAAeiF,EAAaT,GAAO0B,oCAAsCnG,EAAK,MAAO,CAAEC,UAAW,eAAeiF,EAAaT,GAAO0B,kCAAmC9B,MAAO,CAAEgC,eAAgB,UAAarG,EAAK,MAAO,CAAEC,UAAW,eAAeiF,EAAaT,GAAO0B,kCAAmC9B,MAAO,CAAEgC,eAAgB,aAAiBrG,EAAK,MAAO,CAAEC,UAAW,GAAGiF,EAAaT,GAAO2B,2BAA4BtG,SAAUoG,MAC7lB,CACO,SAASI,IAAYrG,UAAEA,EAASwE,MAAEA,EAAQ,OAAM8B,MAAEA,EAAQ,KAAIL,QAAEA,IACnE,MAAOM,EAAUC,GAAevD,EAAS,KAClCwD,EAAWC,GAAgBzD,EAAS,eACpC0D,EAAOC,GAAY3D,EAAS,IAyEnC,OAzCA0C,EAAU,KACN,IAAIkB,EACAC,EAAiBC,KAAKC,MAC1B,MAAMC,EAAoB,KACtB,MAAMD,EAAMD,KAAKC,MACXE,EAAYF,EAAMF,EACxBA,EAAiBE,EACjBR,EAAYV,IAGR,MAAMqB,EAAkBR,GAASO,EAAY,IAE7C,IAAIE,EAAqB,eAAdX,EACLX,EAAOqB,EACPrB,EAAOqB,EAEb,OAAIC,GAAQ,IACRV,EAAa,cAEbE,EAAS,GAAsB,GAAhBS,KAAKC,UACb,IAEFF,GAAQ,IACbV,EAAa,cAEbE,EAAS,GAAsB,GAAhBS,KAAKC,UACb,KAGPD,KAAKC,SAAW,KAChBV,EAASd,GAAQuB,KAAKE,IAAI,GAAKF,KAAKG,IAAI,GAAK1B,GAAwB,GAAhBuB,KAAKC,SAAiB,QAExEF,KAEXP,EAAmBY,sBAAsBR,IAG7C,OADAJ,EAAmBY,sBAAsBR,GAClC,KACHS,qBAAqBb,KAE1B,CAACJ,EAAWE,IACPrG,EAAM,MAAO,CAAEN,UAAWmE,EAAG,sBAAuBnE,GAAYH,SAAU,CAACoG,GAAYlG,EAAK,MAAO,CAAEC,UAAW,uBAjD/F,CACrB0E,KAAM,mCACNC,OAAQ,uCACRC,KAAM,mCACNC,MAAO,qCACPC,MAAO,sCA4CqJN,UAAe3E,SAAUoG,IAAalG,EAAK,MAAO,CAAEC,UAAWmE,EAAG,kDA/D7M,CACjBO,KAAM,kCACNC,OAAQ,sCACRC,KAAM,kCACNC,MAAO,oCACPC,MAAO,qCA0DuRN,GAvE7Q,CACjBa,GAAI,OACJC,GAAI,OACJC,GAAI,OACJoC,GAAI,OACJC,KAAM,UAkE6StB,IAASzG,SAAUE,EAAK,MAAO,CAAEC,UAAWmE,EAAG,sBAxD9U,CACpBO,KAAM,iFACNC,OAAQ,yFACRC,KAAM,iFACNC,MAAO,qFACPC,MAAO,sFAmDkYN,IAASJ,MAAO,CACzYkC,MAAO,GAAGC,KACV5C,WAAY,oDAEpC,CACO,SAASkE,IAAa7H,UAAEA,EAASwE,MAAEA,EAAQ,OAAMQ,KAAEA,EAAO,OAE7D,MAAO8C,EAAYC,GAAiB9E,EAAS+E,MAAM,GAAGC,KAAK,KAErDC,EAAc,CAChB7C,GAAI,CAAEiB,MAAO,OAAQ/C,OAAQ,MAAO4E,SAAU,QAASC,IAAK,aAC5D9C,GAAI,CAAEgB,MAAO,OAAQ/C,OAAQ,MAAO4E,SAAU,MAAOC,IAAK,aAC1D7C,GAAI,CAAEe,MAAO,OAAQ/C,OAAQ,MAAO4E,SAAU,QAASC,IAAK,UAG1DnD,EAAe,CACjBP,KAAM,iFACNC,OAAQ,yFACRC,KAAM,iFACNC,MAAO,qFACPC,MAAO,sFAwBX,OArBAa,EAAU,KACN,IAAIkB,EACJ,MAAMwB,EAAS,CAAC,IAAK,EAAK,IAAK,GAAK,IAAK,GAAK,KACxCC,EAAS,CAAC,EAAG,GAAK,EAAG,IAAK,EAAG,IAAK,GACxC,IAAIC,EAAO,EACX,MAAMC,EAAc,KAChBD,GAAQ,IAER,MAAME,EAAaX,EAAWlH,IAAI,CAAC8H,EAAGC,IAG3B,GAA4D,IAAtDtB,KAAKuB,IAAIL,EAAOF,EAAOM,GAASL,EAAOK,IAAU,IAElEZ,EAAcU,GACd5B,EAAmBY,sBAAsBe,IAG7C,OADA3B,EAAmBY,sBAAsBe,GAClC,KACHd,qBAAqBb,KAE1B,IACK9G,EAAK,MAAO,CAAEC,UAAWmE,EAAG,gCAAiC+D,EAAYlD,GAAMsB,MAAO4B,EAAYlD,GAAMzB,OAAQ2E,EAAYlD,GAAMoD,IAAKpI,GAAYH,SAAUiI,EAAWlH,IAAI,CAAC2C,EAAQlB,IAAOtC,EAAK,MAAO,CAAEC,UAAWmE,EAAG+D,EAAYlD,GAAMmD,SAAU,6BAA8BlD,EAAaT,IAASJ,MAAO,CAC3Sb,OAAQ,GAAGA,KACXI,WAAY,8CACZH,QAAS,KACRnB,KACjB,CC1MA,MAAMwG,GAAuBC,EAAc,MACpC,SAASC,KACZ,MAAMC,EAAMC,EAAWJ,IACvB,OAAKG,GAEM,CACHE,UAAYC,GAAQC,OAAOC,KAAKF,EAAK,UACrCG,WAAY,OAIxB,CACO,SAASC,IAAsB1J,SAAEA,IACpC,MAAO2J,EAAOC,GAAYxG,EAAS,MAC7BiG,EAAYQ,EAAY,CAACP,EAAKQ,KAChCF,EAAS,CAAEN,MAAKQ,SACjB,IACGL,EAAaI,EAAY,KAC3BD,EAAS,OACV,IACH,OAAQnJ,EAAMuI,GAAqBe,SAAU,CAAEnJ,MAAO,CAAEyI,YAAWI,cAAczJ,SAAU,CAACA,EAAU2J,GAAUzJ,EAAK,MAAO,CAAEC,UAAW,sFAAuFkD,QAASoG,EAAYzJ,SAAUS,EAAM,MAAO,CAAEN,UAAW,qCAAsCH,SAAU,CAACE,EAAK,MAAO,CAAEoJ,IAAKK,EAAML,IAAKQ,IAAKH,EAAMG,KAAO,gBAAiB3J,UAAW,iEAAmED,EAAK,SAAU,CAAEC,UAAW,qGAAsGkD,QAASoG,EAAYjI,MAAO,QAASxB,SAAUE,EAAK8J,GAAG,CAAE7J,UAAW,aAAgBD,EAAK,IAAK,CAAE+J,KAAMN,EAAML,IAAKY,OAAQ,SAAUC,IAAK,sBAAuBhK,UAAW,wGAAyGkD,QAAU+G,GAAMA,EAAEC,kBAAmB7I,MAAO,kBAAmBxB,SAAUE,EAAKoK,GAAc,CAAEnK,UAAW,oBAC39B,CCmDA,MAAMoK,GAAqBC,EArE3B,UAAqCpE,QAAEA,EAAOqE,UAAEA,EAASC,UAAEA,GAAY,IACnE,MAAOxH,EAAYyH,GAAiBvH,GAAS,GACvCwH,EAAQC,KACRC,UAAEA,EAASC,MAAEA,EAAKC,UAAEA,EAASC,UAAEA,EAASC,OAAEA,EAAMC,MAAEA,EAAKC,WAAEA,EAAUC,aAAEA,GAAiBZ,EACtF/D,EAAWqE,EAAQ,EAAKC,EAAYD,EAAS,IAAM,EACnDO,EAAYJ,EAAS,EACrBK,EAAaP,IAAcD,IAAUL,EAWrCc,EAREd,IAAca,EACP,UACPL,IAAWH,EACJ,QACPG,EAAS,EACF,UACJ,YA+CLO,IAHWJ,EACXA,EAAeD,EACflE,KAAKC,MAAQiE,GACa,KAAMM,QAAQ,GAC9C,OAAQjL,EAAM,MAAO,CAAEN,UAAW,cA9BR,cAAlBqL,EACO,mBACW,UAAlBA,EACO,uBACW,YAAlBA,EACO,qBACJ,+EAwBkHxL,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,mJAAoJkD,QAAS,IAAMsH,GAAezH,GAAalD,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CA3Cna0K,IAAca,EACPrL,EAAKgF,GAAiB,CAAEC,KAAM,KAAMR,MAAO,SAEhC,cAAlB6G,EACOtL,EAAKyL,GAAa,CAAExL,UAAW,wBAEpB,UAAlBqL,GAA+C,YAAlBA,EACtBtL,EAAK0L,GAAa,CAAEzL,UAAW,4BAEnCD,EAAK2L,GAAQ,CAAE1L,UAAW,2BAkCgaD,EAAK,OAAQ,CAAEC,UAAW,iCAAkCH,SAAU,UAAYE,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAU8K,IAAcrK,EAAM,OAAQ,CAAEN,UAAW,qBAAsBH,SAAU,CAACgL,EAAW,IAAKD,KAAyB7K,EAAdgD,EAAmB4I,GAA0DC,GAA7C,CAAE5L,UAAW,yBAAwFM,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACS,EAAM,OAAQ,CAAEN,UAAW,qBAAsBH,SAAU,CAACyL,EAAa,OAASvL,EAAK,OAAQ,CAAEC,UAAW,qBAAsBH,SAAUgM,GAAMZ,GAAYa,OAAO,cAAgB/L,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAAU+G,IACzmCA,EAAEC,kBAfV,MACpB,MAAM+B,EAAUC,KAAKC,UAAU7B,EAAW,KAAM,GAChD8B,UAAUC,UAAUC,UAAUL,GAASM,KAAK,KACxC9B,EAAM,CACF+B,OAAQ,UACRnL,MAAO,oCACPuC,SAAU,SAUU6I,IACDzM,UAAW,aAAcqB,MAAO,qBAAsBxB,SAAUE,EAAK2M,GAAU,CAAE1M,UAAW,mBAAwBD,EAAK,MAAO,CAAEC,UAAW,8CAA+CH,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,uEAAwEH,SAAUE,EAAK,MAAO,CAAEC,UAAW,UAvBjamL,EACO,eACPC,EACO,aACJ,qDAmBmehH,MAAO,CAAEkC,MAAO,GAAGC,UAAqBjG,EAAM,MAAO,CAAEN,UAAW,kCAAmCH,SAAU,CAACiL,EAAY,GAAMxK,EAAM,OAAQ,CAAEN,UAAW,uCAAwCH,SAAU,CAACE,EAAKyL,GAAa,CAAExL,UAAW,WAAa8K,KAAgBC,EAAS,GAAMzK,EAAM,OAAQ,CAAEN,UAAW,2CAA4CH,SAAU,CAACE,EAAK0L,GAAa,CAAEzL,UAAW,WAAa+K,KAAaR,GAAaM,EAAYD,GAAUtK,EAAM,OAAQ,CAAEN,UAAW,wCAAyCH,SAAU,CAACE,EAAK4M,GAAS,CAAE3M,UAAW,wBAA0B4K,EAAQC,aAA2B9H,GAAciI,EAAM4B,OAAS,GAAM7M,EAAK,MAAO,CAAEC,UAAW,2BAA4BH,SAAUmL,EAAMpK,IAAKiM,GAAUvM,EAAM,MAAO,CAAEN,UAAW,uJAAwJH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,oBAAqBH,SAAU,CAAiB,YAAhBgN,EAAKL,QAAyBzM,EAAKyL,GAAa,CAAExL,UAAW,wBAA2C,UAAhB6M,EAAKL,QAAuBzM,EAAK0L,GAAa,CAAEzL,UAAW,4BAA+C,YAAhB6M,EAAKL,QAAyBzM,EAAK4M,GAAS,CAAE3M,UAAW,sCAAyD,YAAhB6M,EAAKL,QAAyBzM,EAAK,MAAO,CAAEC,UAAW,uEAA2ED,EAAK,OAAQ,CAAEC,UAAW,mDAAoDqB,MAAOwL,EAAK1L,GAAItB,SAAUgN,EAAK1L,KAAOpB,EAAK,OAAQ,CAAEC,UAAW,6BAA8BqB,MAAOwL,EAAK5G,QAASpG,SAAUgN,EAAK5G,UAA4B,YAAhB4G,EAAKL,OAAuB,aAAe,WAA6BM,IAArBD,EAAKE,aAA8BzM,EAAM,OAAQ,CAAEN,UAAW,2BAA4BH,SAAU,EAAEgN,EAAKE,YAAc,KAAMxB,QAAQ,GAAI,SAAasB,EAAK1L,QAAY4B,GAAckD,EAAQA,SAAYlG,EAAK,MAAO,CAAEC,UAAW,+BAAgCH,SAAUoG,EAAQA,YAC34E,EAE6D,CAAC+G,EAAWC,IACjED,EAAUzC,YAAc0C,EAAU1C,YAElCyC,EAAU1C,UAAUO,YAAcoC,EAAU3C,UAAUO,YAEtDmC,EAAU1C,UAAUQ,YAAcmC,EAAU3C,UAAUQ,WAEtDkC,EAAU1C,UAAUS,SAAWkC,EAAU3C,UAAUS,UC9ErDmC,GAAiB,CACnBC,QAAS,CACLC,OAAQ,qBACRC,GAAI,mCACJC,KAAM,kBAEVC,QAAS,CACLH,OAAQ,uBACRC,GAAI,+BACJC,KAAM,oBAEVE,KAAM,CACFJ,OAAQ,gBACRC,GAAI,iCACJC,KAAM,aAEVG,QAAS,CACLL,OAAQ,mBACRC,GAAI,mCACJC,KAAM,iBAGRI,GAAgB,CAClBP,QAASQ,GACTJ,QAAS9B,GACT+B,KAAMI,GACNH,QAASjC,IAQN,SAASqC,IAAcC,SAAEA,EAAQC,YAAEA,EAAWC,QAAEA,EAAOC,SAAEA,EAAQC,cAAEA,EAAaC,SAAEA,EAAQC,kBAAEA,GAAoB,EAAKC,YAAEA,GAAc,EAAKC,YAAEA,EAAc,wBAAuBC,UAAEA,GAAY,EAAKjB,KAAEA,EAAItB,QAAEA,EAAU,UAASwC,SAAEA,GAAW,EAAKC,WAAEA,GAAa,EAAKzO,UAE5QA,EAAS0O,cAAEA,EAAaC,gBAAEA,EAAeC,cAAEA,EAAaC,kBAAEA,EAAiBC,qBAAEA,EAAoBC,iBAAEA,EAAgBC,gBAAEA,EAAeC,wBAAEA,EAAuBC,eAAEA,EAAcC,sBAAEA,IAC3K,MAAOC,EAAYC,GAAiBC,EAAMrM,SAAS,KAC5CsM,EAAiBC,GAAsBF,EAAMrM,SAAS,IAAIwM,KAC3DC,EAAWJ,EAAMK,OAAO,MACxBC,EAAS1C,GAAelB,GACxB6D,EAAcnC,GAAc1B,GAmB5B8D,EAAe,KACbV,EAAWW,QAAU5B,IACrBA,EAASiB,EAAWW,QACpBV,EAAc,MAShBW,EAAcvB,EAAa,GAAK,cAAcmB,EAAOxC,SAC3D,OAAQrN,EAAK,MAAO,CAAEC,UAAW,QAAQA,GAAa,KAAMH,SAAUS,EAAM,MAAO,CAAEN,UAAW,GAAGgQ,KAAeJ,EAAOvC,6BAA6BqB,GAAiB,KAAM7O,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,aAAa2O,GAAmB,KAAM9O,SAAUS,EAAM,MAAO,CAAEN,UAAW,yBAA0BH,SAAU,EAAE2O,GAAazO,EAAK,MAAO,CAAEC,UAAW,wBAAwB4P,EAAOtC,QAAQsB,GAAiB,KAAM/O,SAAUyN,GAAQvN,EAAK8P,EAAa,CAAE7P,UAAW,aAAiBM,EAAM,MAAO,CAAEN,UAAW,iBAAkBH,SAAU,CAACE,EAAK,KAAM,CAAEC,UAAW,0DAA0D6O,GAAqB,KAAMhP,SAAUiO,IAAaC,GAAgBhO,EAAK,IAAK,CAAEC,UAAW,iDAAiD8O,GAAwB,KAAMjP,SAAUkO,YAA4BC,GAAWA,EAAQpB,OAAS,GAAM7M,EAAK,MAAO,CAAEC,UAAW,kBAAkB+O,GAAoB,KAAMlP,SAAUwO,EAE/5B/N,EAAM,MAAO,CAAEN,UAAW,YAAaH,SAAU,CAACmO,EAAQpN,IAAKqP,IACnD,MAAMC,EAAY5P,EAAM,QAAS,CAAEN,UAAW,kIAC5BuP,EAAgBY,IAAIF,EAAO9O,IACnC,6EACA,oKACQoN,EAAY,gCAAkC,KAAM1O,SAAU,CAACE,EAAK,QAAS,CAAES,KAAM,WAAY4P,QAASb,EAAgBY,IAAIF,EAAO9O,IAAKkP,SAAU,KAAMC,OAtClLC,EAsC+LN,EAAO9O,QArCxNqO,EAAoB1J,IAChB,MAAMsB,EAAO,IAAIqI,IAAI3J,GAOrB,OANIsB,EAAK+I,IAAII,GACTnJ,EAAKoJ,OAAOD,GAGZnJ,EAAKqJ,IAAIF,GAENnJ,IATM,IAACmJ,GAsC2MG,SAAUnC,EAAWvO,UAAW,4GAA8GM,EAAM,OAAQ,CAAEN,UAAW,mEAAoEH,SAAU,CAACoQ,EAAO3C,KAAM2C,EAAOU,YACjd,OAAOV,EAAOlC,YAAehO,EAAK6Q,EAAU,CAAE7C,YAAakC,EAAOlC,YAAa8C,UAAW,QAASC,SAAS,EAAMjR,SAAUqQ,GAAYD,EAAO9O,IAAQpB,EAAKuP,EAAMyB,SAAU,CAAElR,SAAUqQ,GAAYD,EAAO9O,MAC3MpB,EAAK,MAAO,CAAEC,UAAW,OAAQH,SAAUS,EAAMyL,EAAQ,CAAE/G,KAAM,KAAM9B,QA5BzE,KAClBqM,EAAgBvK,KAAO,GAAKkJ,IAC5BA,EAAclG,MAAMgJ,KAAKzB,IACzBC,EAAmB,IAAIC,OAyBgGiB,SAAUnC,GAAsC,IAAzBgB,EAAgBvK,KAAYhF,UAAW,0BAA2BH,SAAU,CAACE,EAAKkR,GAAM,CAAEjR,UAAW,WAAa,mBAAoBuP,EAAgBvK,KAAO,EAAI,KAAKuK,EAAgBvK,QAAU,WAEtUjF,EAAK,MAAO,CAAEC,UAAW,uBAAwBH,SAAUmO,EAAQpN,IAAKqP,IAChE,MAAM1N,EAAUjC,EAAMyL,EAAQ,CAAEC,QAAS,UAAWhH,KAAM,KAAM9B,QAAS,IAAM+K,IAAWgC,EAAO9O,IAAKuP,SAAUnC,EAAWvO,UAAW,2BAA2BgP,GAAmB,KAAMnP,SAAU,CAACoQ,EAAO3C,KAAM2C,EAAOU,SACzN,OAAOV,EAAOlC,YAAehO,EAAK6Q,EAAU,CAAE7C,YAAakC,EAAOlC,YAAa8C,UAAW,MAAOC,SAAS,EAAMjR,SAAU0C,GAAU0N,EAAO9O,IAAQpB,EAAKuP,EAAMyB,SAAU,CAAElR,SAAU0C,GAAU0N,EAAO9O,UAC7LiN,GAAsBrO,EAAK,MAAO,CAAEC,UAAW,kBAAkBiP,GAA2B,KAAMpP,SAAUS,EAAM,MAAO,CAAEN,UAAW,aAAcH,SAAU,CAACE,EAAK,QAAS,CAAEqB,IAAKsO,EAAUlP,KAAM,OAAQC,MAAO2O,EAAYiB,SAAWpG,GAAMoF,EAAcpF,EAAEF,OAAOtJ,OAAQyQ,UArBxRjH,IACL,UAAVA,EAAEkH,KAAoBlH,EAAEmH,WACxBnH,EAAEoH,iBACFvB,MAkBiUxB,YAAaA,EAAaoC,SAAUnC,EAAWvO,UAAW,uKAAuKkP,GAAkB,OAASnP,EAAKgM,EAAQ,CAAE/G,KAAM,KAAM9B,QAAS4M,EAAcY,SAAUnC,IAAca,EAAWW,OAAQ/P,UAAWmP,EAAuBtP,SAAU0O,EAAY,MAAQ,kBACtuB,CACO,SAAS+C,IAAmBxD,SAAEA,EAAQC,YAAEA,EAAWwD,UAAEA,EAASC,SAAEA,EAAQC,aAAEA,EAAe,MAAKC,YAAEA,EAAc,KAAInD,UAAEA,GAAY,EAAKvC,QAAEA,EAAU,UAAShM,UAAEA,IAC/J,OAAQD,EAAK8N,GAAe,CAAEC,SAAUA,EAAUC,YAAaA,EAAa/B,QAASA,EAASuC,UAAWA,EAAWvO,UAAWA,EAAWgO,QAAS,CAC3I,CACI7M,GAAI,UACJwP,MAAOc,EACPnE,KAAMvN,EAAKyL,GAAa,CAAExL,UAAW,YAEzC,CACImB,GAAI,SACJwP,MAAOe,EACPpE,KAAMvN,EAAK4R,GAAS,CAAE3R,UAAW,aAEtCiO,SAAW9M,IACC,YAAPA,EACAoQ,IAEAC,MAEhB,CC/GY,MAACI,GAAmB,CAE5B,6BACA,2BACA,+BACA,sBAEA,+BACA,2BACA,iCACA,oCACA,mCACA,iCACA,iCACA,4BACA,iCACA,mCAEA,+BACA,4BACA,oCACA,kCACA,gCACA,iCACA,mCACA,kCACA,oCACA,iCAEA,wBACA,8BACA,gCACA,kCACA,mCACA,gCAEA,6BACA,sCACA,8BACA,iCAEA,kCACA,+BACA,sCACA,oCACA,uCAEA,4BACA,wCACA,oCACA,gCACA,oCAEA,iCACA,mCACA,iCACA,iCACA,kCCvDG,SAASC,GAAwBC,EAAKC,GACzC,MAAMC,EAA2B,iBAAhBD,EAAEE,UAAyBF,EAAEE,UAAY,IAAIlL,KAAKgL,EAAEE,WAAWC,UAC1EC,EAAML,EAAIM,UAAWC,IACW,iBAAhBA,EAAEJ,UAAyBI,EAAEJ,UAAY,IAAIlL,KAAKsL,EAAEJ,WAAWC,WACrEF,IAEJ,IAARG,EACAL,EAAIQ,KAAKP,GAETD,EAAIS,OAAOJ,EAAK,EAAGJ,EAC3B,CAMO,MAAMS,GAAc,CACvBC,GAAiBC,SACjBD,GAAiBE,KACjBF,GAAiBG,cACjBH,GAAiBI,YAuEd,SAASC,GAAgB7M,GAE5B,OAAIA,EAAQ8M,eAEJ9M,EAAQzF,OAASiS,GAAiBC,UAClCM,QAAQC,IAAI,yDAA0DhN,EAAQ8M,eAE3E9M,EAAQ8M,gBAGf9M,EAAQzF,OAASiS,GAAiBC,UAClCM,QAAQC,IAAI,kFAGT,OACX,CAsDO,SAASC,GAAkBjN,GAC9B,OAAOA,EAAQzF,OAASiS,GAAiBU,WAAalN,EAAQmN,SAASC,IAC3E,CAIO,SAASC,GAAarN,GACzB,OAAOA,EAAQmN,SAASG,WAC5B,CAKO,SAASC,GAAiBvN,GAC7B,OAAOA,EAAQmN,SAASK,cAC5B,CAIO,SAASC,GAAczN,GAC1B,OAAOA,EAAQmN,SAASO,WAC5B,CA6CA,SAASC,GAAe3B,GACpB,MAA4B,iBAAdA,EAAyBA,EAAY,IAAIlL,KAAKkL,GAAWC,SAC3E,CAYO,SAAS2B,GAA2BC,EAAUC,EAAmBC,GAEpE,MAAMC,EAAkB,IAAIC,IAEtBC,EAAgB,IAAID,IAEpBE,EAAqB,GAC3B,IAAK,MAAMnO,KAAW6N,EAClB,GAAIZ,GAAkBjN,GAAU,CAC5B,MAAMoO,EAAgBb,GAAiBvN,GACjCqO,EAAYhB,GAAarN,QACT6G,IAAlBuH,GAEKJ,EAAgB9D,IAAIkE,IACrBJ,EAAgBM,IAAIF,EAAe,CAC/BP,SAAU,GACVU,eAAgBZ,GAAe3N,EAAQgM,aAG/CgC,EAAgBQ,IAAIJ,GAAeP,SAASxB,KAAKrM,IAE5CqO,GAEAH,EAAchE,IAAImE,IACnBH,EAAcI,IAAID,EAAW,CACzBR,SAAU,GACVU,eAAgBZ,GAAe3N,EAAQgM,aAG/CkC,EAAcM,IAAIH,GAAWR,SAASxB,KAAKrM,IAI3CmO,EAAmB9B,KAAKrM,EAEhC,MAEImO,EAAmB9B,KAAKrM,GAGhC,MAAM+E,EAAQ,GAEdiJ,EAAgBS,QAAQ,CAACC,EAAOC,KAC5B5J,EAAMsH,KAAK,CACPuC,KAAM,kBACND,YACAd,SAAUa,EAAMb,SAChB7B,UAAW0C,EAAMH,mBAIzBL,EAAcO,QAAQ,CAACC,EAAOL,KAC1BtJ,EAAMsH,KAAK,CACPuC,KAAM,WACNP,YACAR,SAAUa,EAAMb,SAChB7B,UAAW0C,EAAMH,mBAIzB,IAAK,MAAMvO,KAAWmO,EAClBpJ,EAAMsH,KAAK,CACPuC,KAAM,UACN5O,UACAgM,UAAW2B,GAAe3N,EAAQgM,aAI1C8B,EAAkBW,QAAQ,CAACI,EAAMC,KAE7B,GAAKD,EAAK3O,KAAV,CAGA,GAAI6N,GAAyC,QAArBA,EAA4B,CAChD,MAAMgB,EAAmBF,EAAKG,cAAgB,OAC9C,GAAIjB,IAAqBgB,EACrB,MACR,CACAhK,EAAMsH,KAAK,CACPuC,KAAM,YACNE,cACAD,OACA7C,UAAW6C,EAAKI,gBAXhB,IAeRlK,EAAMmK,KAAK,CAAC9C,EAAG+C,IAEI,cAAX/C,EAAEwC,MAAmC,cAAXO,EAAEP,KACrB,EACI,cAAXO,EAAEP,MAAmC,cAAXxC,EAAEwC,MACrB,EAEJxC,EAAEJ,UAAYmD,EAAEnD,WAG3B,MAAMoD,EAAS,GACf,IAAIC,EAAmB,GACvB,MAAMC,EAAiB,KACfD,EAAiB1I,OAAS,IACM,IAA5B0I,EAAiB1I,OACjByI,EAAO/C,KAAK,CAAE9R,KAAM,SAAUyF,QAASqP,EAAiB,KAGxDD,EAAO/C,KAAK,CACR9R,KAAM,aACNsT,SAAUwB,EACVd,eAAgBZ,GAAe0B,EAAiB,GAAGrD,aAG3DqD,EAAmB,KAG3B,IAAK,MAAMzI,KAAQ7B,EACf,GAAkB,cAAd6B,EAAKgI,KAELU,IACAF,EAAO/C,KAAK,CACR9R,KAAM,YACNuU,YAAalI,EAAKkI,YAClB5O,KAAM0G,EAAKiI,KAAK3O,KAChB8O,aAAcpI,EAAKiI,KAAKG,aACxBC,eAAgBrI,EAAKiI,KAAKI,eAC1B9J,WAAYyB,EAAKiI,KAAK1J,kBAGzB,GAAkB,oBAAdyB,EAAKgI,KAA4B,CAEtCU,IAEA,MAAMC,EAAiB,IAAI3I,EAAKiH,UAAUqB,KAAK,CAAC9C,EAAG+C,IAAMxB,GAAevB,EAAEJ,WAAa2B,GAAewB,EAAEnD,YAElGwD,EAAeD,EAAeE,OAAO,CAAClJ,EAAQmJ,IAAQjC,GAAciC,IAAQnJ,OAAQM,GAC1FuI,EAAO/C,KAAK,CACR9R,KAAM,aACNsT,SAAU0B,EACVhB,eAAgB3H,EAAKoF,UACrB2D,WAAYH,GAEpB,MACK,GAAkB,aAAd5I,EAAKgI,KAAqB,CAE/BU,IAEA,MAAMC,EAAiB,IAAI3I,EAAKiH,UAAUqB,KAAK,CAAC9C,EAAG+C,IAAMxB,GAAevB,EAAEJ,WAAa2B,GAAewB,EAAEnD,YAElGwD,EAAeD,EAAeE,OAAO,CAAClJ,EAAQmJ,IAAQjC,GAAciC,IAAQnJ,OAAQM,GAC1FuI,EAAO/C,KAAK,CACR9R,KAAM,aACNsT,SAAU0B,EACVhB,eAAgB3H,EAAKoF,UACrBqC,UAAWzH,EAAKyH,UAChBsB,WAAYH,GAEpB,MACSvC,GAAkBrG,EAAK5G,SAE5BqP,EAAiBhD,KAAKzF,EAAK5G,UAI3BsP,IACAF,EAAO/C,KAAK,CAAE9R,KAAM,SAAUyF,QAAS4G,EAAK5G,WAKpD,OADAsP,IACOF,CACX,CCxZA,MAAMQ,GAA0B/M,EAAc,MAKvC,SAASgN,IAAyBjW,SAAEA,IACvC,MAAMkW,EAAWpG,EAAO,IAAIuE,KACtB8B,EAAarG,EAAO,IAAIuE,KACxB+B,EAASvM,EAAayH,GACjB4E,EAASG,QAAQzB,IAAItD,GAC7B,IACGgF,EAASzM,EAAY,CAACyH,EAAKiF,KAC7BL,EAASG,QAAQ3B,IAAIpD,EAAKiF,IAC3B,IACGC,EAAa3M,EAAY4M,MAAOnF,EAAKoF,KAEvC,MAAMC,EAAST,EAASG,QAAQzB,IAAItD,GACpC,GAAIqF,EACA,OAAOA,EAGX,MAAMC,EAAUT,EAAWE,QAAQzB,IAAItD,GACvC,GAAIsF,EACA,OAAOA,EAGX,MAAMC,EAAUH,IAAUhK,KAAM6J,IAC5BL,EAASG,QAAQ3B,IAAIpD,EAAKiF,GAC1BJ,EAAWE,QAAQ1F,OAAOW,GACnBiF,IACRO,MAAOC,IAEN,MADAZ,EAAWE,QAAQ1F,OAAOW,GACpByF,IAGV,OADAZ,EAAWE,QAAQ3B,IAAIpD,EAAKuF,GACrBA,GACR,IACGjW,EAAQ6O,EAAMzN,QAAQ,KAAA,CAASoU,SAAQE,SAAQE,eAAe,CAACJ,EAAQE,EAAQE,IACrF,OAAQtW,EAAK8V,GAAwBjM,SAAU,CAAEnJ,MAAOA,EAAOZ,SAAUA,GAC7E,CAKO,SAASgX,KACZ,OAAO5N,EAAW4M,GACtB,CAIO,SAASiB,GAAoBC,EAAOC,EAAMC,EAAc,UAC3D,MAAO,YAAYF,KAASC,KAAQC,GACxC,CAIO,SAASC,GAAgBF,GAC5B,MAAO,QAAQA,GACnB,CCNA,MAAMG,GAAiB,CACnB,CAAC1E,GAAiB2E,QAAS,CAAEC,YAAa,gBAAiBC,QAAS,UAAWC,UAAW,YAAaC,OAAQ,QAASC,KAAMC,IAC9H,CAACjF,GAAiBC,UAAW,CAAE2E,YAAa,mBAAoBC,QAAS,aAAcC,UAAW,eAAgBC,OAAQ,YAAaC,KAAMjM,IAC7I,CAACiH,GAAiBE,MAAO,CAAE0E,YAAa,gBAAiBC,QAAS,aAAcC,UAAW,YAAaC,OAAQ,QAASC,KAAME,IAC/H,CAAClF,GAAiBG,eAAgB,CAAEyE,YAAa,qBAAsBC,QAAS,eAAgBC,UAAW,iBAAkBC,OAAQ,QAASC,KAAMG,IACpJ,CAACnF,GAAiBoF,UAAW,CAAER,YAAa,iBAAkBC,QAAS,WAAYC,UAAW,aAAcC,OAAQ,OAAQC,KAAMG,IAClI,CAACnF,GAAiBU,SAAU,CAAEkE,YAAa,sBAAuBC,QAAS,wCAAyCC,UAAW,uCAAwCC,OAAQ,QAASC,KAAMC,IAC9L,CAACjF,GAAiBqF,OAAQ,CAAET,YAAa,uBAAwBC,QAAS,iBAAkBC,UAAW,mBAAoBC,OAAQ,QAASC,KAAMhM,IAClJ,CAACgH,GAAiBsF,QAAS,CAAEV,YAAa,mBAAoBC,QAAS,aAAcC,UAAW,eAAgBC,OAAQ,SAAUC,KAAMO,IACxI,CAACvF,GAAiBwF,MAAO,CAAEZ,YAAa,qBAAsBC,QAAS,eAAgBC,UAAW,iBAAkBC,OAAQ,OAAQC,KAAM7J,IAC1I,CAAC6E,GAAiBI,YAAa,CAAEwE,YAAa,iBAAkBC,QAAS,WAAYC,UAAW,aAAcC,OAAQ,aAAcC,KAAMjM,IAC1I,CAACiH,GAAiByF,SAAU,CAAEb,YAAa,qBAAsBC,QAAS,eAAgBC,UAAW,iBAAkBC,OAAQ,UAAWC,KAAMhM,IAChJ,CAACgH,GAAiB0F,QAAS,CAAEd,YAAa,iBAAkBC,QAAS,WAAYC,UAAW,aAAcC,OAAQ,SAAUC,KAAMO,IAClI,CAACvF,GAAiB2F,iBAAkB,CAAEf,YAAa,gBAAiBC,QAAS,UAAWC,UAAW,YAAaC,OAAQ,QAASC,KAAMC,IACvI,CAACjF,GAAiB4F,gBAAiB,CAAEhB,YAAa,oBAAqBC,QAAS,oCAAqCC,UAAW,mCAAoCC,OAAQ,QAASC,KAAM/L,IAC3LyB,QAAS,CAAEkK,YAAa,iBAAkBC,QAAS,WAAYC,UAAW,aAAcC,OAAQ,QAASC,KAAMC,KAgK9G,MAACY,GAAcjO,EA9JpB,UAA8BpE,QAAEA,EAAOsS,oBAAEA,GAAsB,EAAKC,cAAEA,EAAaxY,UAAEA,EAAS0O,cAAEA,EAAaC,gBAAEA,EAAe8J,iBAAEA,EAAgBC,mBAAEA,EAAkBC,gBAAEA,EAAe/J,cAAEA,EAAagK,iBAAEA,EAAgBC,mBAAEA,IACpN,MAAOC,EAAaC,GAAkB9V,GAAS,IACzC+V,OAAEA,GAAWC,KACbxO,EAAQC,IACRwO,EAAWrC,MACX3N,UAAEA,GAAcH,KAEhB6G,EAASuH,GAAelR,EAAQzF,OAAS2W,GAAehK,QAExDgM,EAAiBtX,EAAQ,KAC3B,IAAIoK,EAAU,GAgBd,GAfIhG,EAAQA,UAIJgG,EAF2B,iBAApBhG,EAAQA,QAELiG,KAAKC,UAAUlG,EAAQA,QAAS,KAAM,GAE3CA,EAAQA,QAAQ8J,KACX9J,EAAQA,QAAQ8J,OAIhBqJ,OAAOnT,EAAQA,UAIV,iBAAZgG,GAAwBA,EAAQoN,SAAS,sBAAuB,CAEvE,MAAMC,EAAcjS,KAAKkS,MAAMlS,KAAKC,SAAWsK,GAAiBhF,QAChEX,EAAUA,EAAQuN,QAAQ,sBAAuB5H,GAAiB0H,GACtE,CACA,OAAOrN,GACR,CAAChG,EAAQA,UAENwT,EAAmB5X,EAAQ,IACxBsX,EAzFb,SAAmClN,EAASyN,EAAaC,GAErD,GAAuB,iBAAZ1N,EACP,OAAOA,EAGX,GAAIyN,IAAgBjH,GAAiBU,SACL,iBAApBwG,IACHA,EAAgBC,cAAcP,SAAS,mBACpCM,EAAgBC,cAAcP,SAAS,iBACvCM,EAAgBC,cAAcP,SAAS,OAAS,CACxD,IAAIQ,EAAmB5N,EAgBvB,MAdI,aAAa6N,KAAKD,KAElBA,EAAmBA,EAAiBL,QAAQ,kCAAmC,UAE/EK,EAAmBA,EAAiBL,QAAQ,+BAAgC,WAG5EK,EAAiBR,SAAS,OAASQ,EAAiBR,SAAS,UAC7DQ,EAAmBA,EAAiBL,QAAQ,iEAAkE,WAG9GK,EAAiBR,SAAS,SAC1BQ,EAAmBA,EAAiBL,QAAQ,WAAY,SAErDK,CACX,CAEA,MAAI,aAAaC,KAAK7N,KAAaA,EAAQoN,SAAS,QAEzCpN,EAAQuN,QAAQ,kCAAmC,UAEvDvN,CACX,CAwDe8N,CAA0BZ,EAAgBlT,EAAQzF,KAAiC,iBAApByF,EAAQA,QAAuBA,EAAQA,aAAU6G,GAD5G,GAEZ,CAACqM,EAAgBlT,EAAQzF,KAAMyF,EAAQA,UAmBpC+T,EAAiB/N,IAEnB,GAAuB,iBAAZA,EACP,OAAQlM,EAAK,MAAO,CAAEC,UAAW,gHAAiHH,SAAUqM,KAAKC,UAAUF,EAAS,KAAM,KAG9L,MAAM8K,EAAQ9Q,EAAQgU,gBACtB,OAAQla,EAAK,MAAO,CAAEC,UAAW,gNAAiNH,SAAUE,EAAKma,GAAkB,CAAEC,cAAepD,EAAOqD,iBAAmB7J,GAAaiI,IAAgBjI,GAAW8J,iBAAmBlU,GAASqS,IAAgBrS,GAAOmU,WAAY,CACzZjI,EAAG,EAAGkI,OAAMnZ,SAAQoZ,MAChB,MAAM1Q,EAAO0Q,EAAM1Q,MAAQ,GAC3B,OAAIA,EAAKuP,SAAS,kBACNtZ,EAAK0a,GAAS,CAAE3Q,KAAMA,EAAM4Q,aAAa,EAAM7a,SAAU2a,EAAM3a,WAEnEE,EAAK,IAAK,IAAKya,EAAOzQ,OAAQ,SAAUC,IAAK,yBAEzD2Q,IAAK,EAAGJ,OAAMnZ,SAAQoZ,KACVza,EAAK,MAAO,IAAKya,EAAOxa,UAAW,+FAAgG4a,QAAS,OAAQ1X,QAAS,IAAMsX,EAAMrR,KAAOD,EAAUsR,EAAMrR,IAAKqR,EAAM7Q,QAExN9J,SAAUoM,QAGlB4O,EAAeC,GAAoB7X,EAAS,IAE7C8T,EAAQ9Q,EAAQgU,gBAChB7G,EAAUnN,EAAQmN,QAElB2H,EAAc3H,GAAS2H,aAAe3H,GAAS4H,MAC/CC,EAAiBjT,MAAMkT,QAAQH,GAAeA,EAAYI,KAAK,KAAO,GAC5ExV,EAAU,KACgB2Q,WAClB,GAAKS,GAAU/O,MAAMkT,QAAQH,IAAuC,IAAvBA,EAAYnO,OAIzD,IACI,MAAMwO,QAAgBC,QAAQC,IAAIP,EAAYna,IAAI0V,MAAOnW,IACrD,GAAoB,iBAATA,IAAsBA,EAAK4P,OAClC,OAAO,KACX,MAAMwL,EAAUpb,EAAK4P,OAGfyL,EAAeD,EAAQE,WAAW,SAAWF,EAAQE,WAAW,WAAaF,EAAQE,WAAW,YAChGF,EACA,OAAOA,IACPG,EAAMF,EAAaG,MAAM,KAAKC,OAAOhC,eAAiB,GAEtDiC,EADkB,IAAIpM,IAAI,CAAC,MAAO,MAAO,OAAQ,MAAO,OAAQ,MAAO,QAC7CU,IAAIuL,GAC9BzE,EAAc4E,EAAU,SAAW,aACzC,IAEI,MAAMC,EAAWhF,GAAoBC,EAAOyE,EAAcvE,GAC1D,IAAIb,EACJ,GAAI8C,EACA9C,QAAY8C,EAAS7C,WAAWyF,EAAUxF,gBACjB0C,EAAOgC,MAAMe,uBAAuBhF,EAAOyE,EAAcvE,IAChEb,SAGjB,CAEDA,SADqB4C,EAAOgC,MAAMe,uBAAuBhF,EAAOyE,EAAcvE,IACjEb,GACjB,CACA,MAAO,CACH4F,YAAaT,EACbC,eACApF,MACAyF,UAER,CACA,MAAOjF,GAEH,OADA5D,QAAQiJ,MAAM,sCAAsCT,IAAgB5E,GAC7D,IACX,KAEJkE,EAAiBM,EAAQc,OAAQjS,KAAQA,GAC7C,CACA,MAAOgS,GACHjJ,QAAQiJ,MAAM,mDAAoDA,GAClEnB,EAAiB,GACrB,MAhDIA,EAAiB,KAkDzBqB,IACD,CAACpF,EAAOkE,EAAgBjC,EAAQE,IACnC,MAAMjE,EAAenC,GAAgB7M,IAC/BwR,KAAEA,GAAS7H,EAQjB,OAAQ7P,EAAK,MAAO,CAAEC,UAAWA,EAAWH,SAAUS,EAAM,MAAO,CAAEN,UAAW,6DAA6D4P,EAAOyH,eAAe3I,GAAiB,KAAM,qBAAsBuG,EAAcpV,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,iDAAiD2O,GAAmB,KAAM9O,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,GAAGuY,EAAsB,iBAAmB,MAAM3J,GAAiB,KAAM/O,SALpf0Y,EACOxY,EAAKgF,GAAiB,CAAEC,KAAM,KAAMR,MAAO,SAE/CzE,EAAK0X,EAAM,CAAEzX,UAAW,UAAU4P,EAAO2H,gBAEmexX,EAAK,OAAQ,CAAEC,UAAW,kCAAkC2Y,GAAmB,KAAM9Y,SAAU+P,EAAO4H,SAA4B,SAAjBvC,GAA4C,QAAjBA,GAA2BlV,EAAKH,EAAO,CAAEoM,QAAS,UAAWhM,UAAW,0BAA2BH,SAAUoV,OAAsB3U,EAAM,MAAO,CAAEN,UAAW,yCAA0CH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,6BAA6B0Y,GAAsB,KAAM7Y,SAAUgM,GAAM5F,EAAQgM,WAAWnG,OAAO,cAAgB/L,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QA7GvhC,KACpB,MAAM+I,EAAUkN,GAAkB,GAC5BiD,EAA4C,iBAApBnW,EAAQmN,QAChCnN,EAAQmN,QACRnN,EAAQmN,QACJlH,KAAKC,UAAUlG,EAAQmN,QAAS,KAAM,GACtC,GACJiJ,EAAa,CAACpQ,EAASmQ,EAAiB,iBAAmBA,EAAiB,IAAIjB,KAAK,IAAIpL,OAC/F3D,UAAUC,UAAUC,UAAU+P,GAAY9P,KAAK,KAC3C9B,EAAM,CACF+B,OAAQ,UACRnL,MAAO,sBACPuC,SAAU,SAiGmjC5D,UAAW,6CAA8CqB,MAAO,eAAgBxB,SAAUE,EAAK2M,GAAU,CAAE1M,UAAW,mBAAwBM,EAAM,MAAO,CAAEN,UAAW,uCAAuCyY,GAAoB,KAAM5Y,SAAU,CAACoG,EAAQzF,OAASiS,GAAiBG,eAAiB3M,EAAQmN,SAASkJ,GAAM,MAC/2C,MAAMC,EAAWtW,EAAQmN,QAAQkJ,GACjC,OAAQvc,EAAK8N,GAAe,CAAEC,SAAoC,iBAAnBqL,EAA8BA,EAAiB,GAAInL,QAASuO,EAASvO,QAAShC,QAASuQ,EAASvQ,QAASqC,YAAakO,EAASlO,YAAaD,kBAAmBmO,EAASnO,kBAAmBE,YAAaiO,EAASjO,YAAaL,SAAWsC,GAAaiI,IAAgBjI,GAAWrC,cAAgBsO,GAAchE,IAAgBgE,EAAUrB,KAAK,OAAQhN,SAAWhI,GAASqS,IAAgBrS,GAAOsI,YAAY,GAC/b,EAH82C,GAGv2C0K,GAAmBpZ,EAAK,MAAO,CAAEC,UAAW,yCAA0CoE,MAAO,CAAEqY,aAAc,YAAc5c,SAAUma,EAAcP,GAAoBN,KAAqB0B,EAAcjO,OAAS,GAAMtM,EAAM,MAAO,CAAEN,UAAW,gBAAgB6Y,GAAsB,KAAMhZ,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,8BAA+BH,SAAU,cAAgBgb,EAAc6B,KAAKrK,GAAKA,EAAEwJ,UAAa9b,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAUgb,EAC1dqB,OAAO7J,GAAKA,EAAEwJ,SACdjb,IAAI,EAAGob,cAAaR,eAAcpF,SAAW9V,EAAM,MAAO,CAAEN,UAAW,0BAA2BkD,QAAS,IAAMgG,EAAUkN,EAAK4F,GAAcnc,SAAU,CAACE,EAAK,MAAO,CAAEoJ,IAAKiN,EAAKzM,IAAKqS,EAAahc,UAAW,6EAA+ED,EAAK,MAAO,CAAEC,UAAW,uCAAwCH,SAAUmc,MAAmB,GAAGR,gBAA+Bzb,EAAK,MAAO,CAAEC,UAAW,oCAAqCH,SAAUgb,EAAcja,IAAI,EAAGob,cAAaR,eAAcpF,SAAWrW,EAAKgM,EAAQ,CAAEC,QAAS,UAAWhH,KAAM,KAAMhF,UAAW,oBAAqBkD,QAAS,IAAMkG,OAAOC,KAAK+M,EAAK,UAAW/U,MAAOma,EAAc3b,SAAUmc,GAAeR,EAAepF,SAAgBnQ,EAAQmN,SAAY9S,EAAM,MAAO,CAAEN,UAAW,qBAAqB4Y,GAAoB,KAAM/Y,SAAU,CAACS,EAAM,SAAU,CAAE4C,QAAS,IAAM6V,GAAgBD,GAAc9Y,UAAW,uCAAwCH,SAAU,CAACiZ,EAAc,OAAS,OAAQ,WAAY/Y,EAAK,MAAO,CAAE4c,MAAO,6BAA8B3c,UAAW,sCAAqC8Y,EAAc,aAAe,IAAM7Q,KAAM,OAAQ2U,QAAS,YAAaC,OAAQ,eAAgBhd,SAAUE,EAAK,OAAQ,CAAE+c,cAAe,QAASC,eAAgB,QAASC,YAAa,EAAGC,EAAG,wBAA4BnE,GAAgB/Y,EAAK,MAAO,CAAEC,UAAW,iEAAkEH,SAAqC,iBAApBoG,EAAQmN,QAAwB4G,EAAc/T,EAAQmN,SAAarT,EAAK,MAAO,CAAEC,UAAW,yFAA0FH,SAAUqM,KAAKC,UAAUlG,EAAQmN,QAAS,KAAM,iBAC7rD,EAG+C,CAACpG,EAAWC,IAC/CD,EAAU/G,QAAQgM,YAAchF,EAAUhH,QAAQgM,WACtDjF,EAAUuL,sBAAwBtL,EAAUsL,qBAC5CvL,EAAUwL,gBAAkBvL,EAAUuL,eACtCxL,EAAUhN,YAAciN,EAAUjN,WAClCgN,EAAU0B,gBAAkBzB,EAAUyB,eACtC1B,EAAU2B,kBAAoB1B,EAAU0B,iBACxC3B,EAAUyL,mBAAqBxL,EAAUwL,kBACzCzL,EAAU0L,qBAAuBzL,EAAUyL,oBAC3C1L,EAAU2L,kBAAoB1L,EAAU0L,iBACxC3L,EAAU4B,gBAAkB3B,EAAU2B,eACtC5B,EAAU4L,mBAAqB3L,EAAU2L,kBACzC5L,EAAU6L,qBAAuB5L,EAAU4L,oBC9B9C,MAACqE,GAAmB5N,EAAMjF,KArM/B,UAAmClE,KAAEA,EAAI8O,aAAEA,EAAYkI,YAAEA,EAAc,IAAG/R,WAAEA,GAAa,EAAK6G,UAAEA,EAASjS,UAAEA,EAAS2O,gBAAEA,EAAe8J,iBAAEA,IACnI,MAAO2E,EAAiBC,GAAsBpa,EAAS,IAChDqa,EAAeC,GAAoBta,EAAS,IAC7Cua,EAAe7N,EAAO,MACtB8N,EAAkB9N,EAAOxJ,EAAKyG,QAC9B8Q,EAAqB/N,EAAO,GAC5BgO,EAAYhO,EAAOsC,GAAalL,KAAKC,OACrC4W,EAAUjO,EAAOxJ,GAEjB0X,EAAoBlO,EAAO,GAC3BmO,EAAkBnO,EAAOoO,YAAY/W,OACrCgX,EAAerO,EAAOwN,GACtBc,EAAqBtO,EAAO,GAElChK,EAAU,KACN,MAAMqB,EAAM+W,YAAY/W,MAClBkX,EAAW/X,EAAKyG,OAASiR,EAAkB3H,QAC3CiI,EAAUnX,EAAM8W,EAAgB5H,QAEtC,GAAIgI,EAAW,GAAKC,EAAU,GAAI,CAC9B,MAAMC,EAAeF,EAAWC,EAAW,IAGrCE,EAAQ,GACdL,EAAa9H,QAAU8H,EAAa9H,SAAW,EAAImI,GAASD,EAAcC,EAE1EL,EAAa9H,QAAU7O,KAAKE,IAAI,GAAIF,KAAKG,IAAI,IAAMwW,EAAa9H,SACpE,CACA2H,EAAkB3H,QAAU/P,EAAKyG,OACjCkR,EAAgB5H,QAAUlP,GAC3B,CAACb,EAAKyG,SAET6Q,EAAgBvH,QAAU/P,EAAKyG,OAC/BgR,EAAQ1H,QAAU/P,EAClB,MAAM1C,EAAUiG,EAAY,KACxB,IAAI4U,EAAWP,YAAY/W,MAC3B,MAAMuX,EAAQC,IACV,MAAML,EAAUK,EAAcF,EAC9BA,EAAWE,EACX,MAAMC,EAAShB,EAAgBvH,QAAUwH,EAAmBxH,QAE5D,GAAIuI,GAAU,EAGV,OAFAR,EAAmB/H,QAAU,OAC7BsH,EAAatH,QAAUzO,sBAAsB8W,IAKjD,IAAIG,EACJ,GAAItT,EAGAsT,EAAarX,KAAKE,IAAI,IAA4B,EAAvByW,EAAa9H,cAEvC,GAAIuI,EAAS,GAGdC,EAAoC,IAAvBV,EAAa9H,aAEzB,GAAIuI,EAAS,IAEdC,EAAaV,EAAa9H,aAEzB,GAAIuI,EAAS,IAAK,CAGnB,MAAMzM,GAAKyM,EAAS,KAAO,IAC3BC,EAAaV,EAAa9H,SAAW,EAAQ,GAAJlE,EAC7C,MAII0M,EAAoC,EAAvBV,EAAa9H,QAI9B,MAAMyI,EAAcD,EAAaP,EAAU,IAAQF,EAAmB/H,QAChE0I,EAAavX,KAAKkS,MAAMoF,GAC9BV,EAAmB/H,QAAUyI,EAAaC,EACtCA,EAAa,IACblB,EAAmBxH,QAAU7O,KAAKG,IAAIkW,EAAmBxH,QAAU0I,EAAYnB,EAAgBvH,SAC/FmH,EAAmBK,EAAmBxH,UAG1CsH,EAAatH,QAAUzO,sBAAsB8W,IAEjDf,EAAatH,QAAUzO,sBAAsB8W,IAC9C,CAACnT,IAEJzF,EAAU,KACFQ,EAAKyG,OAAS8Q,EAAmBxH,UAAYsH,EAAatH,SAC1DzS,IAEG,KACC+Z,EAAatH,UACbxO,qBAAqB8V,EAAatH,SAClCsH,EAAatH,QAAU,QAGhC,CAAC/P,EAAKyG,OAAQnJ,IAEjBkC,EAAU,KACFyF,GAAcsS,EAAmBxH,QAAU/P,EAAKyG,SAC5C4Q,EAAatH,UACbxO,qBAAqB8V,EAAatH,SAClCsH,EAAatH,QAAU,MAE3BzS,MAEL,CAAC2H,EAAYjF,EAAKyG,OAAQnJ,IAG7B,MAAMob,EAAsBlP,EAAO,MAC7BmP,EAAyBnP,EAAO,GAEtChK,EAAU,MACFyX,GAAmBK,EAAgBvH,SAAW9K,KAC9CmS,EAAiBK,EAAQ1H,QAAQ6I,MAAM,EAAG3B,IAC1C0B,EAAuB5I,QAAUkH,IAEtC,CAACA,EAAiBhS,IAErB,MAAM4T,EAAc5B,EAAkBjX,EAAKyG,SAAWxB,EACtDzF,EAAU,KACN,GAAKqZ,EAmBL,OAVKH,EAAoB3I,UACrB2I,EAAoB3I,QAAU9M,OAAOvD,YAAY,KAC7C,MAAMoZ,EAAgBvB,EAAmBxH,QAErC+I,EAAgBH,EAAuB5I,UACvCqH,EAAiBK,EAAQ1H,QAAQ6I,MAAM,EAAGE,IAC1CH,EAAuB5I,QAAU+I,IAEtC,KAEA,KACCJ,EAAoB3I,UACpBnQ,cAAc8Y,EAAoB3I,SAClC2I,EAAoB3I,QAAU,OApB9B2I,EAAoB3I,UACpBnQ,cAAc8Y,EAAoB3I,SAClC2I,EAAoB3I,QAAU,OAqBvC,CAAC8I,IACJ,MAAMvU,EAAQC,IACRwU,EAAgBrd,EAAQ,IAAMgK,GAAM8R,EAAUzH,SAASpK,OAAO,YAAa,IAC3EqT,EAAW/B,EAAkBjX,EAAKyG,OAGlCwS,EAAwBvd,EAAQ,KAClC,MAAMwd,EAAW/B,GAAiBnX,EAAK4Y,MAAM,EAAG3B,GAChD,OAAO+B,EAAWE,EAnKN,IAmK+BA,GAC5C,CAAC/B,EAAenX,EAAMiX,EAAiB+B,IAC1C,OAAKhZ,EAWG7F,EAAM,MAAO,CAAEN,UAAWmE,EAAG,qCAAsC,mFAAoF,eAAgBnE,GAAYH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAWmE,EAAG,oCAAqCwK,GAAkB9O,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACoV,GAAiC,SAAjBA,GAA4B3U,EAAM,OAAQ,CAAEN,UAAW,uDAAwDH,SAAU,CAAC,SAAUoV,KAAmBkK,GAAapf,EAAK,OAAQ,CAAEC,UAAW,qBAAsBH,SAAU,oBAAwBS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,qBAAsBH,SAAUqf,IAAkBnf,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAT5wB,KACpBkJ,UAAUC,UAAUC,UAAUnG,GAAMoG,KAAK,KACrC9B,EAAM,CACF+B,OAAQ,UACRnL,MAAO,sBACPuC,SAAU,SAIwyB5D,UAAW,0CAA2CqB,MAAO,eAAgBxB,SAAUE,EAAK2M,GAAU,CAAE1M,UAAW,mBAAwBM,EAAM,MAAO,CAAEN,UAAWmE,EAAG,oGAAqGgb,GAAY,mBAAoB1G,GAAmB5Y,SAAU,CAACE,EAAKma,GAAkB,CAAEra,SAAUuf,IAA0Brf,EAAK,QAAS,CAAEF,SAAU,kqCAVrtC,IAoCf,GCvMMyf,GAAclJ,GAAQ,uCAAuC0D,KAAK1D,GAExE,SAASmJ,IAAYvE,MAAEA,IACnB,MAAM9R,UAAEA,GAAcH,KACtB,OAAKiS,GAA0B,IAAjBA,EAAMpO,OAEZ7M,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAUmb,EAAMpa,IAAI,CAAC4e,EAAMrN,KACjF,MAAMsN,EAAWD,EAAK7D,MAAM,KAAKC,OAAOD,MAAM,KAAK,IAAM,OACzD,OAAI2D,GAAWE,GACHzf,EAAK,MAAO,CAAEC,UAAW,iBAAkBkD,QAAS,IAAMgG,EAAUsW,EAAMC,GAAWpe,MAAO,mBAAoBxB,SAAUE,EAAK,MAAO,CAAEoJ,IAAKqW,EAAM7V,IAAK8V,EAAUzf,UAAW,oGAAuGmS,GAExR7R,EAAM,IAAK,CAAEwJ,KAAM0V,EAAMzV,OAAQ,SAAUC,IAAK,sBAAuBhK,UAAW,sFAAuFH,SAAU,CAAC,MAAiB4f,IAAatN,OANvN,IAQf,CACA,SAASuN,IAAazZ,QAAEA,EAAOlD,WAAEA,EAAU4c,SAAEA,EAAQxF,cAAEA,IACnD,MAAOrB,EAAaC,GAAkB9V,GAAS,IACxC2c,EAAeC,GAAoB5c,EAAS,IAC7CwH,EAAQC,KACRsO,OAAEA,GAAWC,KACbC,EAAWrC,KACXzD,EAAUnN,EAAQmN,QAClB0M,EAAW1M,GAASC,MAAQ,OAC5B2H,EAAQ5H,GAAS4H,MACjB7B,EAA4C,iBAApBlT,EAAQA,QAAuBA,EAAQA,QAAU,GAE/EN,EAAU,KACN,IAAKqV,GAA0B,IAAjBA,EAAMpO,SAAiBuN,EAEjC,YADA0F,EAAiB,IAGrB,IAAIE,GAAY,EAwChB,MAvCqBzJ,WACjB,MAAM0J,QAAiB3E,QAAQC,IAAIN,EAAMpa,IAAI0V,MAAOkJ,IAChD,IAAKA,GAAwB,iBAATA,EAChB,OAAO,KAEX,GAAIA,EAAK/D,WAAW,YAAc+D,EAAK/D,WAAW,YAC9C,OAAO+D,EAGX,MAAMhE,EAAegE,EAAK/D,WAAW,SAAW+D,EAAK/D,WAAW,WAAa+D,EAAK/D,WAAW,YACvF+D,EACA,OAAOA,IACP9D,EAAMF,EAAaG,MAAM,KAAKC,OAAOhC,eAAiB,GAGtD3C,EAFkB,IAAIxH,IAAI,CAAC,MAAO,MAAO,OAAQ,MAAO,OAAQ,MAAO,QAC7CU,IAAIuL,GACN,SAAW,aACzC,IACI,MAAMI,EAAWhF,GAAoBqD,EAAeqB,EAAcvE,GAClE,GAAIiC,EACA,aAAaA,EAAS7C,WAAWyF,EAAUxF,gBAClB0C,EAAOgC,MAAMe,uBAAuB5B,EAAeqB,EAAcvE,IACxEb,KAKlB,aADqB4C,EAAOgC,MAAMe,uBAAuB5B,EAAeqB,EAAcvE,IACxEb,GAEtB,CACA,MAAOQ,GAEH,OADA5D,QAAQiJ,MAAM,sCAAsCT,IAAgB5E,GAC7D,IACX,KAECmJ,GACDF,EAAiBG,EAAS9D,OAAQ+D,KAAQA,KAGlDC,GACO,KAAQH,GAAY,IAC5B,CAAC/E,EAAOb,EAAenB,EAAQE,IAElC,MAAMiH,EAAaP,EAAc1D,OAAO+D,GAAKX,GAAWW,IAClDG,EAAgBR,EAAc1D,OAAO+D,IAAMX,GAAWW,IAc5D,OAAQ3f,EAAM,MAAO,CAAEN,UAAW,gEAAiEH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,0HAA2HkD,QAASyc,EAAU9f,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,yCAA0CH,SAAU,CAAeE,EAAdgD,EAAmB4I,GAAwEC,GAA3D,CAAE5L,UAAW,oCAAgHD,EAAK,OAAQ,CAAEC,UAAW,yEAA0EH,SAAUigB,KAAc/c,GAAcoW,GAAmBpZ,EAAK,OAAQ,CAAEC,UAAW,4BAA6BH,SAAUsZ,OAAwB7Y,EAAM,MAAO,CAAEN,UAAW,wCAAyCH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,qBAAsBH,SAAUgM,GAAM5F,EAAQgM,WAAWnG,OAAO,cAAgB/L,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAAU+G,IACl9BA,EAAEC,kBAdV,MACpB,MAAMmS,EAAa,CACflD,EACA/F,EAAU,iBAAmBlH,KAAKC,UAAUiH,EAAS,KAAM,GAAK,IAClE+H,KAAK,IAAIpL,OACX3D,UAAUC,UAAUC,UAAU+P,GAAY9P,KAAK,KAC3C9B,EAAM,CACF+B,OAAQ,UACRnL,MAAO,sBACPuC,SAAU,SAMU6I,IACDzM,UAAW,kEAAmEqB,MAAO,eAAgBxB,SAAUE,EAAK2M,GAAU,CAAE1M,UAAW,mBAAwBmgB,EAAWvT,OAAS,GAAM7M,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAUE,EAAKwf,GAAa,CAAEvE,MAAOmF,MAAmBpd,GAAezC,EAAM,MAAO,CAAEN,UAAW,8CAA+CH,SAAU,CAACsZ,GAAmBpZ,EAAK,MAAO,CAAEC,UAAW,uGAAwGH,SAAUE,EAAKma,GAAkB,CAAEC,cAAeA,EAAeta,SAAUsZ,MAAuBiH,EAAcxT,OAAS,GAAK7M,EAAKwf,GAAa,CAAEvE,MAAOoF,IAAkBhN,GAAY9S,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAACS,EAAM,SAAU,CAAE4C,QAAU+G,IACjxBA,EAAEC,kBACF6O,GAAgBD,IACjB9Y,UAAW,uCAAwCH,SAAU,CAACiZ,EAAc,OAAS,OAAQ,WAAY/Y,EAAK,MAAO,CAAE4c,MAAO,6BAA8B3c,UAAW,sCAAqC8Y,EAAc,aAAe,IAAM7Q,KAAM,OAAQ2U,QAAS,YAAaC,OAAQ,eAAgBhd,SAAUE,EAAK,OAAQ,CAAE+c,cAAe,QAASC,eAAgB,QAASC,YAAa,EAAGC,EAAG,wBAA4BnE,GAAgB/Y,EAAK,MAAO,CAAEC,UAAW,iEAAkEH,SAAUE,EAAK,MAAO,CAAEC,UAAW,wDAAyDH,SAAUqM,KAAKC,UAAUiH,EAAS,KAAM,eACtrB,CAEA,SAASiN,IAAmBrF,MAAEA,EAAKb,cAAEA,IACjC,MAAOyF,EAAeC,GAAoB5c,EAAS,KAC7C+V,OAAEA,GAAWC,KACbC,EAAWrC,KACjBlR,EAAU,KACN,IAAKqV,GAA0B,IAAjBA,EAAMpO,SAAiBuN,EAEjC,YADA0F,EAAiB,IAGrB,IAAIE,GAAY,EAsChB,MArCqBzJ,WACjB,MAAM0J,QAAiB3E,QAAQC,IAAIN,EAAMpa,IAAI0V,MAAOkJ,IAChD,IAAKA,GAAwB,iBAATA,EAChB,OAAO,KACX,GAAIA,EAAK/D,WAAW,YAAc+D,EAAK/D,WAAW,YAC9C,OAAO+D,EAEX,MAAMhE,EAAegE,EAAK/D,WAAW,SAAW+D,EAAK/D,WAAW,WAAa+D,EAAK/D,WAAW,YACvF+D,EACA,OAAOA,IACP9D,EAAMF,EAAaG,MAAM,KAAKC,OAAOhC,eAAiB,GAGtD3C,EAFkB,IAAIxH,IAAI,CAAC,MAAO,MAAO,OAAQ,MAAO,OAAQ,MAAO,QAC7CU,IAAIuL,GACN,SAAW,aACzC,IACI,MAAMI,EAAWhF,GAAoBqD,EAAeqB,EAAcvE,GAClE,GAAIiC,EACA,aAAaA,EAAS7C,WAAWyF,EAAUxF,gBAClB0C,EAAOgC,MAAMe,uBAAuB5B,EAAeqB,EAAcvE,IACxEb,KAKlB,aADqB4C,EAAOgC,MAAMe,uBAAuB5B,EAAeqB,EAAcvE,IACxEb,GAEtB,CACA,MAAOQ,GAEH,OADA5D,QAAQiJ,MAAM,sCAAsCT,IAAgB5E,GAC7D,IACX,KAECmJ,GACDF,EAAiBG,EAAS9D,OAAQ+D,KAAQA,KAGlDC,GACO,KAAQH,GAAY,IAC5B,CAAC/E,EAAOb,EAAenB,EAAQE,IAClC,MAAMiH,EAAaP,EAAc1D,OAAO+D,GAAKX,GAAWW,IAClDG,EAAgBR,EAAc1D,OAAO+D,IAAMX,GAAWW,IAC5D,OAAQ3f,EAAMggB,EAAW,CAAEzgB,SAAU,CAACsgB,EAAWvT,OAAS,GAAM7M,EAAK,MAAO,CAAEC,UAAW,iBAAkBH,SAAUE,EAAKwf,GAAa,CAAEvE,MAAOmF,MAAmBC,EAAcxT,OAAS,GAAM7M,EAAK,MAAO,CAAEC,UAAW,iBAAkBH,SAAUE,EAAKwf,GAAa,CAAEvE,MAAOoF,QACpR,CA8HA,MAAMG,GAAgBlW,EA7HtB,UAAgCyJ,SAAEA,EAAQyE,oBAAEA,GAAsB,EAAOjE,UAAWkM,EAAU5K,WAAEA,IAC5F,MAAO6K,EAAaC,GAAkBzd,GAAS,IACxC0d,EAAeC,GAAoB3d,EAAS,IAAIwM,MAChDoR,EAAkBC,GAAuB7d,EAAS,IAAIwM,KACvDsR,EAAepR,EAAOmE,EAASlH,QAC/BnC,EAAQC,IAERyP,EAAgBrG,EAASkN,KAAKjP,GAAKA,EAAEkI,kBAAkBA,iBACtDnG,EAAS,IAAImG,gBA4BpBtU,EAAU,KACN,MAAMsb,EAAYF,EAAa7K,QACzBgL,EAAepN,EAASlH,OAC9B,GAAIsU,EAAeD,EAAW,CAE1B,MAAME,EAAa,IAAI1R,IACvB,IAAK,IAAIpN,EAAI4e,EAAW5e,EAAI6e,EAAc7e,IACtC8e,EAAW1Q,IAAIpO,GAEnBye,EAAoBK,GAEpB,MAAMC,EAAQC,WAAW,KACrBP,EAAoB,IAAIrR,MACzB,KAEH,OADAsR,EAAa7K,QAAUgL,EAChB,IAAMI,aAAaF,EAC9B,CACAL,EAAa7K,QAAUgL,GACxB,CAACpN,EAASlH,SACb,MAAM2U,EAAezN,EAAS,GACxB0N,EAAc1N,EAASA,EAASlH,OAAS,GACzC4H,EAAiB+M,EAAatP,UAC9BwP,EAAgBD,EAAYvP,UAE5ByP,EAAY5N,EAASlT,IAAImR,IAC3B,MAAMqB,EAAUrB,EAAEqB,QAClB,OAAOA,GAASC,MAAQ,SAGtBsO,EAAkC,IADhB,IAAIlS,IAAIiS,GAAW1c,KAErC,GAAG8O,EAASlH,WAAW8U,EAAU,KACjC,GAAG5N,EAASlH,oBACZgV,EAAcjZ,IAChBiY,EAAiB9a,IACb,MAAMsB,EAAO,IAAIqI,IAAI3J,GAOrB,OANIsB,EAAK+I,IAAIxH,GACTvB,EAAKoJ,OAAO7H,GAGZvB,EAAKqJ,IAAI9H,GAENvB,KAgBf,OAAQ9G,EAAM,MAAO,CAAEN,UAAW,cAlEX,cAAf4V,EACO,mBACQ,UAAfA,EACO,uBACQ,YAAfA,EACO,qBACJ,uEA4DwG/V,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,4HAA6HkD,QAAS,IAAMwd,GAAgBD,GAAc5gB,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAlFtY0Y,GAAsC,YAAf3C,EAChB7V,EAAKgF,GAAiB,CAAEC,KAAM,KAAMR,MAAO,SAEnC,cAAfoR,EACO7V,EAAKyL,GAAa,CAAExL,UAAW,wBAEvB,UAAf4V,EACO7V,EAAK0L,GAAa,CAAEzL,UAAW,4BAEvB,YAAf4V,EACO7V,EAAK8hB,GAAe,CAAE7hB,UAAW,0BAErCD,EAAK2X,GAAK,CAAE1X,UAAW,gDAsEsYD,EAAK,OAAQ,CAAEC,UAAW,iCAAkCH,SAAU,UAAYE,EAAK,OAAQ,CAAEC,UAAW,2DAA4DH,SAAU8hB,IAA+B5hB,EAAf0gB,EAAoB7U,GAA2DD,GAA7C,CAAE3L,UAAW,yBAAuFM,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAACS,EAAM,OAAQ,CAAEN,UAAW,4BAA6BH,SAAU,CAACgM,GAAM2I,GAAgB1I,OAAO,YAAagI,EAASlH,OAAS,GAAK,MAAMf,GAAM4V,GAAe3V,OAAO,iBAAmB/L,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAAU+G,IAClgCA,EAAEC,kBAdP,MACvB,MAAM4X,EAAahO,EAASlT,IAAImR,IAC5B,MAAMqB,EAAUrB,EAAEqB,QAClB,MAAO,IAAIA,GAASC,MAAQ,WAAWtB,EAAE9L,SAAW,OAAOmN,EAAUlH,KAAKC,UAAUiH,EAAS,KAAM,GAAK,OACzG+H,KAAK,eACR/O,UAAUC,UAAUC,UAAUwV,GAAYvV,KAAK,KAC3C9B,EAAM,CACF+B,OAAQ,UACRnL,MAAO,qCACPuC,SAAU,SAMUme,IACD/hB,UAAW,6CAA8CqB,MAAO,sBAAuBxB,SAAUE,EAAK2M,GAAU,CAAE1M,UAAW,mBAAwBygB,GAAgB1gB,EAAK,MAAO,CAAEC,UAAW,sBAAuBH,SAAUiU,EAASlT,IAAI,CAACmR,EAAGI,KAC/P,MAAMiB,EAAUrB,EAAEqB,QACZ0M,EAAW1M,GAASC,MAAQ,OAC5B2O,EAAmC,iBAAdjQ,EAAE9L,QAAuB8L,EAAE9L,QAAU,GAC1Dgc,EAAcpB,EAAiB1Q,IAAIgC,GACnC+P,EAAiBvB,EAAcxQ,IAAIgC,GACnC6I,EAAQ5H,GAAS4H,MACvB,OAAQ1a,EAAM,MAAO,CAAEN,UAAW,gEAAiEoE,MAAO,CAClGZ,QAASye,EAAc,EAAI,EAC3B5d,UAAW4d,EAAc,oBAAsB,gBAC/Cte,WAAY,iDACZwe,gBAAwE,KAAnDhQ,GAAO2B,EAASlH,OAASiU,EAAiB7b,OAA9C,KACjBod,UAAWH,EAAc,qCAAuC,OAChE7b,eAAuE,KAAnD+L,GAAO2B,EAASlH,OAASiU,EAAiB7b,OAA9C,MACjBnF,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,mGAAoGkD,QAAS,IAAM0e,EAAWzP,GAAM9Q,MAAO2gB,EAAaniB,SAAU,CAAmBE,EAAlBmiB,EAAuBvW,GAAwEC,GAA3D,CAAE5L,UAAW,oCAAgHD,EAAK,OAAQ,CAAEC,UAAW,+EAAgFH,SAAUigB,KAAcoC,GAAmBniB,EAAK,OAAQ,CAAEC,UAAW,6BAA8BH,SAAUmiB,OAAqBjiB,EAAKsgB,GAAoB,CAAErF,MAAOA,EAAOb,cAAeA,IAAkB+H,GAAmB5hB,EAAM,MAAO,CAAEN,UAAW,yBAA0BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,uGAAwGH,SAAUE,EAAKma,GAAkB,CAAEC,cAAeA,EAAeta,SAAUmiB,MAAmB5O,GAAWiP,OAAOC,KAAKlP,GAASxG,OAAS,GAAMtM,EAAM,UAAW,CAAEN,UAAW,eAAgBH,SAAU,CAACE,EAAK,UAAW,CAAEC,UAAW,4BAA6BH,SAAU,iBAAmBE,EAAK,MAAO,CAAEC,UAAW,oDAAqDH,SAAUqM,KAAKC,UAAUiH,EAAS,KAAM,aAAoB,GAAGrB,EAAEE,aAAaE,SAC9yCpS,EAAK,QAAS,CAAEF,SAAU,yWAW/B4gB,GAAgB1gB,EAAK,MAAO,CAAEC,UAAW,QAASH,SAAUiU,EAASlT,IAAI,CAACqF,EAAS0C,IAAW5I,EAAK2f,GAAc,CAAEzZ,QAASA,EAASlD,WAAY4d,EAAcxQ,IAAIxH,GAAQgX,SAAU,IAAMiC,EAAWjZ,GAAQwR,cAAeA,GAAiB,GAAGlU,EAAQgM,aAAatJ,UACzR,EAEmD,CAACqE,EAAWC,IACvDD,EAAU8G,SAASlH,SAAWK,EAAU6G,SAASlH,SAEjDI,EAAUuL,sBAAwBtL,EAAUsL,sBAE5CvL,EAAUsH,YAAcrH,EAAUqH,YAElCtH,EAAU4I,aAAe3I,EAAU2I,aAG/B5I,EAAU8G,SAAS,IAAI7B,YAAchF,EAAU6G,SAAS,IAAI7B,WAChEjF,EAAU8G,SAAS9G,EAAU8G,SAASlH,OAAS,IAAIqF,YAC/ChF,EAAU6G,SAAS7G,EAAU6G,SAASlH,OAAS,IAAIqF,eCpShD,SAASsQ,IAAeC,YAAEA,EAAWxO,iBAAEA,EAAgByO,mBAAEA,EAAkBC,MAAEA,EAAKC,iBAAEA,IAE/F,MAAMC,EAAsB,IAAI1O,IAChC0O,EAAoBrO,IAAI,MAAO,gBAC/BqO,EAAoBrO,IAAI,OAAQ,QAEhCiO,EAAY9N,QAAQ,CAACvU,EAAMgB,KACZ,QAAPA,GACO,SAAPA,GACO,oBAAPA,GACO,eAAPA,GACAyhB,EAAoBrO,IAAIpT,EAAIhB,KAIpCqiB,EAAcI,EAKd,MAAMC,EAAoB7a,MAAMgJ,KAAKwR,EAAYpH,WAAWjG,KAAK,EAAE2N,IAAOC,KAC1D,QAARD,GACO,EACC,QAARC,EACO,EACC,SAARD,GACO,EACC,SAARC,EACO,EACJD,EAAIE,cAAcD,IAGvBE,EAAyBJ,EAAkBjW,OAAS,EAE1D,OAGQ7M,EAAK,MAHRkjB,EAGe,CAAEjjB,UAAW,4FAA6FH,SAAUgjB,EAAkBjiB,IAAI,EAAEO,EAAIhB,KAAWG,EAAM,SAAU,CAAEN,UAAW,yHACtLgU,IAAqB7S,EAC7B,2CACA,2DAA6D+B,QAAS,IAAMuf,EAAmBthB,GAAKE,MAAOlB,EAAKyM,OAAS,GAAKzM,OAAO2M,EAAWjN,SAAU,CAACM,EAAKyM,OAAS,GAAKzM,EAAK+iB,UAAU,EAAG,IAAM,MAAQ/iB,EAAMuiB,GAASA,EAAMvS,IAAIhP,IAAOuhB,EAAMjO,IAAItT,GAAM,GAAMb,EAAM,MAAO,CAAEN,UAAW,8BAA+BH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,sGAClVgU,IAAqB7S,EACrB,oBACA,uBAAyBtB,SAAU6iB,EAAMjO,IAAItT,KAAQwhB,GACpD,QAAPxhB,IACCwhB,EAAiBlO,IAAItT,GAAOpB,EAAKyL,GAAa,CAAExL,UAAW,wBAA6BD,EAAK4X,GAAO,CAAE3X,UAAW,gCAAsCmB,KAVzJ,CAAEnB,UAAW,QAWxC,CA+BO,SAASmjB,GAA2BrP,EAAUmB,GACjD,MAAqB,QAAjBA,EAEO,IAAInB,GAEW,SAAjBmB,EAGEnB,EAASoI,OAAQjW,GAEO,SADH6M,GAAgB7M,IAMrC6N,EAASoI,OAAQjW,GACI6M,GAAgB7M,KACbgP,EAGvC,CC3FA,MAAMmO,GAA6B,CAACjd,EAAMkd,IAClCld,EAAKkT,SAAS,sBACPlT,EAAKqT,QAAQ,sBAAuB5H,GAAiByR,IAEzDld,EAGLmd,GAA0Brd,GACrBA,EAAQzF,OAASiS,GAAiB4F,kBAAoBpS,EAAQmN,SAASmQ,SAgBlF,MAAMC,WAA6BC,EAC/B,WAAAC,CAAYlJ,GACRmJ,MAAMnJ,GACNoJ,KAAKC,MAAQ,CAAEC,UAAU,EAC7B,CACA,+BAAOC,CAAyB9H,GAE5B,OADAjJ,QAAQiJ,MAAM,wBAAyBA,GAChC,CAAE6H,UAAU,EAAM7H,QAC7B,CACA,MAAA+H,GAEI,OAAIJ,KAAKC,MAAMC,SACJ,KAEJF,KAAKpJ,MAAM3a,QACtB,EA2NJ,MAAMokB,GAAmB3U,EAAMjF,KAvN/B,UAAmCyJ,SAAEA,EAAQoQ,UAAEA,EAASC,SAAEA,EAAW,UAASC,YAAEA,GAAc,EAAKrQ,kBAAEA,EAAoB,IAAIG,IAAKsE,cAAEA,EAAa6K,qBAAEA,EAAuB,IACtK,MAAMgB,EAAe1U,EAAO,OACrBqE,EAAkBsQ,GAAuBrhB,EAAS,OAGnDshB,EAAoB5U,EAAO,GAC3B6U,EAAqB7U,EAAO,MAC5BqP,EAAcjL,EAAkB/O,KAAO,EAGvCyf,EAAyB5iB,EAAQ,KACnC,IAAI+I,EAAQ,EAIZ,OAHAmJ,EAAkBW,QAASI,IACvBlK,GAASkK,EAAK3O,MAAMyG,QAAU,IAE3BvF,KAAKkS,MAAM3O,EAAQ,MAC3B,CAACmJ,IAEE2Q,EAAgBhb,EAAY,KAC1Bwa,EAAUhO,UACVgO,EAAUhO,QAAQyO,eAAe,CAAEC,SAAU5F,EAAc,UAAY,WACvEuF,EAAkBrO,QAAUnP,KAAKC,OAErCwd,EAAmBtO,QAAU,MAC9B,CAACgO,EAAWlF,IAGfrZ,EAAU,KACN,MACMkf,EADM9d,KAAKC,MACiBud,EAAkBrO,QAEpD,GAAI2O,GAhCe,IAiCfH,SAEC,GAAmC,OAA/BF,EAAmBtO,QAAkB,CAE1C,MAAM4O,EArCS,IAqCoBD,EACnCL,EAAmBtO,QAAU9M,OAAOiY,WAAWqD,EAAeI,EAClE,CAEA,MAAO,KACgC,OAA/BN,EAAmBtO,UACnBoL,aAAakD,EAAmBtO,SAChCsO,EAAmBtO,QAAU,QAGtC,CAACpC,EAASlH,OAAQmH,EAAkB/O,KAAMyf,EAAwBC,IAErE,MAAMlP,EAAiBlG,EAAMzN,QAAQ,IAAM,IAAIiS,GAC1CoI,OAAOvG,IAjFgB,CAAC1P,IAC7B,GAAIA,EAAQzF,OAASiS,GAAiBsF,OAClC,OAAO,EACX,MAAM5R,EAAOF,EAAQA,SAAS8e,YAAc,GAE5C,QAAI5e,EAAKsV,WAAW,qBAGhBtV,EAAKsV,WAAW,mCAyEAuJ,CAAwBrP,IACvCR,KAAK,CAAC9C,EAAG+C,KAC2B,iBAAhB/C,EAAEJ,UAAyBI,EAAEJ,UAAY,IAAIlL,KAAKsL,EAAEJ,WAAWC,YAC/C,iBAAhBkD,EAAEnD,UAAyBmD,EAAEnD,UAAY,IAAIlL,KAAKqO,EAAEnD,WAAWC,YAEpF,CAAC4B,IAEC0O,EAAclT,EAAMzN,QAAQ,KAE9B,MAAMojB,EDzDP,SAA4BnR,GAC/B,MAAM0O,EAAc,IAAItO,IAqBxB,OAnBAsO,EAAYjO,IAAI,MAAO,gBACvBiO,EAAYjO,IAAI,OAAQ,QAExBT,EAASY,QAASzO,IACVA,EAAQ8M,eACkB,SAA1B9M,EAAQ8M,eACkB,QAA1B9M,EAAQ8M,gBACPyP,EAAYrS,IAAIlK,EAAQ8M,iBAEzByP,EAAYjO,IAAItO,EAAQ8M,cAAe9M,EAAQ8M,eAC/CC,QAAQC,IAAI,qBAAqBhN,EAAQ8M,oBAK7CyP,EAAYxd,MAAQ,IAAMwd,EAAYrS,IAAI,SAC1CqS,EAAYjO,IAAI,OAAQ,QAE5BvB,QAAQC,IAAI,yBAA0BuP,GAC/BA,CACX,CCkCqC0C,CAAmB1P,GAGhD,OAAOyP,GACR,CAACzP,IAEE2P,EAAmB7V,EAAMzN,QAAQ,KACnC,MAAMujB,EAAS,IAAIlR,IACnBkR,EAAO7Q,IAAI,MAAOiB,EAAe5I,QAEjC,MAAMyY,EAAelC,GAA2B3N,EAAgB,QAShE,OARA4P,EAAO7Q,IAAI,OAAQ8Q,EAAazY,QAEhC4I,EAAed,QAASiB,IACpB,MAAMV,EAAenC,GAAgB6C,GAChB,SAAjBV,GACAmQ,EAAO7Q,IAAIU,GAAemQ,EAAO3Q,IAAIQ,IAAiB,GAAK,KAG5DmQ,GACR,CAAC5P,IAEE8P,EAAkBhW,EAAMzN,QAAQ,IACT,QAArBmS,EACOwB,EAEJ2N,GAA2B3N,EAAgBxB,GACnD,CAACwB,EAAgBxB,KAEduR,kBAAEA,EAAiBC,eAAEA,GAAmBlW,EAAMzN,QAAQ,KACxD,MAAM4jB,EAAe1R,EAAkB/O,KAAO,EAsB9C,MAAO,CAAEugB,kBApBSD,EAAgBpJ,OAAOvG,GAAOA,EAAInV,OAASiS,GAAiB2E,QAC1EzB,EAAInV,OAASiS,GAAiBoF,UAC9BlC,EAAInV,OAASiS,GAAiBC,UAC9BiD,EAAInV,OAASiS,GAAiBE,MAC9BgD,EAAInV,OAASiS,GAAiBG,eAC9B+C,EAAInV,OAASiS,GAAiBI,YAC9B8C,EAAInV,OAASiS,GAAiBqF,OAE7BnC,EAAInV,OAASiS,GAAiBU,SAAWwC,EAAIvC,SAASC,MAEtDsC,EAAInV,OAASiS,GAAiB0F,QAAuC,kBAA7BxC,EAAIvC,SAASsS,aAUnBF,eAPbpB,GAAgBqB,EAMpC,GALAH,EACGpJ,OAAOvG,GAAOA,EAAInV,OAASiS,GAAiBsF,QAC7CpC,EAAInV,OAASiS,GAAiBwF,MAC7BtC,EAAInV,OAASiS,GAAiBU,UAAYwC,EAAIvC,SAASC,MACvD0L,OAAM,KAGhB,CAACuG,EAAiBlB,EAAarQ,EAAkB/O,OAE9C2gB,EAAkBrW,EAAMzN,QAAQ,IAAMgS,GAA2ByR,EAAiBvR,EAAmBC,GAAmB,CAACsR,EAAiBvR,EAAmBC,IAE7J4R,EAA2BtW,EAAMzN,QAAQ,IAAMgS,GAA2B0R,EAAmBxR,EAAmBC,GAAmB,CAACuR,EAAmBxR,EAAmBC,IAE1K6R,EAAiBhkB,EAAQ,KACvBuiB,IAGGrQ,EAAkB/O,KAAO,GAAKwgB,EAAe5Y,OAAS,IAAM0Y,EAAgB5I,KAAK/G,GAAOA,EAAInV,OAASiS,GAAiBC,UACzHiD,EAAInV,OAASiS,GAAiBE,MAC9BgD,EAAInV,OAASiS,GAAiBI,aACnC,CAACuR,EAAarQ,EAAkB/O,KAAMwgB,EAAe5Y,OAAQ0Y,IAE1DQ,EAA6BjkB,EAAQ,KACvC,MAAMkkB,EAAY,IAAI7R,IAEhB8R,EAAqB,IAAI9R,IAC/BsB,EAAed,QAAQzO,IACnB,MAAMgP,EAAenC,GAAgB7M,GAChC+f,EAAmB7V,IAAI8E,IACxB+Q,EAAmBzR,IAAIU,EAAc,IAEzC+Q,EAAmBvR,IAAIQ,GAAc3C,KAAKrM,KAG9C,IAAK,MAAOgP,EAAcgR,KAASD,EAAmB5K,UAClD,GAAI6K,EAAKrZ,OAAS,EAAG,CACjB,MAAM4U,EAAcyE,EAAKA,EAAKrZ,OAAS,GACvCmZ,EAAUxR,IAAIU,EAAc,CACxBxC,GAAiBC,SACjBD,GAAiBE,KACjBF,GAAiBG,cACjBH,GAAiBI,YACnBwG,SAASmI,EAAYhhB,MAC3B,CAEJ,OAAOulB,GACR,CAACvQ,IACJ,OAAQlV,EAAM,MAAO,CAAEc,IAAKijB,EAAcrkB,UAAW,sGAAuG,cAAe,qBAAsBH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,oBAAqBH,SAAUE,EAAKwiB,GAAgB,CAAEC,YAAaA,EAAaxO,iBAAkBA,EAAkByO,mBAAoB6B,EAAqB5B,MAAOyC,EAAkBxC,iBAAkBmD,MAA6D,IAA3BR,EAAgB1Y,OAAgB7M,EAAK,MAAO,CAAEC,UAAW,2DAA4DH,SAAUE,EAAK,MAAO,CAAEC,UAAW,yCAA0CH,SAA+B,QAArBmU,EACroB,gCACA,4CAAkD1T,EAAM,MAAO,CAAEN,UAAW,oDAAqDH,SAAU,CAEjJS,EAAMggB,EAFyJ,YAAb6D,EAEjI,CAAEtkB,SAAU,CAAC8lB,EAAgB/kB,IAAI,CAAC+T,EAAOuR,KAC9C,MAAMC,EAAcD,IAAeP,EAAgB/Y,OAAS,EAC5D,GAAmB,eAAf+H,EAAMnU,KAAuB,CAE7B,MAAMghB,EAAc7M,EAAMb,SAASa,EAAMb,SAASlH,OAAS,GACrDwZ,GAAYhC,GACd+B,IACC3T,GAAY6G,SAASmI,EAAYhhB,OACb,cAArBmU,EAAMiB,WACV,OAAQ7V,EAAKyjB,GAAsB,CAAE3jB,SAAUE,EAAKwgB,GAAe,CAAEzM,SAAUa,EAAMb,SAAUyE,oBAAqB6N,EAAU9R,UAAWK,EAAML,UAAWsB,WAAYjB,EAAMiB,cAAiB,SAASjB,EAAML,WAAaK,EAAMH,kBAAkB0R,IACrP,CACK,GAAmB,cAAfvR,EAAMnU,KAEX,OAAQT,EAAKyjB,GAAsB,CAAE3jB,SAAUE,EAAKmd,GAAkB,CAAE/W,KAAMwO,EAAMxO,KAAM8O,aAAcN,EAAMM,aAAc7J,WAAYuJ,EAAMvJ,cAAiB,aAAauJ,EAAMI,eAAemR,KAEhM,CAED,MAAMjgB,EAAU0O,EAAM1O,QAChBogB,GAAmBjC,GACrB+B,IACC3T,GAAY6G,SAASpT,EAAQzF,MAElC,OAAI8iB,GAAuBrd,GACflG,EAAKyjB,GAAsB,CAAE3jB,SAAUE,EAAKqK,GAAoB,CAAEnE,QAASA,EAASqE,UAAWrE,EAAQmN,QAAS7I,WAAYtE,EAAQmN,QAAQlI,gBAAmB,SAASjF,EAAQmN,QAAQmQ,YAAYtd,EAAQgM,aAAaiU,KAE7NnmB,EAAKyjB,GAAsB,CAAE3jB,SAAUE,EAAKuY,GAAa,CAAErS,QAASA,EAASsS,oBAAqB8N,EAAiB7N,cAAeA,KAAoB,GAAGvS,EAAQgM,aAAaiU,IAC1L,IACAL,GAA6C,IAA3B9R,EAAkB/O,MAAe1E,EAAM,MAAO,CAAEN,UAAW,0HAA2HH,SAAU,CAACE,EAAKgF,GAAiB,CAAEC,KAAM,KAAMR,MAAO,SAAWzE,EAAK,OAAQ,CAAEC,UAAW,qBAAsBH,SAAU,oBAE9T,CAAEA,SAAU,CAAC+lB,EAAyBhlB,IAAI,CAAC+T,EAAOuR,KACvD,MAAMC,EAAcD,IAAeN,EAAyBhZ,OAAS,EACrE,GAAmB,eAAf+H,EAAMnU,KAAuB,CAE7B,MAAMghB,EAAc7M,EAAMb,SAASa,EAAMb,SAASlH,OAAS,GACrDwZ,GAAYhC,GACY,IAA1BoB,EAAe5Y,QACfuZ,IACC3T,GAAY6G,SAASmI,EAAYhhB,OACb,cAArBmU,EAAMiB,WACV,OAAQ7V,EAAKyjB,GAAsB,CAAE3jB,SAAUE,EAAKwgB,GAAe,CAAEzM,SAAUa,EAAMb,SAAUyE,oBAAqB6N,EAAU9R,UAAWK,EAAML,UAAWsB,WAAYjB,EAAMiB,cAAiB,SAASjB,EAAML,WAAaK,EAAMH,kBAAkB0R,IACrP,CACK,GAAmB,cAAfvR,EAAMnU,KAEX,OAAQT,EAAKyjB,GAAsB,CAAE3jB,SAAUE,EAAKmd,GAAkB,CAAE/W,KAAMwO,EAAMxO,KAAM8O,aAAcN,EAAMM,aAAc7J,WAAYuJ,EAAMvJ,cAAiB,aAAauJ,EAAMI,eAAemR,KAEhM,CAED,MAAMjgB,EAAU0O,EAAM1O,QAChBogB,GAAmBjC,GACK,IAA1BoB,EAAe5Y,QACfuZ,IACC3T,GAAY6G,SAASpT,EAAQzF,MAElC,OAAI8iB,GAAuBrd,GACflG,EAAKyjB,GAAsB,CAAE3jB,SAAUE,EAAKqK,GAAoB,CAAEnE,QAASA,EAASqE,UAAWrE,EAAQmN,QAAS7I,WAAYtE,EAAQmN,QAAQlI,gBAAmB,SAASjF,EAAQmN,QAAQmQ,YAAYtd,EAAQgM,aAAaiU,KAE7NnmB,EAAKyjB,GAAsB,CAAE3jB,SAAUE,EAAKuY,GAAa,CAAErS,QAASA,EAASsS,oBAAqB8N,EAAiB7N,cAAeA,KAAoB,GAAGvS,EAAQgM,aAAaiU,IAC1L,IACAV,EAAe5kB,IAAI,CAAC0lB,EAAUnU,IAASpS,EAAKyjB,GAAsB,CAAE3jB,SAAUE,EAAKmd,GAAkB,CAAE/W,KAAMid,GAA2BkD,EAASrgB,SAAW,GAAIod,GAAuBpO,aAAcnC,GAAgBwT,GAAWlb,WAAY+G,EAAMqT,EAAe5Y,OAAS,KAAQ,YAAY0Z,EAASrU,aAAaE,MAAU0T,GAA4C,IAA1BL,EAAe5Y,QAA2C,IAA3BmH,EAAkB/O,MAAe1E,EAAM,MAAO,CAAEN,UAAW,0HAA2HH,SAAU,CAACE,EAAKgF,GAAiB,CAAEC,KAAM,KAAMR,MAAO,SAAWzE,EAAK,OAAQ,CAAEC,UAAW,qBAAsBH,SAAU,qBAA2BE,EAAK,MAAO,CAAEqB,IAAK8iB,EAAWlkB,UAAW,aACpwB,GCxQO,MAAMumB,GACTC,SACAC,YACAC,cAAe,EACfC,aAAc,EACdC,eACAC,YACAC,QAAS,EACTC,oBAAqB,EACrBC,aACAC,aACAC,OAAS,GACTC,YAAc,GACdC,MACAC,yBACAC,gBACA,WAAA5D,CAAY8C,EAAUC,GAClB7C,KAAK4C,SAAWA,EAChB5C,KAAK6C,YAAcA,CACvB,CACA,cAAAc,GACI,MAAMC,EAAc5D,KAAK6D,QACzB7D,KAAK6C,YAAYe,EACrB,CACA,KAAAC,GACI,MAAMC,EAAU,IAAInB,GAAe3C,KAAK4C,SAAU5C,KAAK6C,aAcvD,OAbAiB,EAAQL,yBAA2BzD,KAAKyD,yBACxCK,EAAQV,aAAepD,KAAKoD,aAC5BU,EAAQN,MAAQxD,KAAKwD,MACrBM,EAAQT,aAAerD,KAAKqD,aAC5BS,EAAQR,OAAStD,KAAKsD,OACtBQ,EAAQP,YAAc,IAAIvD,KAAKuD,aAC/BO,EAAQhB,aAAe9C,KAAK8C,aAC5BgB,EAAQf,YAAc/C,KAAK+C,YAC3Be,EAAQd,eAAiBhD,KAAKgD,eAAiB,IAAIhD,KAAKgD,qBAAkB9Z,EAC1E4a,EAAQJ,gBAAkB1D,KAAK0D,gBAC/BI,EAAQZ,OAASlD,KAAKkD,OACtBY,EAAQb,YAAcjD,KAAKiD,YAC3Ba,EAAQX,mBAAqBnD,KAAKmD,mBAC3BW,CACX,CACA,eAAIC,GACA,OAAO/D,KAAK8C,YAChB,CACA,eAAIiB,CAAYA,GACRA,IAAgB/D,KAAK8C,eACrB9C,KAAK8C,aAAeiB,EACpB/D,KAAK2D,iBAEb,CACA,cAAIK,GACA,OAAOhE,KAAK+C,WAChB,CACA,cAAIiB,CAAWA,GACPA,IAAehE,KAAK+C,cACpB/C,KAAK+C,YAAciB,EACnBhE,KAAK2D,iBAEb,CACA,iBAAIM,GACA,OAAOjE,KAAKgD,cAChB,CACA,iBAAIiB,CAAcA,GACdjE,KAAKgD,eAAiBiB,EACtBjE,KAAK2D,gBACT,CACA,cAAIO,GACA,OAAOlE,KAAKiD,WAChB,CACA,cAAIiB,CAAWA,GACPA,IAAelE,KAAKiD,cACpBjD,KAAKiD,YAAciB,EACnBlE,KAAK2D,iBAEb,CACA,gBAAIQ,GACA,OAAOnE,KAAKiD,YAAcmB,GAAiBC,gBAAanb,CAC5D,CACA,yBAAMob,CAAoBC,GAEtB,IAAIC,EAAiBD,EAAQE,YAC7B,GAAIF,EAAQG,QAAS,CACK,oBACHxO,KAAKsO,KAEpBA,EAAiB,GAAGA,KAAkBD,EAAQG,UAEtD,CACA,MAAMC,QAAc3E,KAAK4C,SAASgC,aAAaC,QAAQC,QAAQN,GACzDO,EAAQJ,EAAMK,SAASC,aAAeV,EAAQW,QAAQD,YACtDE,EAAQZ,EAAQW,QAAQC,MACxBC,QAAaL,EACf/E,KAAK4C,SAASyC,aAAaC,SAASf,EAAQW,QAAQD,aAEhDxN,QAAQqN,aAAQ5b,IACxB8W,KAAKuF,wBAA0BhB,EAAQgB,yBAA2B,KAElEvF,KAAKyE,YAAcE,EACnB3E,KAAKuD,YAAcgB,EAAQiB,YAAc,GACzCxF,KAAKwD,MAAQe,EAAQrT,KACrB8O,KAAK8C,aAAeyB,EAAQR,YAC5B/D,KAAK+C,YAAcwB,EAAQP,aAAc,EACzChE,KAAKgD,eAAiBuB,EAAQN,cAC9BjE,KAAKkE,WAAaK,EAAQkB,oBAAiBvc,EAE3C8W,KAAKiF,YAAcG,EACfD,IACAnF,KAAKsD,OAAS6B,GAElBnF,KAAK2D,gBACT,CACA,eAAIc,GACA,OAAOzE,KAAKoD,YAChB,CACA,eAAIqB,CAAYA,GACZ,GAAIA,GAAalnB,KAAOyiB,KAAKoD,cAAc7lB,GAAI,CAM3C,GALAyiB,KAAKoD,aAAeqB,EAEpBzE,KAAKuF,wBAA0Bd,EAAciB,GAAyBjB,EAAYkB,cAAWzc,EAE7F8W,KAAK0D,qBAAkBxa,EACnBub,IAAgBzE,KAAKmD,oBACjBsB,EAAYO,SAASC,YAAa,CAClC,MAAMF,EAAQN,EAAYO,QAAQC,YAClCjF,KAAK4C,SAASyC,aAAaC,SAASP,GAAOpc,KAAMsc,GAAgBjF,KAAKiF,YAAcA,EACxF,CAEJjF,KAAK2D,gBACT,CACJ,CACA,eAAIsB,GACA,OAAOjF,KAAKqD,YAChB,CACA,eAAI4B,CAAYA,GACZ,GAAIA,GAAa1nB,KAAOyiB,KAAKqD,cAAc9lB,GAAI,CAE3C,GADAyiB,KAAKqD,aAAe4B,GACfjF,KAAKmD,mBAAoB,CAE1B,MAAMyC,EAAmB5F,KAAKyE,aAAaO,SAASG,MAChDS,GAAoBX,GAAeY,GAAgBD,EAAkBX,EAAYa,UACjF9F,KAAKsD,OAASsC,EAGd5F,KAAKsD,OAAS2B,GAAac,eAAiBF,GAAgBZ,EAAYc,cAAed,EAAYa,UAC7Fb,EAAYc,cAAgB,EAE1C,CACA/F,KAAK2D,gBACT,CACJ,CACA,SAAIwB,GACA,OAAOnF,KAAKsD,MAChB,CACA,SAAI6B,CAAMA,GACFA,IAAUnF,KAAKsD,SACftD,KAAKsD,OAAS6B,GAAS,GACvBnF,KAAK2D,iBAEb,CACA,cAAI6B,GACA,OAAOxF,KAAKuD,WAChB,CACA,cAAIiC,CAAWQ,GACXhG,KAAKuD,YAAcyC,EACnBhG,KAAK2D,gBACT,CACA,QAAIzS,GACA,OAAO8O,KAAKwD,KAChB,CACA,QAAItS,CAAK+U,GACLjG,KAAKwD,MAAQyC,EACbjG,KAAK2D,gBACT,CACA,OAAIuC,CAAIA,GACJ9W,QAAQC,IAAI,MAAO6W,GACnBlG,KAAK2D,gBACT,CACA,SAAIwC,CAAMtpB,GACFmjB,KAAKkD,SAAWrmB,IAChBmjB,KAAKkD,OAASrmB,EACdmjB,KAAK2D,iBAEb,CACA,SAAIwC,GACA,OAAOnG,KAAKkD,MAChB,CACA,qBAAIkD,GACA,OAAOpG,KAAKmD,kBAChB,CACA,qBAAIiD,CAAkBvpB,GAClBmjB,KAAKmD,mBAAqBtmB,CAC9B,CACA,2BAAI0oB,GACA,OAAOvF,KAAKyD,wBAChB,CACA,2BAAI8B,CAAwBc,GACpBrG,KAAKyD,2BAA6B4C,IAClCrG,KAAKyD,yBAA2B4C,EAChCrG,KAAK2D,iBAEb,CACA,KAAA2C,GAiBI,GAhBAtG,KAAKkD,QAAS,EACdlD,KAAK8C,cAAe,EACpB9C,KAAK+C,aAAc,EACnB/C,KAAKgD,oBAAiB9Z,EACtB8W,KAAKiD,iBAAc/Z,EACnB8W,KAAKmD,oBAAqB,EAC1BnD,KAAKsD,OAAS,GACdtD,KAAKqD,kBAAena,EACpB8W,KAAKuD,YAAc,GACnBvD,KAAKoD,kBAAela,EACpB8W,KAAKwD,WAAQta,EACb8W,KAAKyD,yBAA2B,KAChCzD,KAAK0D,qBAAkBxa,EACvB8W,KAAKmF,WAAQjc,EACb8W,KAAKiF,iBAAc/b,EACnB8W,KAAK2D,iBACD4C,SAASC,KAAM,CACf,MAAMC,EAAiBjhB,OAAO+gB,SAASG,OAASlhB,OAAO+gB,SAASI,SAAWnhB,OAAO+gB,SAASK,OAC3FC,QAAQC,aAAa,KAAM,GAAIL,GAC/BF,SAASC,KAAO,EACpB,CACJ,CACA,aAAAO,GACI,IAAK/G,KAAKyD,yBACN,MAAO,CAAEuD,SAAS,GAGtB,IAAKhH,KAAK0D,iBAAmB1D,KAAK0D,gBAAgB2C,SAAWrG,KAAKyD,yBAA0B,CACxF,MAAMwD,EAAM,IAAIC,GAAI,CAAEC,QAAQ,IAC9BnH,KAAK0D,gBAAkB,CACnB0D,SAAUH,EAAII,QAAQrH,KAAKyD,0BAC3B4C,OAAQrG,KAAKyD,yBAErB,CACA,MAAMwC,EAAcjG,KAAKwD,OAAS,CAAA,EAElC,IADgBxD,KAAK0D,gBAAgB0D,SAASnB,GAChC,CAIV,MAAO,CAAEe,SAAS,EAAOM,aAHJtH,KAAK0D,gBAAgB0D,SAASG,OAC7CvH,KAAK0D,gBAAgB0D,SAASG,OAAOvqB,IAAKgW,GAAQ,GAAGA,EAAIwU,iBAAiBxU,EAAI3Q,WAAWkV,KAAK,MAC9F,uBAEV,CACA,MAAO,CAAEyP,SAAS,EACtB,EAEQ,MAACS,GAAiBviB,OAAcgE,GACrC,SAASwe,IAAuBzrB,SAAEA,IACrC,MAAMmZ,OAAEA,GAAWC,MACZyO,EAAS6D,GAActoB,IAI9B,OAHA0C,EAAU,KACN4lB,EAAW,IAAIhF,GAAevN,EAAQuS,KACvC,IACI7D,GAAY3nB,EAAKsrB,GAAezhB,SAAU,CAAEnJ,MAAOinB,EAAS7nB,SAAUA,GACjF,CACO,SAAS2rB,KACZ,MAAMxiB,EAAMC,EAAWoiB,IACvB,IAAKriB,EACD,MAAM,IAAIyiB,MAAM,2DAEpB,OAAOziB,CACX,CCrQe,SAAS0iB,IAAOrqB,MAAEA,EAAKsqB,QAAEA,EAAOC,QAAEA,EAAO9B,IAAEA,EAAG3F,SAAEA,EAAQ0H,iBAAEA,EAAgBC,cAAEA,EAAaC,QAAEA,GAAU,EAAKC,kBAAEA,EAAiBC,WAAEA,EAAUC,YAAEA,EAAWC,cAAEA,EAAaC,YAAEA,EAAWpsB,UAAEA,EAASqsB,eAAEA,EAAcC,iBAAEA,IAC1N,OAAQvsB,EAAKurB,GAAwB,CAAEzrB,SAAUS,EAAM,MAAO,CAAEN,UAAW,yFAAyFA,GAAa,KAAMH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,yCAAyCqsB,GAAkB,KAAMxsB,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,8BAA+BH,SAAU,CAACE,EAAK2X,GAAK,CAAE1X,UAAW,sBAAwBD,EAAK,OAAQ,CAAEC,UAAW,cAAeH,SAAUwB,OAAcf,EAAM,OAAQ,CAAEN,UAAW,0BAA2BH,SAAU,CAAC,YAAaiqB,EAAI/S,MAAMmM,UAAU,EAAG,GAAI,aAAgB5iB,EAAM,MAAO,CAAEN,UAAW,mDAAmDssB,GAAoB,KAAMzsB,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,qDAAsDH,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAsB,YAAbmY,EAAyB,UAAY,QAASnf,KAAM,KAAMhF,UAAW,eAAgBkD,QAAS,IAAM2oB,EAAiB,WAAYhsB,SAAU,YAAcE,EAAKgM,EAAQ,CAAEC,QAAsB,YAAbmY,EAAyB,UAAY,QAASnf,KAAM,KAAMhF,UAAW,eAAgBkD,QAAS,IAAM2oB,EAAiB,WAAYhsB,SAAU,sBAAyBS,EAAM,MAAO,CAAEN,UAAW,WAAYH,SAAU,CAACksB,IAAYD,GAAkB/rB,EAAK,OAAQ,CAAEC,UAAW,2FAA8FM,EAAMyL,EAAQ,CAAE/G,KAAM,KAAMgH,QAAS8f,EAAgB,UAAY,YAAa5oB,QAAS8oB,EAAmBhsB,UAAW,yCAA0CqB,MAAO,oBAAqBxB,SAAU,CAACE,EAAKwsB,GAAe,CAAEvsB,UAAW,kBAAoBD,EAAK,OAAQ,CAAEC,UAAW,sBAAuBH,SAAUisB,EAAgB,YAAc,oBAAwB/rB,EAAKysB,GAAc,CAAE1C,IAAKA,EAAK8B,QAASA,EAASD,QAASA,EAASM,WAAYA,EAAYC,YAAaA,EAAaC,cAAeA,EAAeC,YAAaA,IAAgBT,IAAYC,GAAY7rB,EAAKgM,EAAQ,CAAE/G,KAAM,KAAMgH,QAAS,QAAS9I,QAASyoB,EAAS9rB,SAAUE,EAAK0sB,GAAO,CAAEzsB,UAAW,oBACh/D,CACA,SAASwsB,IAAa1C,IAAEA,EAAG8B,QAAEA,EAAOD,QAAEA,EAAOM,WAAEA,EAAUC,YAAEA,EAAWC,cAAEA,EAAaC,YAAEA,IACnF,MAAM3hB,EAAQC,KACRsO,OAAEA,GAAWC,KACbyO,EAAU8D,KA0BhB,OAAQlrB,EAAMosB,EAAS,CAAEC,OAAO,EAAM9sB,SAAU,CAACE,EAAK6sB,EAAgB,CAAE/sB,SAAUE,EAAKgM,EAAQ,CAAE/G,KAAM,KAAMgH,QAAS,QAAS3K,MAAO,eAAgBxB,SAAUE,EAAK8sB,GAAc,CAAE7sB,UAAW,eAAmBD,EAAK+sB,EAAgB,CAAE9sB,UAAW,OAAQ+sB,MAAO,MAAOltB,SAAUE,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAUE,EAAK,MAAO,CAAEC,UAAW,gBAAiBH,SAAUE,EAAKitB,EAAS,CAAEntB,SAAUE,EAAKktB,EAAa,CAAEptB,SAAUS,EAAM4sB,EAAc,CAAErtB,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,yEAA0EH,SAAUE,EAAK,OAAQ,CAAEC,UAAW,aAAcH,SAAU,cAAiB+rB,GAAYtrB,EAAM6sB,EAAa,CAAEntB,UAAW,UAAWiO,SAAU,KAAMmf,OAJxsBhX,EAIgtB,+BAA+B0T,EAAI/S,UAAU+S,EAAIuD,aAH9wBjkB,OAAOC,KAAK+M,EAAK,UACVA,EAFK,IAACA,GAIgxBvW,SAAU,CAACE,EAAKoK,GAAc,CAAEnK,UAAW,6BAA+B,sBAAyBM,EAAM6sB,EAAa,CAAEntB,UAAW,UAAWiO,SAAU,KACz4Bie,EACAA,KAGA9f,UAAUC,UAAUC,UAAUwd,EAAI/S,OAClCtM,EAAM,CACF+B,OAAQ,UACRnL,MAAO,gBACPuC,SAAU,QAGnB/D,SAAU,CAACE,EAAK2M,GAAU,CAAE1M,UAAW,6BAA+B,kBAAoBM,EAAM6sB,EAAa,CAAEntB,UAAW,UAAWiO,SAAU,KAC1Ige,EACAA,IRsG7C3V,eAAkCkQ,EAAU8G,GAC/C,OAAO9G,EAASxL,MACXuS,eAAe,UAAUD,uBACzB/gB,KAAMihB,GAAMA,EAAEpX,IACvB,CQvGoDqX,CAAmBzU,EAAQ8Q,EAAI/S,OAAOxK,KAAMihB,GAAMpkB,OAAOC,KAAKmkB,EAAG,YAEtE3tB,SAAU,CAACE,EAAK2tB,GAAmB,CAAE1tB,UAAW,6BAA+B,4BAA8BosB,GAAgB9rB,EAAM6sB,EAAa,CAAEntB,UAAW,UAAWiO,SAAUme,EAAavsB,SAAU,CAACE,EAAK2tB,GAAmB,CAAE1tB,UAAW,6BAA+B,oBAAuB2rB,GAAWC,GAAYtrB,EAAM6sB,EAAa,CAAEntB,UAAW,UAAWiO,SAAU0d,EAAS9rB,SAAU,CAACE,EAAK0sB,GAAO,CAAEzsB,UAAW,6BAA+B,YAAeM,EAAM6sB,EAAa,CAAEntB,UAAW,2BAA4BiO,SAAU,KA5CtiBqI,OAAOwT,IAC1B,IASI,aARM9Q,EAAO2U,MAAMC,UAAUC,UAAU/D,EAAIuD,WAAYvD,EAAI/S,MAAO,UAClEtM,EAAM,CACF+B,OAAQ,UACRnL,MAAO,qBACPuC,SAAU,MAEd8jB,EAAQwC,QACRiC,OACO,CACX,CACA,MAAOlQ,GAMH,OALAxR,EAAM,CACF+B,OAAQ,QACRnL,MAAO,4BACPuC,SAAU,OAEP,CACX,GA0BwCkqB,CAAehE,IAChBjqB,SAAU,CAACE,EAAK0sB,GAAO,CAAEzsB,UAAW,mCAAqC,qCACxH,CCxDA,MAAM+tB,GAAsB,2CACrB,SAASC,IAAyBC,SAAEA,IACvC,MAAOC,EAAYC,GAAiBlrB,EAAuD,SAA9CmrB,aAAaC,QAAQN,KAS5DO,EAAiB,KACnBF,aAAaG,QAAQR,GAAqB,QAC1CI,GAAc,GACdF,GAAS,IAEPO,EAAkB,KACpBJ,aAAaG,QAAQR,GAAqB,SAC1CI,GAAc,GACdF,GAAS,IAEb,OAAQluB,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAlBxB,KACXgrB,EACAM,IAGAF,KAawD3kB,IAAKukB,EAAa,aAAe,iBAAkBruB,SACzGE,EADmHmuB,EAC9GO,GACAC,GADiB,CAAA,IAEpC,CC5BO,SAASC,GAAQxtB,EAAIyL,EAAS,GACjC,OAAKzL,EAGE,IAAMA,EAAG4d,OAAOnS,GAFZ,EAGf,CACO,SAASgiB,GAAcC,EAAKjiB,GAC/B,OAAOiiB,EAAIjiB,OAASA,EAASiiB,EAAI3L,UAAU,EAAGtW,GAAU,MAAQiiB,CACpE,CDqBAb,GAAyBD,oBAAsBA,GE7B/C,MAAMe,GAAa,WACbC,GAAe,SACfC,GAAa,kBACbC,GAAe,SAEfC,GAA2B,CAC7B,0EACA,qBACA,4EACA,iCAESC,GAAS3uB,GAASA,IAASsuB,IAAcA,GAAWzV,SAAS7Y,GAC7Dqb,GAAWrb,GAASA,EAAKib,WAAWsT,KAAiBA,GAAa1V,SAAS7Y,GAC3E4uB,GAAS5uB,GAASA,IAASwuB,IAAcA,GAAW3V,SAAS7Y,GAC7D6uB,GAAW7uB,GAASA,EAAKib,WAAWwT,KAAiBA,GAAa5V,SAAS7Y,GAC3E8uB,GAAsB9uB,GAAS0uB,GAAyB7V,SAAS7Y,GCZxEwoB,eAAkBA,IAClBuG,GAAoB,CACtBC,OAAQxG,IAAKyG,mBAAqB,IAClC3jB,OAAQ4jB,GAAqBC,KAC7BC,qBAAqB,GAEnBC,GAAe,qCACdvZ,eAAewZ,GAAkB9W,EAAQ1X,EAAKyuB,EAAiBC,EAAiBC,GACnF,IAAK3uB,GAAK2K,SAASzL,QACbqb,GAAQva,EAAI2K,QAAQzL,OAClB6uB,GAAQ/tB,EAAI2K,QAAQzL,OACpB4uB,GAAM9tB,EAAI2K,QAAQzL,OAEtB,YADAyvB,EAAmB,wBAGvBA,EAAmB,wBACnB,MAAMzR,GAAc,IAAIzX,MAAOmL,UAAY,IACrCge,EAAU9B,aAAaC,QAAQ,GAAGwB,MAAgBvuB,EAAIH,MAAMouB,GAAkBC,UAC9EW,EAAc/B,aAAaC,QAAQ,GAAGwB,MAAgBvuB,EAAIH,MAAMouB,GAAkBC,eACxF,GAAIU,GAAStjB,QACTujB,GACA9oB,KAAK+oB,IAAI5R,EAAc6R,SAASF,KAAiB,IAIjD,OAHAJ,EAAgBG,GAChBF,EAAgB,GAAG1uB,EAAInB,kBACvB8vB,EAAmB,SACZC,EAEXD,EAAmB,wBACnBjX,EAAOsX,QAAQC,aAAajvB,EAAIH,GAAIouB,IAAmBhjB,KAAMikB,IACzD,GAAwB,eAApBA,EAAShkB,OACTyjB,EAAmB,wBACnBF,EAAgB,IAChBC,EAAgB,IAChB3O,WAAW,IAAMyO,GAAkB9W,EAAQ1X,EAAKyuB,EAAiBC,EAAiBC,GAAqB,SAEtG,IAAwB,WAApBO,EAAShkB,OAId,OAHAyjB,EAAmB,wBACnBF,EAAgB,SAChBC,EAAgB,IAGf,CACD,IAAKQ,GAAUC,YAAY7jB,OAIvB,OAHAqjB,EAAmB,wBACnBF,EAAgB,SAChBC,EAAgB,IAGpB,MAAMU,EAAYF,EAASC,WAAW,GACtCrC,aAAaG,QAAQ,GAAGsB,MAAgBvuB,EAAIH,MAAMouB,GAAkBC,SAAUkB,GAC9EtC,aAAaG,QAAQ,GAAGsB,MAAgBvuB,EAAIH,MAAMouB,GAAkBC,gBAAgB,IAAIzoB,MAAOmL,UAAY,KAAM6S,YACjHgL,EAAgBW,GAChBV,EAAgB,GAAG1uB,EAAInB,kBACvB8vB,EAAmB,SACnBjd,QAAQC,IAAI,0BAA0B3R,EAAIH,8BAA8BuvB,IAC5E,KACD/Z,MAAOsF,IACNgU,EAAmB,wBACnBjd,QAAQ2d,KAAK,gCAAiC1U,GAC9C8T,EAAgB,IAChBC,EAAgB,KAExB,CC2EO,SAASY,GAAkBC,EAAexvB,GAC7C,GAAsB,oBAAX+H,QAA8C,oBAAb0nB,SACxC,OAAO,EAGX,MAAMC,EAASD,SAASE,cAAc,UACtCD,EAAO3sB,MAAM6sB,SAAW,QACxBF,EAAO3sB,MAAM8sB,MAAQ,IACrBH,EAAO3sB,MAAM+sB,OAAS,IACtBJ,EAAO3sB,MAAMkC,MAAQ,IACrByqB,EAAO3sB,MAAMb,OAAS,IACtBwtB,EAAO3sB,MAAMgJ,OAAS,IACtB2jB,EAAO3sB,MAAMgtB,WAAa,SAC1BN,SAASnuB,KAAK0uB,YAAYN,GAC1B,MAAMO,EAAeP,EAAOQ,cAC5B,IAAKD,EAED,OADAP,EAAOS,YAAYC,YAAYV,IACxB,EAEX,MAAMzvB,EAAMgwB,EAAaR,SACzBxvB,EAAI+H,OACJ/H,EAAIowB,MAAM,qCAAqCrwB,wCAC/CC,EAAIqwB,QACJrwB,EAAID,MAAQA,EACGyvB,SAASc,iBAAiB,iCAClCld,QAAS6F,IACZjZ,EAAIuwB,KAAKR,YAAY9W,EAAKuX,WAAU,MAGxC,MAAMC,EAAazwB,EAAI0vB,cAAc,SASrC,OARAe,EAAWC,YArKM,o5EAsKjB1wB,EAAIuwB,KAAKR,YAAYU,GACrBzwB,EAAIqB,KAAKsvB,UAAYpB,EAAcoB,UACnCX,EAAaY,QACbZ,EAAaa,QACb9Q,WAAW,KACP0P,EAAOS,YAAYC,YAAYV,IAChC,MACI,CACX,CC/KO,SAASqB,GAAuB5lB,GACnC,OAAQA,GACJ,KAAK6lB,GAAwBC,QACzB,MAAO,YACX,KAAKD,GAAwBE,UACzB,MAAO,eACX,KAAKF,GAAwBG,OACzB,MAAO,mBACX,KAAKH,GAAwBxf,WAC7B,KAAKwf,GAAwBI,SACzB,MAAO,iBACX,QACI,MAAO,aAEnB,CAIO,SAASC,GAAsBlmB,GAClC,OAAQA,GACJ,KAAK6lB,GAAwBC,QACzB,MAAO,UACX,KAAKD,GAAwBE,UACzB,MAAO,YACX,KAAKF,GAAwBG,OACzB,MAAO,SACX,KAAKH,GAAwBM,iBACzB,MAAO,mBACX,KAAKN,GAAwBxf,WACzB,MAAO,aACX,KAAKwf,GAAwBO,UACzB,MAAO,YACX,KAAKP,GAAwBI,SACzB,MAAO,WACX,QACI,MAAO,UAEnB,CCtCA,MAAMI,WAA0BC,EAC5B,OAAAC,CAAQlmB,GACJ,OAAOA,EAAK8D,KAChB,CACA,IAAAqiB,CAAKnmB,GACD,OAAOA,EAAK1L,EAChB,CACA,YAAA8xB,CAAapmB,GACT,OAAQvM,EAAM,MAAO,CAAET,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,cAAeH,SAAUgN,EAAK8D,QAAU5Q,EAAK,IAAK,CAAEC,UAAW,gDAAiDH,SAAUgN,EAAKkB,gBAC9L,EAEG,SAASmlB,IAAwBxwB,OAAEA,EAAMipB,QAAEA,EAAOpa,UAAEA,EAAShD,UAAEA,EAAS4kB,iBAAEA,IAC7E,MAAMC,EAAc,CAChB,CACIjyB,GAAI,SACJwP,MAAO,yBACP5C,YAAaolB,EACP,mFACA,2DAEV,CACIhyB,GAAI,cACJwP,MAAO,qBACP5C,YAAaolB,EACP,iFACA,qFAIRE,EAAgBF,EAAmBC,EAAY,GAAKA,EAAY,IAC/DE,EAAgBC,GAAqBtwB,EAASowB,IAC9CG,EAAcC,GAAmBxwB,EAAS,IAC3CywB,EAAgB,IAAIb,GAE1BltB,EAAU,KACFjD,IACA6wB,EAAkBF,GAClBI,EAAgB,MAErB,CAAC/wB,EAAQywB,IACZ,MAAMQ,EAAuC,gBAAvBL,GAAgBnyB,GAOtC,OAAQb,EAAMszB,EAAO,CAAElxB,OAAQA,EAAQipB,QAASA,EAAS3rB,UAAW,cAAeH,SAAU,CAACE,EAAK8zB,EAAY,CAAEh0B,SAAU,iBAAmBE,EAAK+zB,EAAW,CAAEj0B,SAAUS,EAAM,MAAO,CAAEN,UAAW,YAAaH,SAAU,CAACszB,GAAqBpzB,EAAK,MAAO,CAAEC,UAAW,qDAAsDH,SAAUS,EAAM,IAAK,CAAEN,UAAW,uDAAwDH,SAAU,CAAC,kDAAmDE,EAAK,OAAQ,CAAEC,UAAW,YAAaH,SAAUszB,SAA6BpzB,EAAK,IAAK,CAAEC,UAAW,6BAA8BH,SAAU,8CAAgDE,EAAKg0B,EAAY,CAAEC,QAASN,EAAe1lB,QAASolB,EAAa3yB,MAAO6yB,EAAgBjjB,SANjtBJ,IACxBsjB,EAAkBtjB,IAKqvB7H,IAAK,UAAYurB,GAAkB5zB,EAAKk0B,EAAU,CAAEtjB,MAAO,2BAA4B5C,YAAa,sCAAuC/N,UAAW,YAAaH,SAAUE,EAAKm0B,EAAO,CAAEzzB,MAAO+yB,EAAcnjB,SAAUojB,EAAiBnlB,YAAa,oCAAqCtO,UAAW,kBAAwBM,EAAM6zB,EAAa,CAAEt0B,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,YAAa9I,QAASyoB,EAASjb,SAAUnC,EAAW1O,SAAU,WAAaE,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAH3tCoT,gBACZ/E,EAAUoiB,EAAeA,EAAgBH,OAAe1mB,IAEusCyB,UAAWA,EAAW1O,SAAU,cAC7yC,CC1CO,SAASu0B,IAAsB1xB,OAAEA,EAAMipB,QAAEA,EAAO0I,OAAEA,EAAMC,QAAEA,IAC7D,MAAMtb,OAAEA,EAAM2U,MAAEA,GAAU1U,KACpBxO,EAAQC,IACR6pB,EAAWC,MACVjmB,EAAWkmB,GAAgBxxB,GAAS,IACpCyxB,EAAgBC,GAAqB1xB,EAAS,KAC9C2xB,EAAkBC,GAAuB5xB,GAAS,IAClD6xB,EAAkBC,GAAuB9xB,EAAS,MACnD+xB,EAAYrlB,EAAO,MACnBslB,EAAYtlB,EAAO,OAClBulB,EAAYC,GAAiBlyB,EAAS,OAEtCmyB,EAAeC,GAAmBpyB,EAAS,MAqClD,SAASqyB,EAAoBC,EAAQtL,GACjCsL,EAAOC,UAAUC,KAAKC,aAAaC,sBAAsB,CACrD3K,UAAU,EACV4K,QAAS,CACL,CACIC,IAAK,qCACLC,UAAW,CAAC,KACZ7L,YAIhB,CA4FA,OA1IAtkB,EAAU,KACFjD,IACAiyB,EAAkBzoB,KAAKC,UAAUkoB,EAAOxxB,YAAc,GAAI,KAAM,IAE5DwxB,EAAO7zB,MAAMW,IAezBmV,eAA+Byf,GAC3B,IACI,MAAMC,QAAoBrI,EAAMsI,MAAM/M,SAAS6M,GAC3CC,EAAYE,gBACZf,EAAca,EAAYE,eAEtBjB,EAAU/e,SACVof,EAAoBL,EAAU/e,QAAS8f,EAAYE,eAG/D,CACA,MAAOja,GACHjJ,QAAQiJ,MAAM,+BAAgCA,EAClD,CACJ,CA5BYka,CAAgB9B,EAAO7zB,KAAKW,MAGrC,CAACuB,EAAQ2xB,IAkIJ/zB,EAAMggB,EAAW,CAAEzgB,SAAU,CAACS,EAAMszB,EAAO,CAAElxB,OAAQA,EAAQipB,QAASA,EAAS3rB,UAAW,8DAA+DH,SAAU,CAACE,EAAK8zB,EAAY,CAAEh0B,SAAU,oBAAsBS,EAAMwzB,EAAW,CAAEj0B,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,6BAA8BH,SAAU,CAACw0B,EAAO7zB,MAAML,KAAQG,EAAM,OAAQ,CAAET,SAAU,CAAC,uCAAwCE,EAAK,SAAU,CAAEF,SAAUw0B,EAAO7zB,KAAKL,UAAgBJ,EAAK,OAAQ,CAAEF,SAAU,4CAA+Cq1B,GAAen1B,EAAK,OAAQ,CAAEC,UAAW,sBAAuBH,SAAU,wCAA4CE,EAAK,MAAO,CAAEC,UAAW,kEAAmEH,SAAUE,EAAKq2B,GAAQ,CAAE7yB,OAAQ,OAAQ8yB,SAAU,OAAQ51B,MAAOi0B,EAAgBrkB,SAAW5P,GAAUk0B,EAAkBl0B,GAAS,IAAK61B,QAhIh3B,SAA8BC,EAAQhB,GAClCP,EAAU9e,QAAUqgB,EACpBtB,EAAU/e,QAAUqf,EAEhBL,GACAI,EAAoBC,EAAQL,EAEpC,EAyH+4BlnB,QAAS,CACp3BwoB,QAAS,CAAEC,SAAS,GACpBC,sBAAsB,EACtBC,eAAe,EACfC,cAAc,EACdC,iBAAiB,EACjBC,SAAU,aACDx2B,EAAM6zB,EAAa,CAAEt0B,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,YAAa9I,QAASyoB,EAAS9rB,SAAU,WAAaE,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAjG9L,WACI,IAAK8xB,EAAU9e,QACX,OACJ,MAAM6gB,EAAc/B,EAAU9e,QAAQ8gB,WACtC,IACI,MAAMn0B,EAAaqJ,KAAK+qB,MAAMF,GAC9BhC,EAAoBlyB,GACpBgyB,GAAoB,EACxB,CACA,MAAOje,GACHnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,eACP0M,YAAa,mDACbnK,SAAU,KAElB,CACJ,EAgFmN/D,SAAU,uBAA2BE,EAAKmzB,GAAyB,CAAExwB,OAAQkyB,EAAkBjJ,QAVlT,WACIkJ,GAAoB,EACxB,EAQqVtjB,UA9ErV+E,eAA8Bqd,EAAeH,GACzC,IACIiB,GAAa,GACb,MAAM5xB,EAAaiyB,GAAoB5oB,KAAK+qB,MAAMvC,GAClD,GAAIf,EAAe,CAEf,MAAMnD,QAAiBxX,EAAOsX,QAAQ4G,OAAO7C,EAAOlzB,GAAI,CACpD0B,WAAYA,GACb,CACCs0B,gBAAgB,EAChBC,cAAe5D,IAGfhD,EAASrvB,KAAOkzB,EAAOlzB,IACvBk0B,EAAgB7E,EAASrvB,IAE7BsJ,EAAM,CACF+B,OAAQ,UACRnL,MAAO,sBACP0M,YAAa,0DACbnK,SAAU,MAGdixB,GAAoB,GACpBlJ,IAEI6E,EAASrvB,KAAOkzB,EAAOlzB,IAEvBkgB,WAAW,KACPkT,EAAS,YAAY/D,EAASrvB,MAC9BsJ,EAAM,CACF+B,OAAQ,OACRnL,MAAO,sBACP0M,YAAaylB,EAAe,wBAAwBA,KAAkB,8BACtE5vB,SAAU,OAEf,IAEX,YAGU+pB,EAAM2C,QAAQ4G,OAAO7C,EAAOlzB,GAAI,CAClC0B,WAAYA,IAEhB4H,EAAM,CACF+B,OAAQ,UACRnL,MAAO,qBACP0M,YAAa,wDACbnK,SAAU,MAEV0wB,SACMA,IAEVO,GAAoB,GACpBlJ,GAER,CACA,MAAO1P,GACHxR,EAAM,CACF+B,OAAQ,QACRnL,MAAO,4BACP0M,YAAakO,EAAMhW,SAAW,mDAC9BrC,SAAU,MAEd6wB,GAAa,EACjB,CACJ,EAYgXlmB,UAAWA,MAC/X,CClKA,SAAS8oB,IAAer3B,UAAEA,EAASgF,KAAEA,EAAO,OAMxC,OAAQjF,EAAK,MAAO,CAAEC,UAAW,oCAAoCA,GAAa,KAAMH,SAAUE,EAAK4M,GAAS,CAAE3M,UAAW,GALzG,CAChBqF,GAAI,UACJC,GAAI,UACJC,GAAI,WAEoIP,2CAChJ,CACO,SAASsyB,IAAgBC,OAAEA,EAAMC,WAAEA,EAAUlxB,MAAEA,EAAKtG,UAAEA,EAASy3B,gBAAEA,GAAkB,EAAKC,sBAAEA,GAAwB,EAAKC,cAAEA,EAAaC,QAAEA,IAC3I,MAAOhd,EAASid,GAAc50B,GAAS,IAChCgZ,EAAO6b,GAAY70B,EAAS,MAUnC,OAAIgZ,EACQlc,EAAK,MAAO,CAAEC,UAAW,6DAA6DA,GAAa,KAAMH,SAAU,uBAEvHS,EAAM,MAAO,CAAEN,UAAWA,EAAWH,SAAU,CAAC+a,GAAY7a,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,OAAUjF,EAAKg4B,GAAU,CAAEvY,KAAM+X,EAAQI,cAZnI,EAAGK,eACzBH,GAAW,GACXF,IAAgBK,IAU2KC,YAR1KrhB,IACjBihB,GAAW,GACXC,EAASlhB,GACTghB,IAAUhhB,IAK2MgE,QAAS,KAAM/a,SAAUE,EAAKm4B,GAAM,CAAEV,WAAYA,EAAYlxB,MAAOA,EAAOmxB,gBAAiBA,EAAiBC,sBAAuBA,EAAuB9c,QAAS7a,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,aAClb,CA1BAmzB,GAAMC,oBAAoBC,UAAY,0BAA0BF,GAAM7P,mCA2BtE,MAAMgQ,GAAmBxvB,EAAc,MAKhC,SAASyvB,IAAkBhB,OAAEA,EAAMiB,WAAEA,GAAa,EAAK34B,SAAEA,EAAQ83B,cAAEA,IACtE,MAAOK,EAAUS,GAAex1B,EAAS,IAClC2X,EAASid,GAAc50B,GAAS,IAChCgZ,EAAO6b,GAAY70B,EAAS,OAC5By1B,EAAgBC,GAAqB11B,EAAS,MAuB/CxC,EAAQ,CACV82B,SACAS,WACApd,QAJc4d,IAAejB,GAAS3c,EAKtCqB,QACAyc,kBAIJ,OAAIzc,EACQlc,EAAK,MAAO,CAAEC,UAAW,iEAAkEH,SAAU,uBAEzGE,EAAKu4B,GAAiB1uB,SAAU,CAAEnJ,MAAOA,EAAOZ,SAAU03B,EAAUx3B,EAAKg4B,GAAU,CAAEvY,KAAM+X,EAAQI,cAlCjFrhB,MAAOsiB,IAC7BH,EAAYG,EAAIZ,UAChBL,IAAgBiB,EAAIZ,UACpB,IACI,MACMa,SADaD,EAAIE,QAAQ,IACTC,YAAY,CAAEC,MAAO,IAC3CL,EAAkB,CACdryB,MAAOuyB,EAASvyB,MAChB/C,OAAQs1B,EAASt1B,OACjB01B,YAAaJ,EAASvyB,MAAQuyB,EAASt1B,QAE/C,CACA,MAAOqT,GACH5D,QAAQiJ,MAAM,iCAAkCrF,EACpD,CACAihB,GAAW,IAmB8HI,YAjBxHrhB,IACjBihB,GAAW,GACXC,EAASlhB,IAe0JgE,QAAS7a,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,OAASnF,SAAUA,EAJhO,CAAC23B,EAAYlxB,IAAWvG,EAAKm4B,GAAM,CAAEV,WAAYA,EAAYlxB,MAAOA,EAAOmxB,iBAAiB,EAAOC,uBAAuB,EAAO9c,QAAS7a,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,QAAWwyB,MAIuDz3B,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,QACnU,CACO,SAASk0B,KACZ,OAAOjwB,EAAWqvB,GACtB,CAEA,MAAMa,GAAkB,IAAM,IAKvB,SAASC,IAAc5B,WAAEA,EAAUlxB,MAAEA,EAAKtG,UAAEA,IAC/C,MAAMmoB,EAAU+Q,KACVD,EAAc9Q,GAASuQ,gBAAgBO,aAAeE,GACtDE,EAAoB/yB,EAAQe,KAAKiyB,MAAMhzB,EAAQ2yB,GAAe,IACpE,OACYl5B,EAAK,MADbooB,GAASvN,QACW,CAAE5a,UAAW,6CAA6CA,GAAa,KAAMoE,MAAO,CAAEb,OAAQ81B,EAAmB/yB,MAAOA,GAAS,QAAUzG,SAAUE,EAAKs3B,GAAgB,CAAEryB,KAAM,QAEtL,CAAEhF,UAAWA,EAAWH,SAAUE,EAAKm4B,GAAM,CAAEV,WAAYA,EAAYlxB,MAAOA,EAAOmxB,iBAAiB,EAAOC,uBAAuB,EAAO9c,QAAS7a,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,UAC5N,CAKA,SAASu0B,IAAqB/B,WAAEA,EAAUlxB,MAAEA,EAAKkzB,WAAEA,EAAUvrB,SAAEA,EAAQwrB,gBAAEA,EAAeR,YAAEA,EAAcE,GAAeO,WAAEA,EAAa,cAClI,MAAMrV,EAAe1U,EAAO,OACrBgqB,EAAgBC,GAAqB32B,GAAS,GAErD0C,EAAU,KACN,MAAMk0B,EAAYxV,EAAanO,QAC/B,IAAK2jB,EACD,OACJ,MAAMC,EAAW,IAAIC,qBAAsB3e,IACvC,MAAM4e,EAAQ5e,EAAQ,GAClB4e,GAAOC,gBACPL,GAAkB,IAEvB,CAAEF,aAAYQ,UAAW,IAE5B,OADAJ,EAASK,QAAQN,GACV,IAAMC,EAASM,cACvB,CAACV,IACJ,MAAML,EAAoB/yB,EAAQe,KAAKiyB,MAAMhzB,EAAQ2yB,GAAe,IAI9DoB,EADmBV,EACe55B,EAAKm4B,GAAM,CAAEV,WAAYA,EAAYlxB,MAAOA,EAAOmxB,iBAAiB,EAAOC,uBAAuB,EAAO9c,QAAS7a,EAAK,MAAO,CAAEC,UAAW,4CAA6CoE,MAAO,CAAEb,OAAQ81B,GAAqBx5B,SAAUE,EAAKs3B,GAAgB,CAAEryB,KAAM,WAAkBjF,EAAK,MAAO,CAAEC,UAAW,4CAA6CoE,MAAO,CAAEb,OAAQ81B,EAAmB/yB,MAAOA,GAAS,QAAUzG,SAAUE,EAAK,OAAQ,CAAEC,UAAW,gCAAiCH,SAAU23B,MAClhB,OAAQz3B,EAAK,MAAO,CAAEqB,IAAKijB,EAAcxkB,SAAU45B,EAAgB,CAC3DjC,aACAgC,aACAa,cACApsB,cAEZ,CAqBO,SAASqsB,IAAiB/C,OAAEA,EAAMiB,WAAEA,GAAa,EAAK+B,UAAEA,EAASC,YAAEA,EAAWC,eAAEA,EAAcC,aAAEA,EAAYjB,gBAAEA,EAAekB,mBAAEA,EAAkBC,oBAAEA,EAAmBC,mBAAEA,EAAkBC,oBAAEA,EAAmBC,kBAAEA,IACpN,MAAO9e,EAAO6b,GAAY70B,EAAS,OAC5B+3B,EAAcC,GAAmBh4B,EAAS,CAAE8mB,MAAO,EAAGmR,IAAK7zB,KAAKG,IAAI,GAAI+yB,MAExEtB,EAAakC,GAAkBl4B,EAAS,MACzCohB,EAAe1U,EAAO,MACtByrB,EAAc1xB,EAAakN,IAC7BkhB,EAASlhB,IACV,IAEGykB,EAAoB3xB,EAAY4M,MAAOsiB,IAEzCmC,IAAoBnC,EAAIZ,UACxB,IACI,MACMa,SADaD,EAAIE,QAAQ,IACTC,YAAY,CAAEC,MAAO,IACrCsC,EAAQzC,EAASvyB,MAAQuyB,EAASt1B,OACxC43B,EAAeG,GACfV,IAAsBU,EAC1B,CACA,MAAO1kB,GACH5D,QAAQiJ,MAAM,iCAAkCrF,GAEhDukB,EAAehC,IACfyB,IAAsBzB,GAC1B,GACD,CAACyB,EAAqBG,IAEnBQ,EAAuBtC,GAAeE,GAEtCE,EAAoBoB,EAAiBpzB,KAAKiyB,MAAMmB,EAAiBc,GAAwB,IAGzFC,EAAaV,EACbA,EAAoBzB,GACpBA,EAAoB,GAAK,GAAK,EAEpC1zB,EAAU,KACF61B,EAAa,GAAqB,OAAhBvC,GAClB4B,IAAqBW,IAE1B,CAACA,EAAYvC,EAAa4B,IA+B7B,GA3BAl1B,EAAU,KAEN,MAAMk0B,EAAYc,GAAoBzkB,SA7D9C,SAAgCulB,GAC5B,IAAKA,EACD,OAAO,KACX,IAAIvlB,EAAUulB,EAAQC,cACtB,KAAOxlB,GAAS,CACZ,MACMylB,EADQvyB,OAAOwyB,iBAAiB1lB,GACdylB,UACxB,GAAkB,SAAdA,GAAsC,WAAdA,EACxB,OAAOzlB,EAEXA,EAAUA,EAAQwlB,aACtB,CACA,OAAO,IACX,CAgDyDG,CAAuBxX,EAAanO,SACrF,IAAK2jB,EACD,OACJ,MAAMiC,EAAqB,KACvB,MAAMC,EAAYlC,EAAUkC,UACtBC,EAAiBnC,EAAUoC,aAE3BC,EAAe70B,KAAKkS,MAAMwiB,EAAYP,GACtCW,EAAc90B,KAAK+0B,MAAML,EAAYC,GAAkBR,GAEvDzR,EAAQ1iB,KAAKE,IAAI,EAAG20B,EAdZ,GAeRhB,EAAM7zB,KAAKG,IAAI+yB,EAAW4B,EAflB,GAgBdlB,EAAgBn1B,GACRA,EAAKikB,QAAUA,GAASjkB,EAAKo1B,MAAQA,EAC9B,CAAEnR,QAAOmR,OAEbp1B,IAOf,OAHAg2B,IAEAjC,EAAUwC,iBAAiB,SAAUP,EAAoB,CAAEQ,SAAS,IAC7D,IAAMzC,EAAU0C,oBAAoB,SAAUT,IACtD,CAACN,EAAYjB,EAAWI,IACvB1e,EACA,OAAQlc,EAAK,MAAO,CAAEC,UAAW,iEAAkEH,SAAU,uBAEjH,GAAI24B,IAAejB,EACf,OAAOx3B,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,OAG3D,MAAMw3B,EAAkBxB,EAAajR,MAAQyR,EACvCiB,GAAsBlC,EAAYS,EAAaE,KAAOM,EAGtDkB,EAAiC,OAAhBzD,EACvB,OAAQl5B,EAAK,MAAO,CAAEqB,IAAKijB,EAAcxkB,SAAUE,EAAKg4B,GAAU,CAAEvY,KAAM+X,EAAQI,cAAe0D,EAAmBpD,YAAamD,EAAaxgB,QAAS7a,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,OAASnF,SAAU68B,EAAkBp8B,EAAMggB,EAAW,CAAEzgB,SAAU,CAAC28B,EAAkB,GAAMz8B,EAAK,MAAO,CAAEqE,MAAO,CAAEb,OAAQi5B,KAAuBx0B,MAAMgJ,KAAK,CAAEpE,OAAQouB,EAAaE,IAAMF,EAAajR,OAAS,CAACrhB,EAAGC,KACtY,MAAM6uB,EAAawD,EAAajR,MAAQphB,EAAQ,EAChD,OAAQ5I,EAAK,MAAO,CAAE,kBAAmBy3B,EAAa,EAAGpzB,MAAO,CAAEb,OAAQi4B,EAAYmB,SAAU,UAAY98B,SAAUE,EAAKw5B,GAAsB,CAAE/B,WAAYA,EAAYlxB,MAAOm0B,EAAgBjB,WAAYhC,IAAegD,EAAavsB,SAAU,IAAMysB,EAAalD,GAAaiC,gBAAiBA,EAAiBR,YAAasC,KAA2B/D,KAC9ViF,EAAqB,GAAM18B,EAAK,MAAO,CAAEqE,MAAO,CAAEb,OAAQk5B,QAAiC18B,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,UACnK,CACO,SAAS43B,IAAoBrF,OAAEA,EAAMC,WAAEA,EAAUlxB,MAAEA,EAAK/C,OAAEA,EAAMvD,UAAEA,EAASy3B,gBAAEA,GAAkB,EAAKC,sBAAEA,GAAwB,EAAKmF,aAAEA,IACxI,MAAO7E,EAAUS,GAAex1B,EAAS,IAClC2X,EAASid,GAAc50B,GAAS,IAChCgZ,EAAO6b,GAAY70B,EAAS,MACnC0C,EAAU,KACFqyB,EAAW,GACX6E,IAAerF,EAAYQ,IAEhC,CAACR,EAAYQ,EAAU6E,IAS1B,OAAI5gB,EACQlc,EAAK,MAAO,CAAEC,UAAW,qDAAqDA,GAAa,KAAMH,SAAUS,EAAM,OAAQ,CAAET,SAAU,CAAC,uBAAwBoc,EAAMhW,aAExK3F,EAAM,MAAO,CAAEN,UAAWA,EAAWH,SAAU,CAAC+a,GAAY7a,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,OAAUjF,EAAKg4B,GAAU,CAAEvY,KAAM+X,EAAQI,cAXnI,EAAGK,SAAU8E,MACnCrE,EAAYqE,GACZjF,GAAW,IASgLI,YAP1KrhB,IACjBihB,GAAW,GACXC,EAASlhB,IAK4MgE,QAAS,KAAM/a,SAAUE,EAAKm4B,GAAM,CAAEV,WAAYnwB,KAAKG,IAAIgwB,EAAYQ,GAAY,GAAI1xB,MAAOA,EAAO/C,OAAQA,EAAQk0B,gBAAiBA,EAAiBC,sBAAuBA,EAAuB9c,QAAS7a,EAAKs3B,GAAgB,CAAEr3B,UAAW,OAAQgF,KAAM,aAC3d,CC5PA,MAAMm0B,GAAkB,IAAM,IAExB4D,GAAc,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,KAO1C,SAASC,IAAczF,OAAEA,EAAM0F,cAAEA,GAAgB,EAAK1C,UAAEA,EAASC,YAAEA,EAAWnqB,SAAEA,EAAQ0qB,kBAAEA,EAAiB/6B,UAAEA,EAASk9B,QAAEA,GAAU,EAAKC,YAAEA,IAC5I,MAAM/7B,EAAMuO,EAAO,MACbgrB,EAAqBhrB,EAAO,OAC3BytB,EAAWC,GAAgBp6B,OAAS6J,IACpCwwB,EAAMC,GAAWt6B,EAVP,MAWVg2B,EAAakC,GAAkBl4B,EAASk2B,KAExCqC,EAAYgC,GAAiBv6B,EAAS,MAEvCw6B,EAAoB9tB,EAAO,MAE3B8qB,EAAiB2C,EAAY/1B,KAAKiyB,MAAM8D,EAAYE,EAAO,UAAOxwB,EAClE4wB,EAASh0B,EAAY,KACvB,IAAIi0B,EAAeZ,GAAY3qB,UAAUwrB,GAASA,GAASN,IACtC,IAAjBK,IACAA,EAAeZ,GAAYnwB,OAAS,GAExC,MAAMixB,EAAYx2B,KAAKG,IAAIm2B,EAAe,EAAGZ,GAAYnwB,OAAS,GAClE2wB,EAAQR,GAAYc,KACrB,CAACP,IACEQ,EAAUp0B,EAAY,KACxB,IAAIi0B,EAAeZ,GAAY3qB,UAAUwrB,GAASA,GAASN,IACtC,IAAjBK,IACAA,EAAeZ,GAAYnwB,OAAS,GAExC,MAAMmxB,EAAY12B,KAAKE,IAAIo2B,EAAe,EAAG,GAC7CJ,EAAQR,GAAYgB,KACrB,CAACT,IACEU,EAAYt0B,EAAY,KAC1B6zB,EAnCa,MAoCd,IAGGzC,EAAsBpxB,EAAa2vB,GAE9BA,GADa6D,EAAU,GAAa,IAE5C,CAACA,IAEEe,EAAgB,CAAC33B,EAAOg1B,KAC1B,MAAMjC,EAAoB/yB,EAAQe,KAAKiyB,MAAMhzB,EAAQg1B,GAAS,IAC9D,OAAOR,EAAoBzB,IAI/B1zB,EAAU,KACN,MAAMk0B,EAAYc,EAAmBzkB,QACrC,IAAK2jB,EACD,OACJ,IAAIqE,EAAgB,KACpB,MAAMC,EAAoB,IAEftE,EAAUuE,YAAc,GAAK,GAAK,EAEvCC,EAAc,KAChB,MAAMC,EAAWH,IACjB,GAAIG,GAAY,EACZ,OAEJ,MAAMC,EAAgBd,EAAkBvnB,QACxC,GAAIqoB,GAAiBA,EAAgB,EAAG,CACpC,MAAMC,EAAmB3E,EAAUkC,UAC7B0C,EAAiBp3B,KAAKiyB,MAAMkF,EAAmBD,GAE/CG,EAAgBT,EAAcK,EAAUrF,GACxC0F,EAAeF,EAAiBC,EAEtCrB,EAAaiB,GAEb72B,sBAAsB,KAClBoyB,EAAU+E,SAAS,CAAEz5B,IAAKw5B,EAAc/Z,SAAU,cAEtD6Y,EAAkBvnB,QAAUwoB,CAChC,MAEIrB,EAAaiB,GACbb,EAAkBvnB,QAAU+nB,EAAcK,EAAUrF,IAItD4F,EAAeV,IACjBU,EAAe,IACfxB,EAAawB,GACbpB,EAAkBvnB,QAAU+nB,EAAcY,EAAc5F,IAE5D,MAMM6F,EAAiB,IAAIC,eANN,KAEbb,GACA5c,aAAa4c,GACjBA,EAAgB7c,WAAWgd,EAAa,OAI5C,OADAS,EAAe3E,QAAQN,GAChB,KACCqE,GACA5c,aAAa4c,GACjBY,EAAe1E,eAEpB,CAACnB,IAEJ,MAAM+F,EAA0BrvB,GAAO,GAEjCsvB,EAAuBtvB,EAAO,MAE9BuvB,EAAcvvB,EAAO2tB,GAC3B33B,EAAU,KACFu5B,EAAYhpB,UAAYonB,IACxB4B,EAAYhpB,QAAUonB,EAEtB2B,EAAqB/oB,QAAU,CAAEipB,WAAY3E,GAC7CwE,EAAwB9oB,SAAU,IAEvC,CAAConB,EAAM9C,IAEV70B,EAAU,KACN,MAAMk0B,EAAYc,EAAmBzkB,QAC/BkpB,EAAgBH,EAAqB/oB,QAC3C,GAAIkpB,GAAiBvF,GAAa2B,EAAY,CAC1CyD,EAAqB/oB,QAAU,KAE/B,MAAMmpB,GAAmBD,EAAcD,WAAa,GAAK3D,EAEzD/zB,sBAAsB,KAClBoyB,EAAU+E,SAAS,CAAEz5B,IAAKk6B,EAAiBza,SAAU,YAErDnd,sBAAsB,KAClBu3B,EAAwB9oB,SAAU,KAG9C,GACD,CAACslB,IAEJ,MAAM8D,EAAwB3vB,GAAO,GAErChK,EAAU,KACN,MAAMk0B,EAAYc,EAAmBzkB,QACrC,GAAK2jB,GAAc2B,IAAc8D,EAAsBppB,QAGvD,GAAIskB,EAAc,EAAG,CACjB8E,EAAsBppB,SAAU,EAChC8oB,EAAwB9oB,SAAU,EAClC,MAAMmpB,GAAmB7E,EAAc,GAAKgB,EAC5C3B,EAAU+E,SAAS,CAAEz5B,IAAKk6B,EAAiBza,SAAU,YACrDnd,sBAAsB,KAClBu3B,EAAwB9oB,SAAU,GAE1C,MAEIopB,EAAsBppB,SAAU,GAErC,CAACslB,EAAYhB,IAGhB,MAAM+E,EAAc5vB,EAAO6qB,GAC3B70B,EAAU,KACN,MAAMk0B,EAAYc,EAAmBzkB,QACrC,GAAK2jB,GAAc2B,GAGf+D,EAAYrpB,UAAYskB,EAAa,CACrC+E,EAAYrpB,QAAUskB,EAEtBwE,EAAwB9oB,SAAU,EAGlC,MAAMmpB,GAAmB7E,EAAc,GAAKgB,EAC5C3B,EAAU+E,SAAS,CAAEz5B,IAAKk6B,EAAiBza,SAAU,YAErDnd,sBAAsB,KAClBu3B,EAAwB9oB,SAAU,GAE1C,GACD,CAACskB,EAAagB,IAEjB71B,EAAU,KACN,MAAMk0B,EAAYc,EAAmBzkB,QACrC,IAAK2jB,IAAc2B,EACf,OACJ,IAAIgE,EAAsB,KAC1B,MAAMC,EAAe,KAEbT,EAAwB9oB,UAGxBspB,GACAle,aAAake,GACjBA,EAAsBne,WAAW,KAG7B,MAAM0a,EAAYlC,EAAUkC,UACtB2D,EAAiBr4B,KAAKiyB,MAAMyC,EAAYP,GAAc,EAEtDmE,EAAct4B,KAAKE,IAAI,EAAGF,KAAKG,IAAIk4B,EAAgBnF,IACrDoF,IAAgBnF,IAChB+E,EAAYrpB,QAAUypB,EACtBtvB,EAASsvB,KAEd,MAGP,OADA9F,EAAUwC,iBAAiB,SAAUoD,EAAc,CAAEnD,SAAS,IACvD,KACCkD,GACAle,aAAake,GACjB3F,EAAU0C,oBAAoB,SAAUkD,KAE7C,CAACjE,EAAYjB,EAAWC,EAAanqB,IAWxC,OAAQ/P,EAAM,MAAO,CAAEc,IAAKA,EAAKpB,UAAWmC,EAAK,8BAA+B+6B,EAAU,UAAY,UAAWl9B,GAAYH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAWmC,EAAK,iDAAkD+6B,EAAU,MAAQ,OAAQr9B,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAV5R,KACPs3B,EAAc,GACdnqB,EAASmqB,EAAc,IAQ6R7wB,IAAK,gBAAiB9J,SAAUE,EAAK6/B,GAAY,CAAE5/B,UAAW,aAAgBM,EAAM,MAAO,CAAEN,UAAW,4CAA6CH,SAAU,CAACE,EAAK8/B,GAAc,CAAEvC,KAAMA,EAAMwC,SAAUpC,EAAQqC,UAAWjC,EAASkC,YAAahC,EAAWiC,UAAW3C,EAAOP,GAAYA,GAAYnwB,OAAS,GAAIszB,WAAY5C,EAAOP,GAAY,KAAOI,GAAgB78B,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,4BAA8Bm9B,QAAsBp9B,EAAK,MAAO,CAAEC,UAAW,mBAAoBH,SAAUE,EAAKogC,GAAe,CAAE3F,YAAaA,EAAa4F,WAAY7F,EAAWlqB,SAAUA,SAAoBtQ,EAAK,MAAO,CAAEqB,IAAKu5B,EAAoB36B,UAAWmC,EAAK,yDAA0D+6B,EAAU,QAAU,SAAUr9B,SAAUE,EAAKu6B,GAAkB,CAAE/C,OAAQA,EAAQiB,WAAYyE,EAAe1C,UAAWA,EAAWC,YAAaA,EAAaC,eAAgBA,EAAgBC,aAAcrqB,EAAU0qB,kBAAmBA,EAAmBJ,mBAAoBA,EAAoBC,oBAAqBO,EAAgBN,mBAAoB2C,EAAe1C,oBAAqBA,EAAqBrB,gBAAiB,EAAGjC,aAAYgC,aAAYa,cAAapsB,cAAgB3N,EAAM,MAAO,CAAEN,UAAWmC,EAAK,mCAAoC+6B,EAAU,MAAQ,OAAQr9B,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAWmC,EAAK,uDAAwDq3B,EAAa,iBAAmB,iBAAkBt2B,QAAS+K,EAAUpO,SAAUw6B,IAAgBt6B,EAAKsgC,EAAQ,CAAErgC,UAAWmC,EAAK,sCAAuC+6B,EAAU,iBAAmB,gBAAiBr9B,SAAU23B,MAAkBA,OAAoBz3B,EAAK,MAAO,CAAEC,UAAWmC,EAAK,mCAAoC+6B,EAAU,MAAQ,OAAQr9B,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QALlkE,KACPs3B,EAAcD,GACdlqB,EAASmqB,EAAc,IAGmkE7wB,IAAK,YAAa9J,SAAUE,EAAKugC,GAAc,CAAEtgC,UAAW,iBAClqE,CACA,SAASmgC,IAAc3F,YAAEA,EAAW4F,WAAEA,EAAU/vB,SAAEA,IAC9C,MAAMX,EAAWC,EAAO,OACjBP,EAAYC,GAAiBpM,EAASmW,OAAOohB,IAEpD70B,EAAU,KACN0J,EAAc+J,OAAOohB,KACtB,CAACA,IACJ,MAAM1qB,EAAe,KACjB,MAAMywB,EAAOlQ,SAASjhB,EAAY,KAC7BoxB,MAAMD,IAASA,GAAQ,GAAKA,GAAQH,EACrC/vB,EAASkwB,GAITlxB,EAAc+J,OAAOohB,KAgB7B,OAAQl6B,EAAM,MAAO,CAAEN,UAAW,wDAAyDH,SAAU,CAACE,EAAK,OAAQ,CAAEF,SAAU,SAAWE,EAAK,QAAS,CAAEqB,IAAKsO,EAAUlP,KAAM,OAAQC,MAAO2O,EAAYiB,SAAWpG,GAAMoF,EAAcpF,EAAEF,OAAOtJ,OAAQyQ,UAbnOjH,IACL,UAAVA,EAAEkH,KACFrB,IACAJ,EAASwG,SAASuqB,QAEH,WAAVx2B,EAAEkH,MACP9B,EAAc+J,OAAOohB,IACrB9qB,EAASwG,SAASuqB,SAM0PC,OAHjQ,KACf5wB,KAEoS9P,UAAW,6HAA+HM,EAAM,OAAQ,CAAET,SAAU,CAAC,KAAMugC,OACvd,CACA,SAASP,IAAavC,KAAEA,EAAIwC,SAAEA,EAAQC,UAAEA,EAASC,YAAEA,EAAWC,UAAEA,EAASC,WAAEA,IACvE,OAAQ5/B,EAAM,MAAO,CAAEN,UAAW,8BAA+BH,SAAU,CAACE,EAAK6Q,EAAU,CAAE7C,YAAa,WAAY8C,UAAW,SAAU7L,KAAM,KAAMnF,SAAUE,EAAK,SAAU,CAAEC,UAAWmC,EAAK,+CAAgD+9B,EAC5N,6DACA,+CAAgDh9B,QAAS68B,EAAWrvB,UAAWwvB,EAAYrgC,SAAUE,EAAK4gC,GAAO,CAAE3gC,UAAW,eAAmBM,EAAM,OAAQ,CAAEN,UAAW,yDAA0DH,SAAU,CAACy9B,EAAM,OAASv9B,EAAK6Q,EAAU,CAAE7C,YAAa,UAAW8C,UAAW,SAAU7L,KAAM,KAAMnF,SAAUE,EAAK,SAAU,CAAEC,UAAWmC,EAAK,+CAAgD89B,EACra,6DACA,+CAAgD/8B,QAAS48B,EAAUpvB,UAAWuvB,EAAWpgC,SAAUE,EAAK6gC,GAAM,CAAE5gC,UAAW,eAAmBD,EAAK6Q,EAAU,CAAE7C,YAAa,eAAgB8C,UAAW,SAAU7L,KAAM,KAAMnF,SAAUE,EAAK,SAAU,CAAEC,UAAWmC,EAAK,+CArQ7Q,MAqQ6Tm7B,EACxT,6DACA,4BAA6Bp6B,QAAS88B,EAAangC,SAAUE,EAAK8gC,GAAU,CAAE7gC,UAAW,iBACnH,CC9QA,MACM8gC,GAA6B,YAC5B,IAAIC,IACX,SAAWA,GACPA,EAAoB,SAAI,WACxBA,EAAwB,aAAI,cAC/B,CAHD,CAGGA,KAAcA,GAAY,CAAA,IAEtB,MAAMC,GACThoB,OACAioB,SACAb,WACAc,MAAQ,IAAIhtB,IACZuC,QAAU,IAAIvC,IACd,WAAAwP,CAAY1K,EAAQioB,EAAUb,GAC1Bxc,KAAK5K,OAASA,EACd4K,KAAKqd,SAAWA,EAChBrd,KAAKwc,WAAaA,CACtB,CACA,WAAAe,CAAYZ,EAAM//B,GACd,MAAO,GAAGA,KAAQ+/B,GACtB,CAEA,qBAAMa,CAAgBb,EAAM//B,GACxB,MAAM2Q,EAAMyS,KAAKud,YAAYZ,EAAM//B,GAE7BgW,EAASoN,KAAKsd,MAAMzsB,IAAItD,GAC9B,GAAIqF,EACA,OAAOA,EAEX,MAAMC,EAAUmN,KAAKnN,QAAQhC,IAAItD,GACjC,GAAIsF,EACA,OAAOA,EAEX,MAAMC,EAAUkN,KAAKyd,cAAcd,EAAM//B,GACzCojB,KAAKnN,QAAQlC,IAAIpD,EAAKuF,GACtB,IACI,MAAMN,QAAYM,EAElB,OADAkN,KAAKsd,MAAM3sB,IAAIpD,EAAKiF,GACbA,CACX,CACR,QACYwN,KAAKnN,QAAQjG,OAAOW,EACxB,CACJ,CACA,mBAAMkwB,CAAcd,EAAM//B,GACtB,MAAMwW,EAAO4M,KAAK0d,aAAaf,EAAM//B,GAErC,aADuBojB,KAAK5K,OAAOgC,MAAMuS,eAAevW,IACxCZ,GACpB,CACA,YAAAkrB,CAAaf,EAAM//B,GACf,MAAM+gC,EAAW,GAAGT,MAA8Bld,KAAKqd,iBACvD,OAAQzgC,GACJ,KAAKugC,GAAUS,SACX,MAAO,GAAGD,UAAiBhB,iBAC/B,KAAKQ,GAAUU,aACX,MAAO,GAAGF,UAAiBhB,qBAEvC,EAEJ,MAAMmB,GACF1oB,OACAioB,SACAb,WACAc,MAAQ,IAAIhtB,IACZuC,QAAU,IAAIvC,IACd,WAAAwP,CAAY1K,EAAQioB,EAAUb,GAC1Bxc,KAAK5K,OAASA,EACd4K,KAAKqd,SAAWA,EAChBrd,KAAKwc,WAAaA,CACtB,CACA,mBAAMuB,CAAcpB,GAEhB,MAAM/pB,EAASoN,KAAKsd,MAAMzsB,IAAI8rB,GAC9B,QAAezzB,IAAX0J,EACA,OAAOA,EAEX,MAAMC,EAAUmN,KAAKnN,QAAQhC,IAAI8rB,GACjC,GAAI9pB,EACA,OAAOA,EAEX,MAAMC,EAAUkN,KAAKge,gBAAgBrB,GACrC3c,KAAKnN,QAAQlC,IAAIgsB,EAAM7pB,GACvB,IACI,MAAMzK,QAAgByK,EAEtB,OADAkN,KAAKsd,MAAM3sB,IAAIgsB,EAAMt0B,GACdA,CACX,CACR,QACY2X,KAAKnN,QAAQjG,OAAO+vB,EACxB,CACJ,CACA,qBAAMqB,CAAgBrB,GAClB,MAAMvpB,EAAO,GAAG8pB,MAA8Bld,KAAKqd,uBAAuBV,gBACpE/P,QAAiB5M,KAAK5K,OAAOgC,MAAMuS,eAAevW,GAClD6qB,QAAeC,MAAMtR,EAASpa,IAAK,CAAE2rB,OAAQ,QACnD,IAAKF,EAAOG,GACR,MAAM,IAAIvW,MAAM,gCAAkCoW,EAAOI,YAE7D,OAAOJ,EAAO17B,MAClB,EAEJ,MAAM+7B,GACF9B,WACAtD,MAAQ,GACR,WAAApZ,CAAY0c,GACRxc,KAAKwc,WAAaA,CACtB,CAGA,eAAA+B,CAAgBC,GACZxe,KAAKkZ,MAeb,SAA8B7wB,EAASm0B,GACnC,MAAMtD,EAAQ,IAAI90B,MAAMo4B,GAAYn4B,KAAK,IAEnCo6B,EAAqB,6CAErBC,EAAU,GAChB,IAAIC,EACJ,KAAsD,QAA9CA,EAAQF,EAAmBG,KAAKv2B,KACpCq2B,EAAQhwB,KAAK,CACTiuB,KAAMlQ,SAASkS,EAAM,GAAI,IACzB55B,MAAO45B,EAAM55B,MAAQ45B,EAAM,GAAG31B,SAItC,IAAK,IAAIvK,EAAI,EAAGA,EAAIigC,EAAQ11B,OAAQvK,IAAK,CACrC,MAAMogC,EAASH,EAAQjgC,GACjBqgC,EAAYD,EAAOlC,KAAO,EAChC,GAAImC,EAAY,GAAKA,GAAatC,EAC9B,SAEJ,MAAMuC,EAAaF,EAAO95B,MAEpBi6B,EAAqB32B,EAAQ8S,MAAM4jB,GAAYJ,MAAM,2CACrDM,EAAiBD,EACjBD,EAAaC,EAAmBj6B,MAChCsD,EAAQW,OACd,IAAIk2B,EAAc72B,EAAQ8S,MAAM4jB,EAAYE,GAAgB9yB,OAE5D+yB,EAAcA,EAAYtpB,QAAQ,YAAa,IAAIzJ,OACnD+sB,EAAM4F,GAAaI,CACvB,CACA,OAAOhG,CACX,CA/CqBiG,CAAqBX,EAAiBxe,KAAKwc,WAC5D,CAEA,cAAM4C,CAASC,EAAWC,GAE1B,CACA,qBAAMC,CAAgB5C,GAClB,MAAM53B,EAAQ43B,EAAO,EACrB,OAAI53B,EAAQ,GAAKA,GAASib,KAAKkZ,MAAMlwB,OAC1B,GAEJgX,KAAKkZ,MAAMn0B,EACtB,EAoCJ,MAAMy6B,GAAkBt6B,OAAcgE,GAC/B,SAASu2B,IAAiBxjC,SAAEA,EAAQw0B,OAAEA,IACzC,MAAMrb,OAAEA,GAAWC,KACbqqB,EAAajP,EAAOkP,SAASD,YAlKZ,GAmKjBE,EAAmE,aAA7CnP,EAAOkP,UAAUE,mBAAmBjjC,MAEzDgN,EAAMk2B,GAAWzgC,EAAS,KAC7B,MAAM0gC,EAAmB,IAAIzB,GAAqBoB,GAC9CE,GAAuBnP,EAAOluB,MAC9Bw9B,EAAiBxB,gBAAgB9N,EAAOluB,MAE5C,MAAMy9B,EAAMvP,EAAOluB,KAAO09B,GAASxP,EAAOluB,MAAQ,GAClD,MAAO,CACHuc,MAAO4gB,EACPQ,eAAgB,IAAIpC,GAAmB1oB,EAAQqb,EAAOlzB,GAAImiC,GAC1DK,mBACAI,cAAe,IAAI/C,GAAkBhoB,EAAQqb,EAAOlzB,GAAImiC,GACxDM,MACAI,SAAU3P,EAAOluB,KAAO89B,GAAgBL,GAAO,GAC/CrM,OAAQ,GACR0F,eAAe,KA8BvB,OA3BAt3B,EAAU,KACN,GAAI69B,EAAqB,CAGrB,MAAMD,EAAWlP,EAAOkP,SAClBW,EAAeX,GAAU9S,YAAYzP,KAAKwM,GAAKA,EAAErtB,OAASgkC,IAC1DC,EAAuC,oBAAzB/P,EAAOpoB,SAASzL,KAC9B6jC,EAAkBH,GAAcj4B,SAASq4B,SAAWF,EAAc/P,EAAOpoB,SAASq4B,YAASx3B,GAC7Fu3B,EACArrB,EAAO2U,MAAM2C,QAAQ/C,eAAe8W,OAAiBv3B,EAAW,UAC3DP,KAAMikB,IACPkT,EAAQ59B,QAAcA,EAAMyxB,OAAQ/G,EAASpa,IAAK6mB,eAAe,OAEhEtmB,MAAO1M,IACR+I,QAAQ2d,KAAK,yBAA0B1mB,GACvCy5B,EAAQ59B,IAAI,IAAUA,EAAMm3B,eAAe,OAI/CyG,EAAQ59B,IAAI,IAAUA,EAAMm3B,eAAe,IAEnD,MAGIyG,EAAQ59B,IAAI,IAAUA,EAAMm3B,eAAe,MAEhD,CAAC5I,EAAOlzB,GAAI6X,EAAQwqB,EAAqBF,IACpCvjC,EAAKqjC,GAAgBx5B,SAAU,CAAEnJ,MAAO+M,EAAM3N,SAAUA,GACpE,CAMO,SAAS0kC,KACZ,MAAMpc,EAAU7Y,EAAMrG,WAAWm6B,IACjC,IAAKjb,EACD,MAAM,IAAIsD,MAAM,6DAEpB,OAAOtD,CACX,CACA,SAAS8b,GAAgBL,GAErB,MACM9G,GADM,IAAI0H,WAAYC,gBAAgBZ,GAASD,GAAM,YACzCc,qBAAqB,QACjCC,EAAa,IAAIC,cACvB,OAAO58B,MAAMgJ,KAAK8rB,GAAOl8B,IAAKikC,GAAMF,EAAWG,kBAAkBD,GACrE,CACA,SAAShB,GAASD,GAKd,OAJmBA,EAEdpqB,QAAQ,oCAAqC,IAC7CA,QAAQ,gBAAiB,GAElC,CCzOA,MAAMujB,GAAc,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,KAG3CgI,GAAuB,GAAK,IAsB3B,SAASC,IAAqBhlC,UAAEA,EAASw6B,YAAEA,EAAWnqB,SAAEA,IAC3D,MAAO40B,EAAWC,GAAgBjiC,EAAS89B,GAAUU,eAC9CxI,EAAakC,GAAkBl4B,EAAS8hC,KACxCI,EAAYC,GAAiBniC,EAAS,IAAIiR,MAC1CopB,EAAMC,GAAWt6B,EA5BP,KA6BXoiC,EAAiB11B,EAAO,IAAIF,KAC5BrO,EAAMuO,EAAO,MACbgrB,EAAqBhrB,EAAO,MAC5BqvB,EAA0BrvB,GAAO,IACjCo0B,cAAEA,EAAarhB,MAAEA,GAAU6hB,KAC3B7G,EAASh0B,EAAY,KACvB,IAAIi0B,EAAeZ,GAAY3qB,UAAUwrB,GAASA,GAASN,IACtC,IAAjBK,IACAA,EAAeZ,GAAYnwB,OAAS,GAExC,MAAMixB,EAAYx2B,KAAKG,IAAIm2B,EAAe,EAAGZ,GAAYnwB,OAAS,GAClE2wB,EAAQR,GAAYc,KACrB,CAACP,IACEQ,EAAUp0B,EAAY,KACxB,IAAIi0B,EAAeZ,GAAY3qB,UAAUwrB,GAASA,GAASN,IACtC,IAAjBK,IACAA,EAAeZ,GAAYnwB,OAAS,GAExC,MAAMmxB,EAAY12B,KAAKE,IAAIo2B,EAAe,EAAG,GAC7CJ,EAAQR,GAAYgB,KACrB,CAACT,IACEU,EAAYt0B,EAAY,KAC1B6zB,EAnDa,MAoDd,IAEH53B,EAAU,KACNo+B,EAAc3C,gBAAgB,EAAG6D,GAC5B14B,KAAM6J,IACP,MAAMuE,EAAM,IAAIvR,OAAOk8B,MACvB3qB,EAAI4qB,OAAS,KACL5qB,EAAIrU,MAAQ,GAAKqU,EAAIpX,OAAS,GAC9B43B,EAAexgB,EAAIpX,OAASoX,EAAIrU,QAGxCqU,EAAIxR,IAAMiN,IAETO,MAAM,SAGZ,CAACotB,EAAekB,IAEnB,MAAMO,EAAmB71B,EAAOs1B,GAEhCt/B,EAAU,KACN,IAAIoa,GAAY,EAESylB,EAAiBtvB,UAAY+uB,IAElDO,EAAiBtvB,QAAU+uB,EAC3BI,EAAenvB,QAAU,IAAIzG,IAC7B21B,EAAc,IAAIlxB,MAEtB,MAAMuxB,EA5Ed,SAA0BjL,EAAa4F,GACnC,MAAMsF,EAAQ,CAAClL,GACf,IAAImL,EAAS,EACb,KAAOD,EAAM94B,OAASwzB,GAAY,CAC9B,MAAMh5B,EAAOozB,EAAcmL,EACrB7/B,EAAO00B,EAAcmL,EACvBv+B,GAAQg5B,GACRsF,EAAMpzB,KAAKlL,GACXtB,GAAQ,GACR4/B,EAAMpzB,KAAKxM,GACf6/B,GACJ,CACA,OAAOD,CACX,CA+D0BE,CAAiBpL,EAAa9X,GAoBhD,OADA+iB,EAAU/wB,QAAQ6rB,GAhBDjqB,OAAOiqB,IACpB,IAAIxgB,IAAaslB,EAAenvB,QAAQ/F,IAAIowB,GAE5C,IACI,MAAMnqB,QAAY2tB,EAAc3C,gBAAgBb,EAAM0E,GACjDllB,IACDslB,EAAenvB,QAAQzF,IAAI8vB,GAC3B6E,EAAct/B,GAAQ,IAAIoO,IAAIpO,GAAMyO,IAAIgsB,EAAMnqB,IAEtD,CACA,MAEA,GAIsByvB,CAAStF,IAC5B,KACHxgB,GAAY,IAEjB,CAACya,EAAa9X,EAAOuiB,EAAWlB,IAEnC,MAAM7E,EAAcvvB,EAAO2tB,GAC3B33B,EAAU,KACN,GAAIu5B,EAAYhpB,UAAYonB,GAAQ3C,EAAmBzkB,QAAS,CAC5DgpB,EAAYhpB,QAAUonB,EAEtB0B,EAAwB9oB,SAAU,EAClC,MAAM4vB,EAAYnL,EAAmBzkB,QAAQ6vB,cAAc,eAAevL,OACtEsL,EAEAr+B,sBAAsB,KAClBq+B,EAAUnhB,eAAe,CACrBC,SAAU,UACVohB,MAAO,WAGXv+B,sBAAsB,KAClBu3B,EAAwB9oB,SAAU,MAK1C8oB,EAAwB9oB,SAAU,CAE1C,GACD,CAAConB,EAAM9C,IAEV,MAAM+E,EAAc5vB,EAAO6qB,GAC3B70B,EAAU,KACN,GAAI45B,EAAYrpB,UAAYskB,GAAeG,EAAmBzkB,QAAS,CACnEqpB,EAAYrpB,QAAUskB,EAEtBwE,EAAwB9oB,SAAU,EAClC,MAAM4vB,EAAYnL,EAAmBzkB,QAAQ6vB,cAAc,eAAevL,OACtEsL,GACAA,EAAUnhB,eAAe,CACrBC,SAAU,UACVohB,MAAO,YAIfv+B,sBAAsB,KAClBu3B,EAAwB9oB,SAAU,GAE1C,GACD,CAACskB,IAEJ70B,EAAU,KACN,MAAMk0B,EAAYc,EAAmBzkB,QACrC,IAAK2jB,EACD,OACJ,IAAI2F,EAAsB,KAC1B,MAAMC,EAAe,KAEbT,EAAwB9oB,UAGxBspB,GACAle,aAAake,GACjBA,EAAsBne,WAAW,KAE7B,MAAM4kB,EAAgBpM,EAAUqM,wBAC1BC,EAAkBF,EAAc9gC,IAAM8gC,EAAc1iC,OAAS,EACnE,IAAI6iC,EAAc5L,EACd6L,EAAkBC,IACtB,IAAK,IAAIjkC,EAAI,EAAGA,GAAKqgB,EAAOrgB,IAAK,CAC7B,MAAMkkC,EAAS1M,EAAUkM,cAAc,eAAe1jC,OACtD,GAAIkkC,EAAQ,CACR,MAAMC,EAAWD,EAAOL,wBAClBO,EAAaD,EAASrhC,IAAMqhC,EAASjjC,OAAS,EAC9CmjC,EAAWr/B,KAAK+oB,IAAIqW,EAAaN,GACnCO,EAAWL,IACXA,EAAkBK,EAClBN,EAAc/jC,EAEtB,CACJ,CACI+jC,IAAgB5L,IAChB+E,EAAYrpB,QAAUkwB,EACtB/1B,EAAS+1B,KAEd,MAGP,OADAvM,EAAUwC,iBAAiB,SAAUoD,EAAc,CAAEnD,SAAS,IACvD,KACCkD,GACAle,aAAake,GACjB3F,EAAU0C,oBAAoB,SAAUkD,KAE7C,CAAC/c,EAAO8X,EAAanqB,IAWxB,OAAQ/P,EAAM,MAAO,CAAEc,IAAKA,EAAKpB,UAAWmC,EAAK,sCAAuCnC,GAAYH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,qDAAsDH,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAVxO,KACPs3B,EAAc,GACdnqB,EAASmqB,EAAc,IAQyO7wB,IAAK,gBAAiB9J,SAAUE,EAAK6/B,GAAY,CAAE5/B,UAAW,aAAgBM,EAAM,MAAO,CAAEN,UAAW,4CAA6CH,SAAU,CAACE,EAAK4mC,GAAiB,CAAEnmC,KAAMugC,GAAUS,SAAUoF,YAAa3B,EAAW/hC,QAAS,IAAMgiC,EAAanE,GAAUS,UAAWl0B,KAAMvN,EAAKulC,GAAO,CAAEtlC,UAAW,WAAa6mC,QAAS,oBAAsB9mC,EAAK4mC,GAAiB,CAAEnmC,KAAMugC,GAAUU,aAAcmF,YAAa3B,EAAW/hC,QAAS,IAAMgiC,EAAanE,GAAUU,cAAen0B,KAAMvN,EAAK+mC,GAAY,CAAE9mC,UAAW,WAAa6mC,QAAS,wBAA0B9mC,EAAK,MAAO,CAAEC,UAAW,4BAA8BD,EAAK8/B,GAAc,CAAEvC,KAAMA,EAAMwC,SAAUpC,EAAQqC,UAAWjC,EAASkC,YAAahC,EAAWiC,UAAW3C,EAAOP,GAAYA,GAAYnwB,OAAS,GAAIszB,WAAY5C,EAAOP,GAAY,QAAWh9B,EAAK,MAAO,CAAEC,UAAW,mBAAoBH,SAAUE,EAAKogC,GAAe,CAAE3F,YAAaA,EAAa4F,WAAY1d,EAAOrS,SAAUA,SAAoBtQ,EAAK,MAAO,CAAEqB,IAAKu5B,EAAoB36B,UAAW,+DAAgEH,SAAUmI,MAAMgJ,KAAK,CAAEpE,OAAQ8V,GAAS,CAACha,EAAGC,IAAW5I,EAAKgnC,GAAe,CAAEvM,YAAaA,EAAahD,WAAY7uB,EAAQ,EAAGswB,YAAaA,EAAaqE,KAAMA,EAAMlnB,IAAK+uB,EAAW1wB,IAAI9L,EAAQ,GAAIsF,SAAU,IAAMoC,EAAS1H,EAAQ,IAAMA,MAAa5I,EAAK,MAAO,CAAEC,UAAW,uCAAwCH,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QALvqD,KACPs3B,EAAc9X,GACdrS,EAASmqB,EAAc,IAGwqD7wB,IAAK,YAAa9J,SAAUE,EAAKugC,GAAc,CAAEtgC,UAAW,iBACvwD,CACA,SAAS2mC,IAAgBnmC,KAAEA,EAAIomC,YAAEA,EAAW1jC,QAAEA,EAAOoK,KAAEA,EAAIu5B,QAAEA,IAEzD,OAAQ9mC,EAAK6Q,EAAU,CAAE7C,YAAa84B,EAASh2B,UAAW,SAAU7L,KAAM,KAAMnF,SAAUE,EAAK,SAAU,CAAEC,UAAWmC,EAAK,+CADxG3B,IAASomC,EAEd,6BACA,8DAA+D1jC,QAASA,EAASrD,SAAUyN,KAC7G,CACA,SAASuyB,IAAavC,KAAEA,EAAIwC,SAAEA,EAAQC,UAAEA,EAASC,YAAEA,EAAWC,UAAEA,EAASC,WAAEA,IACvE,OAAQ5/B,EAAM,MAAO,CAAEN,UAAW,8BAA+BH,SAAU,CAACE,EAAK6Q,EAAU,CAAE7C,YAAa,WAAY8C,UAAW,SAAU7L,KAAM,KAAMnF,SAAUE,EAAK,SAAU,CAAEC,UAAWmC,EAAK,+CAAgD+9B,EAC5N,6DACA,+CAAgDh9B,QAAS68B,EAAWrvB,UAAWwvB,EAAYrgC,SAAUE,EAAK4gC,GAAO,CAAE3gC,UAAW,eAAmBM,EAAM,OAAQ,CAAEN,UAAW,yDAA0DH,SAAU,CAACy9B,EAAM,OAASv9B,EAAK6Q,EAAU,CAAE7C,YAAa,UAAW8C,UAAW,SAAU7L,KAAM,KAAMnF,SAAUE,EAAK,SAAU,CAAEC,UAAWmC,EAAK,+CAAgD89B,EACra,6DACA,+CAAgD/8B,QAAS48B,EAAUpvB,UAAWuvB,EAAWpgC,SAAUE,EAAK6gC,GAAM,CAAE5gC,UAAW,eAAmBD,EAAK6Q,EAAU,CAAE7C,YAAa,eAAgB8C,UAAW,SAAU7L,KAAM,KAAMnF,SAAUE,EAAK,SAAU,CAAEC,UAAWmC,EAAK,+CA1N7Q,MA0N6Tm7B,EACxT,6DACA,4BAA6Bp6B,QAAS88B,EAAangC,SAAUE,EAAK8gC,GAAU,CAAE7gC,UAAW,iBACnH,CACA,SAAS+mC,IAAcvP,WAAEA,EAAUgD,YAAEA,EAAWvB,YAAEA,EAAWqE,KAAEA,EAAIlnB,IAAEA,EAAGnI,SAAEA,IAGtE,OAAQ3N,EAAM,MAAO,CAAEN,UAAW,2DAA4D,YAAaw3B,EAAYpzB,MAAO,CAAEkC,MAAO,GADlHg3B,MACwIz9B,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAWmC,EAAK,2GAFnLq1B,IAAegD,EAE6R,iBAAmB,iBAAkBp2B,MAAO,CAAE60B,YAAa,OAAOA,KAAiB/1B,QAAS+K,EAAUpO,SAAUuW,EAAOrW,EAAK,MAAO,CAAEoJ,IAAKiN,EAAKzM,IAAK,QAAQ6tB,IAAcx3B,UAAW,WAAgBD,EAAK4M,GAAS,CAAE3M,UAAW,iDAAqDD,EAAKsgC,EAAQ,CAAErgC,UAAW,mDAAoDH,SAAU23B,MAChrB,CACA,SAAS2I,IAAc3F,YAAEA,EAAW4F,WAAEA,EAAU/vB,SAAEA,IAC9C,MAAMX,EAAWC,EAAO,OACjBP,EAAYC,GAAiBpM,EAASmW,OAAOohB,IAEpD70B,EAAU,KACN0J,EAAc+J,OAAOohB,KACtB,CAACA,IACJ,MAAM1qB,EAAe,KACjB,MAAMywB,EAAOlQ,SAASjhB,EAAY,KAC7BoxB,MAAMD,IAASA,GAAQ,GAAKA,GAAQH,EACrC/vB,EAASkwB,GAITlxB,EAAc+J,OAAOohB,KAgB7B,OAAQl6B,EAAM,MAAO,CAAEN,UAAW,wDAAyDH,SAAU,CAACE,EAAK,OAAQ,CAAEF,SAAU,SAAWE,EAAK,QAAS,CAAEqB,IAAKsO,EAAUlP,KAAM,OAAQC,MAAO2O,EAAYiB,SAAWpG,GAAMoF,EAAcpF,EAAEF,OAAOtJ,OAAQyQ,UAbnOjH,IACL,UAAVA,EAAEkH,KACFrB,IACAJ,EAASwG,SAASuqB,QAEH,WAAVx2B,EAAEkH,MACP9B,EAAc+J,OAAOohB,IACrB9qB,EAASwG,SAASuqB,SAM0PC,OAHjQ,KACf5wB,KAEoS9P,UAAW,6HAA+HM,EAAM,OAAQ,CAAET,SAAU,CAAC,KAAMugC,OACvd,CCpQO,SAAS4G,IAAgB3S,OAAEA,IAC9B,MAAMrb,OAAEA,GAAWC,KACbgT,EAAc9rB,KF+MjB,SAAwBqmB,EAAUya,EAAU9gC,GAC/C,OAAOqmB,EAASxL,MACXuS,eAAe,GAAGuT,MAA8BG,KAAY9gC,KAC5DoM,KAAMihB,GAAMA,EAAEpX,IACvB,EElNQ6wB,CAAejuB,EAAQqb,EAAOlzB,GAAIhB,GAAMoM,KAAK6J,GAAOhN,OAAOC,KAAK+M,EAAK,YAUnE8wB,EAAc,sDAEpB,MAAsB,aAVG,MACrB,GAA8B,aAA1B7S,EAAOkP,UAAU/iC,KAAqB,CACtC,MAAM2mC,EAAc9S,EAAOkP,SAC3B,OAAO4D,EAAY1D,mBAAmBjjC,MAAQ,KAClD,CACA,MAAO,OAEW4mC,GAIVrnC,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAAS,IAAM+oB,EAAW,eAAgBtiB,IAAK,WAAY9J,SAAUE,EAAKsnC,GAAU,CAAErnC,UAAW,aAGlJM,EAAMosB,GAAS,CAAE4a,SAAU,WAAYz2B,UAAW,eAAgB02B,OAAQ,IAAK5B,OAAQ,EAAG9lC,SAAU,CAACE,EAAK2sB,GAAQ8a,QAAS,CAAEC,OAAO,EAAM5nC,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM2E,IAAK,WAAY9J,SAAUE,EAAKsnC,GAAU,CAAErnC,UAAW,eAAmBD,EAAK2sB,GAAQgb,QAAS,CAAE7nC,SAAUS,EAAM,MAAO,CAAEN,UAAW,0GAA2GH,SAAU,CAACE,EAAK,SAAU,CAAEC,UAAWknC,EAAahkC,QAAS,IAAM+oB,EAAW,iBAAkBpsB,SAAU,kBAAoBE,EAAK,SAAU,CAAEC,UAAWknC,EAAahkC,QAAS,IAAM+oB,EAAW,gBAAiBpsB,SAAU,iBAAmBE,EAAK,SAAU,CAAEC,UAAWknC,EAAahkC,QAAS,IAAM+oB,EAAW,uBAAwBpsB,SAAU,+BAClxB,CCrBA,SAASw3B,IAAer3B,UAAEA,IACtB,OAAQD,EAAK,MAAO,CAAEC,UAAW,oCAAoCA,GAAa,KAAMH,SAAUE,EAAK4M,GAAS,CAAE3M,UAAW,wCACjI,CACO,SAAS2nC,IAAqBC,SAAEA,EAAQpQ,WAAEA,IAC7C,OAAQoQ,GACJ,IAAK,OACD,OAAO7nC,EAAK8nC,GAAoB,CAAErQ,WAAYA,IAClD,IAAK,WACD,OAAOz3B,EAAK+nC,GAAkB,CAAEtQ,WAAYA,IAChD,QACI,OAAOz3B,EAAKgoC,GAAa,CAAEvQ,WAAYA,IAEnD,CACA,SAASuQ,IAAYvQ,WAAEA,IACnB,MAAQwM,SAAUlH,GAAUyH,KAC5B,OAAQxkC,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAUE,EAAKioC,GAAW,CAAEpE,IAAK9G,EAAMtF,EAAa,GAAIyQ,aAAa,KACvH,CACA,SAASJ,IAAmBrQ,WAAEA,IAC1B,MAAOvrB,EAASi8B,GAAcjlC,EAAS,OAChC2X,EAASid,GAAc50B,GAAS,IAChCgZ,EAAO6b,GAAY70B,EAAS,OAC7B6gC,eAAEA,GAAmBS,KAe3B,OAdA5+B,EAAU,KACNkyB,GAAW,GACXC,EAAS,MACTgM,EAAenC,cAAcnK,GACxBjrB,KAAM47B,IACPD,EAAWC,EAAgBj8B,KAAK+qB,MAAMkR,GAAiB,MACvDtQ,GAAW,KAEVlhB,MAAOC,IACR5D,QAAQiJ,MAAMrF,GACdkhB,EAASlhB,EAAI3Q,SAAW,yBACxB4xB,GAAW,MAEhB,CAACL,EAAYsM,IACZlpB,EACQ7a,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAUE,EAAKs3B,GAAgB,CAAA,KAE7Epb,EACQlc,EAAK,MAAO,CAAEC,UAAW,iCAAkCH,SAAUoc,IAE1EhQ,EAAUlM,EAAKqoC,GAAU,CAAEpoC,UAAW,SAAU8U,KAAM7I,IAAa,IAC9E,CACA,SAAS67B,IAAiBtQ,WAAEA,IACxB,MAAOvrB,EAASi8B,GAAcjlC,EAAS,OAChC2X,EAASid,GAAc50B,GAAS,IAChCgZ,EAAO6b,GAAY70B,EAAS,OAC7B0gC,iBAAEA,GAAqBY,KAe7B,OAdA5+B,EAAU,KACNkyB,GAAW,GACXC,EAAS,MACT6L,EAAiBR,gBAAgB3L,GAC5BjrB,KAAMjH,IACP4iC,EAAW5iC,GACXuyB,GAAW,KAEVlhB,MAAOC,IACR5D,QAAQiJ,MAAMrF,GACdkhB,EAASlhB,EAAI3Q,SAAW,2BACxB4xB,GAAW,MAEhB,CAACL,EAAYmM,IACZ/oB,EACQta,EAAM,MAAO,CAAEN,UAAW,yDAA0DH,SAAU,CAACE,EAAKs3B,GAAgB,CAAA,GAAKt3B,EAAK,OAAQ,CAAEC,UAAW,gCAAiCH,SAAU,kBAG9LE,EAAK,MADbkc,EACoB,CAAEjc,UAAW,iCAAkCH,SAAUoc,GAE7D,CAAEjc,UAAW,wDAAyDH,SAAUoM,EAAUlM,EAAKma,GAAkB,CAAEra,SAAUoM,IAAalM,EAAK,MAAO,CAAEF,SAAU,mCAC1L,CCjEA,MAAMwoC,WAA6B5kB,EAC/B,WAAAC,CAAYlJ,GACRmJ,MAAMnJ,GACNoJ,KAAKC,MAAQ,CAAEC,UAAU,EAAO7H,MAAO,KAC3C,CACA,+BAAO8H,CAAyB9H,GAC5B,MAAO,CAAE6H,UAAU,EAAM7H,QAC7B,CACA,iBAAAqsB,CAAkBrsB,EAAOssB,GACrBv1B,QAAQiJ,MAAM,kBAAmBA,EAAOssB,EAC5C,CACA,MAAAvkB,GACI,OAAIJ,KAAKC,MAAMC,SACH/jB,EAAK,MAAO,CAAEC,UAAW,oEAAqEH,SAAUS,EAAM,MAAO,CAAEN,UAAW,gDAAiDH,SAAU,CAACE,EAAKyoC,EAAU,CAAEnnC,MAAO,4BAA6BxB,SAAU+jB,KAAKC,MAAM5H,OAAOhW,SAAW,iCAAmC2d,KAAKpJ,MAAMmR,SAAY5rB,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAAS0gB,KAAKpJ,MAAMmR,QAAS9rB,SAAU,eAEna+jB,KAAKpJ,MAAM3a,QACtB,EAEG,SAAS4oC,IAAaxH,SAAEA,EAAQtV,QAAEA,IACrC,MAAM3S,OAAEA,GAAWC,MACXnE,KAAMuf,EAAMpY,MAAEA,GAAUysB,EAAS,IAAM1vB,EAAO2U,MAAM2C,QAAQpH,SAAS+X,EAAU,SAAU,CAACA,IAClG,OAAIhlB,EACQlc,EAAK,MAAO,CAAEC,UAAW,oEAAqEH,SAAUS,EAAM,MAAO,CAAEN,UAAW,gDAAiDH,SAAU,CAACE,EAAKyoC,EAAU,CAAEnnC,MAAO,2BAA4BxB,SAAUoc,EAAMhW,UAAY0lB,GAAY5rB,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAASyoB,EAAS9rB,SAAU,eAEhWw0B,EAGGt0B,EAAKsoC,GAAsB,CAAE1c,QAASA,EAAS9rB,SAAUE,EAAK,MAAO,CAAEC,UAAW,oEAAqEH,SAAUE,EAAKsjC,GAAkB,CAAEhP,OAAQA,EAAQx0B,SAAUE,EAAK4oC,GAAkB,CAAEtU,OAAQA,EAAQ1I,QAASA,UAFlQrrB,EAAM,MAAO,CAAEN,UAAW,iDAAkDH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,4FAA6FH,SAAU8rB,GAAY5rB,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAASyoB,EAAShiB,IAAK,QAAS9J,SAAUE,EAAK8J,GAAG,CAAE7J,UAAW,eAAoBD,EAAK,MAAO,CAAEC,UAAW,0CAA2CH,SAAUE,EAAK,MAAO,CAAEC,UAAW,oEAG1d,CACA,SAAS2oC,IAAiBtU,OAAEA,EAAM1I,QAAEA,IAChC,MAAQjJ,MAAO0d,EAAU7I,OAAEA,EAAM0F,cAAEA,GAAkBsH,MAU9C/M,EAAYoR,GAAiB3lC,EAAS,GACvC4lC,EAVmB,MACrB,GAA8B,aAA1BxU,EAAOkP,UAAU/iC,KAAqB,CACtC,MAAM2mC,EAAc9S,EAAOkP,SACrB/iC,EAAO2mC,EAAY1D,mBAAmBjjC,KAC5C,GAAa,aAATA,EACA,MAAO,UACf,CACA,MAAO,OAGW4mC,GAGtB,OACY9mC,EAAMwoC,EADI,QAAlBD,EACmC,CAAEpiC,UAAW,aAAczG,UAAW,mBAAoBH,SAAU,CAACE,EAAKgpC,EAAgB,CAAEC,YAAa,GAAIC,QAAS,GAAIC,QAAS,GAAIlpC,UAAW,WAAYH,SAAUE,EAAKilC,GAAsB,CAAEhlC,UAAW,SAAUw6B,YAAahD,EAAYnnB,SAAUu4B,MAAqB7oC,EAAKopC,EAAiB,CAAEnpC,UAAW,uCAAyCM,EAAMyoC,EAAgB,CAAEC,YAAa,GAAIC,QAAS,GAAIjpC,UAAW,gBAAiBH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,gGAAiGH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAUE,EAAKinC,GAAiB,CAAE3S,OAAQA,MAAc/zB,EAAM,OAAQ,CAAEN,UAAW,gCAAiCH,SAAU,CAAC,QAAS23B,EAAY,MAAO4I,KAAgBrgC,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,WAAY8rB,GAAY5rB,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAASyoB,EAAShiB,IAAK,QAAS9J,SAAUE,EAAK8J,GAAG,CAAE7J,UAAW,kBAAwBD,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAUE,EAAK4nC,GAAsB,CAAEnQ,WAAYA,EAAYoQ,SAAU,eAGvnC,CAAEnhC,UAAW,aAAczG,UAAW,mBAAoBH,SAAU,CAACE,EAAKgpC,EAAgB,CAAEC,YAAa,GAAIC,QAAS,GAAIC,QAAS,GAAIlpC,UAAW,WAAYH,SAAUE,EAAKi9B,GAAe,CAAEzF,OAAQA,EAAQ0F,cAAeA,EAAe1C,UAAW6F,EAAYpgC,UAAW,SAAUw6B,YAAahD,EAAYnnB,SAAUu4B,MAAqB7oC,EAAKopC,EAAiB,CAAEnpC,UAAW,uCAAyCM,EAAMyoC,EAAgB,CAAEC,YAAa,GAAIC,QAAS,GAAIjpC,UAAW,gBAAiBH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,gGAAiGH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAUE,EAAKinC,GAAiB,CAAE3S,OAAQA,MAAc/zB,EAAM,OAAQ,CAAEN,UAAW,gCAAiCH,SAAU,CAAC,QAAS23B,EAAY,MAAO4I,KAAgBrgC,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,WAAY8rB,GAAY5rB,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAASyoB,EAAShiB,IAAK,QAAS9J,SAAUE,EAAK8J,GAAG,CAAE7J,UAAW,kBAAwBD,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAUE,EAAK4nC,GAAsB,CAAEnQ,WAAYA,EAAYoQ,SAAU,oBACxtC,CChDO,SAASwB,IAAgB/U,OAAEA,EAAMje,IAAEA,EAAGkuB,OAAEA,EAAMtkC,UAAEA,IACnD,MAAMgZ,OAAEA,GAAWC,MACZuhB,EAAa6O,GAAkBpmC,EAAS,IACxCs0B,EAAQ+R,GAAarmC,EAASmT,GAAO,KACrC6mB,EAAesM,GAAoBtmC,GAAUmT,IAC7CmkB,EAAWiP,GAAgBvmC,EAAS,IACpCwmC,EAAcC,GAAmBzmC,GAAS,GAEjD0C,EAAU,KAEN,GAAIyQ,EAGA,OAFAkzB,EAAUlzB,QACVmzB,GAAiB,GAIrB,MAAMlF,EAAkBC,GAAUjQ,GAAQpoB,SAASq4B,OAC9CD,GAILkF,GAAiB,GACjBvwB,EAAOgC,MAAMuS,eAAe8W,GACvB93B,KAAMs1B,IACPyH,EAAUzH,EAAOzrB,OAEhBO,MAAOC,IACR5D,QAAQiJ,MAAM,yBAA0BrF,KAEvC+yB,QAAQ,KACTJ,GAAiB,MAZjBA,GAAiB,IActB,CAACnzB,EAAKkuB,EAAQjQ,GAAQpoB,SAASq4B,OAAQtrB,IAE1CrT,EAAU,KAEN,MAAM49B,EAAWlP,GAAQkP,SACnB7gB,EAAQ6gB,GAAUzG,OAASyG,GAAUD,YAAc,EACrD5gB,EAAQ,GACR8mB,EAAa9mB,IAGlB,CAAC2R,GAAQkP,WAEZ,MAAMqG,EAAyBlnB,IAC3B8mB,EAAa9mB,IAEjB,OAAIua,EACQl9B,EAAK,MAAO,CAAEC,UAAW,0CAA2CH,SAAUE,EAAK8pC,EAAS,CAAE7kC,KAAM,SAE3GuyB,EAIDkS,EACQnpC,EAAM,MAAO,CAAEN,UAAW,iEAAkEH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,4FAA6FH,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAAS,IAAMwmC,GAAgB,GAAQ//B,IAAK,mBAAoB9J,SAAUE,EAAK8J,GAAG,CAAE7J,UAAW,eAAmBD,EAAKi9B,GAAe,CAAEzF,OAAQA,EAAQ0F,cAAeA,EAAe1C,UAAWA,GAAa,IAAKC,YAAaA,EAAanqB,SAAUg5B,EAAgBtO,kBAAmB6O,EAAuB5pC,UAAW,sBAEplBD,EAAK,MAAO,CAAEC,UAAW,gCAAiCH,SAAUE,EAAKi9B,GAAe,CAAEzF,OAAQA,EAAQ0F,cAAeA,EAAe1C,UAAWA,GAAa,IAAKC,YAAaA,EAAanqB,SAAUg5B,EAAgBtO,kBAAmB6O,EAAuB5pC,UAAWA,EAAWk9B,SAAS,EAAMC,YAAap9B,EAAK6Q,EAAU,CAAE7C,YAAa,aAAc8C,UAAW,SAAU7L,KAAM,KAAMnF,SAAUE,EAAK,SAAU,CAAEC,UAAW,0GAA2GkD,QAAS,IAAMwmC,GAAgB,GAAO7pC,SAAUE,EAAK+pC,GAAW,CAAE9pC,UAAW,mBAN5lBD,EAAK,MAAO,CAAEC,UAAW,qDAAsDH,SAAU,oBAOzG,CCjEA,MAAMkqC,GAAwB,OCU9B,MAAMC,GAA8B,CAAC,aAAc,YAAa,YAAa,YAAa,aAAc,iBAElGC,GAA8B,CAAC,YAAa,cAE5CC,GAA8B,CAChC,YACA,YACA,cACA,aACA,YACA,YACA,cAGEC,GAEI,wBAFJA,GAIU,wBAJVA,GAMO,wBANPA,GAQK,4BA6BX,SAASC,GAA4B59B,GACjC,OAAOA,IAAW69B,GAAoBC,SAAW99B,IAAW69B,GAAoBE,UACpF,CAIA,SAASC,GAAwBnW,GAC7B,OAAOA,EAAOkP,UAAUE,mBAAmBjjC,IAC/C,CAoBA,SAASiqC,GAAmBC,GACxB,OAAOA,EAAY,GAAK,QAC5B,CACA,IAAIC,GASG,SAASC,IAAgBvW,OAAEA,EAAMwW,SAAEA,EAAQvW,QAAEA,IAChD,MAAM7pB,EAAQC,IACRogC,EAAoBx0B,MAAOrK,EAASzL,KACtC,UACU4L,UAAUC,UAAUC,UAAUL,GACpCxB,EAAM,CACF+B,OAAQ,UACRnL,OAAmB,SAATb,EAAkB,UAAY,cAAjC,UACPuN,YAAa,uBAAuBvN,iBACpCoD,SAAU,KAElB,CACA,MAAOgT,GACH5D,QAAQiJ,MAAM,kBAAkBzb,KAASoW,GACzCnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,cACP0M,YAAa,kBAAkBvN,iBAC/BoD,SAAU,KAElB,GAEJ,OAAQ7D,EAAKugB,EAAW,CAAEzgB,SAAUS,EAAMwoC,EAAqB,CAAEriC,UAAW,aAAczG,UAAWmqC,GAAoBtqC,SAAU,CAACE,EAAKgpC,EAAgB,CAAE/oC,UAAW,gBAAiBH,SAAUE,EAAKgrC,GAAiB,CAAE1W,OAAQA,EAAQC,QAASA,GAAO,KAAWjZ,QAAQqN,WAAYoiB,kBAAmBA,MAAyB/qC,EAAKopC,EAAiB,CAAE6B,YAAY,IAASjrC,EAAKgpC,EAAgB,CAAE/oC,UAAW,gBAAiBH,SAAUE,EAAKkrC,GAAW,CAAE5W,OAAQA,EAAQwW,SAAUA,IAAY,EAAOC,kBAAmBA,EAAmBxW,QAASA,UAChiB,CACA,SAASyW,IAAgB1W,OAAEA,EAAMC,QAAEA,EAAOwW,kBAAEA,IACxC,MAAOI,EAAUC,GAAeloC,GAAS,IAClCmoC,EAAuBC,GAA0BpoC,GAAS,GAOjE,OAAQ3C,EAAMggB,EAAW,CAAEzgB,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,yCAA0CH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,oDAAqDH,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,IAAGk/B,EAAW,QAAU,WAAalmC,KAAM,KAAM2E,IAAK,qBAAsBzG,QAAS,IAAMioC,GAAaD,GAAWrrC,SAAU,eAAiBE,EAAKgM,EAAQ,CAAEC,QAAS,IAAGk/B,EAAW,UAAY,SAAWlmC,KAAM,KAAM2E,IAAK,sBAAuBzG,QAAS,IAAMioC,GAAaD,GAAWrrC,SAAU,YAAeS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACw0B,EAAOxxB,YAAe9C,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM3D,MAAO,kBAAmB6B,QAAS,IAAM4nC,EAAkB5+B,KAAKC,UAAUkoB,EAAOxxB,WAAY,KAAM,GAAI,cAAehD,SAAUE,EAAKurC,GAAM,CAAEtrC,UAAW,aAAiBD,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QANj1B,KAC9BmoC,GAAuB,IAK43BhqC,MAAO,kBAAmBrB,UAAW,0BAA2BH,SAAUE,EAAKwrC,GAAW,CAAEvrC,UAAW,mBAAwBq0B,EAAOxxB,WAAc9C,EAAK,MAAO,CAAEC,UAAW,GAAGmqC,wBAA+CtqC,SAAUE,EAAKyrC,GAAa,CAAE/qC,MAAO4zB,EAAOxxB,WAAYqoC,SAAUA,MAAmBnrC,EAAK,MAAO,CAAEC,UAAW,GAAGmqC,wBAA+CtqC,SAAUE,EAAK,MAAO,CAAEF,SAAU,4BAAgCE,EAAKq0B,GAAuB,CAAE1xB,OAAQ0oC,EAAuBzf,QAHl3C,KAC/B0f,GAAuB,IAE+5ChX,OAAQA,EAAQC,QAASA,MACv9C,CACA,SAAS2W,IAAU5W,OAAEA,EAAMwW,SAAEA,EAAQC,kBAAEA,EAAiBxW,QAAEA,IACtD,MAAMzY,EAAUwY,GAAQkP,UAAU/iC,OAASirC,GAAcnG,MACnDjW,EAAUgF,GAAQkP,UAAU/iC,OAASirC,GAAcC,MACnDC,EAAUtX,GAAQkP,UAAU/iC,OAASirC,GAAcG,MACnDxc,EAAkC,oBAA1BiF,GAAQpoB,SAASzL,KACzBqrC,IAAwBxX,GAAQpoB,SAASzL,MAAO8uB,GAAmB+E,EAAOpoB,QAAQzL,MAClFsrC,EAAwB1B,GAA4B/V,GAAQ7nB,QAC5Du/B,KAAmB1X,EAAO2X,aAAe3c,IAAWsc,GAEpDpI,EAAWlP,EAAOkP,SAClBW,EAAeX,GAAU9S,YAAYzP,KAAKwM,GAAKA,EAAErtB,OAASgkC,KAWzD8H,EAAcC,GAAmBjpC,EARhCosB,EACOsb,GAAUe,MACjBC,EACOhB,GAAUiB,MACjB/vB,EACO8uB,GAAUrF,MACdqF,GAAUwB,OAIfC,SAAEA,EAAQC,YAAEA,EAAa99B,UAAW+9B,EAAeC,UAAWC,GD3JjE,SAAuBvL,EAAUwL,EAAaC,GAAc,GAC/D,MAAM/e,MAAEA,GAAU1U,MACXmzB,EAAUO,GAAe1pC,EAASwpC,IAClCJ,EAAaO,GAAkB3pC,EAAS,IACvCwpC,GAAeA,EAAY7/B,OAASm9B,GAC7B0C,EAAYvpB,UAAU,EAAG6mB,IAE7B0C,IAEJl+B,EAAWkmB,GAAgBxxB,GAAS,IACpCspC,EAAWM,GAAgB5pC,EAAS,MAAQwpC,GAAeA,EAAY7/B,OAASm9B,IACjFc,EAAWnhC,EAAY,KACzB+qB,GAAa,GACb9G,EAAM2C,QACDwc,cAAc7L,GACd10B,KAAMwgC,IACPJ,EAAYI,EAAI5mC,MACZ4mC,EAAI5mC,KAAKyG,OAASm9B,IAClB6C,EAAeG,EAAI5mC,KAAK+c,UAAU,EAAG6mB,KACrC8C,GAAa,KAGbD,EAAeG,EAAI5mC,MACnB0mC,GAAa,MAGhBl2B,MAAOC,IACR5D,QAAQiJ,MAAM,sBAAuBrF,GACrC+1B,OAAY7/B,GACZ8/B,OAAe9/B,GACf+/B,GAAa,KAEZlD,QAAQ,KACTlV,GAAa,MAElB,CAACwM,EAAUtT,IAmBd,OAjBAhoB,EAAU,KAEF8mC,GAAeA,EAAY7/B,OAASm9B,IACpC4C,EAAYF,GACZG,EAAeH,EAAYvpB,UAAU,EAAG6mB,KACxC8C,GAAa,KAGbF,EAAYF,GACZG,EAAeH,GACfI,GAAa,IAGbH,IAAgBD,GAChB5B,KAEL,CAAC5J,EAAUwL,EAAaC,EAAa7B,IACjC,CACHuB,WACAC,cACA99B,YACAg+B,YACA1B,WAER,CC8F2FmC,CAAc3Y,EAAOlzB,GAAIkzB,EAAOluB,KAAM0kC,GAEvHoC,GAAsB7d,GAASyc,IAA0BC,GACvDvlC,SAAU2mC,EAAa1gC,OAAQ2gC,EAAWC,aAAcC,EAAiBjiC,WAAYkiC,GD7F1F,SAAgCrM,EAAUsM,GAC7C,MAAMv0B,OAAEA,GAAWC,MACZ1S,EAAUC,GAAevD,KACzBuJ,EAAQghC,GAAavqC,KACrBmqC,EAAcK,GAAmBxqC,KACjCmI,EAAYsiC,GAAiBzqC,GAAS,GAkC7C,OAjCA0C,EAAU,KACN,IAAK4nC,EACD,OACJ,IAAII,GAAc,EA4BlB,OA3BA,SAASC,IACDD,GAEJ30B,EAAOsX,QAAQud,QAAQ5M,GAAU6M,YAC5BvhC,KAAMihB,IACPhnB,EAAYgnB,EAAEjnB,UACdinC,EAAUhgB,EAAEhhB,QACZihC,EAAgBjgB,EAAEugB,eAAiBvgB,EAAEjnB,UAAUwnC,eAC3CvgB,EAAEhhB,SAAW6lB,GAAwBC,QAEhCqb,GACDtsB,WAAWusB,EAAM,KAKrBF,GAAc,KAGjB/2B,MAAM,KAEFg3B,GACDtsB,WAAWusB,EAAM,MAG7B,CACAA,GACO,KAAQD,GAAc,IAC9B,CAACJ,EAAYtM,EAAUjoB,IACnB,CACHzS,WACAiG,SACA4gC,eACAhiC,aAER,CCgDyH4iC,CAAuB3Z,EAAOlzB,GAAI8rC,IAE/I1V,OAAQ0W,EAAcC,aAAcC,EAAqBlyB,MAAOmyB,EAAgBC,kBAAmBC,GD9CxG,SAAgCrN,EAAUxK,GAC7C,MAAMzd,OAAEA,GAAWC,MACZse,EAAQ+R,GAAarmC,KACrBirC,EAAcK,GAAmBtrC,GAAS,IAC1CgZ,EAAO6b,GAAY70B,IACpBorC,EAAoB3kC,EAAY4M,UAClC,IAAKmgB,GAAWyX,EACZ,OACJK,GAAgB,GAChBzW,OAAShrB,GACT,MAAM0hC,EAAal4B,MAAOm4B,IACtB,IACI,MAAMje,QAAiBxX,EAAOsX,QAAQC,aAAa0Q,EAAU,CACzDn1B,OAAQ4iC,GAAwB9V,IAChChJ,oBAAqB6e,EACrBE,UAAU,EACVC,qBAAqB,IAED,eAApBpe,EAAShkB,OAET6U,WAAW,IAAMmtB,GAAW,GAAQ,KAEX,UAApBhe,EAAShkB,QAAsBgkB,EAASC,YAAY7jB,QACzD08B,EAAU9Y,EAASC,WAAW,IAC9B8d,GAAgB,IAES,WAApB/d,EAAShkB,SACdsrB,EAAS,yBACTyW,GAAgB,GAExB,CACA,MAAO33B,GACH5D,QAAQiJ,MAAM,4CAA6CrF,GAC3DkhB,EAAS,4BACTyW,GAAgB,EACpB,SAEEC,GAAW,IAClB,CAACvN,EAAUxK,EAASyX,EAAcl1B,IACrC,MAAO,CACHue,SACA2W,eACAjyB,QACAoyB,oBAER,CCC+IQ,CAAuBxa,EAAOlzB,GAAI0qC,GAE7KlmC,EAAU,KACF2nC,GAAsBH,IAAc9a,GAAwBE,WAC5D+B,OAEL,CAACgZ,EAAoBH,EAAW7Y,IAEnC,MAAMwa,GAAuB1f,GAASyc,IAA0BC,IAA0BwB,GAAsBH,IAAc9a,GAAwBC,QAChJyc,EAAmBp/B,EAAO,MAChC,OAAQrP,EAAM,MAAO,CAAEN,UAAW,uBAAwBH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,kDAAmDH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,+BAAgCH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,+CAAgDH,SAAU,CAACgc,GACnR9b,EAAKgM,EAAQ,CAAEC,QAASigC,IAAiBtB,GAAUrF,MAAQ,UAAY,QAAStgC,KAAM,KAAM2E,IAAK,aAAczG,QAAS,IAAMgpC,EAAgBvB,GAAUrF,OAAQzlC,SAAU,UAAYwvB,GACtLtvB,EAAKgM,EAAQ,CAAEC,QAASigC,IAAiBtB,GAAUe,MAAQ,UAAY,QAAS1mC,KAAM,KAAM2E,IAAK,aAAczG,QAAS,IAAMgpC,EAAgBvB,GAAUe,OAAQ7rC,SAAU,UAAY8rC,GACtL5rC,EAAKgM,EAAQ,CAAEC,QAASigC,IAAiBtB,GAAUiB,MAAQ,UAAY,QAAS5mC,KAAM,KAAM2E,IAAK,aAAczG,QAAS,IAAMgpC,EAAgBvB,GAAUiB,OAAQ/rC,SAAU,UAAYksC,GACtLhsC,EAAKgM,EAAQ,CAAEC,QAASigC,IAAiBtB,GAAUqE,WAAa,UAAY,QAAShqC,KAAM,KAAM2E,IAAK,kBAAmBzG,QAAS,IAAMgpC,EAAgBvB,GAAUqE,YAAanvC,SAAU,eAAiBE,EAAKgM,EAAQ,CAAEC,QAASigC,IAAiBtB,GAAUwB,KAAO,UAAY,QAASnnC,KAAM,KAAM2E,IAAK,YAAazG,QAAS,IAAMgpC,EAAgBvB,GAAUwB,MAAOtsC,SAAU,SAAWuvB,GAC5XrvB,EAAKgM,EAAQ,CAAEC,QAASigC,IAAiBtB,GAAUsE,IAAM,UAAY,QAASjqC,KAAM,KAAM2E,IAAK,WAAYzG,QAAS,IAAMgpC,EAAgBvB,GAAUsE,KAAMpvC,SAAU,QAAUgsC,GAA0B9rC,EAAKgM,EAAQ,CAAEC,QAASigC,IAAiBtB,GAAUsE,IAAM,UAAY,QAASjqC,KAAM,KAAM2E,IAAK,cAAezG,QAAS,KAC3TgpC,EAAgBvB,GAAUsE,KACrB/K,GAAiB+J,GAAiBE,GACnCG,KAEL59B,SAAUy9B,EAAqBtuC,SAAUsuC,EAAsBpuC,EAAK8pC,EAAS,CAAE7kC,KAAM,OAAU,WAAejF,EAAKmvC,GAAY,CAAE7a,OAAQA,OAAe4X,IAAiBtB,GAAUwB,OAAS2C,GAAwB/uC,EAAKovC,GAAa,CAAE9a,OAAQA,EAAQluB,KAAMkmC,EAAaD,SAAUA,EAAUtB,kBAAmBA,EAAmBiE,iBAAkBA,IAAsB9C,IAAiBtB,GAAUsE,KAAOpD,IAA0B3H,GAAgB+J,IAAkBluC,EAAKqvC,GAAkB,CAAE/a,OAAQA,EAAQ6P,aAAcA,EAAc+J,aAAcA,OAAsBluC,EAAK,MAAO,CAAEC,UAAWyqC,GAAmBwB,IAAiBtB,GAAUrF,OAAQzlC,SAAUE,EAAKsvC,GAAY,CAAEhb,OAAQA,MAAct0B,EAAK,MAAO,CAAEC,UAAWyqC,GAAmBwB,IAAiBtB,GAAUe,OAAQ7rC,SAAUE,EAAKuvC,GAAY,CAAEjb,OAAQA,MAAct0B,EAAK,MAAO,CAAEC,UAAWyqC,GAAmBwB,IAAiBtB,GAAUiB,OAAQ/rC,SAAUE,EAAKwvC,GAAY,CAAElb,OAAQA,MAAc0X,GAAkBhsC,EAAK,MAAO,CAAEC,UAAWyqC,GAAmBwB,IAAiBtB,GAAUqE,YAAanvC,SAAUE,EAAKyvC,GAAiB,CAAEnb,OAAQA,EAAQyW,kBAAmBA,MAA0B1b,GAAUrvB,EAAK,MAAO,CAAEC,UAAWyqC,GAAmBwB,IAAiBtB,GAAUsE,KAAMpvC,SAAUE,EAAK0vC,GAAiB,CAAEpb,OAAQA,MAAewX,GAA0B9rC,EAAK,MAAO,CAAEC,UAAWyqC,GAAmBwB,IAAiBtB,GAAUsE,KAAMpvC,SAAUE,EAAK2vC,GAAuB,CAAExL,aAAcA,EAAc+J,aAAcA,EAAcE,oBAAqBA,EAAqBC,eAAgBA,EAAgBuB,UAAWrB,MAAmCQ,GAAwB/uC,EAAK,MAAO,CAAEC,UAAWyqC,GAAmBwB,IAAiBtB,GAAUwB,MAAOtsC,SAAUE,EAAK6vC,GAAoB,CAAErpC,SAAU2mC,EAAa1gC,OAAQ2gC,EAAWC,aAAcC,MAAwBttC,EAAK,MAAO,CAAEC,UAAWyqC,GAAmBwB,IAAiBtB,GAAUwB,OAAS2C,GAAuBxC,GAAgBzsC,SAAUE,EAAK,MAAO,CAAEC,UAAW,0CAA2CH,SAAUE,EAAK8pC,EAAS,CAAE7kC,KAAM,WAAejF,EAAK,MAAO,CAAEC,UAAWyqC,GAAmBwB,IAAiBtB,GAAUwB,OAAS2C,IAAwBxC,GAAgBzsC,SAAUE,EAAK8vC,GAAW,CAAExb,OAAQA,EAAQluB,KAAMkmC,EAAaG,cAAeA,EAAeuC,iBAAkBA,QAC/yE,CACA,SAASI,IAAY9a,OAAEA,EAAMluB,KAAEA,EAAIimC,SAAEA,EAAQtB,kBAAEA,EAAiBiE,iBAAEA,IAC9D,MAAM/1B,OAAEA,GAAWC,KACbxO,EAAQC,KACPolC,EAAeC,GAAoB9sC,EAAS,OAC5C+sC,EAAgBC,GAAqBhtC,GAAS,GAC/CgJ,EAAUooB,EAAOpoB,QACjBikC,EAAajkC,GACfA,EAAQzL,MACS,kBAAjByL,EAAQzL,KAEN2vC,EAAuB3F,GAAwBnW,GAC/C+b,EAAuB95B,MAAOxK,IAEhC,IAAIgkC,EAAJ,CAEAC,EAAiBjkC,GAEjBrB,EAAM,CACF+B,OAAQ,OACRnL,MAAO,aAAayK,EAAOukC,gBAC3BtiC,YAAa,4BACbnK,SAAU,MAEd,IAEI,MAAM4sB,QAAiBxX,EAAOsX,QAAQC,aAAa8D,EAAOlzB,GAAI,CAC1D2K,OAAQA,EACR8jB,qBAAqB,EACrB+e,UAAU,IAEd,GAAwB,eAApBne,EAAShkB,OAST,OARA/B,EAAM,CACF+B,OAAQ,OACRnL,MAAO,sBACP0M,YAAa,qCAAqCjC,EAAOukC,wBACzDzsC,SAAU,WAGdyd,WAAW,IAAM+uB,EAAqBtkC,GAAS,KAGnD,GAAwB,WAApB0kB,EAAShkB,OACT,MAAM,IAAIif,MAAM,8BAGpB,GAAI+E,EAASC,YAAcD,EAASC,WAAW7jB,OAAS,EAAG,CACvD,MAAM0jC,EAAc9f,EAASC,WAAW,GACxC,GAAe,QAAX3kB,OAUC,CAED,MAAMykC,EAAOzf,SAASE,cAAc,KACpCuf,EAAKzmC,KAAOwmC,EACZC,EAAKC,SAAW,GAAGnc,EAAOl0B,MAAQ,cAAc2L,IAChDglB,SAASnuB,KAAK0uB,YAAYkf,GAC1BA,EAAK9I,QACL3W,SAASnuB,KAAK8uB,YAAY8e,GAC1B9lC,EAAM,CACF+B,OAAQ,UACRnL,MAAO,oBACP0M,YAAa,4BAA4BjC,EAAOukC,uBAChDzsC,SAAU,KAElB,CACJ,CACJ,CACA,MAAOgT,GACH5D,QAAQiJ,MAAM,gCAAgCnQ,KAAW8K,GACzDnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,gBACP0M,YAAa,gCAAgCjC,EAAOukC,uBACpDzsC,SAAU,KAElB,CACR,QACYmsC,EAAiB,KACrB,CAvEI,GAkJR,OAAQzvC,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,wEAAyEH,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACusC,GAAa9rC,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM3D,MAAO,YAAa6B,QAAS,IAAM4nC,EAAkBsB,EAAU,QAASvsC,SAAUE,EAAKurC,GAAM,CAAEtrC,UAAW,aAAgBD,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM3D,MAAO,gBAAiB6B,QA9B7c+G,IAGxB,GAFAA,EAAEoH,iBACFpH,EAAEC,mBACGkiC,EACD,OAEJ,IAAI1wB,EAAM,MACN+0B,EAAW,aACc,QAAzBN,GACAz0B,EAAM,MACN+0B,EAAW,aAEmB,aAAzBN,GAAuCD,KAC5Cx0B,EAAM,KACN+0B,EAAW,iBAEf,MAAMC,EAAO,IAAIC,KAAK,CAACvE,GAAW,CAAE5rC,KAAMiwC,IACpCr6B,EAAMw6B,IAAIC,gBAAgBH,GAC1BI,EAAW,GAAGzc,EAAOl0B,MAAQ,cAAcub,IAE3C60B,EAAOzf,SAASE,cAAc,KACpCuf,EAAKzmC,KAAOsM,EACZm6B,EAAKC,SAAWM,EAChBP,EAAKnsC,MAAM2sC,QAAU,OAErB1vB,WAAW,KACPkvB,EAAK9I,QACLmJ,IAAII,gBAAgB56B,IACrB,IAE+fvW,SAAUE,EAAKsnC,GAAU,CAAErnC,UAAW,gBAAqBkwC,GAAc/pC,GAAS7F,EAAMggB,EAAW,CAAEzgB,SAAU,CAACS,EAAMyL,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAzE3oB,IAAMktC,EAAqB,QAyE2oB1/B,SAA4B,OAAlBo/B,EAAwB9vC,UAAW,0BAA2BH,SAAU,CAAmB,SAAlBiwC,EAA4B/vC,EAAK8pC,EAAS,CAAE7kC,KAAM,OAAYjF,EAAKsnC,GAAU,CAAErnC,UAAW,WAAc,UAAYM,EAAMyL,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAxEt5B,KACrB6rC,EAAiB74B,QAStB+5B,GAAkB,GARdxlC,EAAM,CACF+B,OAAQ,QACRnL,MAAO,oBACP0M,YAAa,iCACbnK,SAAU,OAkE87B5D,UAAW,0BAA2BH,SAAU,CAACE,EAAKsnC,GAAU,CAAErnC,UAAW,WAAa,iBAAuBM,EAAM2wC,EAAQ,CAAEvuC,OAAQstC,EAAgBrkB,QAAS,IAAMskB,GAAkB,GAAQpwC,SAAU,CAACE,EAAKmxC,EAAa,CAAErxC,SAAU,2BAA6BS,EAAM6wC,EAAY,CAAEtxC,SAAU,CAACE,EAAK,IAAK,CAAEC,UAAW,OAAQH,SAAU,kFAAoFE,EAAK,IAAK,CAAEC,UAAW,qBAAsBH,SAAU,oFAAyFS,EAAM8wC,EAAc,CAAErkB,MAAO,QAASltB,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAAS,IAAM+sC,GAAkB,GAAQpwC,SAAU,WAAaE,EAAKgM,EAAQ,CAAE/G,KAAM,KAAM9B,QA5D5pD,KACjC,IAAK6rC,EAAiB74B,QAOlB,YANAzL,EAAM,CACF+B,OAAQ,QACRnL,MAAO,oBACP0M,YAAa,iCACbnK,SAAU,MAIlB,MACMytC,EAAW,GADAhd,EAAOl0B,MAAQk0B,EAAOlzB,IACP,uBAChByvB,GAAkBme,EAAiB74B,QAASm7B,IAU5D5mC,EAAM,CACF+B,OAAQ,UACRnL,MAAO,mBACP0M,YAAa,iDACbnK,SAAU,MAEdqsC,GAAkB,IAddxlC,EAAM,CACF+B,OAAQ,QACRnL,MAAO,oBACP0M,YAAa,+BACbnK,SAAU,OA0CktD/D,SAAU,8BACtvD,EA9PA,SAAW8qC,GACPA,EAAgB,KAAI,OACpBA,EAAiB,MAAI,QACrBA,EAAiB,MAAI,QACrBA,EAAiB,MAAI,QACrBA,EAAe,IAAI,MACnBA,EAAsB,WAAI,YAC7B,CAPD,CAOGA,KAAcA,GAAY,CAAA,IAwP7B,MAAMkF,GAAYxlC,EAAK,EAAGgqB,SAAQluB,OAAMqmC,gBAAeuC,uBACnD,MAAM9iC,EAAUooB,EAAOpoB,QACjB6/B,EAAwB1B,GAA4B/V,GAAQ7nB,QAG5D8kC,EAAiC,QADV9G,GAAwBnW,GAG/Ckd,EAAmBtlC,GACrBA,EAAQzL,OACU,kBAAjByL,EAAQzL,MAA6C,eAAjByL,EAAQzL,MAE3CgxC,GAA0BF,IAAUC,GA9R9C,SAA2BprC,GACvB,QAAKA,IAEGA,EAAKkT,SAAS,SAClBlT,EAAKkT,SAAS,UACdlT,EAAKkT,SAAS,WACdlT,EAAKkT,SAAS,SACdlT,EAAKkT,SAAS,SACdlT,EAAKkT,SAAS,SACdlT,EAAKkT,SAAS,OACdlT,EAAKkT,SAAS,MACtB,CAmRkEo4B,CAAkBtrC,IAChF,OAAQA,EAAQ7F,EAAMggB,EAAW,CAAEzgB,SAAU,CAAC2sC,GAAkBzsC,EAAK,MAAO,CAAEC,UAAW,0EAA2EH,SAAUS,EAAM,MAAO,CAAEN,UAAW,yCAA0CH,SAAU,CAACE,EAAK8hB,GAAe,CAAE7hB,UAAW,WAAaD,EAAK,OAAQ,CAAEC,UAAW,wBAAyBH,SAAU,4CAAiDE,EAAK,MAAO,CAAEC,UAAW,kBAAkBmqC,mBAAuC/oC,IAAK2tC,EAAkBlvC,SAAUyxC,EAASvxC,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAUE,EAAKioC,GAAW,CAAEpE,IAAKz9B,EAAM8hC,aAAa,MAAcuJ,EAA0BzxC,EAAK,MAAO,CAAEC,UAAW,sBAAuBH,SAAUE,EAAKma,GAAkB,CAAEI,WAlU7sB,CAC7BjI,EAAG,EAAGkI,UAASC,MACX,MAAM1Q,EAAO0Q,EAAM1Q,MAAQ,GAC3B,OAAIA,EAAKuP,SAAS,mBACNtZ,EAAK0a,GAAS,CAAEC,aAAa,EAAM5Q,KAAMA,EAAM9J,UAAW,YAAaH,SAAU2a,EAAM3a,WAE5FE,EAAK,IAAK,IAAKya,EAAOzQ,OAAQ,SAAUC,IAAK,yBAExD66B,EAAG,EAAGtqB,UAASC,KAAaza,EAAK,IAAK,IAAKya,EAAOxa,UAAW,SAC7D0xC,IAAK,EAAGn3B,UAASC,KAAaza,EAAK,MAAO,IAAKya,EAAOxa,UAAW,qBACjEgB,KAAM,EAAGuZ,OAAMva,YAAWH,cAAa2a,MACnC,MAAM+nB,EAAQ,iBAAiBC,KAAKxiC,GAAa,IAEjD,OAAQD,EAAK,OAAQ,IAAKya,EAAOxa,UADfuiC,EAC+D,aAA1B,wBAAwC1iC,SAAUA,KAE7G8xC,GAAI,EAAGp3B,UAASC,KAAaza,EAAK,KAAM,IAAKya,EAAOxa,UAAW,4BAC/D4xC,GAAI,EAAGr3B,UAASC,KAAaza,EAAK,KAAM,IAAKya,EAAOxa,UAAW,2BAC/D6xC,GAAI,EAAGt3B,UAASC,KAAaza,EAAK,KAAM,IAAKya,EAAOxa,UAAW,2BAC/D8xC,GAAI,EAAGv3B,UAASC,KAAYza,EAAK,KAAM,IAAKya,KAgTsuB3a,SAAUsG,MAAepG,EAAK,MAAO,CAAEC,UAAW,oCAAqCH,SAAUsG,SAC/2BpG,EAAK,MAAO,CAAEC,UAAW,OAAQH,SAAUE,EAAK,MAAO,CAAEF,SAAUisC,EAAwB,wBAA0B,mBAE7H,SAASuD,IAAWhb,OAAEA,IAClB,MAAMrb,OAAEA,GAAWC,MACZ84B,EAAUC,GAAe/uC,IAC1BgJ,EAAUooB,EAAOpoB,QACjB4P,EAAUwY,EAAOkP,UAAYlP,EAAOkP,SAAS/iC,OAASirC,GAAcnG,MAkC1E,OAjCA3/B,EAAU,KACN,GAAIkW,EAAS,CAETm2B,OAAYllC,GACMwJ,WACd,MAAM27B,EAAyBhmC,GAASzL,MAAQwpC,GAA4B3wB,SAASpN,EAAQzL,MAC7F,IACI,MAAMkwB,QAAkB1X,EAAOsX,QAAQC,aAAa8D,EAAOlzB,GAAI,CAC3D2K,OAAQ4jB,GAAqBC,KAC7BC,qBAAqB,EACrB+e,UAAU,IAEd,GAAyB,UAArBje,EAAUlkB,QAAsBkkB,EAAUD,YAAY7jB,OAEtDolC,EAAYthB,EAAUD,WAAW,SAEhC,GAAIwhB,EAAwB,CAE7B,MAAM3B,QAAoBt3B,EAAOgC,MAAMuS,eAAe8G,EAAOpoB,QAAQq4B,QACrE0N,EAAY1B,EAAYl6B,IAC5B,CACJ,CACA,MAAO6F,GAEH,GAAIg2B,EAAwB,CACxB,MAAM3B,QAAoBt3B,EAAOgC,MAAMuS,eAAe8G,EAAOpoB,QAAQq4B,QACrE0N,EAAY1B,EAAYl6B,IAC5B,CACJ,GAEJ87B,EACJ,GACD,CAAC7d,EAAOlzB,GAAI0a,EAAS5P,GAASzL,KAAMyL,GAASq4B,OAAQtrB,IAChDjZ,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAUkyC,EAAYhyC,EAAK,MAAO,CAAEoJ,IAAK4oC,EAAUpoC,IAAK0qB,EAAOl0B,KAAMH,UAAW,0BAA+BD,EAAK8pC,EAAS,CAAE7kC,KAAM,QACvL,CACA,SAASsqC,IAAWjb,OAAEA,IAClB,MAAMrb,OAAEA,GAAWC,MACZk5B,EAAUC,GAAenvC,KACzBovC,EAAWC,GAAgBrvC,KAC3BsL,EAAWkmB,GAAgBxxB,GAAS,GACrCgJ,EAAUooB,EAAOpoB,QACjBojB,EAAUgF,EAAOkP,UAAU/iC,OAASirC,GAAcC,MAElDnI,EAAWlP,EAAOkP,SAClB9S,EAAa8S,GAAU9S,YAAc,GAErC8hB,EAAe9hB,EAAWzP,KAAKwM,GAAwB,cAAnBA,EAAEvhB,QAAQzL,OAChDiwB,EAAWzP,KAAKwM,GAAwB,eAAnBA,EAAEvhB,QAAQzL,MAE7ByxC,EAAyBhmC,GAASzL,MAAQypC,GAA4B5wB,SAASpN,EAAQzL,MAEvFgyC,EAAS/hB,EAAWzP,KAAKwM,GAAKA,EAAErtB,OAASsyC,IAmD/C,OAjDA9sC,EAAU,KACNysC,OAAYtlC,GACZwlC,OAAaxlC,GACb2nB,GAAa,IACd,CAACJ,EAAOlzB,KACXwE,EAAU,KACa2Q,WACf,GAAIk8B,GAAQvmC,SAASq4B,OACjB,IACI,MAAM9T,QAAiBxX,EAAOgC,MAAMuS,eAAeilB,EAAOvmC,QAAQq4B,QAClEgO,EAAa9hB,EAASpa,IAC1B,CACA,MAAO6F,GACHjJ,QAAQiJ,MAAM,8BAA+BA,EACjD,GAGRy2B,IACD,CAACF,EAAQx5B,IACZrT,EAAU,KACN,GAAI0pB,IAAYkjB,GAActmC,SAASq4B,QAAU2N,GAAyB,CACjD37B,WACjB,IACI,IAAIg6B,EACAiC,GAActmC,SAASq4B,OAEvBgM,QAAoBt3B,EAAOgC,MAAMuS,eAAeglB,EAAatmC,QAAQq4B,QAEhE2N,GAA0BhmC,GAASq4B,SAExCgM,QAAoBt3B,EAAOgC,MAAMuS,eAAethB,EAAQq4B,SAExDgM,GACA8B,EAAY9B,EAAYl6B,IAEhC,CACA,MAAO6F,GACHjJ,QAAQiJ,MAAM,0BAA2BA,EAC7C,CAChB,QACoBwY,GAAa,EACjB,GAEJke,EACJ,MAEIle,GAAa,IAElB,CAACpF,EAASkjB,EAAcN,EAAwBhmC,GAASq4B,OAAQtrB,IAC5DjZ,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAW0yC,GAAiBN,EAA8U1jC,EAAaxO,EAAK,MAAO,CAAEC,UAAW,6CAA8CH,SAAUE,EAAK8pC,EAAS,CAAE7kC,KAAM,SAAcmtC,EAAYpyC,EAAK,QAAS,CAAEoJ,IAAKgpC,EAAUK,OAAQH,EAAWO,UAAU,EAAM5yC,UAAW,UAAUmqC,oBAAsCtqC,SAAU,iDAAsDE,EAAK,MAAO,CAAEC,UAAW,wDAAyDH,SAAU,yBAA3tBE,EAAK,MAAO,CAAEC,UAAW,wDAAyDH,SAAUS,EAAM,MAAO,CAAEN,UAAW,cAAeH,SAAU,CAACE,EAAK,IAAK,CAAEF,SAAU,gDAAkDE,EAAK,IAAK,CAAEC,UAAW,eAAgBH,SAAU,sCACjX,CACA,SAAS0vC,IAAWlb,OAAEA,IAClB,MAAMrb,OAAEA,GAAWC,MACZ45B,EAAUC,GAAe7vC,KACzBsL,EAAWkmB,GAAgBxxB,GAAS,GACrCgJ,EAAUooB,EAAOpoB,QACjB0/B,EAAUtX,EAAOkP,UAAU/iC,OAASirC,GAAcG,MAElDrI,EAAWlP,EAAOkP,SAGlBwP,GAFaxP,GAAU9S,YAAc,IAETzP,KAAKwM,GAAKA,EAAErtB,OAAS6yC,IAEjDf,EAAyBhmC,GAASzL,MAAQ0pC,GAA4B7wB,SAASpN,EAAQzL,MAoC7F,OAlCAmF,EAAU,KACNmtC,OAAYhmC,GACZ2nB,GAAa,IACd,CAACJ,EAAOlzB,KACXwE,EAAU,KACN,GAAIgmC,IAAYoH,GAAgB9mC,SAASq4B,QAAU2N,GAAyB,CACnD37B,WACjB,IACI,IAAIg6B,EACAyC,GAAgB9mC,SAASq4B,OAEzBgM,QAAoBt3B,EAAOgC,MAAMuS,eAAewlB,EAAe9mC,QAAQq4B,QAElE2N,GAA0BhmC,GAASq4B,SAExCgM,QAAoBt3B,EAAOgC,MAAMuS,eAAethB,EAAQq4B,SAExDgM,GACAwC,EAAYxC,EAAYl6B,IAEhC,CACA,MAAO6F,GACHjJ,QAAQiJ,MAAM,0BAA2BA,EAC7C,CAChB,QACoBwY,GAAa,EACjB,GAEJwe,EACJ,MAEIxe,GAAa,IAElB,CAACkX,EAASoH,EAAgBd,EAAwBhmC,GAASq4B,OAAQtrB,IAC9DjZ,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAWkzC,GAAmBd,EAA8V1jC,EAAaxO,EAAK,MAAO,CAAEC,UAAW,6CAA8CH,SAAUE,EAAK8pC,EAAS,CAAE7kC,KAAM,SAAc6tC,EAAYvyC,EAAM,MAAO,CAAEN,UAAW,mCAAoCH,SAAU,CAACE,EAAK,QAAS,CAAEoJ,IAAK0pC,EAAUD,UAAU,EAAM5yC,UAAW,mBAAoBH,SAAU,iDAAmD0jC,GAAU3/B,UAAatD,EAAM,MAAO,CAAEN,UAAW,qBAAsBH,SAAU,CAAC,aAAcqzC,GAAe3P,EAAS3/B,gBAAuB7D,EAAK,MAAO,CAAEC,UAAW,wDAAyDH,SAAU,yBAAj5BE,EAAK,MAAO,CAAEC,UAAW,wDAAyDH,SAAUS,EAAM,MAAO,CAAEN,UAAW,cAAeH,SAAU,CAACE,EAAK,IAAK,CAAEF,SAAU,gDAAkDE,EAAK,IAAK,CAAEC,UAAW,eAAgBH,SAAU,sDACnX,CACA,SAASqzC,GAAeC,GACpB,MAAMC,EAAQ/rC,KAAKkS,MAAM45B,EAAU,MAC7BE,EAAUhsC,KAAKkS,MAAO45B,EAAU,KAAQ,IACxCG,EAAOjsC,KAAKkS,MAAM45B,EAAU,IAClC,OAAIC,EAAQ,EACD,GAAGA,KAASC,EAAQtuB,WAAWwuB,SAAS,EAAG,QAAQD,EAAKvuB,WAAWwuB,SAAS,EAAG,OAEnF,GAAGF,KAAWC,EAAKvuB,WAAWwuB,SAAS,EAAG,MACrD,CACA,SAAS/D,IAAgBnb,OAAEA,EAAMyW,kBAAEA,IAC/B,MAAMkB,EAAa3X,EAAO2X,WACpBwH,EAAiBxH,GAAY7lC,KAC7BstC,EAAWzH,GAAYyH,SAEvBrH,EAAWoH,IAAmBC,EAAWA,EAAS7yC,IAAI8yC,GAAKA,EAAEvtC,MAAMgV,KAAK,KAAO,IAC/Ew4B,EAAmBR,IACrB,MAAMC,EAAQ/rC,KAAKkS,MAAM45B,EAAU,MAC7BE,EAAUhsC,KAAKkS,MAAO45B,EAAU,KAAQ,IACxCG,EAAOjsC,KAAKkS,MAAM45B,EAAU,IAClC,OAAIC,EAAQ,EACD,GAAGA,KAASC,EAAQtuB,WAAWwuB,SAAS,EAAG,QAAQD,EAAKvuB,WAAWwuB,SAAS,EAAG,OAEnF,GAAGF,KAAWC,EAAKvuB,WAAWwuB,SAAS,EAAG,QAErD,OAAQjzC,EAAM,MAAO,CAAEN,UAAW,uBAAwBH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,0CAA2CH,SAAUusC,GAAarsC,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM3D,MAAO,kBAAmB6B,QAAS,IAAM4nC,EAAkBsB,EAAU,QAASvsC,SAAUE,EAAKurC,GAAM,CAAEtrC,UAAW,eAAoBD,EAAK,MAAO,CAAEC,UAAW,GAAGmqC,wBAA4CtqC,SAAU4zC,GAAYA,EAAS7mC,OAAS,EAAK7M,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAU4zC,EAAS7yC,IAAI,CAACgzC,EAASzhC,IAAS7R,EAAM,MAAO,CAAEN,UAAW,qBAAsBH,SAAU,CAACS,EAAM,OAAQ,CAAEN,UAAW,+CAAgDH,SAAU,CAAC8zC,EAAgBC,EAAQ7pB,OAAQ6pB,EAAQ1Y,KAAO,MAAMyY,EAAgBC,EAAQ1Y,UAAYn7B,EAAK,OAAQ,CAAEC,UAAW,SAAUH,SAAU+zC,EAAQztC,SAAYgM,MAAaqhC,EAAkBzzC,EAAK,MAAO,CAAEC,UAAW,wDAAyDH,SAAU2zC,IAAsBzzC,EAAK,MAAO,CAAEC,UAAW,aAAcH,SAAU,gCACxgC,CACA,SAASqvC,IAAW7a,OAAEA,IAClB,MAAOwf,EAAkBC,GAAqB7wC,GAAS,GAEjDktC,EAAuB3F,GAAwBnW,GAErD,MADgD,QAAzB8b,GAA2D,aAAzBA,EAGjD7vC,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAAS,IAAM4wC,GAAkB,GAAOzyC,MAAO,oBAAqBxB,SAAUE,EAAKg0C,GAAY,CAAE/zC,UAAW,aAAgB6zC,GAAqB9zC,EAAKi0C,EAAQ,CAAEn0C,SAAUE,EAAK0oC,GAAc,CAAExH,SAAU5M,EAAOlzB,GAAIwqB,QAAS,IAAMmoB,GAAkB,UAD7T,IAEf,CACA,SAAS1E,IAAiB/a,OAAEA,EAAM6P,aAAEA,EAAY+J,aAAEA,IAC9C,MAAMj1B,OAAEA,GAAWC,KACbxO,EAAQC,KACPupC,EAAeC,GAAoBjxC,GAAS,GA4BnD,OAAQlD,EAAK,MAAO,CAAEC,UAAW,0BAA2BH,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QA3BzFoT,UACtB49B,GAAiB,GACjB,IACI,IAAI5D,EAAcrC,EAElB,IAAKqC,GAAepM,GAAcj4B,SAASq4B,OAAQ,CAE/CgM,SADuBt3B,EAAOgC,MAAMuS,eAAe2W,EAAaj4B,QAAQq4B,OAAQ,GAAGjQ,EAAOl0B,MAAQ,iBAAkB,eAC7FiW,GAC3B,CACIk6B,GAEAlnC,OAAOC,KAAKinC,EAAa,SAEjC,CACA,MAAO15B,GACH5D,QAAQiJ,MAAM,0BAA2BrF,GACzCnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,kBACP0M,YAAa,kCACbnK,SAAU,KAElB,CACR,QACYswC,GAAiB,EACrB,GAE2IxjC,SAAUujC,EAAe5yC,MAAO,eAAgBxB,SAAUo0C,EAAgBl0C,EAAK8pC,EAAS,CAAE7kC,KAAM,OAAUjF,EAAKsnC,GAAU,CAAErnC,UAAW,cACzR,CACA,SAASyvC,IAAgBpb,OAAEA,IACvB,OAAQt0B,EAAK,MAAO,CAAEC,UAAWmqC,GAAuBtqC,SAAUE,EAAKqpC,GAAiB,CAAE/U,OAAQA,EAAQr0B,UAAW,YACzH,CAKA,SAAS0vC,IAAsBxL,aAAEA,EAAY+J,aAAEA,EAAYE,oBAAEA,EAAmBC,eAAEA,EAAcuB,UAAEA,IAC9F,OAAIxB,EACQ7tC,EAAM,MAAO,CAAEN,UAAW,yDAA0DH,SAAU,CAACE,EAAK8pC,EAAS,CAAE7kC,KAAM,OAASjF,EAAK,OAAQ,CAAEC,UAAW,aAAcH,SAAU,4BAExLuuC,EACQ9tC,EAAM,MAAO,CAAEN,UAAW,0EAA2EH,SAAU,CAACE,EAAK8hB,GAAe,CAAE7hB,UAAW,WAAaD,EAAK,OAAQ,CAAEF,SAAUuuC,OAGvLruC,EAAK,MADbmkC,GAAcj4B,SAASq4B,OACH,CAAEtkC,UAAWmqC,GAAuBtqC,SAAUE,EAAKqpC,GAAiB,CAAE9E,OAAQJ,EAAaj4B,QAAQq4B,OAAQtkC,UAAW,YAE1IiuC,EACoB,CAAEjuC,UAAWmqC,GAAuBtqC,SAAUE,EAAKqpC,GAAiB,CAAEhzB,IAAK63B,EAAcjuC,UAAW,YAExG,CAAEA,UAAW,yDAA0DH,SAAUE,EAAKgM,EAAQ,CAAE7I,QAASysC,EAAW9vC,SAAU,oBACtJ,CACA,SAAS+vC,IAAmBrpC,SAAEA,EAAQiG,OAAEA,EAAM4gC,aAAEA,IAC5C,MAAM+G,EAAc/hB,GAAuB5lB,GACrC4nC,EAAa1hB,GAAsBlmB,GAEnC6nC,EAAmC,QAAjBjH,EAElBkH,EAA+B,MAArB/tC,GAAU+tC,SAAoB9T,MAAMj6B,EAAS+tC,SAA8B,EAAnB/tC,EAAS+tC,QACjF,OAAQh0C,EAAM,MAAO,CAAEN,UAAW,YAAaH,SAAU,CAAC0G,GAAajG,EAAM,MAAO,CAAEN,UAAW,YAAaH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,sBAAuBH,SAAU,CAACE,EAAKw0C,GAAc,CAAEp0C,KAAMk0C,EAAkB,kBAAoB,eAAgB9tC,SAAUA,EAASu2B,QAAUuX,GAAoB/zC,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAKw0C,GAAc,CAAEp0C,KAAM,iBAAkBoG,SAAUA,EAASiuC,SAAWz0C,EAAKw0C,GAAc,CAAEp0C,KAAM,kBAAmBoG,SAAUA,EAASkuC,SAAW10C,EAAKw0C,GAAc,CAAEp0C,KAAM,mBAAoBoG,SAAUA,EAASmuC,gBAAqBp0C,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAAC,aAAcy0C,EAAS,IAAKv0C,EAAK,OAAQ,CAAEC,UAAW,OAAQH,SAAU,MAAaE,EAAK,OAAQ,CAAEC,UAAWm0C,EAAat0C,SAAUu0C,IAAe7tC,EAAS0E,YAAe3K,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,OAAQH,SAAU,MAAaS,EAAM,OAAQ,CAAET,SAAU,GAAGkH,KAAKC,MAAQT,EAAS0E,YAAc,KAAMM,QAAQ,GAAI,yBAA8BxL,EAAK40C,GAAU,CAAEL,QAASA,QAAkB/tC,GAAajG,EAAM,MAAO,CAAEN,UAAW,qCAAsCH,SAAU,CAACE,EAAK8pC,EAAS,CAAE7kC,KAAM,OAASjF,EAAK,OAAQ,CAAEF,SAAU,sCACxrC,CACA,SAAS00C,IAAap0C,KAAEA,EAAIoG,SAAEA,IAC1B,OAAQjG,EAAM,MAAO,CAAEN,UAAW,qBAAsBH,SAAU,CAACS,EAAM,OAAQ,CAAEN,UAAW,sBAAuBH,SAAU,CAACM,EAAM,OAASG,EAAM,OAAQ,CAAET,SAAU,CAAC0G,EAASquC,UAAW,OAAQruC,EAASqE,WACnN,CC7mBO,SAASiqC,IAAqBtmC,UAAEA,GAAY,EAAK6W,OAAEA,EAAS,IAC/D,OAAK7W,EAGGxO,EAAK,MAAO,CAAEC,UAAW,uCAAwCH,SAAUmI,MAAMod,GAAQnd,KAAK,GAAGrH,IAAI,CAAC8H,EAAGC,IAAU5I,EAAK,MAAO,CAAEC,UAAW,yBAA0BH,SAAUS,EAAMw0C,EAAM,CAAE90C,UAAW,sCAAuCH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,yEAA0EH,SAAU,MAAaE,EAAKg1C,EAAW,CAAE/0C,UAAW,qBAAuBM,EAAM00C,EAAa,CAAEh1C,UAAW,oBAAqBH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,gCAAiCH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,oCAAsCD,EAAK,MAAO,CAAEC,UAAW,kCAAqCD,EAAK,MAAO,CAAEC,UAAW,kDAAmDH,SAAUE,EAAK,MAAO,CAAEC,UAAW,wCAA8C2I,MAFt0B,IAGf,CACO,SAASssC,IAAaC,UAAEA,EAASpkB,SAAEA,EAAQqkB,kBAAEA,EAAiBC,WAAEA,EAAUC,cAAEA,EAAaC,eAAEA,IAC9F,MAAMt8B,OAAEA,GAAWC,MACZs8B,EAAcxlB,GAAmB9sB,OAAS6J,IAC1C0oC,EAAcxlB,GAAmB/sB,OAAS6J,IAC1C2oC,EAAiBxlB,GAAsBhtB,OAAS6J,GAWvD,OANAnH,EAAU,KACDmrB,GAAU7kB,SAGf6jB,GAAkB9W,EAAQ8X,EAAUf,EAAiBC,EAAiBC,IACvE,CAACa,IACIxwB,EAAMw0C,EAAM,CAAE90C,UAAW,+CAA8Cs1C,GAAgBn0C,KAAO2vB,EAAS3vB,GAAK,4BAA8B,IAAM+B,QAAS,IAAOkyC,GAAcA,EAAWtkB,GAAYjxB,SAAU,CAACq1C,GAAcn1C,EAAK,MAAO,CAAEC,UAAW,8DAA+DH,SAAUE,EAAK,QAAS,CAAEqQ,QAAS8kC,EAAU1b,WAAW1I,EAAS3vB,IAAKX,KAAM,WAAY6P,SAVhYqlC,IAClBA,EAAGxrC,kBACHirC,EAAkBrkB,EAAU4kB,IAQ8YxyC,QAAU+G,GAAMA,EAAEC,sBAA0BnK,EAAK,MAAO,CAAEC,UAAW,yDAA0DH,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM3D,MAAO,iBAAkB6B,QAAU+G,IACnnBA,EAAEC,kBACFmrC,IAAgBvkB,EAAS3vB,KAC1BtB,SAAUE,EAAK41C,GAAK,CAAE31C,UAAW,WAA8B,UAApBy1C,EAA8B,aAAe,oBAA0BF,GAAmC,SAAnBE,EAA+B11C,EAAK,MAAO,CAAEoJ,IAAKosC,EAAc5rC,IAAK6rC,EAAcx1C,UAAW,0CAA+CD,EAAK,MAAO,CAAEC,UAAW,4EAA6EH,SAAU41C,IAAqB11C,EAAKg1C,EAAW,CAAE/0C,UAAW,wBAA0BM,EAAM00C,EAAa,CAAEh1C,UAAW,oBAAqBH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,gCAAiCH,SAAU,CAACE,EAAK6Q,EAAU,CAAEC,UAAW,MAAO9C,YAAa+iB,EAASjuB,YAAYxB,OAASyvB,EAAS3wB,KAAMN,SAAUE,EAAK,KAAM,CAAEC,UAAW,+CAAgDH,SAAUixB,EAASjuB,YAAYxB,OAASyvB,EAAS3wB,SAAY2wB,GAAUtwB,MAAML,KAAQJ,EAAK6Q,EAAU,CAAEC,UAAW,SAAU7L,KAAM,KAAM+I,YAAa+iB,GAAUtwB,MAAML,KAAMN,SAAUE,EAAK,IAAK,CAAEC,UAAW,yCAA0CH,SAAUixB,GAAUtwB,MAAML,SAAcJ,EAAK,IAAK,CAAEC,UAAW,qBAAsBH,SAAU,SAAiBixB,EAAS8kB,OAAUt1C,EAAM,MAAO,CAAEN,UAAW,6CAA8CH,SAAU,CAAC,UAAYixB,EAAc,MAAEvlB,QAAQ,IAAM,YAC5wC,CC/BO,SAASsqC,GAAiBC,GAC7B,MAAO,GAAGA,EAAOC,QAAQD,EAAOpzB,QACpC,CACO,SAASszB,GAAqBF,GACjC,MAAO,GAAGA,EAAO31C,SAAS21C,EAAOpzB,QACrC,CCFO,SAASuzB,IAAYzrB,OAAEA,EAAM0rB,QAAEA,EAAO/1C,KAAEA,EAAImO,YAAEA,EAAWtO,UAAEA,IAC9D,MAAMm2C,EAAc3rB,EAAO4rB,eAAej2C,GAIpCM,EAAQy1C,GAASl1B,KAAM/Q,GAAW/D,KAAKC,UAAU8D,EAAO8lC,OAAS7pC,KAAKC,UAAUgqC,IACtF,OAAQp2C,EAAKs2C,EAAW,CAAEC,SAAU,MAAOt2C,UAAWA,EAAWu2C,aAAa,EAAMC,YAAaX,GAAkB7nC,QAASkoC,EAASz1C,MAAOA,EAAO4P,SAJjIJ,IACdua,EAAOisB,eAAet2C,EAAM8P,GAAQ8lC,MAG+HW,GAAI,MAAOpoC,YAAaA,GACnM,CCPO,SAASqoC,IAAgBnsB,OAAEA,EAAMrqB,KAAEA,EAAImO,YAAEA,EAAWtO,UAAEA,IACzD,MAAO42C,EAAMC,GAAW5zC,EAAS,IAIjC,OAHA0C,EAAU,KACN6kB,EAAOisB,eAAet2C,EAAMy2C,IAC7B,CAACA,IACI72C,EAAK+2C,EAAW,CAAE92C,UAAWA,EAAWS,MAAOm2C,EAAMvmC,SAAUwmC,EAASvoC,YAAaA,GACjG,CCLO,SAASunC,GAAiBC,GAC7B,MAAO,GAAGA,EAAO31C,SAAS21C,EAAOpzB,QACrC,CACO,SAASq0B,IAAUvsB,OAAEA,EAAM0rB,QAAEA,EAAO5nC,YAAEA,EAAc,iBAAgBtO,UAAEA,IACzE,MAAOgO,EAASgpC,GAAc/zC,EAAS,KACjCg0C,aAAEA,GAAiBh+B,KACnBk9B,EAAc3rB,EAAO4rB,eAAe,QAI1CzwC,EAAU,KACN,GAAIsxC,EAAc,CACd,MAAMjpC,EAAUkoC,EAAQt1C,IAAKk1C,IACzB,IAAI31C,EAYJ,OAXkB,MAAd21C,EAAOC,KACPD,EAAOC,IAAM,WACb51C,EAAO,aAGPA,EAAO82C,EAAaC,YAAYpB,EAAOC,KAClC51C,IACD6S,QAAQ2d,KAAK,gCAAiCmlB,EAAOC,KACrD51C,EAAO21C,EAAOC,MAGf,IACAD,EACH31C,UAGR6N,EAAQmH,KAAK,CAAC9C,EAAG+C,IAAM/C,EAAElS,KAAK6iB,cAAc5N,EAAEjV,OAC9C62C,EAAWhpC,EACf,GACD,CAACkoC,EAASe,IACb,MAAMx2C,EAAQuN,GAASgT,KAAM/Q,GAAWA,EAAO8lC,MAAQI,GACvD,OAAQp2C,EAAKs2C,EAAW,CAAEC,SAAU,OAAQt2C,UAAWA,EAAWu2C,aAAa,EAAMC,YAAaX,GAAkB7nC,QAASA,EAASvN,MAAOA,EAAO4P,SA5BlIJ,IACdua,EAAOisB,eAAe,OAAQxmC,GAAQ8lC,MA2B8HW,GAAI,MAAOpoC,YAAaA,GACpM,CCxBO,SAAS6oC,IAAajB,QAAEA,EAAO/1C,KAAEA,EAAImO,YAAEA,EAAW9N,KAAEA,EAAI42C,SAAEA,IAC7D,OAhBG,UAAiClB,QAAEA,EAAO/1C,KAAEA,EAAImO,YAAEA,EAAW9N,KAAEA,EAAO,SAAQ42C,SAAEA,GAAW,IAa9F,MARoB,CAChBj3C,KAAMA,EACN6N,QANYkoC,EAAQt1C,IAAKk1C,IAAM,CAC/BnlC,MAAOklC,GAAiBC,GACxBr1C,MAAOq1C,EAAOC,OAKdv1C,KAAMA,EACN42C,SAAUA,EACV9oC,YAAa,GAAGA,GAAe,GAAGnO,EAAKk3C,OAAO,GAAGhH,cAAgBlwC,EAAK4e,MAAM,OACtEu4B,aAAa,EAG3B,CAEWC,CAAwB,CAAErB,UAAS/1C,OAAMmO,cAAa9N,OAAM42C,YACvE,CCjBO,SAASI,IAAWtB,QAAEA,EAAOe,aAAEA,EAAYz2C,KAAEA,EAAO,SAAQ42C,SAAEA,GAAW,IAE5E,MAAMK,EAAc,IAAIvjC,IACnB+iC,GACDjkC,QAAQ2d,KAAK,iCAEjBulB,EAAQxhC,QAASohC,IACb,IAAI31C,EACA41B,EAAS+f,EAAOC,IACF,MAAdD,EAAOC,KACPhgB,EAAS,WACT51B,EAAO,aAGPA,EAAO82C,GAAcC,YAAYpB,EAAOC,KACnC51C,IACD6S,QAAQ2d,KAAK,gCAAiCmlB,EAAOC,KACrD51C,EAAO21C,EAAOC,MAGtB0B,EAAYljC,IAAIwhB,EAAQ,CACpB51B,OACAuiB,MAAOozB,EAAOpzB,UAmCtB,MAvB2B,CACvBviB,KAAM,QACNmO,YAAa,QACb9N,KAAMA,EACN42C,SAAUA,EACVppC,QAdYkoC,EAAQt1C,IAAKk1C,IACzB,MAAM4B,EAAW5B,EAAOC,IAClB4B,EAAaD,GAAY,WACzBE,EAAWH,EAAYhjC,IAAIkjC,GACjC,MAAO,CACHl3C,MAAOi3C,EACP/mC,MAAOinC,EAAW,GAAGA,EAASz3C,SAASy3C,EAASl1B,SAAW,YAAYozB,EAAOpzB,YASlFm1B,cAAgB9hB,IACZ,MAAM6hB,EAAWH,EAAYhjC,IAAIshB,GACjC,OAAK6hB,EAIGt3C,EAAM,MAAO,CAAEN,UAAW,2BAA4BH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,mBAAoBH,SAAU+3C,EAASz3C,OAASG,EAAM,OAAQ,CAAEN,UAAW,eAAgBH,SAAU,CAAC,IAAK+3C,EAASl1B,MAAO,WAH1N1P,QAAQ2d,KAAK,2BAA2BoF,KACjCA,IAIfugB,SAAU,CAACwB,EAAaC,KACpB,MAAMH,EAAWH,EAAYhjC,IAAIqjC,GACjC,OAAKF,EAIEA,EAASz3C,KAAKyZ,cAAcP,SAAS0+B,EAAWn+B,gBAHnD5G,QAAQ2d,KAAK,2BAA2BmnB,MACjC,IAMvB,CCrDA,MAAME,GAAa,CAAA,EACbC,GAAc,CAAA,EAMb,SAASC,GAAiBC,GAC7B,MAAMn/B,OAAEA,GAAWC,KACnB,OAAOyvB,EAAS,KACZ,IAAI0P,EAAOJ,GAAWG,GAOtB,OANKC,IACDA,EAAOp/B,EAAOq/B,MAAMnvB,SAASivB,GAAQ5rC,KAAK6rC,GAC/BA,GAEXJ,GAAWG,GAAUC,GAElBA,GACR,CAACD,GACR,CAKO,SAASG,GAAkBC,GAC9B,MAAMv/B,OAAEA,GAAWC,KACnB,OAAOyvB,EAAS,KACZ,IAAI/zB,EAAQsjC,GAAYM,GAOxB,OANK5jC,IACDA,EAAQqE,EAAOw/B,IAAInjC,OAAO6T,SAASqvB,GAAShsC,KAAKoI,GACtCA,GAEXsjC,GAAYM,GAAW5jC,GAEpBA,GACR,CAAC4jC,GACR,CACA,SAASE,KACL,OAAO14C,EAAK,MAAO,CAAEC,UAAW,UACpC,CACA,SAAS04C,IAAaC,UAAEA,GAAY,EAAK3zC,KAAEA,EAAO,OAC9C,OAAQjF,EAAK64C,GAAkB,CAAEv3C,MAAO,cAAe0M,YAAa,0DAA2DlO,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK84C,GAAQ,CAAE1vC,IAAK,YAAanE,KAAMA,IAAS2zC,GAAa54C,EAAK,MAAO,CAAEC,UAAW,6BAA8BH,SAAU,oBAC3U,CACA,SAASi5C,IAAqBC,UAAEA,EAASJ,UAAEA,GAAY,EAAK3zC,KAAEA,EAAO,OACjE,MAAM+I,EAAezN,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK,MAAO,CAAEF,SAAU,uDAAyDS,EAAM,MAAO,CAAEN,UAAW,2CAA4CH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,gBAAiBH,SAAU,QAAU,IAAKk5C,QACzR,OAAQh5C,EAAK64C,GAAkB,CAAEv3C,MAAO,kBAAmB0M,YAAaA,EAAalO,SAAUS,EAAM,MAAO,CAAEN,UAAW,mCAAoCH,SAAU,CAACE,EAAK84C,GAAQ,CAAE1vC,IAAK,aAAchJ,KAAM,KAAMqE,MAAO,eAAgBxE,UAAW,sBAAuBgF,KAAMA,IAAS2zC,GAAar4C,EAAM,MAAO,CAAEN,UAAW,sCAAuCH,SAAU,CAAC,qBAAsBk5C,SACjZ,CACA,SAASC,IAAY33C,MAAEA,EAAQ,QAAO4a,MAAEA,EAAK08B,UAAEA,GAAY,EAAK3zC,KAAEA,EAAO,OACrE,OAAQjF,EAAKk5C,GAAe,CAAE53C,MAAOA,EAAO4E,QAA0B,iBAAVgW,EAAqBA,EAAQA,EAAMhW,QAASzB,MAAO,aAAcm0C,UAAWA,EAAW3zC,KAAMA,GAC7J,CACO,SAASk0C,IAASC,QAAEA,EAAOR,UAAEA,GAAY,EAAK3zC,KAAEA,EAAO,OAC1D,IAAKm0C,EACD,OAAOp5C,EAAKk5C,GAAe,CAAE53C,MAAO,eAAgB4E,QAAS,qCAAsC0yC,UAAWA,EAAW3zC,KAAMA,IAEnI,MAAOxE,EAAMW,GAAMg4C,EAAUA,EAAQx9B,MAAM,KAAO,CAAC,WACnD,OAAQnb,GACJ,KAAK44C,GAAcxhC,KACf,OAAO7X,EAAKs5C,GAAY,CAAElB,OAAQh3C,EAAIw3C,UAAWA,EAAW3zC,KAAMA,IACtE,KAAKo0C,GAAcE,MACf,OAAOv5C,EAAKw5C,GAAa,CAAEpB,OAAQh3C,EAAIw3C,UAAWA,EAAW3zC,KAAMA,IACvE,IAAK,SACD,OAAOjF,EAAK24C,GAAc,CAAEC,UAAWA,EAAW3zC,KAAMA,IAC5D,KAAKo0C,GAAcI,eAEnB,KAAKJ,GAAcK,MACf,OAAO15C,EAAK+4C,GAAsB,CAAEC,UAAW53C,EAAIw3C,UAAWA,EAAW3zC,KAAMA,IACnF,KAAKo0C,GAAcM,OACf,OAAO35C,EAAK45C,GAAc,CAAEC,MAAOz4C,EAAI6D,KAAMA,EAAM2zC,UAAWA,IAClE,QACI,OAAO54C,EAAKi5C,GAAa,CAAE33C,MAAO,eAAgB4a,MAAO,0BAA0Bzb,IAAQm4C,UAAWA,EAAW3zC,KAAMA,IAEnI,CACA,SAASi0C,IAAc53C,MAAEA,EAAK4E,QAAEA,EAAOzB,MAAEA,EAAKQ,KAAEA,EAAO,KAAI2zC,UAAEA,GAAY,IACrE,OAAQ54C,EAAK64C,GAAkB,CAAEv3C,MAAOA,EAAO0M,YAAa9H,EAASpG,SAAUS,EAAM,MAAO,CAAEN,UAAW,mCAAoCH,SAAU,CAACE,EAAK84C,GAAQ,CAAEr0C,MAAOA,EAAOQ,KAAMA,IAAS2zC,GAAa54C,EAAK,MAAO,CAAEC,UAAW,6BAA8BH,SAAUwB,QACtR,CACA,SAASk4C,IAAYpB,OAAEA,EAAMQ,UAAEA,GAAY,EAAK3zC,KAAEA,EAAO,OACrD,MAAQ8P,KAAMH,EAAKsH,MAAEA,GAAUq8B,GAAkBH,GACjD,GAAIl8B,EACA,OAAOlc,EAAKi5C,GAAa,CAAE33C,MAAO,wBAAyB4a,MAAOA,EAAO08B,UAAWA,EAAW3zC,KAAMA,IAEzG,IAAK2P,EACD,OAAO5U,EAAK04C,GAAmB,IAEnC,MAAM1qC,EAAezN,EAAM,MAAO,CAAEN,UAAW,YAAaH,SAAU,CAAC8U,EAAM5G,aAAehO,EAAK,MAAO,CAAEC,UAAW,UAAWH,SAAU8U,EAAM5G,cAAgBzN,EAAM,MAAO,CAAEN,UAAW,gCAAiCH,SAAU,CAAC,aAAc8U,EAAMxT,MAAQwT,EAAMiiC,MAAQjiC,EAAMiiC,KAAKhqC,OAAS,GAAM7M,EAAK,MAAO,CAAEC,UAAW,uBAAwBH,SAAU8U,EAAMiiC,KAAKh2C,IAAIi5C,GAAQ95C,EAAK,OAAQ,CAAEC,UAAW,yCAA0CH,SAAUg6C,GAAOA,SACjd,OAAQ95C,EAAK64C,GAAkB,CAAEv3C,MAAOsT,EAAMxU,MAAQ,gBAAiB4N,YAAaA,EAAalO,SAAUS,EAAM,MAAO,CAAEN,UAAW,mCAAoCH,SAAU,CAACE,EAAK+5C,GAAO,CAAE95C,UAAW,yBAA0BgF,KAAMA,IAAS2zC,GAAa54C,EAAK,MAAO,CAAEC,UAAW,6BAA8BH,SAAU8U,EAAMxU,MAAQ,sBACtV,CACA,SAASk5C,IAAWlB,OAAEA,EAAMQ,UAAEA,GAAY,EAAK3zC,KAAEA,EAAO,OACpD,MAAQ8P,KAAMsjC,EAAIn8B,MAAEA,GAAUi8B,GAAiBC,GAC/C,GAAIl8B,EACA,OAAOlc,EAAKi5C,GAAa,CAAE33C,MAAO,uBAAwB4a,MAAOA,EAAO08B,UAAWA,EAAW3zC,KAAMA,IAExG,IAAKozC,EACD,OAAOr4C,EAAK04C,GAAmB,IAEnC,MAAM1qC,EAAehO,EAAK,MAAO,CAAEC,UAAW,WAAYqB,MAAO+2C,EAAK2B,MAAOl6C,SAAUu4C,EAAK2B,QAC5F,OAAQh6C,EAAK64C,GAAkB,CAAEv3C,MAAO+2C,EAAKj4C,MAAQi4C,EAAK2B,OAAS3B,EAAK4B,UAAY,UAAWjsC,YAAaA,EAAalO,SAAUS,EAAM,MAAO,CAAEN,UAAW,mCAAoCH,SAAU,CAACE,EAAK84C,GAAQ,CAAE1vC,IAAKivC,EAAK6B,QAAS95C,KAAMi4C,EAAKj4C,KAAMqE,MAAO,gBAAiBQ,KAAMA,IAAS2zC,GAAa54C,EAAK,MAAO,CAAEC,UAAW,6BAA8BH,SAAUu4C,EAAKj4C,MAAQi4C,EAAK2B,OAAS3B,EAAK4B,UAAY,gBACpa,CACO,SAASL,IAAaC,MAAEA,EAAKjB,UAAEA,GAAY,EAAK3zC,KAAEA,EAAO,OAC5D,MAAMgU,OAAEA,GAAWC,MACbnE,KAAEA,EAAImH,MAAEA,GAAUysB,EAAS,IAAM1vB,EAAOkhC,QAAQhxB,SAAS0wB,GAAQ,IACvE,GAAI39B,EACA,OAAOlc,EAAKi5C,GAAa,CAAE33C,MAAO,6BAA8B4a,MAAOA,EAAO08B,UAAWA,EAAW3zC,KAAMA,IAE9G,IAAK8P,EACD,OAAO/U,EAAK04C,GAAmB,IAEnC,MACM0B,EAASp6C,EAAK84C,GAAQ,CAAE14C,KAAM,KAAMqE,MAAO,cAAeQ,KAAMA,IAChE+I,EAAezN,EAAM85C,GAAO,CAAEp6C,UAAW,yDAA0DH,SAAU,CAACS,EAAM,KAAM,CAAET,SAAU,CAACE,EAAK,KAAM,CAAEC,UAAW,qBAAsBH,SAAU,SAAWE,EAAK,KAAM,CAAEC,UAAW,mBAAoBH,SAAUiV,GAAM3U,UAAaG,EAAM,KAAM,CAAET,SAAU,CAACE,EAAK,KAAM,CAAEC,UAAW,qBAAsBH,SAAU,aAAeE,EAAK,KAAM,CAAEC,UAAW,mBAAoBH,SAAUiV,GAAMulC,aAAgB/5C,EAAM,KAAM,CAAET,SAAU,CAACE,EAAK,KAAM,CAAEC,UAAW,qBAAsBH,SAAU,aAAeE,EAAK,KAAM,CAAEC,UAAW,mBAAoBH,SAAUiV,GAAMwlC,QAAQn6C,aACzmB,OAAQJ,EAAK64C,GAAkB,CAAEv3C,MAHnB,cAGiC0M,YAAaA,EAAalO,SAAUS,EAAM,MAAO,CAAEN,UAAW,mCAAoCH,SAAU,CAACs6C,EAAQxB,GAAa54C,EAAK,MAAO,CAAEC,UAAW,wBAAyBH,SAAUiV,GAAM3U,MAAQ2U,GAAMulC,SAAWvlC,GAAMwlC,QAAQn6C,MAAQ,gBACtS,CACA,SAASy4C,IAAiBv3C,MAAEA,EAAK0M,YAAEA,EAAWlO,SAAEA,IAC5C,OAAQS,EAAMosB,EAAS,CAAEC,OAAO,EAAM9sB,SAAU,CAACE,EAAK6sB,EAAgB,CAAE5sB,UAAW,gDAAiDH,SAAUE,EAAK,MAAO,CAAEF,SAAUA,MAAgBE,EAAK+sB,EAAgB,CAAEC,MAAO,SAAUwtB,WAAY,EAAGC,KAAM,QAAS36C,SAAUS,EAAM,MAAO,CAAEN,UAAW,+CAAgDH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,wBAAyBH,SAAUwB,IAAU0M,SACra,CC5FO,SAAS0sC,IAAWvE,QAAEA,EAAO/1C,KAAEA,EAAImO,YAAEA,IACxC,OA1BG,UAA+B4nC,QAAEA,EAAO/1C,KAAEA,EAAImO,YAAEA,IACnD,MAAMN,EAAUkoC,EAAQt1C,IAAKk1C,IAClB,CACHr1C,MAAOq1C,EAAOC,IACdplC,MAAO,IAAImlC,EAAOpzB,YAmB1B,MAhBoB,CAChBviB,KAAMA,EACNmO,YAAaA,GAAe,GAAGnO,EAAKk3C,OAAO,GAAGhH,cAAgBlwC,EAAK4e,MAAM,KACzE/Q,QAASA,EACT6pC,cAAgBsB,IAEZ,GADkC,iBAAZA,IAA+BA,EAClC,CAEf,MAAMrD,EAASI,EAAQl1B,KAAK5L,GAAKA,EAAE2gC,MAAQoD,GAC3C,MAAO,iBAAiBrD,GAAQpzB,OAAS,IAC7C,CAEA,MAAMozB,EAASI,EAAQl1B,KAAK5L,GAAKA,EAAE2gC,MAAQoD,GAC3C,OAAQ74C,EAAM,MAAO,CAAEN,UAAW,iCAAkCH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,4CAA6CH,SAAUE,EAAKm5C,GAAU,CAAEC,QAASA,EAASR,WAAW,EAAM3zC,KAAM,SAAY1E,EAAM,OAAQ,CAAEN,UAAW,sCAAuCH,SAAU,CAAC,IAAKi2C,GAAQpzB,OAAS,EAAG,WAIvV,CAEWg4B,CAAsB,CAAExE,UAAS/1C,OAAMmO,eAClD,CCxBO,SAASqsC,IAAiBnwB,OAAEA,EAAM0rB,QAAEA,EAAO5nC,YAAEA,EAAc,mBAAkBtO,UAAEA,IAClF,MAAMgZ,OAAEA,GAAWC,MACZjL,EAASgpC,GAAc/zC,EAAS,IACjCkzC,EAAc3rB,EAAO4rB,eAAe,eAI1CzwC,EAAU,KACN,GAAIqT,EAAQ,CACR,MAAMhL,EAAUkoC,EAAQt1C,IAAI0V,MAAOw/B,IAC/B,IAAI31C,EASJ,aARM6Y,EAAOiQ,aAAaC,SAAS4sB,EAAOC,KAAKxpC,KAAMsc,IACjD1oB,EAAO0oB,EAAY1oB,OACpBwW,MAAM,KACLxW,EAAO,GAAG21C,EAAOC,kBAEhB51C,IACDA,EAAO21C,EAAOC,KAEX,IACAD,EACH31C,UAGRkb,QAAQC,IAAItN,GAASzB,KAAKquC,IACtBA,EAAgBzlC,KAAK,CAAC9C,EAAG+C,IAAM/C,EAAElS,KAAK6iB,cAAc5N,EAAEjV,OACtD62C,EAAW4D,IAEnB,GACD,CAAC1E,EAASl9B,IACb,MAAMvY,EAAQuN,GAASgT,KAAM/Q,GAAWA,EAAO8lC,MAAQI,GACvD,OAAQp2C,EAAKs2C,EAAW,CAAEC,SAAU,OAAQt2C,UAAWA,EAAWu2C,aAAa,EAAMC,YAAaR,GAAsBhoC,QAASA,EAASvN,MAAOA,EAAO4P,SA3BtIJ,IACdua,EAAOisB,eAAe,cAAexmC,GAAQ8lC,MA0B2HW,GAAI,MAAOpoC,YAAaA,GACxM,CC5BO,SAASusC,GAAoBC,GAChC,MAAMC,EAAqB,GAQ3B,GADAA,EAAmBzoC,KANM,CACrBnS,KAAM,UACNmO,YAAa,SACb9N,KAAM,OACN42C,UAAU,IAGV0D,EAAOtyB,aAAc,CACrB,MAAMwyB,EChBP,UAA2B9E,QAAEA,EAAO/1C,KAAEA,EAAImO,YAAEA,IAuC/C,MAlCoB,CAChBnO,KAAMA,EACNmO,YAAaA,EACbN,QAPYkoC,EAAQt1C,IAAKk1C,IAAM,CAC/BnlC,MAAO,IAAImlC,EAAOpzB,SAClBjiB,MAAOq1C,EAAOC,OAMdv1C,KAAM,SACNq3C,cAAgBoD,IACZ,MAAMnF,EAASI,EAAQl1B,KAAK5L,GAAKA,EAAE2gC,MAAQkF,GACrCj/B,EAAc85B,GAAQ31C,MAAQ86C,EAEpC,IAAIC,EAAe,UACnB,GAAIpF,GAAQtpC,OACR,OAAQspC,EAAOtpC,QACX,KAAK2uC,GAAkBC,UACnBF,EAAe,UACf,MACJ,KAAKC,GAAkBE,SACnBH,EAAe,cACf,MACJ,QACIA,EAAe,YAI3B,MAAMI,EAAYxF,GAAQxtB,SAAWwtB,GAAQtpC,OACzC,IAAIspC,EAAOxtB,WAAWwtB,EAAOtpC,SAC7BspC,GAAQtpC,SAAWspC,GAAQxtB,QAAU,IAAIwtB,EAAOxtB,UAAY,IAChE,OAAQhoB,EAAM,MAAO,CAAEN,UAAW,2CAA4CH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,4DAA6DH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,mBAAoBH,SAAUmc,IAAgBs/B,GAAcv7C,EAAKH,EAAO,CAAEoM,QAASkvC,EAAcl7C,UAAW,gBAAiBH,SAAUy7C,OAAmBh7C,EAAM,OAAQ,CAAEN,UAAW,wBAAyBH,SAAU,CAAC,IAAKi2C,GAAQpzB,OAAS,EAAG,WAE3c4zB,SAAU,CAACwB,EAAaC,KACpB,MAAMjC,EAASI,EAAQl1B,KAAK5L,GAAKA,EAAE2gC,MAAQ+B,GAE3C,OADmBhC,GAAQ31C,MAAQ23C,GACjBl+B,cAAcP,SAAS0+B,EAAWn+B,gBAIhE,CDxBuC2hC,CAAkB,CAC7CrF,QAAS4E,EAAOtyB,cAAgB,GAChCroB,KAAM,cACNmO,YAAa,iBAEjBysC,EAAmBzoC,KAAK0oC,EAC5B,CACA,GAAIF,EAAO7xB,aAAc,CACrB,MAAMuyB,EE1BP,UAA2BtF,QAAEA,EAAO/1C,KAAEA,IACzC,MAAM6N,EAAUkoC,EAAQt1C,IAAKk1C,IAAM,CAC/BnlC,MAAO,IAAImlC,EAAOpzB,SAClBjiB,MAAOq1C,EAAOC,OAkBlB,MAhBoB,CAChB51C,KAAM,cACNmO,YAAanO,EAAKk3C,OAAO,GAAGhH,cAAgBlwC,EAAK4e,MAAM,GACvD/Q,QAASA,EACTxN,KAAM,SACNq3C,cAAgB4D,IACZ,MAAM3F,EAASI,EAAQl1B,KAAK5L,GAAKA,EAAE2gC,MAAQ0F,GAE3C,OAAQn7C,EAAM,MAAO,CAAEN,UAAW,2BAA4BH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,mBAAoBH,SADnGi2C,GAAQ31C,MAAQs7C,IAC6Gn7C,EAAM,OAAQ,CAAEN,UAAW,eAAgBH,SAAU,CAAC,IAAKi2C,GAAQpzB,OAAS,EAAG,WAEpO4zB,SAAU,CAACwB,EAAaC,KACpB,MAAMjC,EAASI,EAAQl1B,KAAK5L,GAAKA,EAAE2gC,MAAQ+B,GAE3C,OADmBhC,GAAQ31C,MAAQ23C,GACjBl+B,cAAcP,SAAS0+B,EAAWn+B,gBAIhE,CFIuC8hC,CAAkB,CAC7CxF,QAAS4E,EAAO7xB,cAAgB,GAChC9oB,KAAM,iBAEV46C,EAAmBzoC,KAAKkpC,EAC5B,CASA,GADAT,EAAmBzoC,KANK,CACpBnS,KAAM,OACNmO,YAAa,OACb9N,KAAM,aACN42C,UAAU,IAGV0D,EAAOa,OAAQ,CACf,MAAMC,EAAmBzE,GAAa,CAElCjB,QAAS4E,EAAOa,QAAU,GAC1Bx7C,KAAM,UAEV46C,EAAmBzoC,KAAKspC,EAC5B,CACA,GAAId,EAAOe,SAAU,CACjB,MAAMC,EAAoB3E,GAAa,CAEnCjB,QAAS4E,EAAOe,UAAY,GAC5B17C,KAAM,WAEV46C,EAAmBzoC,KAAKwpC,EAC5B,CACA,GAAIhB,EAAOiB,cAAe,CACtB,MAIMC,EAA0B7E,GAAa,CAEzCjB,QAN0B4E,EAAOiB,cAAcn7C,IAAKk1C,IAAM,IACvDA,EACHC,IAAoB,OAAfD,EAAOC,IAAe,OAASD,EAAOC,OAK3C51C,KAAM,gBACNmO,YAAa,kBAEjBysC,EAAmBzoC,KAAK0pC,EAC5B,CACA,GAAIlB,EAAOmB,WAAY,CACnB,MAAMC,EAAuBzB,GAAW,CACpCvE,QAAS4E,EAAOmB,YAAc,GAC9B97C,KAAM,aACNmO,YAAa,eAEjBysC,EAAmBzoC,KAAK4pC,EAC5B,CAOAnB,EAAmBzoC,KANU,CACzBnS,KAAM,QACNmO,YAAa,aACb9N,KAAM,OACN42C,UAAU,IASd2D,EAAmBzoC,KANW,CAC1BnS,KAAM,MACNmO,YAAa,cACb9N,KAAM,OACN42C,UAAU,IAUd,OADA2D,EAAmBzoC,KANc,CAC7BnS,KAAM,mBACNmO,YAAa,kBACb9N,KAAM,OACN42C,UAAU,IAGP2D,CACX,CAEO,SAASoB,GAAqB3xB,GACjC,OAAQ4xB,IACsB,IAAtBA,EAAWxvC,QAMf4d,EAAO6xB,cAAa,GAAO,GAC3BD,EAAW1nC,QAAQwH,IACf,GAAIA,EAAOzb,OAASyb,EAAOzb,MAAMmM,OAAS,EAAG,CACzC,MAAM0vC,EAAapgC,EAAO/b,KAC1B,IAAIg2C,EAEAA,EADgB,eAAhBj6B,EAAO1b,KACO0b,EAAOzb,MAAMG,IAAIwB,GAAkB,iBAANA,EAAiBA,EAAIA,EAAE3B,OAE7Dyb,EAAOk7B,SACEpvC,MAAMkT,QAAQgB,EAAOzb,OAC7Byb,EAAOzb,MAAMG,IAAKwB,GAAmB,iBAANA,GAAkBA,EAAE3B,MAAQ2B,EAAE3B,MAAQ2B,GACrE,CAAyB,iBAAjB8Z,EAAOzb,OAAsByb,EAAOzb,MAAMA,MAAQyb,EAAOzb,MAAMA,MAAQyb,EAAOzb,OAI9EuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,IAAiC,iBAApByb,EAAOzb,MAAM,GAC9Eyb,EAAOzb,MAAM,GAAGA,MAChBuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,GACxCyb,EAAOzb,MAAM,GACbyb,EAAOzb,MAGD,YAAf67C,GAA2C,qBAAfA,GAAuCt0C,MAAMkT,QAAQi7B,KAClFA,EAAc,CAACA,IAEnB3rB,EAAO+xB,MAAMD,GAAcnG,CAC/B,IAEJ3rB,EAAOA,UAhCHA,EAAO6xB,cAAa,GAAM,GAkCtC,CAEO,SAASG,IAAc1B,OAAEA,EAAMtwB,OAAEA,IACpC,MAAOiyB,EAASC,GAAcz5C,EAAS,IACjC05C,EAAe9B,GAAoBC,GACnC8B,EAAoBT,GAAqB3xB,GAS/C,OAAQlqB,EAAMu8C,GAAgB,CAAEF,aAAcA,EAAcF,QAASA,EAASC,WARlDj8C,IACxB,MAAM27C,EAA8B,mBAAV37C,EAAuBA,EAAMg8C,GAAWh8C,EAClEi8C,EAAWN,GACXQ,EAAkBR,IAKwFv8C,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAACE,EAAK+8C,GAAW,CAAA,GAAK/8C,EAAKgM,EAAQ,CAAE7I,QAHzM,KAClBsnB,EAAOA,UAE4Oxe,QAAS,UAAW3K,MAAO,UAAWxB,SAAUE,EAAKg9C,GAAW,CAAE/8C,UAAW,gBAAoBM,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKi9C,GAAW,CAAA,GAAKj9C,EAAKk9C,GAAa,CAAA,QACnc,CGrJO,SAASC,GAAkCpC,GAC9C,MAAMC,EAAqB,GAO3B,GANAA,EAAmBzoC,KAAK,CACpBhE,YAAa,qBACbnO,KAAM,OACNK,KAAM,OACNwN,QAAS,KAET8sC,EAAOtuC,OAAQ,CACf,MAAMsvC,EAAoB3E,GAAa,CAEnCjB,QAAS4E,EAAOtuC,QAAU,GAC1BrM,KAAM,SACNmO,YAAa,WAEjBysC,EAAmBzoC,KAAKwpC,EAC5B,CACA,GAAIhB,EAAOqC,aAAc,CACrB,MAAMC,EAAyB3C,GAAW,CACtCvE,QAAS4E,EAAOqC,cAAgB,GAChCh9C,KAAM,eACNmO,YAAa,iBAEjBysC,EAAmBzoC,KAAK8qC,EAC5B,CAOArC,EAAmBzoC,KANU,CACzBnS,KAAM,QACNmO,YAAa,aACb9N,KAAM,OACN42C,UAAU,IAUd,OADA2D,EAAmBzoC,KANW,CAC1BnS,KAAM,MACNmO,YAAa,cACb9N,KAAM,OACN42C,UAAU,IAGP2D,CACX,CAEO,SAASsC,GAAmC7yB,GAC/C,OAAQ4xB,IACsB,IAAtBA,EAAWxvC,QAIf4d,EAAO6xB,cAAa,GACpBD,EAAW1nC,QAAQwH,IACf,GAAIA,EAAOzb,OAASyb,EAAOzb,MAAMmM,OAAS,EAAG,CACzC,MAAM0vC,EAAapgC,EAAO/b,KAC1B,IAAIg2C,EAEAA,EADgB,eAAhBj6B,EAAO1b,KACO0b,EAAOzb,MAAMG,IAAIwB,GAAkB,iBAANA,EAAiBA,EAAIA,EAAE3B,OAE7Dyb,EAAOk7B,SACEpvC,MAAMkT,QAAQgB,EAAOzb,OAC7Byb,EAAOzb,MAAMG,IAAKwB,GAAmB,iBAANA,GAAkBA,EAAE3B,MAAQ2B,EAAE3B,MAAQ2B,GACrE,CAAyB,iBAAjB8Z,EAAOzb,OAAsByb,EAAOzb,MAAMA,MAAQyb,EAAOzb,MAAMA,MAAQyb,EAAOzb,OAI9EuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,IAAiC,iBAApByb,EAAOzb,MAAM,GAC9Eyb,EAAOzb,MAAM,GAAGA,MAChBuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,GACxCyb,EAAOzb,MAAM,GACbyb,EAAOzb,MAEF,SAAf67C,GACA9xB,EAAO+xB,MAAMe,YAAcnH,EAC3B3rB,EAAO+xB,MAAMp8C,KAAOg2C,GAGpB3rB,EAAO+xB,MAAMD,GAAcnG,CAEnC,IAEJ3rB,EAAOA,UAjCHA,EAAO6xB,eAmCnB,CAEO,SAASkB,IAA4BzC,OAAEA,EAAMtwB,OAAEA,IAClD,MAAOiyB,EAASC,GAAcz5C,EAAS,IACjC05C,EAAeO,GAAkCpC,GACjD8B,EAAoBS,GAAmC7yB,GAM7D,OAAQzqB,EAAK88C,GAAgB,CAAEF,aAAcA,EAAcF,QAASA,EAASC,WALjDj8C,IACxB,MAAM27C,EAA8B,mBAAV37C,EAAuBA,EAAMg8C,GAAWh8C,EAClEi8C,EAAWN,GACXQ,EAAkBR,IAEuFv8C,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK+8C,GAAW,CAAA,GAAK/8C,EAAKi9C,GAAW,IAAKj9C,EAAKk9C,GAAa,CAAA,OACvP,CC3FO,SAASO,GAAwB1C,GACpC,MAAM7D,aAAEA,GAAiBh+B,KACnB8hC,EAAqB,GAa3B,GAZAA,EAAmBzoC,KAAK,CACpBhE,YAAa,KACbnO,KAAM,KACNK,KAAM,OACNwN,QAAS,KAEb+sC,EAAmBzoC,KAAK,CACpBhE,YAAa,OACbnO,KAAM,OACNK,KAAM,OACNwN,QAAS,KAET8sC,EAAOt6C,KAAM,CACb,MAAMi9C,EAAkBjG,GAAW,CAC/BtB,QAAS4E,EAAOt6C,MAAQ,GACxBy2C,aAAcA,EACdz2C,KAAM,SACN42C,UAAU,IAEd2D,EAAmBzoC,KAAKmrC,EAC5B,CACA,GAAI3C,EAAOtuC,OAAQ,CACf,MAAMsvC,EAAoB3E,GAAa,CAEnCjB,QAAS4E,EAAOtuC,QAAU,GAC1BrM,KAAM,SACNmO,YAAa,SACb9N,KAAM,SACN42C,UAAU,IAEd2D,EAAmBzoC,KAAKwpC,EAC5B,CA0BA,OAzBIhB,EAAOlE,MACPmE,EAAmBzoC,KAAK,CACpBnS,KAAM,OACNmO,YAAa,OACb9N,KAAM,aACNwN,QAAS8sC,EAAOlE,KAAKh2C,IAAKi5C,IAAG,CACzBlpC,MAAOkpC,EACPp5C,MAAOo5C,OAInBkB,EAAmBzoC,KAAK,CACpBnS,KAAM,aACNmO,YAAa,eACb9N,KAAM,OACN42C,UAAU,EACVppC,QAAS,KAEb+sC,EAAmBzoC,KAAK,CACpBnS,KAAM,aACNmO,YAAa,eACb9N,KAAM,OACN42C,UAAU,EACVppC,QAAS,KAEN+sC,CACX,CAEO,SAAS2C,GAAyBlzB,GACrC,OAAQ4xB,IACsB,IAAtBA,EAAWxvC,QAIf4d,EAAO6xB,cAAa,GACpBD,EAAW1nC,QAAQwH,IACf,GAAIA,EAAOzb,OAASyb,EAAOzb,MAAMmM,OAAS,EAAG,CACzC,MAAM0vC,EAAapgC,EAAO/b,KAC1B,IAAIg2C,EACJ,GAAoB,SAAhBj6B,EAAO1b,MAAmB0b,EAAOk7B,UAEjC,GAAIpvC,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAMmM,OAAS,EACrD,GAA4B,IAAxBsP,EAAOzb,MAAMmM,OAAc,CAE3B,MAAM+wC,EAAuC,iBAApBzhC,EAAOzb,MAAM,GAAkByb,EAAOzb,MAAM,GAAGA,MAAQyb,EAAOzb,MAAM,GAC7F01C,EAAc,CACVyH,IAAKD,EACLE,IAAKF,EAEb,MACK,GAA4B,IAAxBzhC,EAAOzb,MAAMmM,OAAc,CAIhCupC,EAAc,CACVyH,IAHyC,iBAApB1hC,EAAOzb,MAAM,GAAkByb,EAAOzb,MAAM,GAAGA,MAAQyb,EAAOzb,MAAM,GAIzFo9C,IAHuC,iBAApB3hC,EAAOzb,MAAM,GAAkByb,EAAOzb,MAAM,GAAGA,MAAQyb,EAAOzb,MAAM,GAK/F,OAGH,GAAIyb,EAAOk7B,SACZ,GAAIpvC,MAAMkT,QAAQgB,EAAOzb,OACrB01C,EAAcj6B,EAAOzb,MAAMG,IAAKwB,GAAmB,iBAANA,GAAkBA,EAAE3B,MAAQ2B,EAAE3B,MAAQ2B,OAElF,CAED+zC,EAAc,CAD8B,iBAAjBj6B,EAAOzb,OAAsByb,EAAOzb,MAAMA,MAAQyb,EAAOzb,MAAMA,MAAQyb,EAAOzb,MAE7G,MAIA01C,EAAcnuC,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,IAAiC,iBAApByb,EAAOzb,MAAM,GAC9Eyb,EAAOzb,MAAM,GAAGA,MAChBuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,GACxCyb,EAAOzb,MAAM,GACbyb,EAAOzb,MAEF,SAAf67C,EACA9xB,EAAO+xB,MAAMp8C,KAAOg2C,EAEA,OAAfmG,EACL9xB,EAAO+xB,MAAMp7C,GAAKg1C,EAGlB3rB,EAAO+xB,MAAMD,GAAcnG,CAEnC,IAEJ3rB,EAAOA,UA1DHA,EAAO6xB,eA4DnB,CAEO,SAASyB,IAAmBhD,OAAEA,EAAMtwB,OAAEA,IACzC,MAAOiyB,EAASC,GAAcz5C,EAAS,IACjC05C,EAAea,GAAwB1C,GACvC8B,EAAoBc,GAAyBlzB,GAMnD,OAAQzqB,EAAK88C,GAAgB,CAAEF,aAAcA,EAAcF,QAASA,EAASC,WALjDj8C,IACxB,MAAM27C,EAA8B,mBAAV37C,EAAuBA,EAAMg8C,GAAWh8C,EAClEi8C,EAAWN,GACXQ,EAAkBR,IAEuFv8C,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK+8C,GAAW,CAAA,GAAK/8C,EAAKi9C,GAAW,IAAKj9C,EAAKk9C,GAAa,CAAA,OACvP,CC7IO,SAASc,GAA4BjD,GAExC,MAAMC,EAAqB,GAQ3BA,EAAmBzoC,KANK,CACpBnS,KAAM,OACNmO,YAAa,OACb9N,KAAM,OACN42C,UAAU,IAUd2D,EAAmBzoC,KANW,CAC1BnS,KAAM,SACNmO,YAAa,cACb9N,KAAM,OACN42C,UAAU,IASd2D,EAAmBzoC,KANM,CACrBnS,KAAM,QACNmO,YAAa,QACb9N,KAAM,OACN42C,UAAU,IAWd,OADA2D,EAAmBzoC,KANK,CACpBnS,KAAM,OACNmO,YAAa,OACb9N,KAAM,aACN42C,UAAU,IAGP2D,CACX,CAEO,SAASiD,GAA6BxzB,GACzC,OAAQ4xB,IACsB,IAAtBA,EAAWxvC,QAKf4d,EAAO6xB,cAAa,GAAO,GAC3BD,EAAW1nC,QAAQwH,IACf,GAAIA,EAAOzb,OAASyb,EAAOzb,MAAMmM,OAAS,EAAG,CACzC,MAAM0vC,EAAapgC,EAAO/b,KAC1B,IAAIg2C,EAEAA,EADgB,eAAhBj6B,EAAO1b,KACO0b,EAAOzb,MAAMG,IAAIwB,GAAkB,iBAANA,EAAiBA,EAAIA,EAAE3B,OAE7Dyb,EAAOk7B,SACEpvC,MAAMkT,QAAQgB,EAAOzb,OAC7Byb,EAAOzb,MAAMG,IAAKwB,GAAmB,iBAANA,GAAkBA,EAAE3B,MAAQ2B,EAAE3B,MAAQ2B,GACrE,CAAyB,iBAAjB8Z,EAAOzb,OAAsByb,EAAOzb,MAAMA,MAAQyb,EAAOzb,MAAMA,MAAQyb,EAAOzb,OAI9EuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,IAAiC,iBAApByb,EAAOzb,MAAM,GAC9Eyb,EAAOzb,MAAM,GAAGA,MAChBuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,GACxCyb,EAAOzb,MAAM,GACbyb,EAAOzb,MAErB+pB,EAAO+xB,MAAMD,GAAcnG,CAC/B,IAEJ3rB,EAAOA,QAAO,IA5BVA,EAAO6xB,cAAa,GAAM,GA8BtC,CAEO,SAAS4B,IAAsBnD,OAAEA,EAAMtwB,OAAEA,IAC5C,MAAOiyB,EAASC,GAAcz5C,EAAS,IACjC05C,EAAeoB,KACfnB,EAAoBoB,GAA6BxzB,GAMvD,OAAQzqB,EAAK88C,GAAgB,CAAEF,aAAcA,EAAcF,QAASA,EAASC,WALjDj8C,IACxB,MAAM27C,EAA8B,mBAAV37C,EAAuBA,EAAMg8C,GAAWh8C,EAClEi8C,EAAWN,GACXQ,EAAkBR,IAEuFv8C,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK+8C,GAAW,CAAA,GAAK/8C,EAAKi9C,GAAW,IAAKj9C,EAAKk9C,GAAa,CAAA,OACvP,CClFO,SAASiB,GAAuBpD,GAEnC,MAAMC,EAAqB,GAU3B,GAFAA,EAAmBzoC,KANK,CACpBnS,KAAM,OACNmO,YAAa,OACb9N,KAAM,OACN42C,UAAU,IAIV0D,EAAOqD,MAAQrD,EAAOqD,KAAKvxC,OAAS,EAAG,CACvC,MAAMwxC,EAAmB,CACrBj+C,KAAM,OACNmO,YAAa,OACb9N,KAAM,SACNwN,QAAS8sC,EAAOqD,KAAKv9C,IAAKy9C,IAAK,CAC3B1tC,MAAO0tC,EAAMtI,IACbt1C,MAAO49C,EAAMtI,IACbrzB,MAAO27B,EAAM37B,UAGrBq4B,EAAmBzoC,KAAK8rC,EAC5B,CACA,OAAOrD,CACX,CAEO,SAASuD,GAAwB9zB,GACpC,OAAQ4xB,IACsB,IAAtBA,EAAWxvC,QAMf4d,EAAO6xB,cAAa,GAAO,GAC3BD,EAAW1nC,QAAQwH,IACf,GAAIA,EAAOzb,OAASyb,EAAOzb,MAAMmM,OAAS,EAAG,CACzC,MAAM0vC,EAAapgC,EAAO/b,KAC1B,IAAIg2C,EAEAA,EADgB,eAAhBj6B,EAAO1b,KACO0b,EAAOzb,MAAMG,IAAIwB,GAAkB,iBAANA,EAAiBA,EAAIA,EAAE3B,OAE7Dyb,EAAOk7B,SACEpvC,MAAMkT,QAAQgB,EAAOzb,OAC7Byb,EAAOzb,MAAMG,IAAKwB,GAAmB,iBAANA,GAAkBA,EAAE3B,MAAQ2B,EAAE3B,MAAQ2B,GACrE,CAAyB,iBAAjB8Z,EAAOzb,OAAsByb,EAAOzb,MAAMA,MAAQyb,EAAOzb,MAAMA,MAAQyb,EAAOzb,OAI9EuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,IAAiC,iBAApByb,EAAOzb,MAAM,GAC9Eyb,EAAOzb,MAAM,GAAGA,MAChBuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,GACxCyb,EAAOzb,MAAM,GACbyb,EAAOzb,MAErB+pB,EAAO+xB,MAAMD,GAAcnG,CAC/B,IAEJ3rB,EAAOA,UA5BHA,EAAO6xB,cAAa,GAAM,GA8BtC,CAEO,SAASkC,IAAiBzD,OAAEA,EAAMtwB,OAAEA,IACvC,MAAOiyB,EAASC,GAAcz5C,EAAS,IACjC05C,EAAeuB,GAAuBpD,GACtC8B,EAAoB0B,GAAwB9zB,GAMlD,OAAQzqB,EAAK88C,GAAgB,CAAEF,aAAcA,EAAcF,QAASA,EAASC,WALjDj8C,IACxB,MAAM27C,EAA8B,mBAAV37C,EAAuBA,EAAMg8C,GAAWh8C,EAClEi8C,EAAWN,GACXQ,EAAkBR,IAEuFv8C,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK+8C,GAAW,CAAA,GAAK/8C,EAAKi9C,GAAW,IAAKj9C,EAAKk9C,GAAa,CAAA,OACvP,CCzEO,SAASuB,GAA2B1D,GAEvC,MAAM7D,aAAEA,GAAiBh+B,KACnB8hC,EAAqB,GAU3B,GAFAA,EAAmBzoC,KANK,CACpBnS,KAAM,OACNmO,YAAa,OACb9N,KAAM,OACN42C,UAAU,IAIVH,EAAc,CACd,MAAMwH,EAAcxH,EAAahhB,MAAMr1B,IAAIJ,IAChC,CACHmQ,MAAOnQ,EAAKL,KACZM,MAAOD,EAAKW,MAGds8C,EAAkB,CACpBt9C,KAAM,QACNmO,YAAa,OACb9N,KAAM,SACN42C,UAAU,EACVppC,QAASywC,EACTnI,SAAU,CAAC71C,EAAOs3C,KACd,MAAM9nC,EAASwuC,EAAYz9B,KAAK09B,GAAOA,EAAIj+C,QAAUA,GACrD,OAAOwP,GAAQU,OAAOiJ,cAAcP,SAAS0+B,EAAWn+B,iBAAkB,IAGlFmhC,EAAmBzoC,KAAKmrC,EAC5B,CACA,OAAO1C,CACX,CAEO,SAAS4D,GAA4Bn0B,GACxC,OAAQ4xB,IACsB,IAAtBA,EAAWxvC,QAMf4d,EAAO6xB,cAAa,GACpBD,EAAW1nC,QAAQwH,IACf,GAAIA,EAAOzb,OAASyb,EAAOzb,MAAMmM,OAAS,EAAG,CACzC,MAAM0vC,EAAapgC,EAAO/b,KAC1B,IAAIg2C,EAEAA,EADgB,eAAhBj6B,EAAO1b,KACO0b,EAAOzb,MAAMG,IAAIwB,GAAkB,iBAANA,EAAiBA,EAAIA,EAAE3B,OAE7Dyb,EAAOk7B,SACEpvC,MAAMkT,QAAQgB,EAAOzb,OAC7Byb,EAAOzb,MAAMG,IAAKwB,GAAmB,iBAANA,GAAkBA,EAAE3B,MAAQ2B,EAAE3B,MAAQ2B,GACrE,CAAyB,iBAAjB8Z,EAAOzb,OAAsByb,EAAOzb,MAAMA,MAAQyb,EAAOzb,MAAMA,MAAQyb,EAAOzb,OAI9EuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,IAAiC,iBAApByb,EAAOzb,MAAM,GAC9Eyb,EAAOzb,MAAM,GAAGA,MAChBuH,MAAMkT,QAAQgB,EAAOzb,QAAUyb,EAAOzb,MAAM,GACxCyb,EAAOzb,MAAM,GACbyb,EAAOzb,MAErB+pB,EAAO+xB,MAAMD,GAAcnG,CAC/B,IAEJ3rB,EAAOA,UA5BHA,EAAO6xB,cAAa,GA8BhC,CAEO,SAASuC,IAAqB9D,OAAEA,EAAMtwB,OAAEA,IAC3C,MAAOiyB,EAASC,GAAcz5C,EAAS,IACjC05C,EAAe6B,KACf5B,EAAoB+B,GAA4Bn0B,GAMtD,OAAQzqB,EAAK88C,GAAgB,CAAEF,aAAcA,EAAcF,QAASA,EAASC,WALjDj8C,IACxB,MAAM27C,EAA8B,mBAAV37C,EAAuBA,EAAMg8C,GAAWh8C,EAClEi8C,EAAWN,GACXQ,EAAkBR,IAEuFv8C,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK+8C,GAAW,CAAA,GAAK/8C,EAAKi9C,GAAW,IAAKj9C,EAAKk9C,GAAa,CAAA,OACvP,CCrFO,MAAM4B,GACTxqB,OACA/D,QACAwuB,SAIAC,aACAC,iBAAkB,EAClB,WAAAt7B,CAAY2Q,EAAQ0qB,EAAczuB,EAASwuB,GACvCl7B,KAAKyQ,OAASA,EACdzQ,KAAK0M,QAAUA,EACf1M,KAAKk7B,SAAWA,EAChBl7B,KAAKo7B,gBAAuD,IAArC38B,OAAOC,KAAKsB,KAAK0M,SAAS1jB,OACjDgX,KAAKm7B,aAAeA,CACxB,CACA,iBAAAE,GACI,OAAOr7B,KAAKo7B,eAChB,CACA,YAAAE,GACI,YAAuBpyC,IAAhB8W,KAAKyQ,QAAwC,IAAhBzQ,KAAK5e,MAC7C,CACA,IAAAA,GACI,OAAOqd,OAAOC,KAAKsB,KAAK0M,SAAS1jB,MACrC,CACA,YAAAuyC,GACI,OAAO98B,OAAOC,KAAKsB,KAAK0M,QAC5B,CACA,WAAA8uB,GACI,OAAOx7B,KAAKyQ,QAAQlzB,EACxB,CACA,KAAAsmB,GACI,OAAO,IAAIo3B,GAAkBj7B,KAAKyQ,OAAQzQ,KAAKm7B,aAAcn7B,KAAK0M,QAAS1M,KAAKk7B,SACpF,CACA,GAAAruC,CAAI4jB,GACAzQ,KAAK0M,QAAQ+D,EAAOlzB,IAAMkzB,EAC1BzQ,KAAKo7B,gBAAuD,IAArC38B,OAAOC,KAAKsB,KAAK0M,SAAS1jB,OACjDgX,KAAKk7B,SAASl7B,KAAK6D,QACvB,CACA,MAAA43B,CAAOpe,UACIrd,KAAK0M,QAAQ2Q,GACpBrd,KAAKo7B,gBAAuD,IAArC38B,OAAOC,KAAKsB,KAAK0M,SAAS1jB,OACjDgX,KAAKk7B,SAASl7B,KAAK6D,QACvB,CACA,MAAA63B,CAAOhvB,GACH,IAAK,MAAMivB,KAAOjvB,EACd1M,KAAK0M,QAAQivB,EAAIp+C,IAAMo+C,EAE3B37B,KAAKk7B,SAASl7B,KAAK6D,QACvB,CACA,UAAA+R,CAAWyH,GACP,YAAkCn0B,IAA3B8W,KAAK0M,QAAQ2Q,EACxB,CACA,SAAAue,GACI57B,KAAK0M,QAAU,CAAA,EACf1M,KAAKo7B,iBAAkB,EACvBp7B,KAAKk7B,SAASl7B,KAAK6D,QACvB,EAEJ,MAAMg4B,GAA2B32C,OAAcgE,GACxC,SAAS4yC,KACZ,MAAMxK,EAAYjsC,EAAWw2C,IAC7B,IAAKvK,EACD,MAAM,IAAIzpB,MAAM,oEAEpB,OAAOypB,CACX,CACO,SAASyK,KACZ,OAAO12C,EAAWw2C,GACtB,CACO,SAASG,IAA0Bn/C,MAAEA,EAAKs+C,aAAEA,EAAYl/C,SAAEA,IAC7D,MAAOq1C,EAAW2K,GAAgB58C,IAKlC,OAJA0C,EAAU,KACN,MAAMuvC,EAAY,IAAI2J,GAAkBp+C,EAAOs+C,EAAc,CAAA,EAAIc,GACjEA,EAAa3K,IACd,CAACz0C,IACGy0C,GAAcn1C,EAAK0/C,GAAyB71C,SAAU,CAAEnJ,MAAOy0C,EAAWr1C,SAAUA,GAC/F,CCxEAgM,GAAMi0C,OAAOC,IACbl0C,GAAMi0C,OAAOE,IACb,MAAMC,GAAY,CACd,MAAAC,CAAO1+C,EAAQ2+C,GACX,IAAIC,EAAa,GACjB,GAAI5+C,EAAQ,CACR,MAAMud,EAAQvd,EAAOiT,IAAI,SACrBsK,GACAqhC,EAAW9tC,KAAM7R,GAAUA,EAAMse,MAAMsR,SAAStR,KAEpD,MAAMshC,EAAa7+C,EAAOiT,IAAI,cAC1B4rC,GACAD,EAAW9tC,KAAM7R,GAAUA,EAAMse,MAAM,EAAGsR,SAASgwB,KAEnD7+C,EAAO2O,IAAI,UACXiwC,EAAW9tC,KAAM7R,GAAUA,EAAM4vC,eAEjC7uC,EAAO2O,IAAI,UACXiwC,EAAW9tC,KAAM7R,GAAUA,EAAMmZ,eAEjCpY,EAAO2O,IAAI,eACXiwC,EAAW9tC,KAAM7R,GAAUA,EAAM,GAAG4vC,cAAgB5vC,EAAMyiB,UAAU,IAEpE1hB,EAAO2O,IAAI,aACXiwC,EAAW9tC,KAAM7R,GAAUA,EAAQ,MAE3C,CACA,MAAO,CAACA,EAAOkI,KACX,IAAIvG,EACJ,GAAI3B,GAEA,GADA2B,EAAIgX,OAAO3Y,GACP2/C,EAAWxzC,OAAS,EACpB,IAAK,MAAMoF,KAAKouC,EACZh+C,EAAI4P,EAAE5P,QAKdA,EAAI,GAER,OAAOrC,EAAK,KAAM,CAAEF,SAAUuC,GAAKuG,GAE3C,EACA23C,SAAQ,CAACC,EAASJ,IACP,CAAC1/C,EAAOkI,KACX,IAAI23C,EAAW,GACf,GAAI7/C,EAAO,CACP,MAAM+/C,EAAQC,OAAOhgD,GACrB,GAAK+/B,MAAMggB,GAWPF,EAAWlnC,OAAO3Y,OAXH,CACf,MAAMigD,EAAQ,CAAC,QAAS,KAAM,KAAM,KAAM,MAC1C,GAAc,IAAVF,EACAF,EAAW,cAEV,CACD,MAAMj+C,EAAIgF,KAAKkS,MAAMlS,KAAK4L,IAAIutC,GAASn5C,KAAK4L,IAAI,OAChDqtC,EAAW,IAAIE,EAAQn5C,KAAKs5C,IAAI,KAAMt+C,IAAIkJ,QAAQ,MAAMm1C,EAAMr+C,IAClE,CACJ,CAIJ,CACA,OAAOtC,EAAK,KAAM,CAAEF,SAAUygD,GAAY33C,IAGlD,MAAAi4C,CAAOp/C,EAAQ2+C,GACX,IAAIU,EACAC,EACAt/C,IACAq/C,EAAWr/C,EAAOiT,IAAI,kBAAe3H,EACrCg0C,EAAWt/C,EAAOiT,IAAI,kBAAe3H,GAEzC,MAAMi0C,EAASD,EAAWzwB,SAASywB,GAAY,EAC/C,MAAO,CAACrgD,EAAOkI,KACX,IAAIvG,EAAI,IAAI4+C,KAAKC,aAAa,QAAS,CACnC78C,MAAOy8C,EAAW,WAAa,UAC/BA,WACAK,sBAAuBH,IACxBj1C,OAAOrL,GACV,OAAOV,EAAK,KAAM,CAAEF,SAAUuC,GAAKuG,GAE3C,EACA,QAAAs4B,CAASz/B,EAAQ0B,GACb,IAAIk9C,EAAa,GACbe,GAAW,EACf,GAAI3/C,EAAQ,CACR,MAAMud,EAAQvd,EAAOiT,IAAI,SACrBsK,IACAoiC,GAAW,EACXf,EAAW9tC,KAAM7R,GAAUA,EAAMse,MAAMsR,SAAStR,KAExD,CACA,MAAO,CAACte,EAAOkI,KACX,MAAMy4C,EAAehB,EAAW1qC,OAAO,CAACtT,EAAG4P,IAAMA,EAAE5P,GAAI3B,EAAMU,IAC7D,OAAQb,EAAM,KAAM,CAAEN,UAAW,0CAA2CH,SAAU,CAACshD,EAAW,IAAM,GAAIC,EAAcrhD,EAAKgM,EAAQ,CAAEC,QAAS,QAASrC,IAAK,iBAAkBzG,QAAU+G,IAC5KA,EAAEC,kBACFhH,IAAUzC,EAAMU,KACjBtB,SAAUE,EAAK41C,GAAK,CAAE31C,UAAW,eAAmB2I,GAE3E,EACA,UAAA04C,CAAW7/C,EAAQ2+C,GACf,IAAI9+C,EAAQ,QAIZ,OAHIG,IACAH,EAAQG,EAAOiT,IAAI,UAAY,SAE5B,CAAChU,EAAOkI,IACH5I,EAAK,KAAM,CAAEF,SAAUY,EAAMoC,aAAaxB,IAAUZ,EAAMN,MAAQwuB,GAAQluB,EAAMU,KAAOwH,EAEvG,EAEA,UAAA24C,CAAWf,EAASr9C,GAChB,MAAMk9C,EAAa,GAGnB,OADAA,EAAW9tC,KAAM7R,GAAUA,EAAMse,OAAM,IAChC,CAACte,EAAOkI,KACX,MAAMy4C,EAAehB,EAAW1qC,OAAO,CAACtT,EAAG4P,IAAMA,EAAE5P,GAAI3B,EAAMU,IAC7D,OAAQb,EAAM,KAAM,CAAEN,UAAW,mDAAoDH,SAAU,CAAY,IAAUuhD,EAAcrhD,EAAKgM,EAAQ,CAAEC,QAAS,QAASrC,IAAK,iBAAkBzG,QAAU+G,IACrLA,EAAEC,kBACFhH,IAAUzC,EAAMU,KACjBtB,SAAUE,EAAK41C,GAAK,CAAE31C,UAAW,eAAmB2I,GAE3E,EACA44C,SAAQ,CAAChB,EAASJ,IACP,CAAC1/C,EAAOkI,IACJ5I,EAAK,KAAM,CAAEF,SAAUY,GAAON,MAAQ,OAASwI,GAG9D,IAAA64C,CAAKhgD,EAAQ2+C,GACT,IAAIpe,EAAS,SACT0f,EAAM,MACV,GAAIjgD,EAAQ,CACR,MAAMkgD,EAAYlgD,EAAOiT,IAAI,aAC7B,GAAIitC,EACAD,EAAMC,MAEL,CACD,MAAMC,EAAWngD,EAAOiT,IAAI,YACxBktC,IACA5f,EAAS4f,EACTF,OAAM30C,EAEd,CACJ,CACA,MAAO,CAACrM,EAAOkI,IACJ5I,EAAK,KAAM,CAAEF,SAAUgM,GAAMpL,GAAOshC,GAAQ0f,IAAQ94C,EAEnE,GCvJEi5C,GAAkB3B,GAAUC,SAClC,SAAS2B,GAAaxtB,EAAQrd,GAC1B,IAAI6tB,EAAIxQ,EACR,IAAKwQ,EACD,OACJ,IAAK7tB,EAAKpK,OACN,OAAOi4B,EACX,MAAMid,EAAO9qC,EAAKpK,OAAS,EAC3B,IAAK,IAAIvK,EAAI,EAAGA,EAAIy/C,EAAMz/C,IAEtB,GADAwiC,EAAIA,EAAE7tB,EAAK3U,KACNwiC,EACD,OAGR,OAAOA,EAAE7tB,EAAK8qC,GAClB,CACA,SAASC,GAAU/qC,GACf,OAAKA,GAAiB,MAATA,EAGNA,EAAK2E,MAAM,KAFP,EAGf,CACO,MAAMqmC,GACTC,OACAC,SAAWN,GACX5qC,KACAmrC,aACA9M,cACA,WAAA3xB,CAAYu+B,EAAQ5M,GAMhB,GALAzxB,KAAKq+B,OAASA,EACdr+B,KAAK5M,KAAO+qC,GAAUE,EAAOG,OAAS,IACtCx+B,KAAKu+B,aAAeF,EAAOI,SAAWN,GAAUE,EAAOI,eAAYv1C,EACnE8W,KAAKyxB,cAAgBA,EAEjB4M,EAAOj+B,OACPJ,KAAKs+B,SAAW,CAACI,EAAQC,IAAW,SAEnC,CAED,MAAM/hD,EAAOyhD,EAAOzhD,MAAQ,SACtB6B,EAAI7B,EAAKgiD,QAAQ,KACvB,GAAIngD,EAAI,EAAG,CACP,MAAMlC,EAAOK,EAAK0iB,UAAU,EAAG7gB,GACzBb,EAAS,IAAIihD,gBAAgBjiD,EAAK0iB,UAAU7gB,EAAI,IACtDuhB,KAAKs+B,SAAWjC,GAAU9/C,GAAMqB,EACpC,MAEIoiB,KAAKs+B,SAAWjC,GAAUz/C,IAElC,CACJ,CACA,QAAIL,GACA,OAAOyjB,KAAKq+B,OAAO9hD,IACvB,CACA,YAAAuiD,CAAaruB,GACT,IAAI5zB,EAAQohD,GAAaxtB,EAAQzQ,KAAK5M,MAOtC,YANclK,IAAVrM,GAAuBmjB,KAAKu+B,eAC5B1hD,EAAQohD,GAAaxtB,EAAQzQ,KAAKu+B,oBAExBr1C,IAAVrM,IACAA,EAAQmjB,KAAKq+B,OAAO90C,SAEjB1M,CACX,CACA,MAAAujB,CAAOqQ,EAAQ1rB,GAEX,GAAIib,KAAKq+B,OAAOj+B,OACZ,OAAOjkB,EAAK,KAAM,CAAEC,UAAW,sCAAuCH,SAAU+jB,KAAKq+B,OAAOj+B,OAAOqQ,IAAW1rB,GAElH,MAAMnI,EAAOojB,KAAKq+B,OAAOzhD,MAAQ,SAC3BmiD,EAAWniD,EAAKgiD,QAAQ,KAAO,EAAIhiD,EAAK0iB,UAAU,EAAG1iB,EAAKgiD,QAAQ,MAAQhiD,EAChF,IAAkB,aAAbmiD,GAAwC,eAAbA,IAA8B/+B,KAAKyxB,cAAe,CAC9E,MAAMhzC,EAAI7B,EAAKgiD,QAAQ,KACjBhhD,EAASa,EAAI,EAAI,IAAIogD,gBAAgBjiD,EAAK0iB,UAAU7gB,EAAI,SAAMyK,EAIpE,OAHiBmzC,GAAU0C,GAAUnhD,EAASu0C,IAC1CnyB,KAAKyxB,cAAchhB,EAAOlzB,KAEvB+gD,CAAS7tB,EAAQ1rB,EAC5B,CAEA,OAAOib,KAAKs+B,SAASt+B,KAAK8+B,aAAaruB,GAAS1rB,EACpD,EChFG,SAASi6C,IAAkBtyB,QAAEA,EAAO4kB,UAAEA,EAAS3mC,UAAEA,EAASs0C,QAAEA,EAAOzN,WAAEA,EAAUE,eAAEA,EAAcwN,UAAEA,EAAS3N,kBAAEA,IAC/G,OAAQ70C,EAAM85C,GAAO,CAAEp6C,UAAW,kBAAmBH,SAAU,CAACE,EAAK,QAAS,CAAEF,SAAUS,EAAM,KAAM,CAAET,SAAU,CAACq1C,GAAan1C,EAAK,KAAM,CAAEF,SAAUE,EAAK,QAAS,CAAES,KAAM,WAAY6P,SAAUyyC,MAAiBD,EAAQjiD,IAAKmiD,GAAShjD,EAAK,KAAM,CAAEF,SAAUkjD,EAAI5iD,MAAQ4iD,EAAI5iD,YAAgBG,EAAM0iD,GAAO,CAAEz0C,UAAWA,EAAWs0C,QAASA,EAAQj2C,OAAS,EAAG/M,SAAU,CAACywB,GAAS1vB,IAAK2+C,GAChWj/C,EAAM,KAAM,CAAEN,UAAW,wCAAuCs1C,GAAgBn0C,KAAOo+C,EAAIp+C,GAAK,WAAa,IAAM+B,QAAS,KAC5HkyC,GAAcA,EAAWmK,IAC1B1/C,SAAU,CAACq1C,GACNn1C,EAAK,KAAM,CAAEmD,QAASwyC,GAAMA,EAAGxrC,kBAAmBrK,SAAUE,EAAK,QAAS,CAAEqQ,QAAS8kC,EAAU1b,WAAW+lB,EAAIp+C,IAAKX,KAAM,WAAYR,UAAW,IAAIk1C,EAAU1b,WAAW+lB,EAAIp+C,IAAmC,GAA7B,4BAAmCkP,SAAWqlC,GAAOP,EAAkBoK,EAAK7J,OAAWmN,EAAQjiD,IAAI,CAACmiD,EAAKp6C,IAAUo6C,EAAI/+B,OAAOu7B,EAAK52C,MAAY42C,EAAIp+C,KAC/T,IAAnBmvB,EAAQ1jB,QAAgB7M,EAAK,KAAM,CAAEF,SAAUE,EAAK,KAAM,CAAEkjD,QAASJ,EAAQj2C,QAAUsoC,EAAY,EAAI,GAAIl1C,UAAW,cAAeH,SAAU,8FACvK,CACO,SAASqjD,IAAiB5yB,QAAEA,EAAO4kB,UAAEA,EAAS3mC,UAAEA,EAAS4mC,kBAAEA,EAAiBC,WAAEA,EAAUC,cAAEA,EAAaC,eAAEA,IAC5G,OAAQh1C,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK80C,GAAsB,CAAEtmC,UAAWA,IAAcxO,EAAK,MAAO,CAAEC,UAAW,gJAAiJH,SAAUywB,EAAQ1vB,IAAKkwB,GAAc/wB,EAAKk1C,GAAc,CAAEnkB,SAAUA,EAAUokB,UAAWA,EAAWC,kBAAmBA,EAAmBC,WAAYA,EAAYC,cAAeA,EAAeC,eAAgBA,GAAkBxkB,EAAS3vB,SACrf,CCXO,MAAMgiD,GACTnqC,OACAoqC,MACArE,aACAjE,OAAS,IAAIuI,GAAY,IACzBxhB,OAAS,IAAIwhB,GAAY,CAAE/yB,QAAS,GAAI/hB,WAAW,IACnD+0C,WAAa,GACb/G,MAAQ,CAAA,EACR,WAAA74B,CAAY1K,EAAQoqC,EAAQ,KACxBx/B,KAAK5K,OAASA,EACd4K,KAAKw/B,MAAQA,CACjB,CACA,UAAAG,CAAWzI,GAEP,OADAl3B,KAAK0/B,WAAaxI,EACXl3B,IACX,CACA,WAAI0M,GACA,OAAO1M,KAAKie,OAAOphC,MAAM6vB,OAC7B,CACA,SAAIrU,GACA,OAAO2H,KAAKie,OAAOphC,MAAMwb,KAC7B,CACA,aAAI1R,GACA,OAAOqZ,KAAKie,OAAOphC,MAAM8N,SAC7B,CACA,WAAIi1C,GACA,OAAO5/B,KAAKie,OAAOphC,MAAM+iD,UAAW,CACxC,CACA,cAAApN,CAAej2C,GACX,OAAOyjB,KAAK24B,MAAMp8C,EACtB,CACA,cAAAs2C,CAAet2C,EAAMM,GACjBmjB,KAAK24B,MAAMp8C,GAAQM,EAEnBmjB,KAAK4G,QACT,CACA,cAAAi5B,CAAenhC,GAEf,CACA,YAAA+5B,CAAaqH,GAAa,GAEtB,MAAMC,OAAEA,EAAMC,UAAEA,EAASC,OAAEA,EAAMC,QAAEA,EAAOC,kBAAEA,EAAiBC,gBAAEA,EAAeZ,MAAEA,EAAKa,cAAEA,GAAkBrgC,KAAK24B,MAC9G34B,KAAK24B,MAAQ,CACToH,iBACkB72C,IAAd82C,GAA2B,CAAEA,qBAClB92C,IAAX+2C,GAAwB,CAAEA,kBACd/2C,IAAZg3C,GAAyB,CAAEA,mBACLh3C,IAAtBi3C,GAAmC,CAAEA,6BACjBj3C,IAApBk3C,GAAiC,CAAEA,2BACjBl3C,IAAlBm3C,GAA+B,CAAEA,yBACvBn3C,IAAVs2C,GAAuB,CAAEA,UAE7BM,GACA9/B,KAAK4G,QAEb,CACA,eAAA05B,CAAgB/jD,GACZ,OAAOyjB,KAAKk3B,OAAOr6C,MAAMN,IAAO+1C,SAAW,EAC/C,CACA,WAAAiO,GACIvgC,KAAK24B,MAAQ,CAAA,CACjB,CACA,KAAAryB,CAAM3b,GAAY,GACdqV,KAAKie,OAAOphC,MAAQ,CAChB6vB,QAAS,GACT/hB,YACAi1C,SAAS,EAEjB,CACA,mBAAAY,CAAoB3jD,GAChB,MAAMqF,EAAO8d,KAAKie,OAAOphC,MACzBmjB,KAAKie,OAAOphC,MAAQ,CAChB6vB,QAASxqB,EAAKwqB,QACd/hB,UAAW9N,EACXwb,MAAOnW,EAAKmW,MACZunC,QAAS19C,EAAK09C,QAEtB,CACA,cAAAa,CAAe9H,EAAO6G,EAAOzd,EAAQ2e,GAAgB,GACjD,MAAMC,EAAU,CACZnB,QACAzd,SACA4W,QACAzB,OAAQwJ,EAAgB1gC,KAAK0/B,gBAAax2C,GAK9C,OAHgB8W,KAAKm7B,aACjBn7B,KAAK5K,OAAOwrC,YAAYC,cAAc7gC,KAAKm7B,aAAcwF,GACvD3gC,KAAK5K,OAAOsX,QAAQ9F,OAAO+5B,EAErC,CACA,cAAAG,GACI,MAAMH,EAAU,CAAEzJ,OAAQl3B,KAAK0/B,WAAY/G,MAAO34B,KAAK24B,OACvD,OAAO34B,KAAKm7B,aACRn7B,KAAK5K,OAAOwrC,YAAYG,cAAc/gC,KAAKm7B,aAAcwF,GACvD3gC,KAAK5K,OAAOsX,QAAQq0B,cAAcJ,EAC5C,CACA,aAAAI,CAAcC,GACVhhC,KAAK8gC,iBAAiBn4C,KAAMuuC,IACxBl3B,KAAKk3B,OAAOr6C,MAAQq6C,GAE5B,CACA,OAAA+J,CAAQC,GAAW,EAAOC,GAAW,GACjC,GAAInhC,KAAKrZ,WAAau6C,EAClB,OAAOzpC,QAAQqN,SAAQ,GAE3B9E,KAAKie,OAAOphC,MAAQ,CAChB8N,WAAW,EACX+hB,QAASw0B,EAAWlhC,KAAK0M,QAAU,GACnCkzB,SAASsB,GAAWlhC,KAAKie,OAAOphC,MAAM+iD,SAE1C,MAAMJ,EAAQx/B,KAAKw/B,MACbzd,EAASmf,EAAWlhC,KAAK0M,QAAQ1jB,OAAS,EAChD,OAAOgX,KAAKygC,eAAezgC,KAAK24B,MAAO6G,EAAOzd,GAASof,GAAUx4C,KAAK+J,MAAOy2B,IAEzE,MAAMiY,EAAUjY,EAAIiY,SAAW,GACzBlK,EAAS/N,EAAI+N,QAAU,CAAA,EAU7B,OATAl3B,KAAKie,OAAOphC,MAAQ,CAChB8N,WAAW,EACX+hB,QAASw0B,EAAWlhC,KAAK0M,QAAQ20B,OAAOD,GAAWA,EACnDxB,QAASwB,EAAQp4C,SAAWw2C,IAG3B2B,GAAYjK,GAAUz4B,OAAOC,KAAKw4B,GAAQluC,OAAS,IACpDgX,KAAKk3B,OAAOr6C,MAAQq6C,IAEjB,IACRnkC,MAAOC,IAON,MANAgN,KAAKie,OAAOphC,MAAQ,CAChBwb,MAAOrF,EACPrI,WAAW,EACX+hB,QAAS1M,KAAK0M,QACdkzB,QAAS5/B,KAAKie,OAAOphC,MAAM+iD,SAEzB5sC,GAEd,CACA,MAAA4T,CAAOu6B,GAAW,GAEd,OAAInhC,KAAKrZ,WAAaqZ,KAAK0M,QAAQ1jB,OAAS,EACjCyO,QAAQqN,SAAQ,GAEpB9E,KAAKihC,SAAQ,EAAOE,EAC/B,CACA,QAAAD,CAASC,GAAW,GAChB,OAAInhC,KAAKrZ,YAAcqZ,KAAK4/B,SAExB5/B,KAAK24B,MAAMsH,OADJxoC,QAAQqN,SAAQ,IAGvB9E,KAAK0M,QAAQ1jB,OAAS,IACtBm4C,GAAW,GAERnhC,KAAKihC,SAAQ,EAAME,GAC9B,EAEC,MAACG,GAAwBp8C,OAAcgE,GACrC,SAASq4C,KACZ,OAAOl8C,EAAWi8C,GACtB,CACO,SAASE,KACZ,OAAOC,GAAoBF,KAAoBrK,OACnD,CACO,SAASwK,KACZ,MAAM96B,EAAS26B,KAEf,MAAO,IADQE,GAAoB76B,EAAOqX,QACtBrX,SACxB,CACO,SAAS+6B,KACZ,MAAM/6B,EAAS26B,KAEf,OADeE,GAAoB76B,EAAOswB,QAC5BlwC,KAClB,CCtKU,IAAC46C,GAWXlvC,eAAemvC,GAAkBjmC,GAC7B,IACI,MAAMkmC,QAAoBlmC,EAAKkmC,cACzBC,EAAM,IAAIC,GAChBD,EAAIE,gBAAgB,IAAIC,WAAWJ,IACnC,MAAMt7B,EAAOu7B,EAAIzqB,MACjB,OAAO9Q,GAAMrF,UACjB,CACA,MAAO9I,GAEH,YADAjJ,QAAQiJ,MAAM,+BAAgCA,EAElD,CACJ,CAgDO,SAAS8pC,KACZ,MAAM/sC,OAAEA,GAAWC,KACbxO,EAAQC,IA+Gd,MAAO,CACHs7C,wBAxG0B1vC,MAAO0E,EAAOirC,EAAgBC,KACxD,IAEIlzC,QAAQC,IAAI,0BAA0B+H,EAAMpO,mBAC5C,MAAMu5C,QAvDlB7vC,eAAwC0E,EAAOirC,GAC3C,MAAME,EAAoB,GAG1B,IAAK,IAAI9jD,EAAI,EAAGA,EAAI2Y,EAAMpO,OAAQvK,GADhB,EACgC,CAC9C,MAAM+jD,EAAQprC,EAAM+D,MAAM1c,EAAGA,EAFf,GAIRgkD,QAAwBhrC,QAAQC,IAAI8qC,EAAMxlD,IAAI0V,MAAOkJ,IAEvD,IAAI2K,EAAW87B,GAAkB,IAGjC,GAD0BzmC,EAAK8mC,mBACV,CACjB,MACMC,EADe/mC,EAAK8mC,mBACK3qC,MAAM,KACrC,GAAI4qC,EAAU35C,OAAS,EAAG,CAEtB,MAAM45C,EAAaD,EAAUxnC,MAAM,MAAO5D,KAAK,KAE/CgP,EAAW87B,EAAiB,GAAGA,KAAkBO,IAAeA,CACpE,CACJ,CAGA,MAAO,CACHhnC,OACA4K,WAHeq7B,GAAkBjmC,GAIjCrf,KAAMqf,EAAKrf,KACX6E,KAAMwa,EAAKxa,KACXmlB,eAGRg8B,EAAkB7zC,QAAQ+zC,EAC9B,CACA,OAAOF,CACX,CAoB4CM,CAAyBzrC,EAAOirC,GAC1DS,EAAuBpwC,UAIzB,IAAIy2B,EACJ,MAAMwX,EAAU,CACZhI,MAAO,CAAEha,MALC,CACV,eAAgB,CAAEokB,IAAKR,EAAkBvlD,IAAK4e,GAASA,EAAK4K,SAK5Dw8B,OAAQ,mBAGR7Z,EADAmZ,SACaltC,EAAO2U,MAAM62B,YAAYC,cAAcyB,EAAqB3B,IAAUS,eAGtEhsC,EAAO2U,MAAM2C,QAAQ9F,OAAO+5B,IAAUS,QAEvD,IAAK,MAAM1jD,KAAOyrC,EAAK,CACnB,MAAMvtB,EAAO2mC,EAAkBnlC,KAAMf,GAAMA,EAAEmK,OAAS9oB,EAAI2K,QAAQ46C,MAC9DrnC,IACAA,EAAKsnC,WAAaxlD,EAAIH,GACtBqe,EAAKunC,OAASvB,GAAiBwB,KAEvC,GAKEC,EAAsB3wC,UACxB,MAAM4wC,EAAiBf,EAAkBjqC,OAAQsD,GAASA,EAAKunC,SAAWvB,GAAiBwB,MACrFG,EAAeD,EAAetmD,IAAK4e,GAASA,EAAK2K,UACjDi9B,EAAkBp/C,MAAMgJ,KAAK,IAAIvB,IAAI03C,IACrCE,EAAU,GAChB,IAAK,MAAMl9B,KAAYi9B,EAAiB,CACpC,MAGM7K,EAAQ,CACV,eAAgB,CAAEoK,IAJEO,EACnBhrC,OAAQsD,GAASA,EAAK2K,WAAaA,GACnCvpB,IAAK4e,GAASA,EAAKrf,OAGpBgqB,SAAUA,GAAY,KAE1B,GAAI+7B,EAAqB,CACrB,MAAMnZ,EAAM/zB,EAAO2U,MAAM62B,YAAYC,cAAcyB,EAAqB,CACpE3J,MAAO,CACHha,MAAOga,GAEXqK,OAAQ,6BACTr6C,KAAMikB,GAAaA,EAASw0B,SAC/BqC,EAAQ/0C,KAAKy6B,EACjB,KACK,CACD,MAAMA,EAAM/zB,EAAO2U,MAAM2C,QAAQtP,KAAK,CAClCu7B,MAAOA,EACPqK,OAAQ,6BAEZS,EAAQ/0C,KAAKy6B,EACjB,CACJ,CACA,MAAMiY,SAAiB3pC,QAAQC,IAAI+rC,IAAUC,OAC7Ct0C,QAAQC,IAAI,SAAS+xC,EAAQp4C,4BAA6Bo4C,GAE1D,IAAK,MAAM1jD,KAAO0jD,EAAS,CACvB,MAAMxlC,EAAO2mC,EAAkBnlC,KAE9Bf,GAAMA,EAAE9f,OAASmB,EAAI2K,QAAQ9L,OACzB8f,EAAEkK,SAAWlK,EAAEkK,WAAa7oB,EAAI6oB,SAA4B,MAAjB7oB,EAAI6oB,WAChD3K,IACAA,EAAKsnC,WAAaxlD,EAAIH,GACtBqe,EAAKunC,OAASvB,GAAiBztC,OAEvC,CACA/E,QAAQC,IAAI,cAAckzC,EAAkBjqC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBztC,QAAQnL,WAiBpG,aAfM85C,UACAO,IAENd,EAAkBzxC,QAASuL,IAClBA,EAAE8mC,SACH9mC,EAAE8mC,OAASvB,GAAiB+B,UAIpCv0C,QAAQC,IAAI,qCAAsC,CAC9Cu0C,WAAYxsC,EAAMpO,OAClB66C,SAAUtB,EAAkBjqC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiB+B,QAAQ36C,OAChF86C,SAAUvB,EAAkBjqC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBztC,QAAQnL,OAChF+6C,OAAQxB,EAAkBjqC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBwB,MAAMp6C,SAEzEu5C,CACX,CACA,MAAOlqC,GAOH,MANAxR,EAAM,CACFpJ,MAAO,wCACPmL,OAAQ,QACRuB,YAAakO,EAAMhW,UAEvB+M,QAAQC,IAAI,wCAAyCgJ,GAC/C,IAAIwP,MAAM,0CAA4CxP,EAAMhW,QACtE,GAKR,CClLO,SAAS2hD,IAAoBllD,OAAEA,EAAMipB,QAAEA,EAAS3Q,MAAO6sC,EAAY9I,aAAEA,EAAYkH,eAAEA,EAAc5kD,MAAEA,EAAQ,eAAcxB,SAAEA,EAAQioD,iBAAEA,EAAgBC,kBAAEA,GAAoB,EAAKC,sBAAEA,GAAwB,EAAKC,aAAEA,GAAe,IACnO,MAAMjvC,OAAEA,EAAMi+B,aAAEA,GAAiBh+B,KAC3BxO,EAAQC,KACPsQ,EAAOktC,GAAYjlD,EAAS,KAC5BklD,EAAgBC,GAAqBnlD,EAAS,KAC9ColD,EAAgBC,GAAqBrlD,GAAS,IAC9CslD,EAAcC,GAAmBvlD,EAAS,OAC1CwlD,EAAcC,GAAmBzlD,EAAS,KAC1C0lD,EAAaC,GAAkB3lD,GAAS,IACxC4lD,EAAgBC,GAAqB7lD,GAAS,IAC9C8lD,EAAiBC,GAAsB/lD,EAAS,IAChDgmD,EAAUC,GAAejmD,EAAS8D,KAAKC,QACvCmiD,EAAgBC,GAAqBnmD,OAAS6J,IAC9C+0B,EAAQwnB,GAAapmD,EAAS,OAC9BqmD,EAAQC,GAAYtmD,EAAS5B,IAC7BmoD,EAAcC,GAAkBxmD,EAAS,IAEhD0C,EAAU,KACDo5C,GAEL/lC,EAAO2U,MAAM62B,YAAYt7B,SAAS61B,GAAcxyC,KAAK68C,IACtD,CAACrK,IAEJp5C,EAAU,KACFgjD,GACAY,EAAS,mBACTE,EAAe,GAAGpiD,KAAKiyB,MAAMyvB,iBAExBF,GACLU,EAAS,mBACTE,EAAe,KAEVpB,GACLkB,EAAS,yBACTE,EAAe,GAAGzuC,EAAMpO,cAA+B,IAAjBoO,EAAMpO,OAAe,IAAM,OAE5DoO,EAAMpO,OAAS,GACpB28C,EAASloD,GACTooD,EAAe,yCAGfF,EAASloD,GACTooD,EAAe,MAEpB,CAACd,EAAaE,EAAgBR,EAAgBhnD,EAAO0nD,EAAiB/tC,EAAMpO,SAE/E,MAAM88C,GAAqB,IAClBP,GAAmBlD,EAEhB3lD,EAAMqpD,GAAY,CAAE3pD,UAAW,OAAQwM,OAAQ,UAAWc,KAAMvN,EAAK6pD,GAAY,CAAE5pD,UAAW,WAAaH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,oBAAqBH,SAAUE,EAAK,OAAQ,CAAEC,UAAW,cAAeH,SAAU,uBAA0BS,EAAM,MAAO,CAAEN,UAAW,eAAgBH,SAAU,CAACspD,GAAmB7oD,EAAM,MAAO,CAAEN,UAAW,oBAAqBH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,OAAQH,SAAU,gBAAkBE,EAAK,OAAQ,CAAEC,UAAW,cAAeH,SAAUspD,EAAehpD,UAAc8lD,GAAmB3lD,EAAM,MAAO,CAAEN,UAAW,yBAA0BH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,OAAQH,SAAU,YAAcE,EAAK,OAAQ,CAAEC,UAAW,cAAeH,SAAUomD,aADvsB,MAIR4D,GAAiBC,IAAsB7mD,EAAS,CAAEwkD,SAAU,EAAGC,SAAU,EAAGC,OAAQ,KAErF3B,wBAAEA,IAA4BD,KAE9B9vB,GAAQp0B,EAAQ,IACXo1C,GAAchhB,OAAS,GAC/B,CAACghB,GAAchhB,QAElBtwB,EAAU,KACFjD,IAEA0lD,EAAkB,IAClBE,GAAkB,GAClBE,EAAgB,MAChBE,EAAgB,IAChBE,GAAe,GACfE,GAAkB,GAClBE,EAAmB,GACnBc,GAAmB,CAAErC,SAAU,EAAGC,SAAU,EAAGC,OAAQ,IACvD0B,EAAU,MACVE,EAASloD,GACTooD,EAAe,IAEX5B,GAAgBA,EAAaj7C,OAAS,GACtCs7C,EAASL,GACTkC,GAAalC,IAGbK,EAAS,IAGbgB,EAAYniD,KAAKC,SAEtB,CAACtE,EAAQmlD,IAEZ,MAAMmC,GAAc,KAEhB9B,EAAS,IACTE,EAAkB,IAClBE,GAAkB,GAClBE,EAAgB,MAChBE,EAAgB,IAChBE,GAAe,GACfE,GAAkB,GAClBE,EAAmB,GACnBc,GAAmB,CAAErC,SAAU,EAAGC,SAAU,EAAGC,OAAQ,IACvD0B,EAAU,MACVE,EAASloD,GACTooD,EAAe,IACfP,EAAYniD,KAAKC,OAEjB2kB,KAGEs+B,GAAoBC,IAClBA,GAAYA,EAASt9C,OAAS,IAC9Bs7C,EAASgC,GACTH,GAAaG,KAIfH,GAAezzC,MAAO6zC,IACxB,GAAKA,EAAev9C,OAEpB,IACIoG,QAAQC,IAAI,cAAck3C,EAAev9C,iDAEzC,MAAMgoC,QAAkBoR,GAAwBmE,EAAgBlE,EAAgBlH,GAChFqJ,EAAkBxT,GAElB,MAAM6S,EAAW7S,EAAU14B,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiB+B,QAAQ36C,OACzE86C,EAAW9S,EAAU14B,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBztC,QAAQnL,OACzE+6C,EAAS/S,EAAU14B,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBwB,MAAMp6C,OAE3Ek9C,GAAmB,CACfrC,WACAC,WACAC,WAGJl9C,EAAM,CACFpJ,MAAO,iBACP0M,YAAa,GAAGo8C,EAAev9C,mBAAmB66C,UAAiBC,gBAAuBC,YAC1Fn7C,OAAQ,OACR5I,SAAU,MAGd0kD,GAAkB,EACtB,CACA,MAAOrsC,GACHjJ,QAAQiJ,MAAM,0BAA2BA,GACzCxR,EAAM,CACFpJ,MAAO,QACP0M,YAAa,yCACbvB,OAAQ,QACR5I,SAAU,KAElB,GAGEwmD,GAAe9zC,UACjB,IAAK6xC,EAAev7C,OAChB,OACJ,MAAMmpB,EAASwyB,GAAcpnD,IAAM,KAE7BkpD,EAAkBlC,EAAevnD,IAAK0pD,IAAQ,CAChD9qC,KAAM8qC,EAAS9qC,KACfhT,OAAQ,UACRjG,SAAU,EACVwgD,OAAQuD,EAASvD,SAAWvB,GAAiB+B,OACvC,SACA+C,EAASvD,SAAWvB,GAAiBztC,OACjC,SACA,UAEd2wC,EAAgB2B,GAChBzB,GAAe,GACfE,GAAkB,GAElB,MAAMyB,EAAcpC,EAAejsC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBwB,MACzEwD,EAAgBrC,EAAejsC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBztC,QAC3E0yC,EAAgBtC,EAAejsC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiB+B,QAC3E1lB,EAAS,CACXp0B,SAAS,EACTi9C,UAAW,GACXC,cAAe,GACfC,aAAc,GACdC,YAAa,IAGjB,IAAK,MAAMP,KAAYC,EACfD,EAASxD,aACTjlB,EAAO6oB,UAAUp4C,KAAKg4C,EAASxD,YAC/BjlB,EAAO+oB,aAAat4C,KAAK,CACrBnR,GAAImpD,EAASxD,WACb3mD,KAAMmqD,EAASnqD,KACfK,KAAMu1B,EACNvpB,OAAQ,UACR2d,SAAUmgC,EAASngC,WAGvBu+B,EAAiBxyC,GAAYA,EAAQtV,IAAK4L,GAAWA,EAAOgT,OAAS8qC,EAAS9qC,KACxE,IAAKhT,EAAQA,OAAQ,UAAWjG,SAAU,IAAKpF,GAAImpD,EAASxD,YAC5Dt6C,KAId,MAGMs+C,EAAex0C,MAAO0E,EAAO+rC,KAC/B,MAAMgE,EAAU,GAChB,IAAK,IAAI1oD,EAAI,EAAGA,EAAI2Y,EAAMpO,OAAQvK,GALnB,GAMX0oD,EAAQz4C,KAAK0I,EAAM+D,MAAM1c,EAAGA,EANjB,KAQf,IAAK,IAAI2oD,EAAa,EAAGA,EAAaD,EAAQn+C,OAAQo+C,IAAc,CAChE,MAAM5E,EAAQ2E,EAAQC,GAGtB,GAFAh4C,QAAQC,IAAI,cAAc8zC,WAAgBiE,EAAa,KAAKD,EAAQn+C,WAAWw5C,EAAMx5C,iBAEjFoO,EAAMpO,OAZC,GAYoB,CAE3BnC,EAAM,CACFpJ,MAAO,qBAAqB0lD,KAC5Bh5C,YAAa,aAhBV,GAagBi9C,KAGyBhwC,EAAMpO,kBAClDJ,OAAQ,OACR5I,SAAU,KAElB,CAEA,IAAIqnD,EAAwB,QACtB5vC,QAAQC,IAAI8qC,EAAMxlD,IAAI0V,MAAOg0C,IAC/B,IAKI,GAHA5B,EAAiBxyC,GAAYA,EAAQtV,IAAK4L,GAAWA,EAAOgT,OAAS8qC,EAAS9qC,KACxE,IAAKhT,EAAQA,OAAQ,YAAajG,SAAU,IAC5CiG,IACS,WAAXu6C,GAAuBuD,EAASxD,iBAE1B9tC,EAAO2U,MAAM2C,QAAQ4G,OAAOozB,EAASxD,WAAY,CACnDtmD,KAAMu1B,QAAUjpB,EAChBb,QAASq+C,EAAS9qC,KAClB2K,SAAUmgC,EAASngC,SACnBhqB,KAAMmqD,EAASnqD,MAChB,CACCg3B,gBAAgB,EAChBC,cAAe,cAAe,IAAIrwB,MAAOmkD,gBAG7CxC,EAAiBxyC,GAAYA,EAAQtV,IAAK4L,GAAWA,EAAOgT,OAAS8qC,EAAS9qC,KACxE,IAAKhT,EAAQA,OAAQ,UAAWjG,SAAU,IAAKpF,GAAImpD,EAASxD,YAC5Dt6C,IAENq1B,EAAO6oB,UAAUp4C,KAAKg4C,EAASxD,YAC/BjlB,EAAO8oB,cAAcr4C,KAAK,CACtBnR,GAAImpD,EAASxD,WACb3mD,KAAMmqD,EAASnqD,KACfK,KAAMu1B,EACNvpB,OAAQ,UACR2d,SAAUmgC,EAASngC,eAGtB,CAED,MAAMghC,QAAqBnyC,EAAO2U,MAAM2C,QAAQ86B,OAAO,CACnD5qD,KAAMu1B,QAAUjpB,EAChBb,QAASq+C,EAAS9qC,KAClB2K,SAAUmgC,EAASngC,UAAYmgC,EAAS9qC,KAAK8mC,oBAAsBgE,EAASnqD,MAC7E,CACCkpB,cAAe01B,IAGnB2J,EAAiBxyC,GAAYA,EAAQtV,IAAK4L,GAAWA,EAAOgT,OAAS8qC,EAAS9qC,KACxE,IAAKhT,EAAQA,OAAQ,UAAWjG,SAAU,IAAKpF,GAAIgqD,EAAahqD,IAChEqL,IAENq1B,EAAO6oB,UAAUp4C,KAAK64C,EAAahqD,IACnC0gC,EAAO8oB,cAAcr4C,KAAK,CACtBnR,GAAIgqD,EAAahqD,GACjBhB,KAAMmqD,EAASnqD,KACfK,KAAMu1B,EACNvpB,OAAQ,UACR2d,SAAUmgC,EAASngC,UAE3B,CACJ,CACA,MAAOlO,GACHjJ,QAAQiJ,MAAM,0BAA0BquC,EAASnqD,QAAS8b,GAE1DysC,EAAiBxyC,GAAYA,EAAQtV,IAAK4L,GAAWA,EAAOgT,OAAS8qC,EAAS9qC,KACxE,IACKhT,EACHA,OAAQ,QACRjG,SAAU,IACVN,QAASgW,EAAMhW,SAAW,iBAE5BuG,IAENq1B,EAAOgpB,YAAYv4C,KAAK,CACpBnS,KAAMmqD,EAASnqD,KACf8b,MAAOA,EAAMhW,SAAW,gBACxBuG,OAAQ,SACR2d,SAAUmgC,EAASngC,SACnB3pB,KAAMu1B,IAGV8L,EAAOp0B,SAAU,CACrB,CAEAw9C,IACIA,EArGiB,GAqGoC,GAAKA,IAA0B7E,EAAMx5C,QAC1F87C,EAAiB2C,IACb,MAAMC,EAAiBD,EAAgBnvC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAAqC,UAAbyT,EAAEzT,QAAoBI,OAC/F46C,EAAa6D,EAAgBz+C,OAC7BrG,EAAWihD,EAAa,EAAIngD,KAAKiyB,MAAOgyB,EAAiB9D,EAAc,KAAO,EAEpF,OADAwB,EAAmBziD,GACZ8kD,MAIvB,GAGAb,EAAc59C,OAAS,SACjBk+C,EAAaN,EAAe,UAElCC,EAAc79C,OAAS,SACjBk+C,EAAaL,EAAe,UAItC/B,EAAiBxyC,IAEb,MAAMq1C,EAAkBr1C,EACnBgG,OAAQ1P,GAA6B,YAAlBA,EAAOA,QAC1B5L,IAAK4L,IAAM,IACTA,EACHA,OAAQ,QACRjG,SAAU,IACVN,QAAS,gCAEb,OAAIslD,EAAgB3+C,OAAS,GAEzB2+C,EAAgB72C,QAASlI,IACrBq1B,EAAOgpB,YAAYv4C,KAAK,CACpBnS,KAAMqM,EAAOgT,KAAKrf,KAClB8b,MAAO,6BACPzP,OAAQ,SACRhM,KAAM+nD,GAAcpnD,IAAM,SAIlC0gC,EAAOp0B,SAAU,EAEVyI,EAAQtV,IAAK4L,GAA6B,YAAlBA,EAAOA,OAChC,IACKA,EACHA,OAAQ,QACRjG,SAAU,IACVN,QAAS,8BAEXuG,IAEH0J,IAEX0yC,GAAe,GACfE,GAAkB,GAElB,MAAM0C,EAAe3pB,EAAO8oB,cAAczuC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAAsBI,OAC1E6+C,EAAe5pB,EAAO8oB,cAAczuC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAAsBI,OAC1E8+C,EAAe7pB,EAAO+oB,aAAah+C,OACnC++C,EAAc9pB,EAAOgpB,YAAYj+C,OACvC,IAAIg/C,EAAgB,GAChBJ,EAAe,IACfI,GAAiB,GAAGJ,SAAqC,IAAjBA,EAAqB,IAAM,eACnEC,EAAe,IACfG,GAAiBA,EAAgB,KAAO,GACxCA,GAAiB,GAAGH,SAAqC,IAAjBA,EAAqB,IAAM,cAEnEC,EAAe,IACfE,GAAiBA,EAAgB,KAAO,GACxCA,GAAiB,GAAGF,SAAqC,IAAjBA,EAAqB,IAAM,cAEnEC,EAAc,IACdC,GAAiBA,EAAgB,KAAO,GACxCA,GAAiB,GAAGD,SAAmC,IAAhBA,EAAoB,IAAM,aAErElhD,EAAM,CACFpJ,MAAO,kBACP0M,YAAa69C,EACbp/C,OAAQm/C,EAAc,EAAI,UAAY,UACtC/nD,SAAU,MAEdylD,EAAUxnB,IAERgqB,GAAgB,IACVvrD,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAACS,EAAM,QAAS,CAAEN,UAAW,iCAAkCH,SAAU,CAAC,gBAAiBE,EAAK,OAAQ,CAAEC,UAAW,yBAA0BH,SAAU,eAAiBE,EAAK6Q,EAAU,CAAE7C,YAAa,0IAA2I8C,UAAW,MAAO7L,KAAM,KAAMnF,SAAUE,EAAKiY,GAAM,CAAEhY,UAAW,qBAAyBD,EAAK+rD,GAAY,CAAE99C,QAASioB,GAAOx1B,MAAO8nD,EAAc/R,YAAch2C,GAAUA,EAAOA,EAAKL,KAAO,wBAA0BmO,YAAa,+DAAgE+B,SAAW07C,GAAavD,OAA6B17C,IAAbi/C,EAAyB,KAAOA,GAAWzV,SAAU,OAAQC,aAAa,IAASgS,EAAgBxoD,EAAKugB,EAAW,CAAA,GAAQvgB,EAAK,MAAO,CAAEC,UAAW,iBAAkBH,SAAUS,EAAM,MAAO,CAAEN,UAAW,mCAAoCH,SAAU,CAACE,EAAKisD,GAAiB,CAAEhsD,UAAW,gBAAkB,2BAA4BD,EAAK6Q,EAAU,CAAE7C,YAAa,+IAAgJ8C,UAAW,MAAO7L,KAAM,KAAMnF,SAAUE,EAAKiY,GAAM,CAAEhY,UAAW,0BAkH9wC,OAAQM,EAAM2wC,EAAQ,CAAEvuC,OAAQA,EAAQipB,QAASq+B,GAAahqD,UAAW,UAAWisD,4BAA4B,EAAMpsD,SAAU,CAACE,EAAKmxC,EAAa,CAAEnjC,YAAay7C,EAAc3pD,SAAUypD,IA7GlLtB,EACQ1nD,EAAM6wC,EAAY,CAAEtxC,SAAU,CAACA,EAAU6pD,KAAsBmC,QAGtD,IAAjB7wC,EAAMpO,QAAiBm7C,EAItBY,GAAgBE,EASjBF,EACQroD,EAAM6wC,EAAY,CAAEtxC,SAAU,CAAC6pD,KAAsB3pD,EAAK,MAAO,CAAEC,UAAW,OAAQH,SAAUE,EAAK,MAAO,CAAEC,UAAW,+CAAgDH,SAAUE,EAAK,MAAO,CAAEC,UAAW,iCAAkCoE,MAAO,CAAEkC,MAAO,GAAGyiD,YAA+BhpD,EAAK,MAAO,CAAEC,UAAW,2BAA4BH,SAAU4oD,EAAa7nD,IAAI,CAACsrD,EAAYvjD,IAAWrI,EAAM,MAAO,CAAEN,UAAW,gEAAiEH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAAuB,YAAtBqsD,EAAW1/C,QAAyBzM,EAAKosD,GAAU,CAAEnsD,UAAW,sBAA+C,cAAtBksD,EAAW1/C,QAA0BzM,EAAK8pC,EAAS,CAAE7kC,KAAM,OAA+B,YAAtBknD,EAAW1/C,QAAyBzM,EAAKisD,GAAiB,CAAEhsD,UAAW,wBAAiD,UAAtBksD,EAAW1/C,QAAsBzM,EAAKqsD,GAAa,CAAEpsD,UAAW,+BAAkCM,EAAM,MAAO,CAAEN,UAAW,iBAAkBH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,uBAAwBH,SAAUqsD,EAAW1sC,KAAKrf,OAASG,EAAM,MAAO,CAAEN,UAAW,qBAAsBH,SAAU,CAAuB,YAAtBqsD,EAAW1/C,QAAwB,aAAoC,cAAtB0/C,EAAW1/C,QAA0B,eAAsC,YAAtB0/C,EAAW1/C,SAC5nC,WAAtB0/C,EAAWnF,OACN,UACsB,WAAtBmF,EAAWnF,OACP,UACA,WAAkC,UAAtBmF,EAAW1/C,QAAsB0/C,EAAWjmD,gBAAoB,GAAGimD,EAAW1sC,KAAKrf,QAAQwI,WAGrJ5I,EAAKoxC,EAAY,CAAEtxC,SAAUS,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAAC6pD,KAAsB3pD,EAAKssD,GAAe,CAAErxC,MAAOytC,EAAa7nD,IAAKqf,IAEnI,IAAIzT,EAeJ,OAZQA,EAFS,YAAbyT,EAAEzT,OACe,WAAbyT,EAAE8mC,OACO,UAES,WAAb9mC,EAAE8mC,OACE,UAGA,UAIJ,SAEN,CACH5mD,KAAM8f,EAAET,KAAKrf,KACbqM,SACAyP,MAAoB,UAAbgE,EAAEzT,OAAqByT,EAAEha,aAAU6G,KAE9Cqd,SAAU87B,QAAkBn5C,EAAWgb,WAAYqhC,GAAgBhpD,YAvC3EJ,EAAKoxC,EAAY,CAAEtxC,SAAWwoD,EAIlC/nD,EAAMggB,EAAW,CAAEzgB,SAAU,CAAC6pD,KAAsB3pD,EAAK,MAAO,CAAEC,UAAW,OAAQH,SAAUE,EAAK,MAAO,CAAEC,UAAW,sBAAuBH,SAAUS,EAAM,MAAO,CAAEN,UAAW,yBAA0BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,6BAA8BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKusD,GAAY,CAAEtsD,UAAW,wBAA0BD,EAAK,OAAQ,CAAEC,UAAW,cAAeH,SAAU,WAAcE,EAAK,MAAO,CAAEC,UAAW,yBAA0BH,SAAUgqD,GAAgBpC,cAAiBnnD,EAAM,MAAO,CAAEN,UAAW,6BAA8BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKisD,GAAiB,CAAEhsD,UAAW,wBAA0BD,EAAK,OAAQ,CAAEC,UAAW,cAAeH,SAAU,cAAiBE,EAAK,MAAO,CAAEC,UAAW,yBAA0BH,SAAUgqD,GAAgBnC,cAAiBpnD,EAAM,MAAO,CAAEN,UAAW,6BAA8BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKwsD,GAAiB,CAAEvsD,UAAW,mCAAqCD,EAAK,OAAQ,CAAEC,UAAW,cAAeH,SAAU,YAAeE,EAAK,MAAO,CAAEC,UAAW,yBAA0BH,SAAUgqD,GAAgBlC,mBAAyBkE,KAAiB9rD,EAAK4pD,GAAY,CAAE3pD,UAAW,OAAQwM,OAAQ,OAAQ3M,SAAUgqD,GAAgBpC,SAAWoC,GAAgBnC,SAAW,EAAKpnD,EAAM,MAAO,CAAEN,UAAW,YAAaH,SAAU,CAACS,EAAM,IAAK,CAAET,SAAU,CAACgqD,GAAgBpC,SAAWoC,GAAgBnC,SAAU,QAASmC,GAAgBpC,SAAWoC,GAAgBnC,SAAW,EAAI,QAAU,MAAO,uBAAyB3nD,EAAK,IAAK,CAAEF,SAAUgqD,GAAgBlC,OAAS,GAClpD,GAAGkC,GAAgBlC,cAAckC,GAAgBlC,OAAS,EAAI,QAAU,wDAA6DkC,GAAgBlC,OAAS,EAAKrnD,EAAM,OAAQ,CAAET,SAAU,CAAC,OAAQgqD,GAAgBlC,OAAQ,oGAAyG5nD,EAAK,OAAQ,CAAEF,SAAU,8BAH5XS,EAAM,MAAO,CAAEN,UAAW,iDAAkDH,SAAU,CAACE,EAAK8pC,EAAS,CAAE7kC,KAAM,KAAMhF,UAAW,SAAWD,EAAK,MAAO,CAAEC,UAAW,sBAAuBH,SAAU,4BAN/LS,EAAM6wC,EAAY,CAAEnxC,UAAW,gDAAiDH,SAAU,CAAC6pD,KAAsB3pD,EAAKysD,GAAU,CAAEC,OAAQxC,GAAkBhkD,QAAS,8CAA+CymD,YAAa,eAAgB1sD,UAAW,cAAeioD,aAAcA,IAAiBpoD,KA6ChS,MAEtB,GAAImoD,EACA,OAAQ1nD,EAAM8wC,EAAc,CAAEvxC,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAS9I,QAAS8mD,GAAanqD,SAAU,WAAaE,EAAKgM,EAAQ,CAAE7I,QAAS,KAe3H4kD,GACAA,EAdW,CACXr6C,SAAS,EACTi9C,UAAW,GACXC,cAAe,CACX,CACIxqD,KAAM,iBACNK,KAAM+nD,GAAcpnD,IAAM,KAC1BqL,OAAQ,YAGhBo+C,aAAc,GACdC,YAAa,KAKjBb,MACDnqD,SAAU0oD,EAAe,OAAOA,EAAapoD,OAAS,oCAGzE,GAAqB,IAAjB6a,EAAMpO,SAAiBm7C,EACvB,OAAQhoD,EAAKqxC,EAAc,CAAEvxC,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,QAAS9I,QAAS8mD,GAAanqD,SAAU,aAG5G,IAAK8oD,IAAgBE,EAAgB,CAEjC,MAAM8D,EAAYtE,EAClB,OAAQ/nD,EAAM8wC,EAAc,CAAEvxC,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAS9I,QAAS8mD,GAAanqD,SAAU,WAAaE,EAAKgM,EAAQ,CAAE2E,UAAWi8C,EAAWzpD,QAASknD,GAAcvqD,SAAUgqD,GAAgBpC,SAAWoC,GAAgBnC,SAAW,EACjO,SACA,eACtB,CAEA,OAAIiB,EACQ5oD,EAAKqxC,EAAc,CAAEvxC,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,QAAS0E,UAAU,EAAM7Q,SAAU,mBAG9FS,EAAM8wC,EAAc,CAAEvxC,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAS9I,QAAS,KAEnEglD,EAAS,IACTE,EAAkB,IAClBE,GAAkB,GAClBE,EAAgB,MAChBE,EAAgB,IAChBE,GAAe,GACfE,GAAkB,GAClBE,EAAmB,GACnBc,GAAmB,CAAErC,SAAU,EAAGC,SAAU,EAAGC,OAAQ,KACxD9nD,SAAU,gBAAkBE,EAAKgM,EAAQ,CAAE7I,QAAS,KAC/C4kD,GAAoBjmB,GACpBimB,EAAiBjmB,GAErBmoB,MACDnqD,SAAU,cAE8L+sD,KAAwB3D,EACvP,CC3fO,SAAS4D,GAAyB7+C,GAErC,MAAM8+C,EAAkC,mBAAZ9+C,EAAyBA,EAAUA,EAAQ8+C,cACjE9zC,OAAEA,EAAQshC,QAASyS,EAAUp/B,MAAEA,GAAU1U,KACzCuR,EAAS26B,KACT16C,EAAQC,KACRs7C,wBAAEA,GAA4BD,KACpC,OAAOzvC,MAAO0E,EAAOxa,EAAMu+C,KAEvB,MAAMld,EAAS,CACXp0B,SAAS,EACTi9C,UAAW,GACXC,cAAe,GACfC,aAAc,GACdC,YAAa,IAEjB,IAAKkC,EAMD,OALAtiD,EAAM,CACF+B,OAAQ,QACRnL,MAAO,sBACPuC,SAAU,MAEPi+B,EAEX,IAAK7mB,GAA0B,IAAjBA,EAAMpO,OAMhB,OALAnC,EAAM,CACF+B,OAAQ,UACRnL,MAAO,oBACPuC,SAAU,MAEPi+B,EAEX,MAAMmrB,EAAgBhlD,MAAMgJ,KAAKgK,GAAOkB,OAAQsD,GAASA,EAAKxa,KAAO,GACrE,GAA6B,IAAzBgoD,EAAcpgD,OAOd,OANAnC,EAAM,CACF+B,OAAQ,QACRnL,MAAO,0BACP0M,YAAa,0CACbnK,SAAU,MAEPi+B,EAEX,MAAMorB,EAAmB,GACnBC,EAAoB,GACpBC,EAAkB,GACxBn6C,QAAQC,IAAI,cAAc+5C,EAAcpgD,8CAExC,MAAMu5C,QAA0BH,EAAwBgH,EAAe,KAAMjO,GAEvE0I,EAAWtB,EAAkBjqC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiB+B,QAAQ36C,OACjF86C,EAAWvB,EAAkBjqC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBztC,QAAQnL,OACjF+6C,EAASxB,EAAkBjqC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBwB,MAAMp6C,OAEnFnC,EAAM,CACFpJ,MAAO,iBACP0M,YAAa,GAAGi/C,EAAcpgD,mBAAmB66C,UAAiBC,gBAAuBC,YACzFn7C,OAAQ,OACR5I,SAAU,MAGd,IAAK,MAAM0mD,KAAYnE,EAAkBjqC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBwB,MAAQ/mC,EAAE6mC,YAC3FmG,EAAiB36C,KAAK,CAClBnR,GAAImpD,EAASxD,WACb3mD,KAAMmqD,EAASnqD,KACfK,OACAgM,OAAQ,UACR2d,SAAUmgC,EAASngC,WAI3B,MAAMggC,EAAiBhE,EAAkBjqC,OAAQ+D,IAAOA,EAAE8mC,SAAWvB,GAAiB+B,QAAUtnC,EAAE8mC,SAAWvB,GAAiBztC,SAAWkI,EAAET,MAC3I,GAAI2qC,EAAev9C,OAAS,EAAG,CAC3BoG,QAAQC,IAAI,cAAck3C,EAAev9C,iBAAiBu9C,EAAejuC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiB+B,QAAQ36C,kBAAkBu9C,EAAejuC,OAAQ+D,GAAMA,EAAE8mC,SAAWvB,GAAiBztC,QAAQnL,qBAElN,MAAMwgD,EAAY,GACZC,EAAiB,GACvB,IAAK,IAAIhrD,EAAI,EAAGA,EAAI8nD,EAAev9C,OAAQvK,GAAK+qD,EAC5CC,EAAe/6C,KAAK63C,EAAeprC,MAAM1c,EAAGA,EAAI+qD,IAGpD,IAAK,IAAIpC,EAAa,EAAGA,EAAaqC,EAAezgD,OAAQo+C,IAAc,CACvE,MAAM5E,EAAQiH,EAAerC,GACvBsC,EAAiBtC,EAAaoC,EACpCp6C,QAAQC,IAAI,oBAAoB+3C,EAAa,KAAKqC,EAAezgD,WAAWw5C,EAAMx5C,iBAE9Eu9C,EAAev9C,OAASwgD,GACxB3iD,EAAM,CACFpJ,MAAO,mBACP0M,YAAa,aAAau/C,KAAkBnD,EAAev9C,kBAC3DJ,OAAQ,OACR5I,SAAU,MAIlB,MAAM2pD,QAAuBlyC,QAAQC,IAAI8qC,EAAMxlD,IAAI0V,MAAOg0C,IACtD,IACI,GAAIA,EAASvD,SAAWvB,GAAiBztC,QAAUuyC,EAASxD,WAAY,CAEpE,MAAM0G,QAAqBx0C,EAAO2U,MAAM2C,QAAQ4G,OAAOozB,EAASxD,WAAY,CACxEtmD,KAAMA,QAAQsM,EACdb,QAASq+C,EAAS9qC,KAClB2K,SAAUmgC,EAASngC,SACnBhqB,KAAMmqD,EAASnqD,MAChB,CACCg3B,gBAAgB,EAChBC,cAAe,cAAe,IAAIrwB,MAAOmkD,gBAY7C,OATAgC,EAAkB56C,KAAK,CACnBnR,GAAImpD,EAASxD,WACb3mD,KAAMmqD,EAASnqD,KACfK,OACAgM,OAAQ,UACR2d,SAAUmgC,EAASngC,WAGvB0X,EAAO6oB,UAAUp4C,KAAKg4C,EAASxD,YACxB,CACHr5C,SAAS,EACTtM,GAAIqsD,EAAarsD,GACjBhB,KAAMmqD,EAASnqD,KACf4mD,OAAQ,SAEhB,CACK,CAGD,MAAM/4C,EAAU+wC,EAAe,CAAE11B,cAAe01B,QAAiBjyC,EAC3Dq+C,QAAqBx9B,EAAM2C,QAAQ86B,OAAO,CAC5C5qD,KAAMA,QAAQsM,EACdb,QAASq+C,EAAS9qC,KAClB2K,SAAUmgC,EAASngC,UAAYmgC,EAAS9qC,KAAK8mC,oBAAsBgE,EAASnqD,MAC7E6N,GAEHk/C,EAAkB56C,KAAK,CACnBnR,GAAIgqD,EAAahqD,GACjBhB,KAAMmqD,EAASnqD,KACfK,OACAgM,OAAQ,UACR2d,SAAUmgC,EAASngC,UAE3B,CACJ,CACA,MAAOlO,GACHjJ,QAAQiJ,MAAM,0BAA0BquC,EAASnqD,QAAS8b,GAE1DkxC,EAAgB76C,KAAK,CACjBnS,KAAMmqD,EAASnqD,KACf8b,MAAOA,EAAMhW,SAAW,gBACxBuG,OAAQ,SACR2d,SAAUmgC,EAASngC,SACnB3pB,SAEJiK,EAAM,CACF+B,OAAQ,QACRnL,MAAO,yBAAyBipD,EAASnqD,OACzC4N,YAAakO,EAAMhW,QACnBrC,SAAU,KAElB,KAGE6pD,EAAUP,EAAkBhxC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAC5CkhD,EAAUR,EAAkBhxC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAC5CmhD,EAAWT,EAAkBhxC,OAAQ+D,GAAmB,WAAbA,EAAEzT,QACnDwG,QAAQC,IAAI,SAAS+3C,EAAa,aAAc,CAC5CyC,UACAC,UACAC,WACA/iD,MAAO2iD,EAAe3gD,QAE9B,CACJ,CACA,MAAMghD,EAAgBV,EAAkBhxC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAAsBI,OACxE6+C,EAAeyB,EAAkBhxC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAAsBI,OACvE++C,EAAcuB,EAAkBhxC,OAAQ+D,GAAmB,WAAbA,EAAEzT,QAAqBI,OACrE8+C,EAAewB,EAAkBhxC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAAsBI,OAEzEkgD,IAEA95C,QAAQC,IAAI,mBAAoB,CAC5B46C,eAAgBhsB,EAAO6oB,UAAU99C,OACjC+9C,cAAeiD,EACfE,aAAcrC,EACdb,aAAcc,EACdb,YAAac,UAGXmB,EAAajrB,EAAO6oB,YAG9B,IAAIkB,EAAgB,GAyBpB,OAxBIgC,EAAgB,IAChBhC,GAAiB,GAAGgC,SAAuC,IAAlBA,EAAsB,IAAM,eAErEnC,EAAe,IACfG,GAAiBA,EAAgB,KAAO,GACxCA,GAAiB,GAAGH,SAAqC,IAAjBA,EAAqB,IAAM,cAEnEC,EAAe,IACfE,GAAiBA,EAAgB,KAAO,GACxCA,GAAiB,GAAGF,SAAqC,IAAjBA,EAAqB,IAAM,gCAEnEC,EAAc,IACdC,GAAiBA,EAAgB,KAAO,GACxCA,GAAiB,GAAGD,SAAmC,IAAhBA,EAAoB,IAAM,aAEjEC,GACAnhD,EAAM,CACF+B,OAAQm/C,EAAc,EAAI,UAAY,UACtCtqD,MAAOuqD,EACPhoD,SAAU,MAIlB4mB,EAAOA,SACAqX,EAEf,EF7NA,SAAW2jB,GACPA,EAAyB,OAAI,SAC7BA,EAAuB,KAAI,OAC3BA,EAAyB,OAAI,QAChC,CAJD,CAIGA,KAAqBA,GAAmB,CAAA,IGD3C,MAAMuI,GAAgB,CAClB,CAAE5tD,KAAM,KAAMiiD,MAAO,KAAM5hD,KAAM,qBACjC,CAAEL,KAAM,OAAQiiD,MAAO,IAAK5hD,KAAM,cAClC,CAAEL,KAAM,OAAQiiD,MAAO,YAAa5hD,KAAM,UAC1C,CAAEL,KAAM,SAAUiiD,MAAO,SAAU5hD,KAAM,UACzC,CAAEL,KAAM,aAAciiD,MAAO,aAAc5hD,KAAM,SAE9C,SAASwtD,IAAc9/B,WAAEA,GAAa,EAAK+/B,SAAEA,EAAQlP,aAAEA,KAAiBmP,IAC3E,OAAID,EACQluD,EAAKouD,GAAyB,IAAKD,EAAQD,SAAUA,EAAU//B,WAAYA,EAAY6wB,aAAcA,IAGtGh/C,EAAKquD,GAAmB,IAAKF,EAAQhgC,WAAYA,GAEhE,CACA,SAASigC,IAAwBjgC,WAAEA,EAAU+/B,SAAEA,EAAQlP,aAAEA,EAAYsP,cAAEA,GAAgB,KAAUH,IAC7F,MAAO3/C,EAAWspB,GAAc50B,GAAS,IAClC+X,EAAOktC,GAAYjlD,EAAS,KAC5BqrD,EAAYC,GAAiBtrD,GAAS,IACtCklD,EAAgBC,GAAqBnlD,EAAS,OAC9CurD,EAAmBC,GAAwBxrD,GAAS,GACrDunB,EAAS26B,KACT16C,EAAQC,KACRs7C,wBAAEA,GAA4BD,KAE9B2I,EAAiBp4C,MAAOq4C,EAAcC,KACxC57C,QAAQC,IAAI,gCAAiC07C,EAAa/hD,OAAQgiD,GAClE/2B,GAAW,GACX,IAEI,GAAIknB,EAAc,CAEd,MAAMnK,QAAkBoR,EAAwB2I,EAAc,KAAM5P,GACpEqJ,EAAkBxT,GAElB,MAAM6S,EAAW7S,EAAU14B,OAAQ+D,GAAmB,WAAbA,EAAE8mC,QAAqBn6C,OAC1D86C,EAAW9S,EAAU14B,OAAQ+D,GAAmB,WAAbA,EAAE8mC,QAAqBn6C,OAC1D+6C,EAAS/S,EAAU14B,OAAQ+D,GAAmB,SAAbA,EAAE8mC,QAAmBn6C,OAC5DnC,EAAM,CACFpJ,MAAO,yBACP0M,YAAa,GAAG4gD,EAAa/hD,mBAAmB66C,UAAiBC,gBAAuBC,YACxFn7C,OAAQ,OACR5I,SAAU,KAElB,MAGIwkD,EAAkB,KAE1B,CACA,MAAOnsC,GACHjJ,QAAQiJ,MAAM,0BAA2BA,GACzCxR,EAAM,CACFpJ,MAAO,yBACP0M,YAAa,kDACbvB,OAAQ,QACR5I,SAAU,MAGdwkD,EAAkB,KACtB,CACR,QAIY,GAHAvwB,GAAW,GACXqwB,EAASyG,GACTJ,GAAc,GACVF,EAAe,CAEfr7C,QAAQC,IAAI,oDAAqD,CAC7D47C,YAAaF,EAAa/hD,OAC1BkiD,qBAAsB3G,GAAgBv7C,SAG1C,MAAMmiD,EAAgBd,EAASU,EAAc,KAAM5P,GAE/CgQ,GAA0C,iBAAlBA,IACxBA,EAAc5G,eAAiBA,EAEvC,MAGIn1C,QAAQC,IAAI,oCAAqC,CAAE47C,YAAaF,EAAa/hD,SAC7E6hD,GAAqB,EAE7B,GAGEO,EAAcj5B,IAChB,MAAMi3B,EAAgB,IAAIhyC,GAE1BktC,EAAS,IACTE,EAAkB,MAClBqG,GAAqB,GAEjBzB,EAAcpgD,OAAS,QAAgBE,IAAXipB,IAC5B8B,GAAW,GACX7kB,QAAQC,IAAI,uBAAwB,CAChC8iB,SACAk5B,WAAYjC,EAAcpgD,OAC1BsiD,uBAAwB/G,EACxBpJ,iBAEJkP,EAASjB,EAAej3B,EAAQgpB,GAAcpV,QAAQ,KAClD9R,GAAW,GACXrN,EAAOA,aAKb2kC,EAAkBllD,IACpBA,EAAEoH,iBACFpH,EAAEC,kBACFqkD,GAAc,IAWlB,OAAQjuD,EAAM,MAAO,CAAEN,UAAW,yBAA0BovD,WAAYD,EAAgBE,YAAaF,EAAgBG,YAT5FrlD,IACrBA,EAAEoH,iBACFpH,EAAEC,kBAEED,EAAEslD,cAAcC,SAASvlD,EAAEwlD,gBAG/BlB,GAAc,IAEiI9B,OAASxiD,IAKpJ,GAJAA,EAAEoH,iBACFpH,EAAEC,kBACFqkD,GAAc,GAEVtkD,EAAEylD,aAAa1kD,MAAO,CACtB,MAAMgQ,EAAQ,GACd,IAAK,IAAI3Y,EAAI,EAAGA,EAAI4H,EAAEylD,aAAa1kD,MAAM4B,OAAQvK,IAAK,CAClD,MAAMwK,EAAO5C,EAAEylD,aAAa1kD,MAAM3I,GAClC,GAAkB,SAAdwK,EAAKgI,KAAiB,CACtB,MAAM2K,EAAO3S,EAAK8iD,YACdnwC,GACAxE,EAAM1I,KAAKkN,EACnB,CACJ,CACA,GAAIxE,EAAMpO,OAAS,EAAG,CAClB,MAAMgiD,EAAW,CACblsC,MAAO1H,EAAMpO,OACb3G,QAAS,uBAAuB+U,EAAMpO,cAA+B,IAAjBoO,EAAMpO,OAAe,GAAK,UAElF8hD,EAAe1zC,EAAO4zC,EAC1B,CACJ,GACD/uD,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAWmC,EAAK,8FAA+FoM,EAAY,QAAU,UAAW1O,SAAUE,EAAK8pC,EAAS,CAAE7kC,KAAM,SAAYjF,EAAKquD,GAAmB,IAAKF,EAAQhgC,WAAYA,IAAenuB,EAAK,MAAO,CAAEC,UAAWmC,EAAK,uCAAwCmsD,EAAa,OAAS,SAAUzuD,SAAUE,EAAK,MAAO,CAAEC,UAAW,yBAA0BH,SAAUE,EAAKysD,GAAU,CAAEC,OAAQiC,EAAgBzoD,QAAS,uCAAwCjG,UAAWmC,EAAK,uEAAwEmsD,EAAa,OAAS,UAAW5B,YAAa,0BAA2BzE,cAAc,QAAeloD,EAAK6nD,GAAqB,CAAEllD,OAAQ8rD,GAAqBxzC,EAAMpO,OAAS,EAAG+e,QAAS,KAEryBu8B,EAAS,IACTE,EAAkB,MAClBqG,GAAqB,GACrBO,OAAWliD,IACZkO,MAAOA,EAAO+jC,aAAcA,EAAckH,eAAgB,KAAM5kD,MAAO,eAAgBymD,iBAAmBjmB,IAEzG,GAAIA,EAAQ,CAWR,GATIA,EAAOgpB,aAAehpB,EAAOgpB,YAAYj+C,OAAS,GAClDnC,EAAM,CACFpJ,MAAO,gBACP0M,YAAa,GAAG8zB,EAAOgpB,YAAYj+C,kCACnCJ,OAAQ,UACR5I,SAAU,MAIdi+B,EAAOp0B,QAAS,CAChB,MAAM68B,EAAUzI,EAAO8oB,cAAczuC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAAsBI,OACrEgjD,EAAU/tB,EAAO8oB,cAAczuC,OAAQ+D,GAAmB,YAAbA,EAAEzT,QAAsBI,OACrEijD,EAAUhuB,EAAO+oB,aAAah+C,QAChC09B,EAAU,GAAKslB,EAAU,IACzBnlD,EAAM,CACFpJ,MAAO,kBACP0M,YAAa,GAAGu8B,EAAU,EAAI,GAAGA,YAAoB,KAAKA,EAAU,GAAKslB,EAAU,EAAI,KAAO,KAAKA,EAAU,EAAI,GAAGA,YAAoB,KAAKC,EAAU,EAAI,KAAKA,YAAoB,KACpLrjD,OAAQ,UACR5I,SAAU,KAGtB,CAEA4mB,EAAOA,QACX,CAEA09B,EAAS,IACTE,EAAkB,MAClBqG,GAAqB,GAEjB5sB,GAAUA,EAAOp0B,SAAWo0B,EAAO6oB,UAAU99C,OAAS,EAEtDoiD,EAAW,MAIXA,OAAWliD,QAGnC,CACA,SAASshD,IAAkB99B,QAAEA,EAAO2xB,OAAEA,EAAS8L,GAAax/C,UAAEA,EAAS6mC,WAAEA,EAAUD,kBAAEA,EAAiBE,cAAEA,EAAaC,eAAEA,EAAcpnB,WAAEA,IACnI,MAAMgnB,EAAYyK,KACZmQ,EAAqB,CAACz7B,EAAQqhB,KAChC,GAAIR,EAAW,CACX,MAAM6a,EAAUra,EAAGsa,YAAY5+C,SAE/B,GADgBskC,EAAG3rC,OAAOqG,SAMtB,GADA8kC,EAAUzkC,IAAI4jB,GACV07B,EAAS,CACT,MAAMpnD,EAAQ2nB,EAAQle,UAAWmtC,GAAQA,EAAIp+C,KAAOkzB,EAAOlzB,IACrD2E,EA0C1B,SAA8BwqB,EAAS3nB,EAAOusC,GAC1C,IAAK,IAAI7yC,EAAIsG,EAAQ,EAAGtG,GAAK,EAAGA,IAC5B,GAAI6yC,EAAU1b,WAAWlJ,EAAQjuB,GAAGlB,IAChC,OAAOkB,EAGf,OAAO,CACX,CAjDiC4tD,CAAqB3/B,EAAS3nB,EAAOusC,GAClD,GAAIpvC,GAAO,GAAMA,EAAO6C,EAAQ,EAAG,CAC/B,MAAMunD,EAAW,GACjB,IAAK,IAAI7tD,EAAIyD,EAAO,EAAGzD,EAAIsG,EAAOtG,IAC9B6tD,EAAS59C,KAAKge,EAAQjuB,IAE1B6yC,EAAUoK,OAAO4Q,EACrB,KACK,CACD,MAAM9oD,EAyC9B,SAA0BkpB,EAAS3nB,EAAOusC,GACtC,MAAMtoC,EAAS0jB,EAAQ1jB,OACvB,IAAK,IAAIvK,EAAIsG,EAAQ,EAAGtG,EAAIuK,EAAQvK,IAChC,GAAI6yC,EAAU1b,WAAWlJ,EAAQjuB,GAAGlB,IAChC,OAAOkB,EAGf,OAAO,CACX,CAjDqC8tD,CAAiB7/B,EAAS3nB,EAAOusC,GAC9C,GAAI9tC,GAAO,GAAMA,EAAOuB,EAAQ,EAAG,CAC/B,MAAMunD,EAAW,GACjB,IAAK,IAAI7tD,EAAIsG,EAAQ,EAAGtG,EAAI+E,EAAM/E,IAC9B6tD,EAAS59C,KAAKge,EAAQjuB,IAE1B6yC,EAAUoK,OAAO4Q,EACrB,CACJ,CACJ,OAxBAhb,EAAUmK,OAAOhrB,EAAOlzB,IA0B5Bg0C,GAAqBA,EAAkBD,EAC3C,GAEE4N,EAAapN,IACf,GAAIR,EAAW,CACKQ,EAAG3rC,OAAOqG,QAMtB8kC,EAAUoK,OAAOhvB,GAHjB4kB,EAAUsK,WAKlB,GAEEqD,EAAUhhD,EAAQ,KAECogD,EAAOr1C,OAAS,EAAIq1C,EAAS8L,IAC9BntD,IAAKmiD,GAAQ,IAAIf,GAAoBe,EAAK1N,IAC/D,CAAC4M,EAAQ5M,IACZ,OAAqBt1C,EAAdmuB,EAAmBg1B,GAAkQN,GAAhP,CAAEtyB,QAASA,EAAS/hB,UAAWA,EAAWs0C,QAASA,EAASzN,WAAYA,EAAYC,cAAeA,EAAeC,eAAgBA,EAAgBJ,UAAWA,EAAW4N,UAAWA,EAAW3N,kBAAmB2a,GACjQ,CC/PO,SAASM,IAAuBvwD,SAAEA,EAAQujD,MAAEA,EAAKO,OAAEA,EAAM5tB,OAAEA,EAAM+kB,OAAEA,EAAM36C,KAAEA,EAAI4+C,aAAEA,IACpF,MAAMpxB,MAAEA,GAAU1U,KACZuR,EAAS3oB,EAAQ,KACnB,IAAIyhD,EACAxI,EACAwI,EAAaxI,GAGbwI,EAAa,CACT,CACInjD,KAAM,SACNiiD,MAAO,UAEX,CACIjiD,KAAM,WACNiiD,MAAO,aAGVrsB,GACDutB,EAAW+M,QAAQ,CACflwD,KAAM,OACNiiD,MAAO,UAInB,MAAM53B,EAAS,IAAI24B,GAAex1B,EAAOy1B,GAAOG,WAAWD,GAK3D,OAJA94B,EAAOu0B,aAAeA,EACtBv0B,EAAO+xB,MAAM/7C,KAAOu1B,EACpBvL,EAAO+xB,MAAMoH,OAASA,EACtBn5B,EAAO+xB,MAAMp8C,KAAOA,EACbqqB,GACR,CAACuL,EAAQqtB,EAAOrE,IACnB,OAAQh/C,EAAKuwD,GAAc1mD,SAAU,CAAEnJ,MAAO+pB,EAAQ3qB,SAAUA,GACpE,CC3BA,MAAMoiD,GAAS,CACX,CAAE9hD,KAAQ,OAAQiiD,MAAS,mBAAoB5hD,KAAQ,SAAU6hD,SAAY,QAC7E,CAAEliD,KAAQ,OAAQiiD,MAAS,YAAa5hD,KAAQ,UAChD,CAAEL,KAAQ,SAAUiiD,MAAS,SAAU5hD,KAAQ,UAC/C,CAAEL,KAAQ,aAAciiD,MAAS,aAAc5hD,KAAQ,SAGpD,SAAS+vD,IAAelgD,SAAEA,IAI7B,OAAQtQ,EAAKqwD,GAAwB,CAAEvwD,SAAUE,EAAKywD,GAAoB,CAAEpb,WAHxD2W,IAChB17C,EAAS07C,QAAYj/C,OAG7B,CACA,SAAS0jD,IAAmBpb,WAAEA,IAC1B,MAAOqb,EAASC,GAAcztD,GAAS,IAChCirB,EAAYC,GAAiBlrB,EAAuD,SAA9CmrB,aAAaC,QATlC,8CAUlB7D,OAAEA,EAAMjc,UAAEA,EAAS0N,MAAEA,EAAKqU,QAAEA,EAAOkzB,QAAEA,GAAY8B,KACjDqL,EAAchhD,EAAO,MAC3BihD,GAAwBD,EAAa,KAC7BF,GAAWjN,IAAYj1C,IACvBmiD,GAAW,GACXlmC,EAAOs6B,UAAS,GACXnb,QAAQ,KACT+mB,GAAW,OAGpB,CAAEx2B,UAAW,GAAK22B,KAAM,CAACJ,EAASjN,EAASj1C,KAC9C5I,EAAU,KACN6kB,EAAOA,SACFmf,QAAQ,KACT+mB,GAAW,MAEhB,IACH,MAAM5V,EAASsK,KACT0L,EAAc3L,KAKpB,OAAIlpC,EACOlc,EAAKyoC,EAAU,CAAEnnC,MAAO,gBAAiBxB,SAAUoc,EAAMhW,UAE5D3F,EAAM,MAAO,CAAEN,UAAW,oCAAqCH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,kDAAmDH,SAAU,CAACE,EAAK+9C,GAAoB,CAAEhD,OAAQA,EAAQtwB,OAAQsmC,IAAgBxwD,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAP1T,KAClBwtD,GAAW,GACXlmC,EAAOA,SAASje,KAAK,IAAMmkD,GAAW,KAK8T/mD,IAAK,UAAW9J,SAAUE,EAAKg9C,GAAW,CAAE/3C,KAAM,OAAUjF,EAAKiuB,GAA0B,CAAEC,SAAUE,UAA0B7tB,EAAM,MAAO,CAAEN,UAAW,oCAAqCH,SAAU,CAACE,EAAKiuD,GAAe,CAAE19B,QAASA,GAAW,GAAI/hB,WAAW,EAAO0zC,OAAQA,GAAQ7M,WAAYA,EAAYlnB,WAAYA,IAAenuB,EAAK,MAAO,CAAEqB,IAAKuvD,EAAa3wD,UAAW,eAAiBD,EAAK,MAAO,CAAEC,UAAWmC,EAAK,sGAAuGoM,EAAY,QAAU,UAAW1O,SAAUE,EAAK8pC,EAAS,CAAE7kC,KAAM,cAC57B,CClDO,SAAS+rD,IAAoBruD,OAAEA,EAAMipB,QAAEA,IAC1C,OAAQrrB,EAAM2wC,EAAQ,CAAEtlB,QAAS,IAAMA,IAAWjpB,SAAUA,EAAQ1C,UAAW,eAAgBH,SAAU,CAACE,EAAKmxC,EAAa,CAAErxC,SAAU,mBAAqBE,EAAKoxC,EAAY,CAAEnxC,UAAW,iDAAkDH,SAAU6C,GAAU3C,EAAKwwD,GAAgB,CAAElgD,SAAUsb,QACtS,CCEA,MAAMqlC,GAAc,oBACb,SAASC,IAAc58B,OAAEA,IAC5B,MAAMrb,OAAEA,GAAWC,MACbi4C,IAAEA,EAAGC,GAAEA,EAAE3uD,KAAEA,GAAS4uD,MACnBC,EAAaC,GAAYruD,EAAyB,MAAhBoxB,EAAO5zB,MAAgB2Y,OAAOib,EAAO5zB,OAAS,KAChFa,EAAKiwD,GAAUtuD,OAAS6J,GAMzB0kD,EAAa,KACfF,EAAS,IACTj9B,EAAO5zB,MAAQ,GACf8wD,OAAOzkD,IAyBX,OAdAnH,EAAU,KACN,IAAK0rD,GAAe/vD,EAChB,OAEJ,MAAMihC,EAAQ8uB,EAAY9uB,MAAMyuB,IAC3BzuB,GAGLvpB,EAAOsX,QAAQ7b,IAAI8tB,EAAM,IAAIh2B,KAAMjL,IAC/BiwD,EAAOjwD,KACRqV,MAAM,KACL66C,OAEL,CAACH,IACI/wD,EAAM,MAAO,CAAET,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,WAAYH,SAAU,CAACE,EAAK,QAAS,CAAEU,MAAO4wD,EAAahhD,SAjCpGohD,IACf,MAAMhxD,EAAQgxD,EAAM1nD,OAAOtJ,MAC3B6wD,EAAS7wD,GACT4zB,EAAO5zB,MAAQA,GA8ByHT,UAAWmC,EAAKuvD,GAAOC,MAAO,kBAAoBrwD,GAC1KvB,EAAK,MAAO,CAAEC,UAAW,gEAAiEH,SAAUE,EAAKgM,EAAQ,CAAE7I,QAASsuD,EAAYxlD,QAAS,WAAYhM,UAAW,8DAA+DH,SAAUE,EAAK8J,GAAG,CAAE7J,UAAW,eAAmBD,EAAK,MAAO,CAAEC,UAAW,8DAA+DH,SAAUE,EAAKgM,EAAQ,CAAE7I,QAASiuD,EAAInlD,QAAS,WAAYhM,UAAW,2CAA4CH,SAAUE,EAAK6xD,GAAgB,CAAE5xD,UAAW,eAAmBD,EAAKgxD,GAAqB,CAAEtwD,MAAO4wD,EAAa3uD,OAAQF,EAAMmpB,QAxBlmBlrB,IACd,GAAIA,EAAO,CACP,MAAMo1B,EAAM,SAAWp1B,EAAMU,GAC7BmwD,EAASz7B,GACT07B,EAAO9wD,QAASqM,GAChBunB,EAAO5zB,MAAQo1B,CACnB,CACAq7B,UAiB0oB5vD,GACloBvB,EAAK,MAAO,CAAEC,UAAW,yDAA0DH,SAAUyB,EAAIuB,YAAYxB,OAASC,EAAInB,SAC1I,CCjDO,SAAS0xD,GAAoB74C,EAAQvO,EAAOorB,EAAK11B,GAkBpD,MAjBmB,KACX01B,GACA7c,EAAOgC,MACF82C,0BAA0B,CAAEtyC,KAAMqW,EAAK11B,SACvCoM,KAAMihB,IACPpkB,OAAOC,KAAKmkB,EAAEpX,IAAK,YAElBO,MAAOC,IACRnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,6BACP0M,YAAa6I,EAAI3Q,QACjBrC,SAAU,QAM9B,CCXO,SAASmuD,IAAqB9wB,SAAEA,EAAQv+B,OAAEA,EAAMipB,QAAEA,IACrD,MAAM4I,EAAWC,MACXxb,OAAEA,EAAM2U,MAAEA,GAAU1U,MACnBob,EAAQ29B,GAAa/uD,EAAS,OAC9BsL,EAAWkmB,GAAgBxxB,GAAS,IACpCgvD,EAAaC,GAAkBjvD,GAAS,IACxCkD,EAAMgsD,GAAWlvD,KACjB8uC,EAAUC,GAAe/uC,KACzBmvD,EAAYC,GAAiBpvD,EAAS,WACvCwH,EAAQC,IACd/E,EAAU,KACFs7B,GAAYv+B,GACZ+xB,GAAa,GACb9G,EAAM2C,QACDpH,SAAS+X,EAAU,eACnB10B,KAAMs1B,IACPmwB,EAAUnwB,GAENA,EAAO17B,KACPgsD,EAAQtwB,EAAO17B,MAIfmsD,EAAezwB,EAAO1gC,IAG1B,MAAM8K,EAAU41B,EAAO51B,QACPA,GACZA,EAAQq4B,QACRr4B,EAAQzL,MACRyL,EAAQzL,KAAKib,WAAW,WAExB82C,EAAa1wB,KAGhBlrB,MAAOsF,IACRjJ,QAAQiJ,MAAM,wBAAyBA,GACvCxR,EAAM,CACFpJ,MAAO,QACP0M,YAAa,0BACbvB,OAAQ,QACR5I,SAAU,QAGb+lC,QAAQ,KACTlV,GAAa,OAKjBu9B,EAAU,MACVG,OAAQrlD,GACRklC,OAAYllC,KAEjB,CAACm0B,EAAUv+B,EAAQirB,EAAM2C,UAC5B,MAAMgiC,EAAiBh8C,MAAOnV,IAC1B+wD,GAAe,GACf,IACI,MAAMrwB,QAAelU,EAAM2C,QAAQwc,cAAc3rC,GACjDgxD,EAAQtwB,EAAO17B,KACnB,CACA,MAAO8V,GACHjJ,QAAQiJ,MAAM,sBAAuBA,EACzC,CACR,QACYi2C,GAAe,EACnB,GAEEK,EAAej8C,MAAOipC,IACxB,IAO6B,iBALDvmC,EAAOsX,QAAQC,aAAagvB,EAAIp+C,GAAI,CACxD2K,OAAQ4jB,GAAqBC,KAC7BC,qBAAqB,KAGXpjB,QACVwG,QAAQC,IAAI,mBAGhB,MAAMu/C,QAA0Bx5C,EAAOgC,MAAMuS,eAAegyB,EAAItzC,QAAQq4B,QACxE0N,EAAYwgB,EAAkBp8C,IAClC,CACA,MAAO6F,GACHjJ,QAAQiJ,MAAM,uBAAwBA,EAC1C,GAEEw2C,EAAyB,KACvBp+B,IACAE,EAAS,kBAAkBF,EAAOlzB,MAClCwqB,MAGF+mC,EAAgBvsD,IACjBA,EAAKsV,WAAW,MAAQtV,EAAKkT,SAAS,QAAUlT,EAAKkT,SAAS,QAC7DwC,EAAUwY,GAAQpoB,SAASzL,MAAQ6zB,EAAOpoB,QAAQzL,KAAKib,WAAW,UAClE2T,EAAkC,oBAA1BiF,GAAQpoB,SAASzL,KAC/B,OAAKkC,EAEGpC,EAAM,MAAO,CAAEN,UAAW,6HAA4H0C,EAAS,gBAAkB,oBAAsB7C,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,2JAA4JH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,oBAAqBH,SAAU,CAACE,EAAK4yD,GAAU,CAAE3yD,UAAW,iCAAmCD,EAAK,KAAM,CAAEC,UAAW,kEAAmEH,SAAU0O,EACvlB,sBACA8lB,GAAQl0B,MAAQ,wBAA2BG,EAAM,MAAO,CAAEN,UAAW,8BAA+BH,SAAU,CAACS,EAAMyL,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAASuvD,EAAwBzyD,UAAW,gEAAiEH,SAAU,CAACE,EAAK+pC,GAAW,CAAE9pC,UAAW,YAAcD,EAAK,OAAQ,CAAEF,SAAU,iBAAoBE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAASyoB,EAAS3rB,UAAW,kGAAmGH,SAAUE,EAAK8J,GAAG,CAAE7J,UAAW,oBAAyBuO,EAAaxO,EAAK,MAAO,CAAEC,UAAW,0CAA2CH,SAAUS,EAAM,MAAO,CAAEN,UAAW,cAAeH,SAAU,CAACE,EAAK8pC,EAAS,CAAE7kC,KAAM,KAAMhF,UAAW,8CAAgDD,EAAK,IAAK,CAAEC,UAAW,mCAAoCH,SAAU,6BAAoCS,EAAM,MAAO,CAAEN,UAAW,8BAA+BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,WAAYH,SAAUS,EAAM,MAAO,CAAEN,UAAW,YAAaH,SAAU,CAACE,EAAK,SAAU,CAAEC,UAAW,qCAAmD,YAAfoyD,EACloC,yDACA,oGAAsGlvD,QAAS,IAAMmvD,EAAc,WAAYxyD,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK2uB,GAAY,CAAE1uB,UAAW,YAAcD,EAAK,OAAQ,CAAEF,SAAU,iBAAqBE,EAAK,SAAU,CAAEC,UAAW,qCAAmD,eAAfoyD,EACnX,yDACA,oGAAsGlvD,QAAS,IAAMmvD,EAAc,cAAexyD,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKiY,GAAM,CAAEhY,UAAW,YAAcD,EAAK,OAAQ,CAAEF,SAAU,yBAA+BS,EAAM,MAAO,CAAEN,UAAW,2BAA4BH,SAAU,CAAgB,YAAfuyD,GAA6B9xD,EAAM,MAAO,CAAEN,UAAW,SAAUH,SAAU,CAACoyD,EAAelyD,EAAK,MAAO,CAAEC,UAAW,wCAAyCH,SAAUE,EAAK8pC,EAAS,CAAE7kC,KAAM,KAAMhF,UAAW,2CAAgDmG,EAAQpG,EAAK,MAAO,CAAEC,UAAW,8FAA+FH,SAAU6yD,EAAiB3yD,EAAK,MAAO,CAAEC,UAAW,mKAAoKH,SAAUE,EAAKma,GAAkB,CAAEra,SAAUsG,MAAepG,EAAK,MAAO,CAAEC,UAAW,mDAAoDH,SAAUsG,MAAe,KAAM0V,GAAY9b,EAAK,MAAO,CAAEC,UAAW,OAAQH,SAAsBE,EAAK,MAAjBgyC,EAAwB,CAAE/xC,UAAW,uFAAwFH,SAAUE,EAAK,MAAO,CAAEoJ,IAAK4oC,EAAUpoC,IAAK0qB,GAAQl0B,KAAMH,UAAW,yCAA4D,CAAEA,UAAW,wCAAyCH,SAAUE,EAAK8pC,EAAS,CAAE7kC,KAAM,KAAMhF,UAAW,6CAAmDovB,GAAU9uB,EAAM,MAAO,CAAEN,UAAW,wIAAyIH,SAAU,CAACE,EAAK4yD,GAAU,CAAE3yD,UAAW,wDAA0DM,EAAM,IAAK,CAAEN,UAAW,oDAAqDH,SAAU,CAAC,uDAAwD,OAASE,EAAKgM,EAAQ,CAAE7I,QAASuvD,EAAwBzyD,UAAW,+CAAgDH,SAAU,gCAAoCgc,IAAY1V,IAASipB,IAAU6iC,GAAgB3xD,EAAM,MAAO,CAAEN,UAAW,wIAAyIH,SAAU,CAACE,EAAK4yD,GAAU,CAAE3yD,UAAW,oDAAsDD,EAAK,IAAK,CAAEC,UAAW,+CAAgDH,SAAU,uDAA4E,eAAfuyD,GAA+B/9B,GAAW/zB,EAAM,MAAO,CAAEN,UAAW,SAAUH,SAAU,CAACw0B,EAAOxxB,WAAc9C,EAAK,MAAO,CAAEC,UAAW,8FAA+FH,SAAUE,EAAKyrC,GAAa,CAAE/qC,MAAO4zB,EAAOxxB,eAAqBvC,EAAM,MAAO,CAAEN,UAAW,wIAAyIH,SAAU,CAACE,EAAKiY,GAAM,CAAEhY,UAAW,oDAAsDD,EAAK,IAAK,CAAEC,UAAW,+CAAgDH,SAAU,kDAAsDS,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAACE,EAAK,KAAM,CAAEC,UAAW,8DAA+DH,SAAU,yBAA2BE,EAAK,MAAO,CAAEC,UAAW,8FAA+FH,SAAUS,EAAM,MAAO,CAAEN,UAAW,2CAA4CH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,mCAAoCH,SAAU,OAASE,EAAK,MAAO,CAAEC,UAAW,iCAAkCH,SAAUw0B,EAAOlzB,KAAOpB,EAAK,MAAO,CAAEC,UAAW,mCAAoCH,SAAU,SAAWE,EAAK,MAAO,CAAEC,UAAW,iCAAkCH,SAAUw0B,EAAO7zB,MAAML,MAAQ,YAAcJ,EAAK,MAAO,CAAEC,UAAW,mCAAoCH,SAAU,iBAAmBE,EAAK,MAAO,CAAEC,UAAW,iCAAkCH,SAAUw0B,EAAOpoB,SAASzL,MAAQ,QAAUT,EAAK,MAAO,CAAEC,UAAW,gBAAiBH,SAAU,SAAWE,EAAK,MAAO,CAAEC,UAAW,cAAeH,SAAUw0B,EAAOpoB,SAAW,SAAUooB,EAAOpoB,QACrwI2mD,GAAev+B,EAAOpoB,QAAQjH,MAC9B,YAAcjF,EAAK,MAAO,CAAEC,UAAW,gBAAiBH,SAAU,YAAcE,EAAK,MAAO,CAAEC,UAAW,cAAeH,SAAUw0B,EAAOw+B,WACzI,IAAI9rD,KAAKstB,EAAOw+B,YAAYC,iBAC5B,QAAU/yD,EAAK,MAAO,CAAEC,UAAW,gBAAiBH,SAAU,YAAcE,EAAK,MAAO,CAAEC,UAAW,cAAeH,SAAUw0B,EAAO0+B,WACrI,IAAIhsD,KAAKstB,EAAO0+B,YAAYD,iBAC5B,yBAAmCxyD,EAAM,MAAO,CAAEN,UAAW,kGAAmGH,SAAU,CAACE,EAAK,MAAO,CAAEF,SAAUw0B,GAAQpoB,SAASq4B,QAAWhkC,EAAMyL,EAAQ,CAAE7I,QAAS,KACtRmxB,GAAQpoB,SAASq4B,QACjBtrB,EAAOgC,MACFuS,eAAe8G,EAAOpoB,QAAQq4B,QAC9B/3B,KAAMs1B,IACPz4B,OAAOC,KAAKw4B,EAAOzrB,IAAK,YAEvBO,MAAOsF,IACRjJ,QAAQiJ,MAAM,8BAA+BA,GAC7CxR,EAAM,CACFpJ,MAAO,QACP0M,YAAa,0BACbvB,OAAQ,QACR5I,SAAU,SAIvBoI,QAAS,UAAWhM,UAAW,uDAAwDH,SAAU,CAACE,EAAKsnC,GAAU,CAAErnC,UAAW,iBAAmB,gBAAoBM,EAAMyL,EAAQ,CAAE7I,QAASuvD,EAAwBzyD,UAAW,+CAAgDH,SAAU,CAAC,qBAAsBE,EAAK6L,GAAc,CAAE5L,UAAW,0BA9BlW,IA+Bf,CACA,SAAS4yD,GAAepS,GACpB,GAAc,IAAVA,EACA,MAAO,UACX,MAEMn+C,EAAIgF,KAAKkS,MAAMlS,KAAK4L,IAAIutC,GAASn5C,KAAK4L,IAFlC,OAGV,OAAO+/C,YAAYxS,EAAQn5C,KAAKs5C,IAHtB,KAG6Bt+C,IAAIkJ,QAAQ,IAAM,IAF3C,CAAC,QAAS,KAAM,KAAM,KAAM,MAE2BlJ,EACzE,CC3IA,MAAM4wD,GAAW5wC,OAAOngB,OAAOgxD,IACzBC,GAAiB9wC,OAAOngB,OAAOkxD,IAC9B,SAASC,IAAmBhjD,SAAEA,EAAQ9B,UAAEA,EAAS+kD,QAAEA,EAAOC,YAAEA,IAC/D,MAAMv6C,OAAEA,EAAMshC,QAAEA,GAAYrhC,KACtBxO,EAAQC,KACPqtC,EAAYyb,GAAiBvwD,OAAS6J,IACtCgc,EAAQ2qC,GAAaxwD,OAAS6J,GAC/B2jD,KAAYnW,IAAcxxB,GAAQ4qC,WAAWvtD,OAAU2iB,GAAQ4qC,WAAWlqD,QACzEgD,EAAQghC,GAAavqC,OAAS6J,IAC9B6mD,EAAcC,GAAmB3wD,GAAS,IAE1C4wD,EAAeC,GAAoB7wD,EAASswD,GAAeN,KAC3D7P,EAAO2Q,GAAY9wD,EAAS,KACnC0C,EAAU,KACF4tD,GACAO,EAAiBP,IACtB,CAACA,IAEJ,MAAMS,EAAuB,CAAA,EAC7B,IAAIC,GAAkB,EAClBC,GAAsB,EAC1BL,EAAcn/C,QAAQlU,IACdA,IAAS0yD,GAAYtP,UACrBqQ,GAAkB,EAGlBC,GAAsB,EAEtBf,GAAe95C,SAAS7Y,KACxBwzD,EAAqBxzD,IAAQ,KAGrCmF,EAAU,KACN6tD,OAAc1mD,GACd0gC,OAAU1gC,IACX,CAACwmD,IACJ3tD,EAAU,KACD20C,GAELthC,EAAOm7C,SAASjrC,SAASoxB,EAAQn5C,IAAIoL,KAAM+tC,IACvCmZ,EAAUnZ,EAAQ8Z,kBAEvB,CAAC9Z,IACJ30C,EAAU,KACF6G,GACA/B,EAAM,CAAEpJ,MAAOmL,EAAQA,OAAQ,UAAW5I,SAAU,OAEzD,CAAC4I,IACJ7G,EAAU,KACDoyC,GAAoC,IAAtBA,EAAWnrC,QAC1ByD,OAASvD,IAEd,CAACirC,IACJ,MAAMsc,EAAa,KACf,IAAK5D,IAAY1Y,EACb,OASJ1nC,EARc,CACVwzC,OAAQqQ,EAAsB,CAC1B/tD,KAAM4xC,EACNjvB,OAAQkrC,QACRlnD,EACJ82C,UAAWqQ,EAAkBlc,OAAajrC,EAC1Cs2C,MAAOA,IAGX5V,EAAU,iBAQR8mB,EAAwB9zD,GAAU4P,IAEhC0jD,EADA1jD,EACiBtK,GAAQkC,MAAMgJ,KAAK,IAAIvB,IAAI,IAAI3J,EAAMtF,KAGrCsF,GAAQA,EAAKoW,OAAOlK,GAAKA,IAAMxR,KAGxD,OAAQF,EAAM,MAAO,CAAEN,UAAW,gCAAiCH,SAAU,CAACE,EAAKm0B,EAAO,CAAE5lB,YAAa,oDAAqD7N,MAAOs3C,EAAY1nC,SAAUmjD,EAAetiD,UAdlLjH,IACN,UAAVA,EAAEkH,KACFkjD,OAYgOt0D,EAAKgM,EAAQ,CAAEC,QAAS,QAAS9I,QAAS,IAAM0wD,GAAgB,GAAOjqD,IAAK,2BAA4B3J,UAAW,OAAQH,SAAUE,EAAKw0D,GAAU,CAAEvvD,KAAM,OAAU1E,EAAMszB,EAAO,CAAElxB,OAAQixD,EAAchoC,QAAS,IAAMioC,GAAgB,GAAQ/zD,SAAU,CAACE,EAAK8zB,EAAY,CAAEh0B,SAAU,iBAAmBE,EAAK+zB,EAAW,CAAEj0B,SAAUS,EAAM,MAAO,CAAEN,UAAW,sBAAuBH,SAAU,CAACS,EAAM,QAAS,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKy0D,GAAU,CAAEpkD,QAASyjD,EAAcx6C,SAAS65C,GAAYtP,WAAY6Q,gBAAiBH,EAAqBpB,GAAYtP,aAAe7jD,EAAK,OAAQ,CAAEF,SAAU,iBAAoBE,EAAK,MAAO,CAAEC,UAAW,0BAA2BH,SAAU,eAAiBszD,GAAevyD,IAAIJ,GAASF,EAAM,QAAS,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKy0D,GAAU,CAAEpkD,QAASyjD,EAAcx6C,SAAS7Y,GAAOi0D,gBAAiBH,EAAqB9zD,KAAUT,EAAK,OAAQ,CAAEF,SAAUW,EAAK62C,OAAO,GAAGhH,cAAgB7vC,EAAKue,MAAM,OAAUve,IAASF,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,OAAQH,SAAU,UAAYE,EAAK20D,GAAa,CAAEl0D,KAAM,SAAUgH,IAAK,EAAG/G,MAAO2iD,EAAO/yC,SAAUjO,GAAK2xD,EAAStT,OAAOr+C,GAAK,MAAOgC,MAAO,CAAEkC,MAAO,cAAoBvG,EAAKo0B,EAAa,CAAEt0B,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAAS,IAAM0wD,GAAgB,GAAQ/zD,SAAU,eAAmBE,EAAKgM,EAAQ,CAAEC,QAAS,YAAauC,UAAWA,EAAWrL,QAASmxD,EAAYM,YAAalE,EAAS9mD,IAAK,kBAAmB9J,SAAU,aAChtD,CC1EA,MAAMkuD,GAAgB,CAClB,CAAE5tD,KAAM,KAAMiiD,MAAO,KAAM5hD,KAAM,qBACjC,CAAEL,KAAM,OAAQiiD,MAAO,IAAK5hD,KAAM,cAClC,CAAEL,KAAM,OAAQiiD,MAAO,YAAa5hD,KAAM,UAC1C,CAAEL,KAAM,SAAUiiD,MAAO,SAAU5hD,KAAM,UACzC,CAAEL,KAAM,aAAciiD,MAAO,aAAc5hD,KAAM,SAO9C,SAASo0D,IAAkC9H,aAAEA,EAAex2C,YAAe2rC,OAAEA,IAChF,MAAMz3B,EAAS26B,KACT16C,EAAQC,IAsBRmqD,EAAgBhI,GApBGv2C,MAAOo0C,UAEtBoC,EAAapC,GAEnBrpC,WAAW,KACPrO,QAAQC,IAAI,8DACZuX,EAAOA,SAASje,KAAK,KAEjB9B,EAAM,CACFpJ,MAAO,0BACP0M,YAAa,+DACbvB,OAAQ,OACR5I,SAAU,QAEf+S,MAAMC,IACL5D,QAAQiJ,MAAM,oCAAqCrF,MAExD,OAUP,OAAO7W,EAAK+0D,GAAuB,CAAE7S,OAAQA,EAAQgM,SALxB,CAACjzC,EAAOxa,KAEjC,MAAMu+C,EAAev0B,EAAOu0B,aAC5B,OAAO8V,EAAc75C,EAAOxa,EAAMu+C,KAG1C,CACO,SAAS+V,IAAsB7S,OAAEA,EAAMgM,SAAEA,EAAQ8G,YAAEA,GAAc,EAAIC,YAAEA,GAAc,IAExF,MAAMC,EAAgB9P,MACfsL,EAASC,GAAcztD,GAAS,IAChCqyC,EAAgB4f,GAAqBjyD,EAAS,OAC/Cg0C,aAAEA,GAAiBh+B,MACnBuR,OAAEA,EAAMjc,UAAEA,EAAS0N,MAAEA,EAAKqU,QAAEA,EAAOkzB,QAAEA,GAAY8B,MAChD6P,EAAcC,GAAmBnyD,EAASg0C,EAAegL,IA7C5CoT,EA6CqEpe,IA7C3Dz2C,EA6CyEgqB,EAAO+xB,MAAM/7C,MA5C9F60D,EAASC,cAAc90D,GAAQutD,KAC5BA,IA2CmGA,IA7ChI,IAAwBsH,EAAU70D,EA+C9B,MAAO+0D,EAAgBC,GAAsBvyD,EAAS,IAC/CwyD,EAAQC,GAAazyD,EAAS,IAC9BirB,EAAYC,GAAiBlrB,EAAgF,SAAvEmrB,aAAaC,QAAQL,GAAyBD,uBACpF0uB,EAASC,GAAcz5C,EAAS,IACjC0tD,EAAchhD,EAAO,MAE3BhK,EAAU,KACD8qD,GAA8B,IAAnBngC,EAAQ1jB,SACpB8oD,EAAU,GAEVlrC,EAAO45B,qBAAoB,GAC3B55B,EAAOA,SAASje,KAAK,KACjBmkD,GAAW,KACZ/5C,MAAMC,IACL5D,QAAQiJ,MAAM,yBAA0BrF,GACxC4T,EAAO45B,qBAAoB,OAGpC,IACHz+C,EAAU,KACF2qB,EAAQ1jB,OAAS6oD,GACjBC,EAAUplC,EAAQ1jB,SAEvB,CAAC0jB,EAAQ1jB,OAAQ6oD,IACpB7E,GAAwBD,EAAa,KAC7BF,GAAWngC,EAAQ1jB,OAAS,GAAK0jB,EAAQ1jB,QAAU6oD,IACnD/E,GAAW,GACXlmC,EAAOs6B,WAAWnb,QAAQ,KACtB+rB,EAAUplC,EAAQ1jB,QAClB8jD,GAAW,OAGpB,CAAEG,KAAM,CAACJ,EAASngC,EAAQ1jB,UAE7B,MA0CMkuC,EAASsK,KACT0L,EAAc3L,KAKdxI,EAAea,GAAwB1C,GACvC8B,EAAoBc,GAAyBoT,GAM7C16C,EAAM,IAAIw6B,IAAIxnC,OAAO+gB,SAASrgB,MAC9B6rD,EAAev/C,EAAIw/C,aAAanhD,IAAI,WAC1C,GAAIkhD,EACA,IACI,MAAME,EAAcF,EAAah6C,MAAM,KACjCm6C,EAAmBD,EAAY35C,OAAO65C,IACxC,MAAOC,GAAeD,EAAKp6C,MAAM,KAC3Bxb,EAAO81D,mBAAmBD,GAChC,MAAgB,UAAT71D,GAA6B,QAATA,IAE/B,GAAI21D,EAAiBlpD,SAAWipD,EAAYjpD,OAAQ,CAChD,MAAMspD,EAAkBJ,EAAiBlpD,OAAS,EAAIkpD,EAAiB36C,KAAK,KAAO,GAC/E+6C,EACA9/C,EAAIw/C,aAAarhD,IAAI,UAAW2hD,GAGhC9/C,EAAIw/C,aAAaplD,OAAO,WAE5BpH,OAAOqhB,QAAQC,aAAathB,OAAOqhB,QAAQ5G,OAAS,CAAA,EAAI,GAAIzN,EAAI2O,WACpE,CACJ,CACA,MAAO9I,GACHjJ,QAAQiJ,MAAM,8CAA+CA,EACjE,CAEJ,MAAMsY,EAAWC,KAQjB,OAAQl0B,EAAM,MAAO,CAAEN,UAAW,wBAAyBH,SAAU,CAACE,EAAKo2D,GAAgB,CAAE9hC,OAAQihB,EAAgB3pB,QAAS,IAAMupC,EAAkB,QAAUj5C,GAASlc,EAAKyoC,EAAU,CAAEnnC,MAAO,QAASxB,SAAUoc,EAAMhW,UAAYlG,EAAKq2D,GAAU,CAAE7nD,UAAWA,EAAWgnD,eAAgBA,EAAgBR,YAAaA,EAAaC,YAAaA,EAAarY,aAAcA,EAAcF,QAASA,EAAS4Z,mBAtCnX51D,IACxB,MAAM27C,EAA8B,mBAAV37C,EAAuBA,EAAMg8C,GAAWh8C,EAClEi8C,EAAWN,GACXQ,EAAkBR,IAmCiaka,mBAxF3Z/Z,IACxB,GAAIA,GAASA,EAAMsH,OAAQ,CAUvB,GATAr5B,EAAO+xB,MAAMsH,OAAStH,EAAMsH,OAC5Br5B,EAAO+xB,MAAMqH,UAAYrH,EAAMqH,UAC/Bp5B,EAAO+xB,MAAMuH,QAAUvH,EAAMuH,QAC7Bt5B,EAAO+xB,MAAMwH,kBAAoBxH,EAAMwH,kBACvCv5B,EAAO+xB,MAAMyH,gBAAkBzH,EAAMyH,qBACjBl3C,IAAhByvC,EAAM6G,QACN54B,EAAO44B,MAAQ7G,EAAM6G,MACrB54B,EAAO+xB,MAAM6G,MAAQ7G,EAAM6G,QAE1B+R,EAAan0C,KAAMu1C,GAAiB,iBAAXA,EAAEp2D,MAA0B,CACtD,MAAM8hD,EAAS,IACRkT,EACH,CACIh1D,KAAM,eACNiiD,MAAO,QACPp+B,OAASnX,GAASA,EAAK+oC,OAAOrqC,QAAQ,IAAM,WAGpD6pD,EAAgBnT,EACpB,CACAz3B,EAAOA,SAASje,KAAK,IAAMmkD,GAAW,GAC1C,MACSnU,GAASA,EAAMqH,WACpBp5B,EAAO+xB,MAAMqH,UAAYrH,EAAMqH,eACX92C,IAAhByvC,EAAM6G,QACN54B,EAAO44B,MAAQ7G,EAAM6G,MACrB54B,EAAO+xB,MAAM6G,MAAQ7G,EAAM6G,OAE/B54B,EAAOA,SAASje,KAAK,IAAMmkD,GAAW,UAEvB5jD,IAAVyvC,GAGDkU,WACOjmC,EAAO+xB,MAAMsH,cACbr5B,EAAO+xB,MAAMqH,UACpBp5B,EAAOA,SAASje,KAAK,IAAMmkD,GAAW,MAkD6a8F,cA5Czc,KAClBhsC,EAAOA,SAASje,KAAK,IAAMmkD,GAAW,KA2CmdviC,cAAeA,IAAkBpuB,EAAKiuD,GAAe,CAAE19B,QAASA,EAAS/hB,WAAY+hB,EAAQ1jB,QAAU2B,EAAW0zC,OAAQkT,EAAc/f,WAPjnB/gB,IAChBE,EAAS,YAAYF,EAAOlzB,OAM6nBk0C,cAJtoBpU,IACnB,MAAMse,EAAMjvB,EAAQtP,KAAKy1C,GAAKA,EAAEt1D,KAAO8/B,IAAa,KACpDi0B,EAAkB3V,IAEqqBjK,eAAgBA,EAAgB2Y,SAAUA,EAAU//B,WAAYA,EAAY6wB,aAAckW,EAAclW,eAA4Bh/C,EAAK,MAAhByjD,EAAuB,CAAEpiD,IAAKuvD,EAAa3wD,UAAW,6BAA8BH,SAAUE,EAAK8pC,EAAS,CAAE7kC,KAAM,QAA2B,CAAEhF,UAAW,sCAAuCH,SAAU,OAAOywB,EAAQ1jB,6BACphC,CACA,SAASwpD,GAAS57C,GACd,MAAMjM,UAAEA,EAASgnD,eAAEA,EAAcR,YAAEA,EAAWC,YAAEA,EAAWrY,aAAEA,EAAYF,QAAEA,EAAO4Z,mBAAEA,EAAkBC,mBAAEA,EAAkBE,cAAEA,EAAaroC,cAAEA,GAAkB3T,EAC7J,OAAQla,EAAM,MAAO,CAAEN,UAAW,uCAAwCH,SAAU,CAACk1D,GAAgBz0D,EAAMu8C,GAAgB,CAAEF,aAAcA,EAAcF,QAASA,EAASC,WAAY2Z,EAAoBx2D,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,0DAA2DH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,gCAAiCH,SAAU,CAACm1D,GAAej1D,EAAKszD,GAAoB,CAAEhjD,SAAUimD,EAAoB/nD,UAAWA,EAAW+kD,QAASiC,EAAgBv1D,UAAW,WAAaD,EAAK+8C,GAAW,CAAA,MAASx8C,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAASszD,EAAe7sD,IAAK,UAAW9J,SAAUE,EAAKg9C,GAAW,CAAE/3C,KAAM,OAAUjF,EAAKiuB,GAA0B,CAAEC,SAAUE,UAA0B7tB,EAAM,MAAO,CAAEN,UAAW,+BAAgCH,SAAU,CAACE,EAAKi9C,GAAW,CAAA,GAAKj9C,EAAKk9C,GAAa,CAAA,UAAe8X,GAAgBz0D,EAAM,MAAO,CAAEN,UAAW,0DAA2DH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,gCAAiCH,SAAUm1D,GAAej1D,EAAKszD,GAAoB,CAAEhjD,SAAUimD,EAAoB/nD,UAAWA,EAAW+kD,QAASiC,MAAsBj1D,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAASszD,EAAe7sD,IAAK,UAAW9J,SAAUE,EAAKg9C,GAAW,CAAE/3C,KAAM,OAAUjF,EAAKiuB,GAA0B,CAAEC,SAAUE,YACl7C,CACA,SAASgoC,IAAe9hC,OAAEA,EAAM1I,QAAEA,IAC9B,MAAMgC,MAAEA,GAAU1U,KACZxO,EAAQC,IACR6pB,EAAWC,KACXvI,EAAa4lC,GAAoBlkC,EAAOljB,EAAO4pB,GAAQpoB,SAASq4B,OAAQjQ,GAAQl0B,MAAQk0B,GAAQpoB,SAAS9L,MAC/G,OAAOk0B,EAAU/zB,EAAMo2D,GAAW,CAAEr1D,MAAOgzB,EAAOxxB,YAAYxB,OAASgzB,EAAOl0B,KAAMuC,QAAQ,EAAMipB,QAASA,EAAS9rB,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM3D,MAAO,cAAe6B,QAAS,IAAMqxB,EAAS,YAAYF,EAAOlzB,MAAOtB,SAAUE,EAAKoK,GAAc,CAAEnK,UAAW,aAAgBq0B,EAAOpoB,SAASq4B,QAAWvkC,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM3D,MAAO,WAAY6B,QAAS+oB,EAAYpsB,SAAUE,EAAKsnC,GAAU,CAAErnC,UAAW,gBAAqBD,EAAK42D,GAAS,CAAE32D,UAAW,SAAWD,EAAK,MAAO,CAAEC,UAAW,OAAQH,SAAUE,EAAK6qC,GAAiB,CAAEvW,OAAQA,EAAQwW,UAAU,GAAQxW,EAAOlzB,SAAc,IAC/rB,CCvMU,IAACy1D,GAMJ,SAASC,IAAsBC,YAAEA,EAAWp0D,OAAEA,EAAMipB,QAAEA,IAEzD,OAAQrrB,EAAMszB,EAAO,CAAEjI,QAAS,IAAMA,OAAQ7e,GAAYpK,OAAQA,EAAQ1C,UAAW,4BAA6BH,SAAU,CAACE,EAAK8zB,EAAY,CAAEh0B,SADlI,8BACuJi3D,GACzJ/2D,EAAKg3D,GAAa,CAAEprC,QAASA,IAAYmrC,GACzC/2D,EAAKi3D,GAAc,MACnC,CACA,SAASD,IAAYprC,QAAEA,IACnB,MAAOsrC,EAAYC,GAAiBj0D,OAAS6J,IACtCqqD,EAAWC,GAAgBn0D,OAAS6J,GACrCuqD,EAAkB,CAAC,0BAA2B,sBAOpD,OAAQ/2D,EAAMwzB,EAAW,CAAE9zB,UAAW,2CAA4CH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,QAASH,SAAUE,EAAKs2C,EAAW,CAAEroC,QAASqpD,EAAiB52D,MAAO02D,EAAW9mD,SAAU+mD,EAAc9oD,YAAa,wBAAyBtO,UAAW,wBAAyBs2C,SAAU,OAAQC,aAAa,MAAYj2C,EAAM,MAAO,CAAEN,UAAW,8CAA+CH,SAAU,CAACE,EAAKs2C,EAAW,CAAEroC,QAASqU,OAAOngB,OAAO00D,IAAcn2D,MAAOw2D,EAAY5mD,SAAU6mD,EAAe5oD,YAAa,kBAAmBtO,UAAW,wBAAyBs2C,SAAU,OAAQC,aAAa,IAASx2C,EAAKgM,EAAQ,CAAE/L,UAAW,SAAU20D,YAAasC,IAAeE,EAAWj0D,QAHjrB,KACbyoB,EAAQsrC,EAA6BE,GAHpBE,EAAgB,KAKgrBx3D,SAAU,2BACnuB,CACA,SAASm3D,OACL,OAAQj3D,EAAK+zB,EAAW,CAAE9zB,UAAW,oBAAqBH,SAAUS,EAAM,MAAO,CAAEN,UAAW,oEAAqEH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,gCAAiCH,SAAU,CAACE,EAAK,IAAK,CAAEF,SAAU,0BAA4BE,EAAK,IAAK,CAAEC,UAAW,iCAAkCH,SAAU,mBAAsBE,EAAK8pC,EAAS,CAAE7kC,KAAM,WACzZ,CCxBO,SAASsyD,IAAqBxvC,WAAEA,IACnC,MAAMrd,EAAQC,KACRsO,OAAEA,EAAMi+B,aAAEA,GAAiBh+B,KAClBksC,KACR5I,MAAM0H,eAAgB,EAC7B,MAWMsT,EAGV,SAAwBzvC,EAAYmvB,GAChC,IAAIugB,EAAe1vC,EAAW0vC,aAC9B,GAAIA,GAAgBA,EAAa5qD,OAAS,EACtC,OAAO4qD,EAEP1vC,EAAWtnB,MAAQy2C,IACnBugB,EAAevgB,GAAcqe,cAAcxtC,EAAWtnB,KAAKW,KAE/D,OAAIq2D,GAAgBA,EAAa5qD,OAAS,EAC/B4qD,OAGP,CAER,CAjBwBC,CAAe3vC,EAAYmvB,GAC/C,OAAOnvB,EAAW4vC,QAAW33D,EAAK+0D,GAAuB,CAAE7S,OAAQsV,IAAmBx3D,EAAK60D,GAAmC,CAAE9H,aAZ3Gx2C,MAAOo0C,IACpBA,EAAU99C,OAAS,SACboM,EAAO2U,MAAM62B,YAAYmT,WAAW7vC,EAAW3mB,GAAIupD,GAAW/zC,MAAMC,IACtEnM,EAAM,CACFpJ,MAAO,sCACP0M,YAAa6I,EAAI3Q,QACjBuG,OAAQ,aAMoIy1C,OAAQsV,GACxK,EDnBA,SAAWX,GACPA,EAAiB,IAAI,MACrBA,EAAkB,KAAI,MACzB,CAHD,CAGGA,KAAgBA,GAAc,CAAA,IEHjC,MAAMpgB,GAAexkC,GACP,OAANA,EACO,OACH1R,EAAM,MAAO,CAAET,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,UAAWH,SAAUmS,EAAE7R,OAASJ,EAAK,MAAO,CAAEC,UAAW,wBAAyBH,SAAUmS,EAAEjE,iBAEtJ,SAAS6pD,IAAkB53D,UAAEA,EAAS63D,aAAEA,EAAYxnD,SAAEA,EAAQkmC,YAAEA,EAAWa,SAAEA,IAChF,MAAM0gB,EAAU7+C,MACT8+C,EAAWC,GAAgB/0D,GAAS,IACpCslD,EAAcC,GAAmBvlD,KACjC4wD,EAAeC,GAAoB7wD,EAAS,IACnD0C,EAAU,KACN,IAAKoyD,IACDC,GAAa,GACTF,EAAQ7gB,cAAgB4gB,GAAc,CACtC,GAAIzgB,GAAYpvC,MAAMkT,QAAQ28C,GAAe,CACzC,MAAM5hC,EAAQ6hC,EAAQ7gB,aAAahhB,MAAM/Z,OAAOlK,GAAK6lD,EAAax+C,SAASrH,EAAE7Q,KAC7E2yD,EAAiB79B,EACrB,CACA,MAAMz1B,EAAOs3D,EAAQ7gB,aAAahhB,MAAMjV,KAAKhP,GAAKA,EAAE7Q,KAAO02D,GACvDr3D,GACAgoD,EAAgBhoD,EAExB,GAEL,CAACs3D,EAAQ7gB,aAAc4gB,EAAczgB,IACxC,MAIM6gB,EAAqBjqD,IACvB8lD,EAAiB9lD,GACjBqC,EAASrC,IAEb,OACYjO,EAAK,MADbq3C,EACoB,CAAEp3C,UAAW,sCAAuCH,SAAUE,EAAK+rD,GAAY,CAAE99C,QAAS8pD,EAAQ7gB,cAAchhB,OAAS,GAAIx1B,MAAOozD,EAAexjD,SAAU4nD,EAAmB3pD,YAAa,0BAA2BkoC,YAAaA,GAAax2C,UAAWA,GAAa,wBAAyBs2C,SAAU,OAAQC,YAAaA,IAAe,EAAOa,UAAU,KAEtW,CAAEp3C,UAAW,sCAAuCH,SAAUE,EAAK+rD,GAAY,CAAE99C,QAAS8pD,EAAQ7gB,cAAchhB,OAAS,GAAIx1B,MAAO8nD,EAAcl4C,SAXnJJ,IACfu4C,EAAgBv4C,QAAUnD,GAC1BuD,EAASJ,IAS8K3B,YAAa,2BAA4BkoC,YAAaA,GAAax2C,UAAWA,GAAa,wBAAyBs2C,SAAU,OAAQC,YAAaA,IAAe,KACjW,CCnCO,SAAS2hB,IAAqBvsC,QAAEA,EAAOwsC,SAAEA,GAAW,EAAIC,kBAAEA,IAC7D,MAAM7jC,EAAWC,KACX/pB,EAAQC,KACP2tD,EAAcC,GAAiBr1D,GAAS,IACzC+V,OAAEA,GAAWC,MACZsrC,EAASgU,GAAct1D,EAAS,CACnCy0D,SAAS,EACTv3D,KAAM,GACN4N,YAAa,KAEjB,SAASyqD,EAAer4D,EAAMM,GAC1B83D,EAAW,IACJhU,EACHpkD,CAACA,GAAOM,GAEhB,CA6CA,OAAQH,EAAM,OAAQ,CAAE6N,SAAWlE,GAAMA,EAAEoH,iBAAkBxR,SAAU,CAACS,EAAM6wC,EAAY,CAAEtxC,SAAU,CAACE,EAAKk0B,EAAU,CAAEtjB,MAAO,OAAQ8nD,UAAU,EAAM54D,SAAUE,EAAKm0B,EAAO,CAAE1zB,KAAM,OAAQC,MAAO8jD,EAAQpkD,MAAQ,GAAIkQ,SAAW5P,GAAU+3D,EAAe,OAAQ/3D,OAAcV,EAAKk0B,EAAU,CAAEtjB,MAAO,cAAe3Q,UAAW,OAAQH,SAAUE,EAAK24D,GAAU,CAAEj4D,MAAO8jD,EAAQx2C,aAAe,GAAIsC,SAAWqlC,GAAO8iB,EAAe,cAAe9iB,OAAW31C,EAAKk0B,EAAU,CAAEtjB,MAAO,qBAAsB3Q,UAAW,OAAQyG,UAAW,MAAOsH,YAAa,gIAAiIlO,SAAUE,EAAK44D,GAAQ,CAAEl4D,MAAO8jD,EAAQmT,UAAW,EAAOrnD,SAAW5P,GAAU+3D,EAAe,UAAW/3D,QAAe8jD,EAAQmT,SACjxB33D,EAAKk0B,EAAU,CAAEtjB,MAAO,wBAAyB3Q,UAAW,OAAQ+N,YAAa,wHAAyHlO,SAAUE,EAAK63D,GAAmB,CAAEC,aAActT,EAAQqU,eAAiB,KAAMvoD,SAAWjO,IACtR4F,MAAMkT,QAAQ9Y,GACdo2D,EAAe,gBAAiBp2D,EAAExB,IAAIJ,GAAQA,EAAKW,KAGnDq3D,EAAe,gBAAiBp2D,EAAI,CAACA,EAAEjB,IAAM,KAElDo1C,aAAa,EAAMa,UAAU,MAAYr3C,EAAKk0B,EAAU,CAAEtjB,MAAO,OAAQ3Q,UAAW,OAAQ+N,YAAa,2FAA4FlO,SAAUE,EAAK63D,GAAmB,CAAEC,aAActT,EAAQ/jD,MAAQ,KAAM6P,SAAWjO,IACvR4F,MAAMkT,QAAQ9Y,GACdo2D,EAAe,OAAQp2D,EAAEwK,OAAS,EAAIxK,EAAE,GAAGjB,GAAK,MAGhDq3D,EAAe,OAAQp2D,GAAGjB,IAAM,OAErCo1C,aAAa,SAAgBx2C,EAAKqxC,EAAc,CAAEvxC,SAAUE,EAAKgM,EAAQ,CAAE4oD,WAAY0D,EAAcn1D,QA3D/G,KACRqhD,GAASpkD,MAASokD,EAAQpkD,KAAK4P,QASpCw0C,EAAQpkD,KAAOokD,EAAQpkD,KAAK4P,OACxBw0C,EAAQx2C,cACRw2C,EAAQx2C,YAAcw2C,EAAQx2C,YAAYgC,QAEvB,MAAnBw0C,EAAQmT,UACRnT,EAAQmT,SAAU,GAEtBY,GAAc,GACdt/C,EAAO2U,MAAM62B,YACR4G,OAAO7G,GACPh4C,KAAMihB,IACP7B,IACAlhB,EAAM,CACFpJ,MAAO,qBACP0M,YAAa,eAAeyf,EAAErtB,6BAC9BqM,OAAQ,UACR5I,SAAU,MAEVu0D,GACA5jC,EAAS,gBAAgB/G,EAAErsB,MAC3Bi3D,GACAA,EAAkB5qC,EAAErsB,MAGvBwV,MAAOC,IACRnM,EAAM,CACFpJ,MAAO,8BACP0M,YAAa6I,EAAI3Q,QACjBuG,OAAQ,QACR5I,SAAU,QAGb+lC,QAAQ,IAAM2uB,GAAc,KAxC7B7tD,EAAM,CACFpJ,MAAO,mBACP0M,YAAa,2CACbvB,OAAQ,QACR5I,SAAU,OAqD6H/D,SAAU,0BACjK,CACO,SAASg5D,IAAsBn2D,OAAEA,EAAMipB,QAAEA,IAC5C,OAAQrrB,EAAM2wC,EAAQ,CAAEtlB,QAASA,EAASjpB,OAAQA,EAAQ7C,SAAU,CAACE,EAAKmxC,EAAa,CAAErxC,SAAU,wBAA0BE,EAAKm4D,GAAsB,CAAEvsC,QAASA,MACvK,CC3EO,SAASmtC,OACZ,MAAM9/C,OAAEA,GAAWC,KACbxO,EAAQC,KACPquD,EAAoBC,GAAyB/1D,KAC7CsL,EAAWkmB,GAAgBxxB,GAAS,IACpCP,EAAQu2D,GAAWh2D,GAAS,IAC3B6R,KAAM0vC,EAAWvoC,MAAEA,EAAKqY,QAAEA,GAAYoU,EAAS,IAAM1vB,EAAO2U,MAAM62B,YAAYh6B,OAAO,CAAA,GAAK,IAOlG,GALA7kB,EAAU,MACF6+C,GAAevoC,IACfwY,GAAa,IAElB,CAAC+vB,EAAavoC,IACbA,EACA,OAAOlc,EAAKyoC,EAAU,CAAEnnC,MAAO,2BAA4BxB,SAAUoc,EAAMhW,UA2B/E,OAAQ3F,EAAMggB,EAAW,CAAEzgB,SAAU,CAAC2kD,IACzBA,EAAY53C,OAAS,EACjBtM,EAAM85C,GAAO,CAAEp6C,UAAW,SAAUH,SAAU,CAACE,EAAK,QAAS,CAAEF,SAAUS,EAAM,KAAM,CAAET,SAAU,CAACE,EAAK,KAAM,CAAEF,SAAU,SAAWE,EAAK,KAAM,CAAEF,SAAU,SAAWE,EAAK,KAAM,CAAEF,SAAU,YAAcE,EAAK,KAAM,SAAYA,EAAKijD,GAAO,CAAEH,QAAS,EAAGt0C,UAAWA,EAAW1O,SAAU2kD,EAAY5jD,IAAK21D,GACvRj2D,EAAM44D,GAAI,CAAEr5D,SAAU,CAACE,EAAK,KAAM,CAAEF,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACs5D,GAAe5C,EAAEmB,SAAU33D,EAAK0a,GAAS,CAAE3Q,KAAM,gBAAgBysD,EAAEp1D,KAAMtB,SAAU02D,EAAEp2D,YAAgBJ,EAAK,KAAM,CAAEF,SAAU02D,EAAE/1D,MAAML,MAAQ,MAAQJ,EAAK,KAAM,CAAEF,SAAUgM,GAAM0qD,EAAE1D,YAAYuG,YAAcr5D,EAAK,KAAM,CAAEC,UAAW,aAAcH,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,cAAehH,KAAM,KAAM9B,QAAS,IAAM81D,EAAsBzC,EAAEp1D,IAAKtB,SAAUE,EAAKs5D,GAAQ,CAAEr5D,UAAW,iBAAsBu2D,EAAEp1D,UAE7hBpB,EAAKu5D,GAAiB,CAAEj4D,MAAO,iBAAkBqrD,YAAa,kBAAmBxpD,QAAS,IAAM+1D,GAAQ,GAAOp5D,SAAU,gDAAkDE,EAAK84D,GAAuB,CAAEn2D,OAAQA,EAAQipB,QAAS,IAAMstC,GAAQ,KAAWl5D,EAAKw5D,GAAc,CAAE72D,SAAUq2D,EAAoB13D,MAAO,oBAAqB4K,QAAS,iFAAkFsF,UA9B5Z+E,UACrB,GAAKyiD,EAEL,UACU//C,EAAO2U,MAAM62B,YAAYh0C,OAAOuoD,GACtCtuD,EAAM,CACFpJ,MAAO,qBACPmL,OAAQ,UACR5I,SAAU,MAEd0wB,GACJ,CACA,MAAO1d,GACH5D,QAAQiJ,MAAM,+BAAgCrF,GAC9CnM,EAAM,CACFpJ,MAAO,8BACP0M,YAAa6I,EAAI3Q,SAAW,oBAC5BuG,OAAQ,QACR5I,SAAU,KAElB,CACR,QACYo1D,OAAsBlsD,EAC1B,GAO8c0E,SAAU,IAAMwnD,OAAsBlsD,OAC5f,CACO,SAASqsD,GAAeK,GAC3B,MAAMC,EAAcD,EAAY,qBAAuB,oBACjDlsD,EAAmBvN,EAAZy5D,EAAiBE,GAAwCC,GAAhC,CAAE35D,UAAW,WACnD,OAAQD,EAAK6Q,EAAU,CAAE7C,YAAa0rD,EAAaz5D,UAAW,OAAQH,SAAUyN,GACpF,CCxDO,SAASssD,IAAwBtpC,QAAEA,EAAO/hB,UAAEA,IAC/C,MAAMgmB,EAAWC,KACjB,OAAQl0B,EAAM85C,GAAO,CAAEp6C,UAAW,SAAUH,SAAU,CAACE,EAAK85D,GAAO,CAAEh6D,SAAUS,EAAM,KAAM,CAAET,SAAU,CAACE,EAAK,KAAM,CAAEF,SAAU,SAAWE,EAAK,KAAM,CAAEF,SAAU,gBAAkBE,EAAK,KAAM,CAAEF,SAAU,sBAAwBE,EAAK,KAAM,CAAEF,SAAU,oBAAwBE,EAAKijD,GAAO,CAAEz0C,UAAWA,KAAe+hB,GAA8B,IAAnBA,EAAQ1jB,QAAei2C,QAAS,EAAGhjD,SAAUywB,GAAS1vB,IAAK2+C,GAASj/C,EAAM,KAAM,CAAE4C,QAAS,IAAMqxB,EAAS,UAAUgrB,EAAIp+C,MAAOnB,UAAW,gCAAiCH,SAAU,CAACE,EAAK,KAAM,CAAEF,SAAU0/C,EAAIp/C,OAASJ,EAAK,KAAM,CAAEF,SAAU0/C,EAAIua,YAAc,MAAQ,OAAS/5D,EAAK,KAAM,CAAEF,SAAU0/C,EAAIwa,aAAe,MAAQ,OAASh6D,EAAK,KAAM,CAAEF,SAAUgM,GAAM0zC,EAAIwT,YAAYqG,cAAiB7Z,EAAIp+C,SACztB,CDAA0K,GAAMi0C,OAAOka,ICJbnuD,GAAMi0C,OAAOka,ICHN,MAAMC,GACTjhD,OACAoqC,MACAvhB,OAAS,IAAIwhB,GAAY,CAAE/yB,QAAS,GAAI/hB,WAAW,IACnDguC,MAAQ,CAAA,EACR,WAAA74B,CAAY1K,EAAQoqC,EAAQ,KACxBx/B,KAAK5K,OAASA,EACd4K,KAAKw/B,MAAQA,CACjB,CACA,WAAI9yB,GACA,OAAO1M,KAAKie,OAAOphC,MAAM6vB,OAC7B,CACA,SAAIrU,GACA,OAAO2H,KAAKie,OAAOphC,MAAMwb,KAC7B,CACA,aAAI1R,GACA,OAAOqZ,KAAKie,OAAOphC,MAAM8N,SAC7B,CACA,cAAA6nC,CAAej2C,GACX,OAAOyjB,KAAK24B,MAAMp8C,EACtB,CACA,cAAAs2C,CAAet2C,EAAMM,GACjBmjB,KAAK24B,MAAMp8C,GAAQM,EACnBmjB,KAAK4G,QACT,CACA,KAAAN,CAAM3b,GAAY,GACdqV,KAAKie,OAAOphC,MAAQ,CAChB6vB,QAAS,GACT/hB,YAER,CACA,mBAAA61C,CAAoB3jD,GAChB,MAAMqF,EAAO8d,KAAKie,OAAOphC,MACzBmjB,KAAKie,OAAOphC,MAAQ,CAChB6vB,QAASxqB,EAAKwqB,QACd/hB,UAAW9N,EACXwb,MAAOnW,EAAKmW,MAEpB,CACA,aAAM4oC,CAAQC,GAAW,GACrB,GAAIlhC,KAAKrZ,UACL,OAAO8Q,QAAQqN,SAAQ,GAE3B9E,KAAKie,OAAOphC,MAAQ,CAChB8N,WAAW,EACX+hB,QAASw0B,EAAWlhC,KAAK0M,QAAU,IAEvC,MAAM8yB,EAAQx/B,KAAKw/B,MACbzd,EAAS/hB,KAAK0M,QAAQ1jB,OAC5B,OAAOgX,KAAK5K,OAAOid,MAAMikC,KAAK,CAC1B9W,QACAzd,SACA4W,MAAO34B,KAAK24B,QACbhwC,KAAK+J,MAAOurB,IACXje,KAAKie,OAAOphC,MAAQ,CAChB8N,WAAW,EACX+hB,QAAS1M,KAAK0M,QAAQ20B,OAAOpjB,KAE1B,IACRlrB,MAAOC,IAMN,MALAgN,KAAKie,OAAOphC,MAAQ,CAChBwb,MAAOrF,EACPrI,WAAW,EACX+hB,QAAS1M,KAAK0M,SAEZ1Z,GAEd,CACA,MAAA4T,GACI,OAAI5G,KAAKrZ,UACE8Q,QAAQqN,SAAQ,GAEpB9E,KAAKihC,SAAQ,EACxB,CACA,QAAAC,GACI,OAAIlhC,KAAKrZ,UACE8Q,QAAQqN,SAAQ,GAEpB9E,KAAKihC,SAAQ,EACxB,EAEC,MAACsV,GAA0BrxD,OAAcgE,GACvC,SAASstD,KACZ,OAAOnxD,EAAWkxD,GACtB,CACO,SAASE,KACZ,MAAM7vC,EAAS4vC,KAEf,MAAO,IADQ/U,GAAoB76B,EAAOqX,QACtBrX,SACxB,CACO,SAAS8vC,KAEZ,OADeF,KACD9pC,QAAQ1jB,MAC1B,CC5FO,SAAS2tD,IAAwBl5D,MAAEA,EAAKqB,OAAEA,EAAMipB,QAAEA,EAAO6uC,QAAEA,EAAOC,eAAEA,IACvE,MAAMhwD,EAAQC,KACPvK,EAAMu6D,GAAWz3D,EAASw3D,GAAgBt6D,OAC1C4N,EAAa07C,GAAkBxmD,EAASw3D,GAAgB1sD,cACxD4sD,EAAYC,GAAiB33D,EAASw3D,GAAgBX,cAAe,GAgB5E,OAAQx5D,EAAMszB,EAAO,CAAElxB,OAAQA,EAAQipB,QAAS,IAAMA,IAAW9rB,SAAU,CAACE,EAAK8zB,EAAY,CAAEh0B,SAAUwB,IAAUtB,EAAK+zB,EAAW,CAAE9zB,UAAW,OAAQH,SAAUS,EAAM,MAAO,CAAEN,UAAW,6CAA8CH,SAAU,CAACS,EAAM,MAAO,CAAET,SAAU,CAACE,EAAK,QAAS,CAAEC,UAAW,uCAAwCH,SAAU,SAAWE,EAAKm0B,EAAO,CAAEzzB,MAAON,EAAMkQ,SAAUqqD,OAAgBp6D,EAAM,MAAO,CAAET,SAAU,CAACE,EAAK,QAAS,CAAEC,UAAW,uCAAwCH,SAAU,gBAAkBE,EAAK24D,GAAU,CAAEj4D,MAAOsN,EAAasC,SAAUpG,GAAKw/C,EAAex/C,EAAEF,OAAOtJ,iBAAsBV,EAAKo0B,EAAa,CAAEt0B,SAAUS,EAAM,MAAO,CAAEN,UAAW,yBAA0BH,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,YAAa9I,QAAS,IAAMyoB,IAAW9rB,SAAU,WAAaE,EAAKgM,EAAQ,CAAEC,QAAS,UAAW9I,QAAS,IAfv0B,MACX,IAAK/C,EAMD,YALAsK,EAAM,CACF+B,OAAQ,QACRnL,MAAO,mBACPuC,SAAU,MAKlB+nB,EADgB,CAAExrB,OAAM4N,cAAa+rD,YAAaa,IACjCpuD,KAAK,IAAMof,KAC5B+uC,OAAQ5tD,GACR28C,OAAe38C,GACf8tD,GAAc,IAE00BC,GAAUh7D,SAAU26D,WACp3B,CCjBA,IAAIM,GAMG,SAASC,IAAyBC,QAAEA,GAAU,IACjD,MAAMlD,EAAU7+C,MACV0U,MAAEA,GAAUmqC,EACZrtD,EAAQC,KACP+lD,EAASC,GAAcztD,GAAS,IACjCunB,OAAEA,EAAMjc,UAAEA,EAAS0N,MAAEA,EAAKqU,QAAEA,GAAY+pC,MACvCY,EAAYC,GAAiBj4D,EAAS,IACvCk4D,EAAgBC,GAAYH,EAAY,KACxCtK,EAAchhD,EAAO,MAC3BihD,GAAwBD,EAAa,KACjCF,GAAWjmC,EAAOs6B,YACnB,CAAE+L,KAAM,CAACJ,KACZ9qD,EAAU,KACN6kB,EAAOA,SACFje,KAAK,IAAMmkD,GAAW,KAC5B,IACH/qD,EAAU,KACN6kB,EAAO+xB,MAAMp8C,KAAO86D,EACpBzwC,EAAOA,SACFje,KAAK,IAAMmkD,GAAW,KAC5B,CAACyK,IACJ,MAAOE,EAAWC,GAAgBr4D,OAAS6J,GAI3CnH,EAAU,KACN6kB,EAAO+xB,MAAM8e,UAAYA,EAAyB,OAAbA,OAAqBvuD,EAC1D0d,EAAOA,SACFje,KAAK,IAAMmkD,GAAW,KAC5B,CAAC2K,IACJ11D,EAAU,KACFq1D,GAAWvK,GACXjmC,EAAOA,SAASje,KAAK,IAAMmkD,GAAW,KAE3C,CAACsK,IACJ,MAAOO,EAAiBC,GAAsBv4D,GAAS,GAIvD,GAAIgZ,EACA,OAAQlc,EAAKyoC,EAAU,CAAEnnC,MAAO,8BAA+BxB,SAAUoc,EAAMhW,UAyBnF,OAAQ3F,EAAM,MAAO,CAAEN,UAAW,6BAA8BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,2BAA4BH,SAAU,CAACE,EAAKm0B,EAAO,CAAE5lB,YAAa,iBAAkB7N,MAAOw6D,EAAY5qD,SAAU6qD,IAAkBn7D,EAAKs2C,EAAW,CAAEr2C,UAAW,OAAQu2C,aAAa,EAAMvoC,QAASqU,OAAOngB,OAAO44D,IAAmBr6D,MAAO46D,EAAWhrD,SA3CjUyE,IACvBwmD,EAAaxmD,IA0CwWxG,YAAa,oBAAuBhO,EAAM,MAAO,CAAEN,UAAW,yBAA0BH,SAAU,CAAG0O,GAAiC,IAApB+hB,GAAS1jB,OAA0K7M,EAAK65D,GAAyB,CAAEtpC,QAASA,EAAS/hB,UAAWA,IAAtNxO,EAAKu5D,GAAiB,CAAEj4D,MAAO,UAAWqrD,YAAa,cAAexpD,QA7BjjB,KACtBs4D,GAAmB,IA4BglB37D,SAAU,wCAAyHE,EAAKw6D,GAAyB,CAAEC,QAAS,SAAUn5D,MAAO,cAAeqB,OAAQ64D,EAAiB5vC,QAtBjzBrV,MAAOiuC,GACzBA,EAIE52B,EAAMsI,MAAMm1B,OAAO7G,GAASh4C,KAAK+J,UACpC7L,EAAM,CACF+B,OAAQ,UACRnL,MAAO,eACPuC,SAAU,MAEdk0D,EAAQ2D,cACRjxC,EAAOA,SAASje,KAAK,IAAMmkD,GAAW,MACvC/5C,MAAMC,IACLnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,sBACP0M,YAAa6I,EAAI3Q,QACjBrC,SAAU,SAhBd43D,GAAmB,GACZngD,QAAQqN,kBAoB3B,EAvEA,SAAWoyC,GACPA,EAAuB,KAAI,MAC3BA,EAAwB,MAAI,IAC/B,CAHD,CAGGA,KAAqBA,GAAmB,CAAA,ICH3C,MAAMY,GAAyB,CAACC,GAAYlmC,MACrC,SAASmmC,IAAmBC,WAAEA,EAAUC,eAAEA,IAC7C,MAAMnuC,MAAEA,GAAU1U,KACZxO,EAAQC,KACPqxD,EAAYC,GAAe/4D,GAAS,GACrCgnB,EAASgyC,GAAUJ,EAAW3lC,eAC9BlB,EAAYrlB,OAAO7C,IAClBovD,EAAaC,GAAkBl5D,GAAS,GACzCxC,EAAQoB,EAAQ,IA6D1B,SAAuB4zB,GACnB,IAAKA,EACD,MAAO,GAEX,OAAOvpB,KAAKC,UAAUspB,EAAM,KAAM,EACtC,CAjEe2mC,CAAcnyC,EAAOA,QAC7B,CAACA,IAmCEoyC,EAAuB,KACzB,GAAIrnC,EAAU9e,QAAS,CACnB,MAAMzV,EAAQu0B,EAAU9e,QAAQ8gB,WAChC,IACI,MAAMslC,EA0BtB,SAAuBrwD,GACnB,IAAKA,GAAS8D,OACV,OAEJ,OAAO7D,KAAK+qB,MAAMhrB,EAAQ8D,OAC9B,CA/BkCwsD,CAAc97D,GAChC+7D,GAAeF,GACfryC,EAAOwyC,cAAcH,EACzB,CACA,MAAO1lD,GAOH,OANAnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,sBACP0M,YAAa6I,EAAI3Q,QACjBrC,SAAU,OAEP,CACX,CACJ,CACA,OAAO,GAEX,OAAQtD,EAAM,MAAO,CAAEN,UAAW,uEAAwEH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,iEAAkEH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,0BAA2BH,SAAU,kBAAoBE,EAAK,MAAO,CAAEF,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,UAAWhH,KAAM,KAAM9B,QA5BhW,KACbg5D,IACKG,KAITF,EAAer2D,IAASA,IAsBgXjG,SAAUq8D,EAAc,cAAgB,gBAAmBn8D,EAAK,MAAO,CAAEC,UAAW,uBAAwBH,SAAUE,EAAKgM,EAAQ,CAAEwC,UAAWwtD,EAAY/vD,QAAS,UAAWhH,KAAM,KAAM9B,QAtDzjB,KACPg5D,IACKG,MAITL,GAAY,GACZruC,EAAMsI,MAAMiB,OAAO2kC,EAAW16D,GAAI,CAAE+0B,cAAejM,EAAOA,SAAU1d,KAAK,KACrEuvD,EAAe7xC,GACfxf,EAAM,CACF+B,OAAQ,UACRnL,MAAO,iBACP0M,YAAa,2CACbnK,SAAU,QAEf+S,MAAOC,IACNnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,0BACP0M,YAAa6I,EAAI3Q,QACjBrC,SAAU,QAEf+lC,QAAQ,KACPqyB,GAAY,OA+BqkBn8D,SAAU,sBAA0BE,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAUq8D,EAC3pBn8D,EAAK28D,GAAkB,CAAEj8D,MAAOA,EAAOk8D,WAAYjB,GAAwB1mC,UAAWA,IACtFj1B,EAAK68D,GAAc,CAAE3yC,OAAQA,QACnD,CAaA,MAAMuyC,GAAkBvyC,IACpB,IACgB,IAAIa,GAAI,CAChBC,QAAQ,IAIRE,QAAQhB,EAChB,CACA,MAAOhO,GACH,MAAM,IAAIwP,MAAM,mCAAmCxP,EAAMhW,UAC7D,GChGG,SAAS42D,IAAyBh9D,SAAEA,EAAQujD,MAAEA,EAAKjjD,KAAEA,EAAMk7D,UAAWA,IACzE,MAAM1tC,MAAEA,GAAU1U,KACZuR,EAAS3oB,EAAQ,KACnB,MAAM2oB,EAAS,IAAIyvC,GAAiBtsC,EAAOy1B,GAG3C,OAFA54B,EAAO+xB,MAAMp8C,KAAOA,EACpBqqB,EAAO+xB,MAAM8e,UAAYA,EAClB7wC,GACR,CAAC44B,IACJ,OAAQrjD,EAAKo6D,GAAwBvwD,SAAU,CAAEnJ,MAAO+pB,EAAQ3qB,SAAUA,GAC9E,CCDO,SAASi9D,IAAuBp6D,OAAEA,EAAMipB,QAAEA,EAAOtqB,MAAEA,EAAQ,sBAAqBxB,SAAEA,EAAQk9D,oBAAEA,EAAsB,KAAItrD,aAAEA,EAAe,cAAaurD,UAAEA,GAAY,IACrK,MAAM/lB,aAAEA,GAAiBh+B,MAClBsvC,EAAcC,GAAmBvlD,EAAS85D,GAE3C9mC,EAAQghB,GAAchhB,OAAS,GAE/B+zB,EAAc,KAChBr+B,OAAQ7e,IAMZ,OAAQxM,EAAMszB,EAAO,CAAElxB,OAAQA,EAAQipB,QAASq+B,EAAahqD,UAAW,0BAA2BH,SAAU,CAACE,EAAK8zB,EAAY,CAAEh0B,SAAUwB,IAAUf,EAAMwzB,EAAW,CAAE9zB,UAAW,MAAOH,SAAU,CAACA,EAAUS,EAAM,MAAO,CAAEN,UAAW,YAAaH,SAAU,CAACS,EAAM,QAAS,CAAEN,UAAW,iCAAkCH,SAAU,CAAC,gBAAiBm9D,GAAaj9D,EAAK,OAAQ,CAAEC,UAAW,4BAA6BH,SAAU,kBAAkCE,EAAKs2C,EAAlB2mB,EAA6B,CAAEhvD,QAASioB,EAAOx1B,MAAO8nD,EAAc/R,YAAch2C,GAASA,EAAOA,EAAKL,KAAO,wBAAyBmO,YAAa,+DAAgE+B,SAAW07C,GAAavD,EAAgBuD,GAAY,MAAOzV,SAAU,OAAQC,aAAa,GAA4B,CAAEvoC,QAASioB,EAAOx1B,MAAO8nD,EAAc/R,YAAch2C,GAASA,EAAOA,EAAKL,KAAO,wBAAyBmO,YAAa,wBAAyB+B,SAAW07C,GAAavD,EAAgBuD,GAAY,MAAOzV,SAAU,SAAY0mB,GAAc18D,EAAM,MAAO,CAAEN,UAAW,+CAAgDH,SAAU,CAACE,EAAKisD,GAAiB,CAAEhsD,UAAW,iBAAmBM,EAAM,OAAQ,CAAET,SAAU,CAACE,EAAK,SAAU,CAAEF,SAAU,gCAAkC,oEAAyE0oD,EAAgBjoD,EAAM,MAAO,CAAEN,UAAW,uDAAwDH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,cAAeH,SAAU0oD,EAAapoD,OAASooD,EAAax6C,aAAgBhO,EAAK,MAAO,CAAEC,UAAW,OAAQH,SAAU0oD,EAAax6C,iBAAuBivD,GAAc18D,EAAM,MAAO,CAAEN,UAAW,uDAAwDH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,cAAeH,SAAU,6BAA+BS,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAAC,gGAAiGE,EAAK,KAAM,CAAA,GAAKA,EAAK,OAAQ,CAAEC,UAAW,yBAA0BH,SAAU,mDAAyDS,EAAM6zB,EAAa,CAAEt0B,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAS9I,QAAS8mD,EAAanqD,SAAU,WAAaE,EAAKgM,EAAQ,CAAE7I,QAH5nE,KAClByoB,EAAQ48B,GAAcpnD,IAAM,OAE0oEtB,SAAU0oD,EAAe,GAAG92C,MAAiB82C,EAAapoD,OAAS68D,EAAY,sBAAwBvrD,SACrxE,CCnBA,MAAMkrD,GAAa,CAAChB,GAAYlmC,MACzB,SAASwnC,IAAkBpB,WAAEA,EAAUqB,eAAEA,IAC5C,MAAMzyD,EAAQC,KACPqxD,EAAYC,GAAe/4D,GAAS,IACrC0qB,MAAEA,GAAU1U,KACZ+b,EAAYrlB,OAAO7C,GACnBrM,EAAQoB,EAAQ,IACXs7D,GAAqBtB,EAAWrE,cACxC,CAACqE,EAAWrE,eACT4F,EAAkB,CAAC/7D,EAAO4E,KAC5BwE,EAAM,CACF+B,OAAQ,QACRnL,MAAOA,EACP0M,YAAa9H,EACbrC,SAAU,OAgDlB,OAAQtD,EAAM,MAAO,CAAEN,UAAW,sDAAuDH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,iEAAkEH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,2BAA4BH,SAAU,wBAA0BE,EAAK,MAAO,CAAEC,UAAW,uBAAwBH,SAAUE,EAAKgM,EAAQ,CAAEwC,UAAWwtD,EAAY/vD,QAAS,UAAWhH,KAAM,KAAM9B,QA7CtZ,KACX,IAAK8xB,EAAU9e,QACX,OAEJ,MAAMzV,EAAQu0B,EAAU9e,QAAQ8gB,WAChC,IAAIwgC,EACJ,GAAK/2D,EAID,IACI+2D,EAAetrD,KAAK+qB,MAAMx2B,EAC9B,CACA,MAAOmW,GACH,OAAOwmD,EAAgB,eAAgBxmD,EAAI3Q,QAC/C,MARAuxD,EAAe,KAUnB,OAAKxvD,MAAMkT,QAAQs8C,GAGfA,EAAa96C,KAAMqmC,IAASA,IAAQA,EAAI5iD,OAAS4iD,EAAIX,OAC9Cgb,EAAgB,eAAgB,2FAE3CpB,GAAY,QACZruC,EAAMsI,MAAMiB,OAAO2kC,EAAW16D,GAAI,CAC9Bq2D,iBACDjrD,KAAMikB,IACL/lB,EAAM,CACF+B,OAAQ,UACRnL,MAAO,uBACP0M,YAAa,iDACbnK,SAAU,MAEds5D,EAAe1sC,EAASgnC,gBACzB7gD,MAAOC,IACNnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,gCACP0M,YAAa6I,EAAI3Q,QACjBrC,SAAU,QAEf+lC,QAAQ,KACPqyB,GAAY,MAxBLoB,EAAgB,eAAgB,sCA2BuYv9D,SAAU,sBAA0BE,EAAK,MAAO,CAAEC,UAAW,YAAaH,SAAUE,EAAK28D,GAAkB,CAAEj8D,MAAOA,EAAOk8D,WAAYA,GAAY3nC,UAAWA,QACxlB,CACO,SAASmoC,GAAqB5d,GACjC,OAAKA,EAGErzC,KAAKC,UAAUozC,EAAK,KAAM,GAFtB,QAGf,CClEA,MAAMod,GAAa,CAAChB,GAAYlmC,MACzB,SAAS4nC,IAAmB/oC,QAAEA,EAAOxM,WAAEA,IAC1C,MAAMiO,EAASjO,EAAWtnB,MAAMW,GAC1Bm8D,EAAiB3tD,OAAO7C,GACxBrC,EAAQC,KACRsO,OAAEA,GAAWC,MACZ8iD,EAAYC,GAAe/4D,GAAS,IACpCsgC,EAAUg6B,GAAet6D,EAAS,CACrC9C,KAAM2nB,EAAW3nB,KACjB4N,YAAa+Z,EAAW/Z,aAAe,GACvCwuC,MAAOz0B,EAAWy0B,MAAQrwC,KAAKC,UAAU2b,EAAWy0B,MAAO,KAAM,GAAK,GACtE3F,KAAM9uB,EAAW8uB,MAAQ,GACzBp2C,KAAMsnB,EAAWtnB,MAAMW,IAAM,GAC7By3D,cAAe9wC,EAAW8wC,eAAiB,KAEzC4E,EAAmB37D,EAAQ,IACtBs7D,GAAqBr1C,EAAW0vC,cACxC,CAAC1vC,EAAW0vC,eAmFTiG,EAAW,CAACt9D,EAAMM,KACpB88D,EAAY,IACLh6B,EACHpjC,CAACA,GAAOM,KAGhB,OAAQH,EAAM,MAAO,CAAEN,UAAW,2BAA4BH,SAAU,CAACS,EAAMo9D,GAAO,CAAEr8D,MAAO,gBAAiB0lD,OAAQhnD,EAAKgM,EAAQ,CAAE/G,KAAM,KAAM2vD,WAAYoH,EAAY74D,QAxF1J,KACb,IAAIq5C,EACJ,IACIA,EAAQhZ,EAASgZ,MAAQrwC,KAAK+qB,MAAMsM,EAASgZ,YAASzvC,CAC1D,CACA,MAAO8J,GAOH,YANAnM,EAAM,CACFpJ,MAAO,qBACP0M,YAAa6I,EAAI3Q,QACjBuG,OAAQ,QACR5I,SAAU,KAGlB,CACA,MAAM2gD,EAAU,CACZpkD,KAAMojC,EAASpjC,KACf4N,YAAaw1B,EAASx1B,YACtBwuC,MAAOA,EACP3F,KAAMrT,EAASqT,KACfp2C,KAAM+iC,EAAS/iC,KACfo4D,cAAer1B,EAASq1B,eAE5B,IAAI38C,EAOJ,GANKsoC,EAAQpkD,OACT8b,EAAQ,oBAEPsoC,EAAQ/jD,OACT+jD,EAAQ/jD,KAAO,MAEfyb,EACAxR,EAAM,CACFpJ,MAAO,oBACP0M,YAAakO,EACbzP,OAAQ,QACR5I,SAAU,UALlB,CASA,GAAI05D,EAAepnD,QAAS,CACxB,MAAM+rC,EAASqb,EAAepnD,QAAQ8gB,WACtC,GAAIirB,EACA,IACIsC,EAAQiT,aAAetrD,KAAK+qB,MAAMgrB,EACtC,CACA,MAAOrrC,GAOH,YANAnM,EAAM,CACFpJ,MAAO,uBACP0M,YAAa6I,EAAI3Q,QACjBuG,OAAQ,QACR5I,SAAU,KAGlB,MAGA2gD,EAAQiT,aAAe,IAE/B,CACAwE,GAAY,GACZhjD,EAAO2U,MAAM62B,YACRttB,OAAOpP,EAAW3mB,GAAIojD,GACtBh4C,KAAK,KACN+nB,IACA7pB,EAAM,CACFpJ,MAAO,qBACP0M,YAAa,2CACbvB,OAAQ,UACR5I,SAAU,QAGb+S,MAAOC,IACRnM,EAAM,CACFpJ,MAAO,8BACP0M,YAAa6I,EAAI3Q,QACjBuG,OAAQ,QACR5I,SAAU,QAGb+lC,QAAQ,KACTqyB,GAAY,IA1ChB,GAmD0Ln8D,SAAU,SAAWA,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,2BAA4BH,SAAU,eAAiBS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKm5C,GAAU,CAAEC,QAASrxB,EAAWm0B,WAAYtD,WAAW,IAASr4C,EAAM,OAAQ,CAAET,SAAU,CAAC,MAAOgM,GAAMic,EAAW+qC,YAAY/mD,OAAO,gCAAoCxL,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,2BAA4BH,SAAU,eAAiBS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAKm5C,GAAU,CAAEC,QAASrxB,EAAW61C,WAAYhlB,WAAW,IAASr4C,EAAM,OAAQ,CAAET,SAAU,CAAC,MAAOgM,GAAMic,EAAWirC,YAAYjnD,OAAO,mCAAwC/L,EAAKk0B,EAAU,CAAEtjB,MAAO,OAAQ8nD,UAAU,EAAM54D,SAAUE,EAAKm0B,EAAO,CAAEzzB,MAAO8iC,EAASpjC,KAAMkQ,SAAWjO,GAAMq7D,EAAS,OAAQr7D,OAAUrC,EAAKk0B,EAAU,CAAEtjB,MAAO,cAAe9Q,SAAUE,EAAK24D,GAAU,CAAEj4D,MAAO8iC,EAASx1B,YAAasC,SAAWpG,GAAMwzD,EAAS,cAAexzD,EAAEF,OAAOtJ,YAAeqnB,EAAW4vC,SACv0C33D,EAAKk0B,EAAU,CAAEtjB,MAAO,wBAAyB5C,YAAa,6GAA8GlO,SAAUE,EAAK63D,GAAmB,CAAEC,aAAct0B,EAASq1B,eAAiB,KAAMvoD,SAAWjO,IACzP4F,MAAMkT,QAAQ9Y,GACdq7D,EAAS,gBAAiBr7D,EAAExB,IAAIJ,GAAQA,EAAKW,KAG7Cs8D,EAAS,gBAAiBr7D,EAAI,CAACA,EAAEjB,IAAM,KAE5Co1C,aAAa,EAAMa,UAAU,MAAYtvB,EAAW4vC,SAAY33D,EAAKk0B,EAAU,CAAEtjB,MAAO,QAAS5C,YAAa,oEAAqElO,SAAUE,EAAK24D,GAAU,CAAE14D,UAAW0xD,GAAOC,MAAOlxD,MAAO8iC,EAASgZ,MAAOlsC,SAAWpG,GAAMwzD,EAAS,QAASxzD,EAAEF,OAAOtJ,WAAeV,EAAKk0B,EAAU,CAAEtjB,MAAO,eAAgB5C,YAAa,kEAAmElO,SAAUE,EAAK28D,GAAkB,CAAE18D,UAAW,oCAAqCS,MAAO+8D,EAAkBb,WAAYA,GAAY3nC,UAAWsoC,MAAsBv9D,EAAKk0B,EAAU,CAAEtjB,MAAO,OAAQ5C,YAAa,gFAAiFlO,SAAUE,EAAK63D,GAAmB,CAAEC,aAAct0B,EAAS/iC,MAAQ,KAAM6P,SAAWjO,IACvyB4F,MAAMkT,QAAQ9Y,GACdq7D,EAAS,OAAQr7D,EAAEwK,OAAS,EAAIxK,EAAE,GAAGjB,GAAK,MAG1Cs8D,EAAS,OAAQr7D,GAAGjB,IAAM,OAE/Bo1C,aAAa,SAAgBxgB,GAAUh2B,EAAK69D,GAAkB,CAAE7nC,OAAQA,EAAQjO,WAAYA,KAAgBA,EAAW4vC,SAAYp3D,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK89D,GAAuB,CAAE/1C,WAAYA,IAAe/nB,EAAK+9D,GAAmB,CAAEh2C,WAAYA,SAC/R,CACA,SAAS81C,IAAiB7nC,OAAEA,EAAMjO,WAAEA,IAChC,MAAOi2C,EAAUC,GAAe/6D,EAAS,CAAA,GACnCwH,EAAQC,KACRsO,OAAEA,GAAWC,MACZ8iD,EAAYkC,GAAiBh7D,GAAS,IACrC6R,KAAMtU,EAAIyb,MAAEA,GAAUysB,EAAS,IAAM1vB,EAAO2U,MAAMsI,MAAM/M,SAAS6M,GAAS,CAACA,IAC7E9L,EAASzpB,GAAM01B,eAAiB,CAAA,EAChC7B,EAASxyB,EAAQ,IAAM,IAAIq8D,GAAcj0C,EAAQnC,EAAWjlB,YAAc,CAAA,GAAK,CAAConB,EAAQnC,EAAWjlB,aACzG,GAAIoZ,EACA,OAAOlc,EAAKyoC,EAAU,CAAEnnC,MAAO,sBAAuBxB,SAAUoc,EAAMhW,UAE1E,IAAKzF,EACD,OAAO,KAmCX,OAAQT,EAAK29D,GAAO,CAAEr8D,MAAO,aAAc0lD,OAAQhnD,EAAKgM,EAAQ,CAAE/G,KAAM,KAAMuJ,UAAWwtD,EAAYv7D,KAAM,SAAU0C,QAAS,IAjC9G,CAAC4R,IACb,IAAKA,IAASuN,OAAOC,KAAKxN,GAAMlI,OAC5B,OAEJ,MAAM23C,EAAU,CAAE1hD,WAAYiS,GAAQ,CAAA,GACtCmpD,GAAc,GACdjlD,EAAO2U,MAAM62B,YACRttB,OAAOpP,EAAW3mB,GAAIojD,GACtBh4C,KAAK,KACN9B,EAAM,CACFpJ,MAAO,gCACP0M,YAAa,2CACbvB,OAAQ,UACR5I,SAAU,QAGb+S,MAAOC,IACRnM,EAAM,CACFpJ,MAAO,yCACP0M,YAAa6I,EAAI3Q,QACjBuG,OAAQ,QACR5I,SAAU,QAGb+lC,QAAQ,KACTs0B,GAAc,MAQ8GE,CAAQJ,GAAWl+D,SAAU,SAAWA,SAAUE,EAAKq+D,GAAe,CAAE/pC,OAAQA,EAAQhkB,SALrMyE,IACfA,aAAgBopD,IAChBF,EAAYlpD,EAAKrU,WAI7B,CChLO,SAAS49D,IAAiBhuD,SAAEA,EAAQ5P,MAAEA,EAAKiQ,SAAEA,GAAW,EAAKpC,YAAEA,EAAc,sBAAqBgwD,kBAAEA,EAAoB,qBAAoBC,UAAEA,EAASC,aAAEA,GAAe,EAAIpnB,SAAEA,GAAW,IAC5L,MAAMp+B,OAAEA,GAAWC,MACZwlD,EAAaC,GAAkBz7D,EAAS,KACxC07D,EAAaC,GAAkB37D,GAAS,IACxC47D,EAAiBC,GAAsB77D,GAAS,GAEjD87D,EAAuB3D,GAAYqD,EAAa,KAEhDO,EAAoBt1D,EAAY4M,MAAOimC,IACzCqiB,GAAe,GACf,MAAMK,EAAe1iB,EAAMxsC,OACrBy0C,QAAoBxrC,EAAO2U,MAAM62B,YAAYh6B,OAAO,CACtDktC,UAAS8G,QAAe1xD,EACxB3M,KAAM0+D,GAAmBI,QAA6BnyD,IAQ1D,OANA8xD,GAAe,IAEVC,GAAmBra,EAAY53C,QAAU,KAC1CkyD,GAAmB,GAGnBP,GAAaA,EAAU3xD,OAAS,EACzB43C,EAAYtoC,OAAO6mC,IAAQwb,EAAUllD,SAAS0pC,EAAI5hD,KAEtDqjD,GACR,CAACxrC,EAAQwlD,EAAcD,EAAWM,KAE7B/pD,KAAM0vC,EAAWvoC,MAAEA,GAAUysB,EAAS,IAAMs2B,EAAkBH,EAAkBE,EAAuB,IAAK,CAACF,EAAkBE,EAAuB,GAAIC,IAE5JE,EAAqBr9D,EAAQ,IAC1B2iD,EAEDpN,GAAYpvC,MAAMkT,QAAQza,GACnB+jD,EAAYtoC,OAAQ4L,GAAernB,EAAM4Y,SAASyO,EAAW3mB,KAE9Di2C,GAA6B,iBAAV32C,EAGtB22C,EAAW,QAAKtqC,EAFZ03C,EAAYxjC,KAAM8G,GAAeA,EAAW3mB,KAAOV,GALnD22C,EAAW,QAAKtqC,EAQ5B,CAAC03C,EAAa/jD,EAAO22C,IAElB+nB,EAAez1D,EAAaoe,IAC9B,GAAIsvB,EAAU,CACV,MAAMgoB,EAAgBp3D,MAAMkT,QAAQza,GAASA,EAAQ,GAErD,GADmB2+D,EAAc/lD,SAASyO,EAAW3mB,IACrC,CAEZ,MAAMk+D,EAAYD,EAAcljD,OAAO/a,GAAMA,IAAO2mB,EAAW3mB,IACzDm+D,EAAiB9a,GAAatoC,OAAOq6C,GAAK8I,EAAUhmD,SAASk9C,EAAEp1D,MAAQ,GAC7EkP,EAASgvD,EAAWC,EACxB,KACK,CAED,MAAMD,EAAY,IAAID,EAAet3C,EAAW3mB,IAC1Cm+D,EAAiB9a,GAAatoC,OAAOq6C,GAAK8I,EAAUhmD,SAASk9C,EAAEp1D,MAAQ,GAC7EkP,EAASgvD,EAAWC,EACxB,CACJ,MAEIjvD,EAASyX,EAAW3mB,GAAI2mB,IAE7B,CAACzX,EAAU5P,EAAO+jD,EAAapN,IAE5BmoB,EAAc71D,EAAY,KAC5B2G,OAASvD,OAAWA,IACrB,CAACuD,IAEEmvD,EAAqB91D,EAAa6yC,IACpCmiB,EAAeniB,IAChB,IACGkjB,EAAiBhB,EAAY1uD,OAAOnD,OAAS,EAE7C8yD,EAAsB79D,EAAQ,KAChC,IAAK2iD,EACD,MAAO,GAEX,GAAIqa,EACA,OAAOra,EAEX,IAAKib,EACD,OAAOjb,EACX,MAAMmb,EAAalB,EAAY7kD,cAC/B,OAAO4qC,EAAYtoC,OAAO6mC,GAAOA,EAAI5iD,KAAKyZ,cAAcP,SAASsmD,KAClE,CAACnb,EAAaqa,EAAiBY,EAAgBhB,IAC5CmB,EAAkBV,GAAsBO,EAE9C,GAAIxjD,EACA,OAAQlc,EAAKyoC,EAAU,CAAEnnC,MAAO,0BAA2BxB,SAAUoc,EAAMhW,UAe/E,OAAQ3F,EAAMosB,EAAS,CAAE7sB,SAAU,CAACE,EAAK6sB,EAAgB,CAAE9b,SAAS,EAAMjR,SAAUS,EAAMyL,EAAQ,CAAEC,QAAS,UAAWmyC,KAAM,WAAY,gBAAiB,UAAWn+C,UAAWmE,EAAG,kCAAmCuM,SAAUA,EAAU7Q,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,oCAAqCH,SAX7Su3C,GAAYpvC,MAAMkT,QAAQgkD,IAAuBA,EAAmBtyD,OAAS,EAC3C,IAA9BsyD,EAAmBtyD,OACZsyD,EAAmB,GAAG/+D,KAE1B,GAAG++D,EAAmBtyD,8BAEvBwqC,IAAY8nB,GAAuBl3D,MAAMkT,QAAQgkD,GAGpD5wD,EAFI4wD,EAAmB/+D,OAIkTJ,EAAK6xD,GAAgB,CAAE5xD,UAAW,0CAA8CD,EAAK+sB,EAAgB,CAAE9sB,UAAW,uDAAwD+sB,MAAO,QAASltB,SAAUS,EAAM0sB,EAAS,CAAE6yC,cAAc,EAAOhgE,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,kDAAmD,qBAAsB,GAAIH,SAAU,CAACE,EAAK+/D,GAAc,CAAExxD,YAAagwD,EAAmB79D,MAAOg+D,EAAasB,cAAeP,EAAoBx/D,UAAW,2JAA6J2+D,GAAgB5+D,EAAK,MAAO,CAAEC,UAAW,2FAA+FD,EAAKigE,GAAc,CAAEngE,SAAU8+D,EACxlC,eACAc,EACI,wBACA,8BAAgCn/D,EAAM4sB,EAAc,CAAEltB,UAAW,8BAA+BH,SAAU,CAAC+/D,IAAoBxoB,GAAar3C,EAAKotB,EAAa,CAAE1sB,MAAO,YAAawN,SAAUsxD,EAAav/D,UAAW,wBAAyBH,SAAU,oBAAuB6/D,EAAoB9+D,IAAKknB,IAC3S,MAAM0R,EAAa4d,GAAYpvC,MAAMkT,QAAQza,GACvCA,EAAM4Y,SAASyO,EAAW3mB,IAC1BV,IAAUqnB,EAAW3mB,GAC3B,OAAQb,EAAM6sB,EAAa,CAAE1sB,MAAOqnB,EAAW3mB,GAAI8M,SAAU,IAAMkxD,EAAar3C,GAAa9nB,UAAW,oCAAqCH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,WAAYH,SAAUioB,EAAW3nB,OAASq5B,GAAez5B,EAAKkgE,GAAO,CAAEjgE,UAAW,4BAAgC8nB,EAAW3mB,gBAEnV,CCjHO,SAAS28D,IAAkBh2C,WAAEA,IAChC,MAAM9O,OAAEA,GAAWC,MACZinD,EAASC,GAAcl9D,OAAS6J,IAChCszD,EAAaC,GAAkBp9D,EAAS6kB,EAAWw4C,mBAAqB,IACzE71D,EAAQC,IACd/E,EAAU,KACFmiB,EAAWtnB,MAAMW,IACjB6X,EAAO2U,MAAMsI,MAAM/M,SAASpB,EAAWtnB,KAAKW,IAAIoL,KAAK4zD,IAE1D,CAACr4C,EAAWtnB,MAAMW,KACrB,MAAM6M,EAAUkyD,EAAU79C,OAAOC,KAAK49C,EAAQhqC,eAAerzB,YAAc,CAAA,GAAM,GAsBjF,OAAQ9C,EAAK29D,GAAO,CAAEr8D,MAAO,oBAAqB0M,YAAa,gJAAiJg5C,OAAQhnD,EAAKgM,EAAQ,CAAE/G,KAAM,KAAMuJ,WAAW,EAAOrL,QAlBtP,KACX8V,EAAO2U,MAAM62B,YAAYttB,OAAOpP,EAAW3mB,GAAI,CAC3Cm/D,kBAAmBF,IACpB7zD,KAAK,KAEJ9B,EAAM,CACFpJ,MAAO,4BACPmL,OAAQ,cAEbmK,MAAOsF,IACNxR,EAAM,CACFpJ,MAAO,qCACP0M,YAAakO,EAAMhW,QACnBuG,OAAQ,aAKkQ3M,SAAU,SAAWA,SAAUE,EAAK,MAAO,CAAEC,UAAW,GAAIH,SAAUE,EAAKwgE,GAAW,CAAE9/D,MAAO2/D,EAAa/vD,SArBhX07C,IACdsU,EAAetU,IAoBmY/9C,QAASA,EAASM,YAAa,kCACzb,CCjCO,SAASuvD,IAAsB/1C,WAAEA,IACpC,MAAM9O,OAAEA,GAAWC,MACZunD,EAAcC,GAAmBx9D,EAAS6kB,EAAW44C,iBAAkB,IACvEC,EAAUC,GAAe39D,GAAS,GACnCwH,EAAQC,IAwBd,OAAQ3K,EAAK29D,GAAO,CAAEr8D,MAAO,2BAA4B0M,YAAa,0GAA2GlO,SAAUE,EAAK44D,GAAQ,CAAEjoD,SAAUiwD,EAAUlgE,OAAQ+/D,EAAcnwD,SAvBxNwwD,IACxB,MAAMH,GAAkBG,EACxBD,GAAY,GACZ5nD,EAAO2U,MAAM62B,YAAYttB,OAAOpP,EAAW3mB,GAAI,CAC3Cu/D,eAAgBA,IACjBn0D,KAAK,KAEJ9B,EAAM,CACFpJ,MAAO,iCACPmL,OAAQ,YAEZi0D,EAAgBC,KACjB/pD,MAAOsF,IACNxR,EAAM,CACFpJ,MAAO,kCACP0M,YAAakO,EAAMhW,QACnBuG,OAAQ,YAGbm9B,QAAQ,KACPi3B,GAAY,MAG8P/gE,SAAU,uCAChS,CC3BO,SAASihE,IAA0B/Z,OAAEA,EAAM2D,UAAEA,EAAS7qD,SAAEA,IAC3D,MAAM8tB,MAAEA,GAAU1U,KACZxO,EAAQC,KACPhI,EAAQu2D,GAAWh2D,GAAS,GAC7B89D,EAAWr3D,EAAY,KACzBuvD,GAAQ,GACD59C,QAAQqN,SAAQ,IACxB,IACHs4C,GAAyBja,EAAO5lD,GAAI4/D,GA6BpC,OAAQzgE,EAAM,MAAO,CAAET,SAAU,CAACA,EAAUE,EAAK+8D,GAAwB,CAAEp6D,OAAQA,EAAQipB,QA5BjEoK,IAEtBkjC,GAAQ,QAEOnsD,IAAXipB,GAIJpI,EAAMszC,aAAa,CACf9gE,KAAM,cACN+gE,IAAKxW,EACLlpD,OAAQ,CAAEu0B,YACXxpB,KAAMihB,IACL/iB,EAAM,CACF+B,OAAQ,UACRnL,MAAO,cACP0M,YAAa,sBAAsB28C,EAAU99C,qBAAkC,gBAAb4gB,EAAEhhB,OAA2B,cAAgB,cAC/G5I,SAAU,QAEf+S,MAAMC,IACLnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,sBACP0M,YAAa6I,EAAI3Q,QACjBrC,SAAU,SAIgGvC,MAAO,sBAAuBoQ,aAAc,cAAe5R,SAAUS,EAAM,MAAO,CAAEN,UAAW,gCAAiCH,SAAU,CAACS,EAAM,IAAK,CAAET,SAAU,CAAC,oDAAqD6qD,EAAU99C,OAAS,EAAI,IAAM,IAAK,uEAAyEtM,EAAM,IAAK,CAAEN,UAAW,eAAgBH,SAAU,CAAC,oCAAqCE,EAAK,OAAQ,CAAEF,SAAU,gBAAkB,yGAChkB,CACY,MAACshE,GAAmB,CAC5BhgE,GAAI,aACJhB,KAAM,sBACN4N,YAAa,oDACbqzD,SAAS,EACTC,UAAWP,ICxCA,SAASQ,IAAcva,OAAEA,EAAMga,SAAEA,EAAQlhE,SAAEA,IACtD,MAAO0hE,EAAkBC,GAAuBv+D,GAAS,GACnDw+D,EAAmB1a,EAAO0a,kBAAoB,4BAA4B1a,EAAO5mD,QACjFuhE,EAAYh4D,EAAalI,GACvBulD,EAAOqa,SACPI,GAAoB,GACbnmD,QAAQqN,SAAQ,IAGhBq4C,EAASv/D,GAErB,CAACulD,EAAOqa,QAASL,IACd/3D,EAAMg4D,GAAyBja,EAAO5lD,GAAIugE,GAKhD,OAAQphE,EAAMggB,EAAW,CAAEzgB,SAAU,CAACA,EAAUE,EAAKw5D,GAAc,CAAEhoD,UAJnD,KACdiwD,GAAoB,GACpBT,EAAS,IAAK/3D,EAAIxH,OAAQulD,YAE6Dv1C,SAAU,IAAMgwD,GAAoB,GAAQngE,MAAO,gBAAiB4K,QAASw1D,EAAkB/+D,OAAQ6+D,MACtM,CCpBO,SAASI,IAA6B5a,OAAEA,EAAM2D,UAAEA,EAAS7qD,SAAEA,IAC9D,MAAMmJ,EAAM44D,KACNn3D,EAAQC,KACRsO,OAAEA,GAAWC,KACbuR,EAAS26B,KACT5wB,EAAWC,KACXusC,EAAWr3D,EAAY,KACzB,IAAKghD,IAAcA,EAAU99C,OAOzB,OANAnC,EAAM,CACF+B,OAAQ,QACRnL,MAAO,sBACP0M,YAAa,kCACbnK,SAAU,MAEPyX,QAAQqN,SAAQ,GAE3B,SAASm5C,EAAeC,EAAOC,GAC3B,GAAID,EAAMl1D,QAAUm1D,EAChB,OAAOD,EACX,MAAME,EAAWF,EAAMG,YAAY,KAC7BvmD,GAAmB,IAAbsmD,EAAkBF,EAAM5+C,UAAU8+C,GAAY,GAG1D,MAAO,SAFUA,EAAkBF,EAAM5+C,UAAU,EAAG8+C,GAAYF,GACjC5+C,UAAU,EAAG6+C,EAAYrmD,EAAI9O,OAAS,QACxC8O,GACnC,CACA,OAAOL,QAAQC,IAAIovC,EAAU9pD,IAAIO,GAAM6X,EAAO2U,MAAM2C,QAAQ9f,OAAOrP,KAAMoL,KAAMwgC,IAC3E,MAAMm1B,EAASn1B,EAAIngC,OAAS,EAAI,IAAM,GAOtC,GANAnC,EAAM,CACF+B,OAAQ,UACRnL,MAAO,GAAG0rC,EAAIngC,gBAAgBs1D,YAC9Bn0D,YAAa,WAAY8zD,EAAe90B,EAAInsC,IAAIqc,GAAKA,EAAE9b,IAAIga,KAAK,MAAO,yBACvEvX,SAAU,MAEV4mB,EAAQ,CACRxhB,EAAIxH,QAAQ0zC,WAAWsK,YACvB,MAAM1E,EAAS5uC,KAAK+qB,MAAM/qB,KAAKC,UAAUqe,EAAOswB,SAC5C4P,EAAU99C,SAAWkuC,EAAOwH,OAAO13C,OACnC4f,EAAO25B,cAEX35B,EAAOA,QACX,MAII+J,EAAS,cAEd5d,MAAMC,IACLnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,yBACP0M,YAAa6I,EAAI3Q,QACjBrC,SAAU,SAGnB,CAAC8mD,IACJ,OAAQ3qD,EAAKuhE,GAAe,CAAEva,OAAQA,EAAQga,SAAUA,EAAUlhE,SAAUA,GAChF,CACY,MAACsiE,GAAsB,CAC/BhhE,GAAI,SACJhB,KAAM,SACN4N,YAAa,8BACbqzD,SAAS,EACTK,iBAAkB,0FAClBJ,UAAWM,GACXS,aAAa,GAEJC,GAAqC,CAC9ClhE,GAAI,wBACJhB,KAAM,iBACN4N,YAAa,8BACbqzD,SAAS,EACTK,iBAAkB,iGAClBJ,UAAWM,GACXS,aAAa,GC3EV,SAASE,IAA0Bvb,OAAEA,EAAM2D,UAAEA,IAChD,MAAM/8B,MAAEA,GAAU1U,KACZxO,EAAQC,KACPhI,EAAQu2D,GAAWh2D,GAAS,IAC5B6zD,EAAayL,GAAkBt/D,GAAS,GACzC89D,EAAWr3D,EAAY,KACzBuvD,GAAQ,GACD59C,QAAQqN,SAAQ,IACxB,IACG1f,EAAMg4D,GAAyBja,EAAO5lD,GAAI4/D,GAiFhD,OAAQhhE,EAAK,MAAO,CAAEF,SAAUE,EAAK82D,GAAuB,CAAEC,YAAaA,EAAap0D,OAAQA,EAAQipB,QAhFnF,CAACsrC,EAAYE,KAC9B,GAAIF,IAAeE,GAAazM,EAAU99C,OAAS,GAAI,CACnD21D,GAAe,GACf,MAAMhmB,EAAQvzC,EAAIxH,QAAQgpB,QAAQ+xB,OAAS,CAAA,EACrCimB,EAAmBx5D,EAAIxH,QAAQgpB,QAAQqX,QAAQphC,OAAO6vB,SAAS1vB,IAAI2+C,GAAOA,EAAIp+C,UAAO2L,EACrF21D,EAAkBnsD,MAAO2qB,GACpBtT,EAAM2C,QAAQ4pC,KAAK,CACtB3d,MAAO,CACHoH,OAAQ1iB,KAEb10B,KAAMikB,GACEA,EAAS5vB,IAAI2+C,GAAOA,EAAIp+C,KAGlBmV,UACb6gD,EAEIqL,EACOjmB,EAAMsH,OAAS2e,EAAmB,GAGpB,IAArB9X,EAAU99C,OACH,UAIG61D,EAAgB/X,EAAU,KAAKzF,OAAOyF,GAG7CA,EAGfvL,GAAe5yC,KAAMm2D,IAGjB/0C,EAAM2C,QAAQqyC,iBAAiB,CAC3BjY,UAAWgY,EACXliE,KAAMy2D,EACN1a,MAAO4a,IAAc5a,EAAMsH,OAAStH,EAAQ,CAAE/7C,KAAM+7C,EAAM/7C,QAC3D+L,KAAMikB,IACL,IAAI1b,EACJ,GAAImiD,IAAeL,GAAYgM,IAC3B9tD,EAAO,IAAI67B,KAAK,CAACngB,EAAS1b,MAAO,CAAEtU,KAAMgwB,EAAShwB,YAEjD,GAAIy2D,IAAeL,GAAY1qD,KAChC4I,EAAO,IAAI67B,KAAK,CAACzkC,KAAKC,UAAUqkB,EAAS1b,OAAQ,CAAEtU,KAAMgwB,EAAShwB,WAEjE,CACD,MAAMqiE,EAAeryC,EAAS1b,KAC9BA,EAAO,IAAI67B,KAAK,CAAC,IAAImV,WAAW+c,EAAa/tD,OAAQ,CAAEtU,KAAMgwB,EAAShwB,MAC1E,CACA,MAAM4V,EAAMhN,OAAOwnC,IAAIC,gBAAgB/7B,GACjCzC,EAAIye,SAASE,cAAc,KACjC3e,EAAEm+B,SAAWhgB,EAASrwB,KACtBkS,EAAEvI,KAAOsM,EACT/D,EAAEo1B,QACFh9B,EAAM,CACF+B,OAAQ,UACRnL,MAAO,oBACP0M,YAAaopD,EAAY,iDACnB,4BAA4BzM,EAAU99C,gBAAgB89C,EAAU99C,OAAS,EAAI,IAAM,kBACzFhJ,SAAU,QAEf+S,MAAMC,IACLnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,0BACP0M,YAAa6I,EAAI3Q,QACjBrC,SAAU,QAEf+lC,QAAQ,KACP44B,GAAe,GACftJ,GAAQ,MAGpB,MAEIA,GAAQ,OAIpB,CACY,MAAC6J,GAAyB,CAClC3hE,GAAI,mBACJhB,KAAM,oBACN4N,YAAa,+BACbqzD,SAAS,EACTC,UAAWiB,IChGR,SAASS,IAAoChc,OAAEA,EAAM2D,UAAEA,EAAS3L,aAAEA,IACrE,MAAM/1C,EAAM44D,KACNn3D,EAAQC,KACRsO,OAAEA,GAAWC,KACbuR,EAAS26B,KACT4b,EAAWr3D,EAAY,IACpBghD,GAAcA,EAAU99C,OASxBmyC,EASE/lC,EAAO2U,MAAM62B,YAAYwe,cAAcjkB,EAAc2L,GAAWn+C,KAAK,KACxE,MAAM21D,EAASxX,EAAU99C,OAAS,EAAI,IAAM,GAC5CnC,EAAM,CACF+B,OAAQ,UACRnL,MAAO,GAAGqpD,EAAU99C,gBAAgBs1D,4BACpCn0D,YAAa,gDACbnK,SAAU,MAEV4mB,IACAxhB,EAAIxH,QAAQ0zC,WAAWsK,YACvBh1B,EAAOA,YAEZ7T,MAAOC,IACNnM,EAAM,CACF+B,OAAQ,QACRnL,MAAO,yCACP0M,YAAa6I,EAAI3Q,QACjBrC,SAAU,SAzBd6G,EAAM,CACF+B,OAAQ,QACRnL,MAAO,wBACP0M,YAAa,iDACbnK,SAAU,MAEPyX,QAAQqN,SAAQ,KAfvBje,EAAM,CACF+B,OAAQ,QACRnL,MAAO,sBACP0M,YAAa,kDACbnK,SAAU,MAEPyX,QAAQqN,SAAQ,IA+B5B,CAACgiC,EAAW3L,IACf,OAAQh/C,EAAKuhE,GAAe,CAAEva,OAAQA,EAAQga,SAAUA,GAC5D,CACY,MAACkC,GAA6B,CACtC9hE,GAAI,uBACJhB,KAAM,yBACN4N,YAAa,mDACbqzD,SAAS,EACTK,iBAAkB,6EAClBJ,UAAW0B,GACXX,aAAa,GCxDV,SAASc,IAAuBnc,OAAEA,EAAM2D,UAAEA,EAAS3L,aAAEA,IACxD,MAAMt0C,EAAQC,KACRsO,OAAEA,GAAWC,MACZvW,EAAQu2D,GAAWh2D,GAAS,GAC7B89D,EAAWr3D,EAAY,KACzBuvD,GAAQ,GACD59C,QAAQqN,SAAQ,IACxB,IA2BH,OADAs4C,GAAyBja,EAAO5lD,GAAI4/D,GAC7BhhE,EAAKojE,GAAoB,CAAEzgE,OAAQA,EAAQipB,QA1BzB0B,IAErB,GADA4rC,GAAQ,GACH5rC,EAKL,OAAOrU,EAAO2U,MAAMC,UAAUw1C,MACzBC,QAAQh2C,EAAYq9B,EAAW,CAAErhC,cAAe01B,IAChDxyC,KAAK,KACN9B,EAAM,CACFpJ,MAAO,mBACPmL,OAAQ,UACR5I,SAAU,QAGb+S,MAAOC,IACRnM,EAAM,CACFpJ,MAAO,0BACPmL,OAAQ,QACRuB,YAAa6I,EAAI3Q,QACjBrC,SAAU,UAM1B,CACY,MAAC0/D,GAAsB,CAC/BniE,GAAI,gBACJhB,KAAM,iBACN4N,YAAa,4CACbqzD,SAAS,EACTmC,YAAY,EACZlC,UAAW6B,IAEf,SAASC,IAAmBzgE,OAAEA,EAAMipB,QAAEA,IAClC,OAAQrrB,EAAM2wC,EAAQ,CAAEtlB,QAAS,IAAMA,OAAQ7e,GAAYpK,OAAQA,EAAQ1C,UAAW,GAAIH,SAAU,CAACE,EAAKmxC,EAAa,CAAErxC,SAAU,6BAA+BE,EAAKyjE,GAAmB,CAAE73C,QAASA,MACzM,CACA,SAAS83C,GAAaxzD,GAClB,MAAO,CACHU,MAAQrQ,EAAM,MAAO,CAAET,SAAU,CAACE,EAAK,MAAO,CAAEF,SAAUoQ,EAAO9P,OAASJ,EAAK,MAAO,CAAEC,UAAW,qBAAsBH,SAAUoQ,EAAOlC,iBAC1I21D,SAAS,EAEjB,CACA,SAASF,IAAkB73C,QAAEA,IACzB,MAAOogC,EAAU4X,GAAe1gE,OAAS6J,GACnCqb,EAAUy5C,KAShB,OAAQthE,EAAM,MAAO,CAAET,SAAU,CAACS,EAAM6wC,EAAY,CAAEtxC,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,OAAQH,SAAU,qCAAuCE,EAAK,MAAO,CAAEC,UAAW,kEAAmEH,SAAUE,EAAK6jE,GAAY,CAAE51D,QAASma,EAAQ07C,QAASJ,aAAcA,GAAcpzD,SARhT5P,IACdkjE,EAAYljE,IAOsUA,MAAOsrD,SAAoBzrD,EAAM8wC,EAAc,CAAEvxC,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,YAAa9I,QAAS,IAAMyoB,IAAW9rB,SAAU,WAAaE,EAAKgM,EAAQ,CAAE7I,QALve,KACR6oD,GACApgC,EAAQogC,EAAS5qD,KAGgfwzD,YAAa5I,EAAUlsD,SAAU,eAC9iB,CC3DO,MAAMikE,GACTtiE,OACAuiE,WAAa,CACTjB,GACA3B,GACAmC,GACAU,GACA7B,GACAc,GACAZ,IAEJwB,QAAU,GACVI,UAAY,CAAA,EACZC,cACA,WAAAxgD,CAAYliB,GACRoiB,KAAKpiB,OAASA,CAClB,CACA,WAAI2iE,GAEA,QADyBvgD,KAAKpiB,OAAO0zC,WAAW6J,aAErCn7B,KAAKmgD,WAAW7nD,OAAO6qC,GAAwB,oBAAdA,EAAO5lD,IAA0C,WAAd4lD,EAAO5lD,IAG3EyiB,KAAKmgD,WAAW7nD,OAAO6qC,GAAwB,yBAAdA,EAAO5lD,IAA+C,0BAAd4lD,EAAO5lD,GAE/F,CACA,mBAAMijE,GAWF,OAVAxgD,KAAKpiB,OAAOwX,OAAO4U,UAAUw1C,MAAMlJ,OAAO3tD,KAAM62D,IAC5Cx/C,KAAKigD,QAAUT,EAAMxiE,IAAIyjE,IAAI,CACzBljE,GAAIkjE,EAAKljE,GACThB,KAAMkkE,EAAKlkE,KACX4N,YAAas2D,EAAKt2D,YAClBqzD,SAAS,EACTkD,YAAY,EACZjD,UAAW6B,MACX/tD,KAAK,CAAC9C,EAAG+C,IAAM/C,EAAElS,KAAK6iB,cAAc5N,EAAEjV,SAEvCyjB,KAAKigD,OAChB,CACA,gBAAAU,CAAiBpkE,EAAMqkE,GAEnB,OADA5gD,KAAKqgD,UAAU9jE,GAAQqkE,EAChB,YACI5gD,KAAKqgD,UAAU9jE,GAE9B,CACA,kBAAAskE,CAAmBtkE,UACRyjB,KAAKqgD,UAAU9jE,EAC1B,CACA,UAAAukE,CAAWC,GACP,IAAI5d,EAASnjC,KAAKmgD,WAAW/iD,KAAK3O,GAAKA,EAAElR,KAAOwjE,GAIhD,OAHK5d,IACDA,EAASnjC,KAAKigD,QAAQ7iD,KAAK3O,GAAKA,EAAElR,KAAOwjE,IAEtC5d,CACX,CACA,SAAMj9B,CAAI66C,GACN,MAAM5d,EAASnjC,KAAK8gD,WAAWC,GAC/B,IAAK5d,EACD,MAAM,IAAIt7B,MAAM,UAAUk5C,eAE9B,MAAMnjE,EAAS,IAAKoiB,KAAKpiB,OAAQulD,UAO3Byd,EAAK5gD,KAAKqgD,UAAUU,GAC1B,GAAIH,EACA,OAAOA,EAAGhjE,GAGV,MAAM,IAAIiqB,MAAM,yBAGxB,EAEJ,MAAMm5C,GAA4B97D,OAAcgE,GACzC,SAAS+3D,IAA6BhlE,SAAEA,IAC3C,MAAMq1C,EAAYwK,KACZj1C,EAAQC,KACRsO,OAAEA,GAAWC,KACbuR,EAAS26B,MACPrwC,KAAMsuD,EAAKnnD,MAAEA,GAAUysB,EAAS,IAC7B1vB,EAAO4U,UAAUw1C,MAAMlJ,OAAO3tD,KAAM62D,GAChCA,EAAMxiE,IAAIyjE,IAAI,CACjBljE,GAAIkjE,EAAKljE,GACThB,KAAMkkE,EAAKlkE,KACX4N,YAAas2D,EAAKt2D,YAClBqzD,SAAS,EACTkD,YAAY,EACZjD,UAAW6B,MACX/tD,KAAK,CAAC9C,EAAG+C,IAAM/C,EAAElS,KAAK6iB,cAAc5N,EAAEjV,QAE/C,IACGgoB,EAAUtmB,EAAQ,KACpB,MAAMsmB,EAAU,IAAI27C,GAAqB,CACrC5uB,YAAWzqC,QAAOuO,SAAQwR,WAG9B,OADArC,EAAQ07C,QAAUT,EACXj7C,GACR,CAAC+sB,EAAWkuB,IACf,OAAInnD,EACOlc,EAAKyoC,EAAU,CAAEnnC,MAAO,4BAA6BxB,SAAUoc,EAAMhW,UAExEkiB,GAAY7nB,EAAMskE,GAA0Bh7D,SAAU,CAAEnJ,MAAO0nB,EAAStoB,SAAU,CAACE,EAAK+kE,GAAS,CAAA,GAAKjlE,IAClH,CACA,SAASilE,OACL,MAAM38C,EAAUy5C,KACV1sB,EAAY/sB,EAAQ3mB,OAAO0zC,UAC3BjU,EAAWiU,EAAUkK,cACrBsL,EAAYxV,EAAU+J,qBAAuBhe,EAAW,CAACA,GAAYiU,EAAUiK,eACrF,OAAQp/C,EAAK,MAAO,CAAEqE,MAAO,CAAE2sC,QAAS,QAAUlxC,SAAUsoB,EAAQ47C,WAAWnjE,IAAImmD,GAAWhnD,EAAKgnD,EAAOsa,UAAW,CAAEta,OAAQA,EAAQ2D,UAAWA,EAAW3L,aAAc7J,EAAU6J,cAAgBgI,EAAO5lD,MAChN,CACO,SAASygE,KACZ,MAAM54D,EAAMC,EAAW27D,IACvB,IAAK57D,EACD,MAAM,IAAIyiB,MAAM,6DAEpB,OAAOziB,CACX,CACO,SAASg4D,GAAyB7gE,EAAMqkE,GAC3C,MAAMx7D,EAAM44D,KAIZ,OAHAj8D,EAAU,IACCqD,EAAIu7D,iBAAiBpkE,EAAMqkE,GACnC,CAACx7D,EAAK7I,EAAMqkE,IACRx7D,CACX,CACO,SAAS+7D,GAAyBP,GACrC,MAAMx7D,EAAM44D,KAOZ,OANAj8D,EAAU,KACNqD,EAAIk7D,cAAgBM,EACb,KACHx7D,EAAIk7D,mBAAgBp3D,IAEzB,CAAC03D,EAAIx7D,IACDA,CACX,CC9IO,SAASg8D,IAA+Bje,OAAEA,EAAM2D,UAAEA,IACrD,MAAOua,EAAWC,GAAgBjiE,GAAS,GACrC89D,EAAWr3D,EAAY,KACrBghD,EAAU99C,OAAS,GACnBs4D,GAAa,GAEV7pD,QAAQqN,SAAQ,IACxB,CAACgiC,IAKJ,OADAsW,GAAyBja,EAAO5lD,GAAI4/D,GAC7BkE,GAAallE,EAAKi0C,EAAQ,CAAEn0C,SAAUE,EAAKolE,GAAuB,CAAEza,UAAWA,EAAWhoD,OAAQuiE,EAAWt5C,QAJpG,KACZu5C,GAAa,OAIrB,CACY,MAAClB,GAAwB,CACjC7iE,GAAI,kBACJhB,KAAM,oBACN4N,YAAa,gCACbqzD,SAAS,EACTC,UAAW2D,IAEf,SAASG,IAAsBziE,OAAEA,EAAMipB,QAAEA,EAAO++B,UAAEA,IAC9C,OAAQpqD,EAAM2wC,EAAQ,CAAEvuC,OAAQA,EAAQipB,QAASA,EAAS3rB,UAAW,0CAA2CH,SAAU,CAACE,EAAKmxC,EAAa,CAAElxC,UAAW,wCAAyCH,SAAU,wBAA0BE,EAAKqlE,GAAmB,CAAEplE,UAAW,0BAA2BH,SAAU,4EAA8EE,EAAK,MAAO,CAAEC,UAAW,qCAAsCH,SAAUE,EAAKslE,GAAqB,CAAE15C,QAASA,EAAS++B,UAAWA,QACrgB,CACA,SAAS2a,IAAoB15C,QAAEA,EAAO++B,UAAEA,IACpC,MAAMjgD,EAAQC,KACRsO,OAAEA,GAAWC,MACZqsD,EAAsBC,GAA2BtiE,IAClDm1D,EAAoB,EAAGrZ,mBACpBA,GAAiB2L,GAAW99C,QAGjCoM,EAAO2U,MAAM62B,YAAYmT,WAAW5Y,EAAc2L,GAAWn+C,KAAK,KAC9D9B,EAAM,CACFpJ,MAAO,4BACPmL,OAAQ,UACRuB,YAAa,SAAS28C,EAAU99C,4CAChChJ,SAAU,MAEd+nB,MACDhV,MAAM,KACLlM,EAAM,CACFpJ,MAAO,4BACPmL,OAAQ,QACRuB,YAAa,uDACbnK,SAAU,SAehB4hE,EAAO,CACT,CACIrlE,KAAM,SACNwQ,MAAO,oBACP1E,QAAU3L,EAAM,MAAO,CAAEN,UAAW,yCAA0CH,SAAU,CAACE,EAAK0lE,GAAS,CAAE7nC,MAAO,EAAG/9B,SAAU,qCAAuCE,EAAKoxC,EAAY,CAAEnxC,UAAW,qCAAsCH,SAAUE,EAAK,MAAO,CAAEC,UAAW,0CAA2CH,SAAUE,EAAKs+D,GAAkB,CAAEhuD,SAftU,CAAC0uC,EAAcl4B,KACV,iBAAjBk4B,QAAqD,IAAjBA,EAC3CwmB,EAAwBxmB,GAEnB/2C,MAAMkT,QAAQ6jC,IAAiBA,EAAanyC,OAAS,EAC1D24D,EAAwBxmB,EAAa,IAGrCwmB,OAAwBz4D,IAO+VrM,MAAO6kE,QAA+BvlE,EAAKqxC,EAAc,CAAEvxC,SAAUE,EAAKgM,EAAQ,CAAE4oD,YAAa2Q,EAAsBpiE,QAAS,IAAMoiE,GAAwBlN,EAAkB,CAAErZ,aAAcumB,IAAyBzlE,SAAU,4BAE9lB,CACIM,KAAM,SACNwQ,MAAO,aACP1E,QAASlM,EAAK,MAAO,CAAEC,UAAW,MAAOH,SAAUE,EAAKm4D,GAAsB,CAAEvsC,QAASA,EAASysC,kBAAoBj3D,GAAOi3D,EAAkB,CAAErZ,aAAc59C,IAAOg3D,UAAU,QAGxL,OAAQ73D,EAAMolE,GAAO,CAAE7N,aAAc,SAAU2N,KAAMA,EAAMG,WAAW,EAAM9lE,SAAU,CAACE,EAAK6lE,GAAU,IAAK7lE,EAAK8lE,GAAY,CAAA,KAChI,CCtEO,SAASC,KACZ,MAAM5wB,EAAYwK,KACZ16C,EAAOkwC,EAAUlwC,OACjBk9D,EAASl9D,EAAO,EAAI,IAAM,GAC1Bk6C,EAAehK,GAAWgK,eAC1B6mB,EAAqB7wB,GAAW+J,oBAItC,OAAQl/C,EAAK8kE,GAA8B,CAAEhlE,SAAUS,EAAM,MAAO,CAAEN,UAAW,4BAA6BH,SAAU,CAACq/C,IAAiB6mB,GAC1HzlE,EAAM,MAAO,CAAEN,UAAW,qCAAsCH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,iBAAkBH,SAAU,CAACmF,EAAM,YAAak9D,EAAQ,eAAiBniE,EAAKgM,EAAQ,CAAE1K,MAAO,kBAAmB2K,QAAS,QAAS9I,QAJhO,KACrBgyC,GAAWsK,aAGqQ3/C,SAAUE,EAAK8J,GAAG,CAAE7J,UAAW,gBAAoBD,EAAKimE,GAAyB,CAAE9wB,UAAWA,EAAWr1C,SAAUE,EAAKgM,EAAQ,CAAEC,QAAS,QAASrC,IAAK,cAAe3E,KAAM,KAAMnF,SAAUE,EAAKkmE,GAAkB,CAAEjhE,KAAM,SAAak6C,GAAgBn/C,EAAKmmE,GAAgB,CAAEhxB,UAAWA,QACpjB,CACA,SAASgxB,OACL,OAAOnmE,EAAKomE,GAAqB,GACrC,CACO,SAASC,IAAoBrnB,aAAEA,EAAYkJ,aAAEA,GAAe,IAC/D,MAAOjtC,EAAOktC,GAAYjlD,EAAS,KAC5BP,EAAQ2jE,GAAapjE,GAAS,GAC/BiyC,EAAYwK,KACZR,EAAehK,GAAWgK,eAKhC,OAASA,GACL5+C,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAKgM,EAAQ,CAAE7I,QAAS,IAAMmjE,GAAU,GAAOxmE,SAAU,WAAaE,EAAK6nD,GAAqB,CAAE7I,aAAcA,GAAgB,GAAIr8C,OAAQA,EAAQipB,QALtK,KACZ06C,GAAU,GACVne,EAAS,KAG2LltC,MAAOA,EAAO3Z,MAAO,eAAgBymD,iBAAmBjmB,IACxOA,GAAUA,EAAOp0B,SACjBy6C,EAAS,KAEdD,aAAcA,MACrC,CACA,SAASke,KACL,MAAMn9D,EAAM44D,KAGZ,OAFkB54D,EAAIxH,OAAO0zC,UACEgK,gBAE3Bn/C,EAAKgM,EAAQ,CAAE7I,QAAS,IAAM8F,EAAI8gB,IAAIw5C,GAAoBniE,IAAKtB,SAAU,kBACjF,CACA,SAAS4jE,GAAaxzD,GAClB,MAAO,CACHU,MAAOV,EAAO9P,KACdH,UAAWmC,EAAK,0CAA2C8N,EAAOmyD,YAAc,mBAAqB,IAE7G,CACA,SAAS4D,IAAwB9wB,UAAEA,EAASr1C,SAAEA,IAC1C,MAAMsoB,EAAUy5C,KAIhB,OAAQthE,EAAMosB,EAAS,CAAEC,OAAO,EAAM9sB,SAAU,CAACE,EAAK6sB,EAAgB,CAAE/sB,SAAUA,IAAaE,EAAK+sB,EAAgB,CAAE9sB,UAAW,WAAY+sB,MAAO,MAAOwtB,WAAY,EAAG16C,SAAUE,EAAKumE,GAAa,CAAEC,cAHjLxf,IACnB5+B,EAAQ2B,IAAIi9B,EAAO5lD,KAE+M+zC,UAAWA,QACrP,CACA,SAASoxB,IAAYC,cAAEA,EAAarxB,UAAEA,IAClC,MAAM/sB,EAAUy5C,KAIV4E,EAAatxB,GAAWgK,eAAiB/2B,EAAQg8C,QAAQjoD,OAAO6qC,IAAWA,EAAOwc,YAAc,CAACT,IACvG,OAAQ/iE,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAUE,EAAK,MAAO,CAAEC,UAAW,eAAgBH,SAAUE,EAAK6jE,GAAY,CAAE51D,QAASw4D,EAAY/C,aAAcA,GAAcpzD,SAJvK02C,IACpBwf,EAAcxf,IAGuM0f,SAAS,OACtO,CC7De,SAASC,IAAaC,OAAEA,EAAMC,OAAEA,EAAMl2D,SAAEA,GAAW,EAAKm2D,UAAEA,GAAY,EAAKC,WAAEA,GAAa,EAAK9nD,YAAEA,GAAc,EAAKoF,YAAEA,GAAc,EAAK2iD,gBAAEA,EAAkB,EAACz4D,YAAEA,EAAc,uBAAsB04D,gBAEnNA,EAAerc,cAAEA,EAAgB,GAAEsc,aAAEA,EAAYC,kBAAEA,EAAoB,kEAAiEC,SAAEA,EAAW,EAACC,gBAAEA,EAAeC,mBAAEA,GAAqB,EAAKC,qBAEnMA,EAAoBC,kBAAEA,EAAoB,GAAEC,iBAAEA,EAAgBC,kBAE9DA,GAAoB,EAAKznE,UAEzBA,EAASkP,eAAEA,IACP,MAAM9N,EAAMuO,EAAO,MACb+3D,EAAe/3D,EAAO,OACrBlP,EAAO6wD,GAAYruD,EAAS,KAC5B0kE,EAAmBC,GAAwB3kE,GAAS,IACpD4kE,EAAiBC,GAAsB7kE,GAAS,IAChD8kE,EAAYC,GAAiB/kE,GAAS,GAC7C0C,EAAU,MACD+K,GAAY0T,GACbhjB,EAAI8U,SAASgc,SAClB,CAACxhB,EAAU0T,IAEd,MAAM6jD,EAAcv+D,EAAasR,IAC7B,IAAKgsD,EACD,OACJ,MAAMkB,EAAYlgE,MAAMgJ,KAAKgK,GACvBmtD,EAAiBhB,EAAWxc,EAAc/9C,OAC1Cw7D,EAAaF,EAAUnpD,MAAM,EAAGopD,GAClCC,EAAWx7D,OAAS,GACpBo6D,EAAgBoB,IAErB,CAACpB,EAAiBG,EAAUxc,EAAc/9C,SAEvCuiD,EAAiBzlD,EAAaO,IAChCA,EAAEoH,iBACFpH,EAAEC,kBACE88D,GACAgB,GAAc,IAEnB,CAAChB,IACEqB,EAAkB3+D,EAAaO,IACjCA,EAAEoH,iBACFpH,EAAEC,kBACF89D,GAAc,IACf,IACGM,EAAa5+D,EAAaO,IAC5BA,EAAEoH,iBACFpH,EAAEC,kBACF89D,GAAc,GACV/9D,EAAEylD,cAAc10C,OAAS/Q,EAAEylD,aAAa10C,MAAMpO,OAAS,GACvDq7D,EAAYh+D,EAAEylD,aAAa10C,QAEhC,CAACitD,IAEEM,EAAc7+D,EAAaO,IAC7B,IAAK+8D,EACD,OACJ,MAAMh8D,EAAQf,EAAEu+D,eAAex9D,MAC/B,IAAKA,EACD,OACJ,MAAMgQ,EAAQ,GACd,IAAK,IAAI3Y,EAAI,EAAGA,EAAI2I,EAAM4B,OAAQvK,IAAK,CACnC,MAAMwK,EAAO7B,EAAM3I,GACnB,GAAkB,SAAdwK,EAAKgI,KAAiB,CACtB,MAAM2K,EAAO3S,EAAK8iD,YAClB,GAAInwC,EAEA,IAAI3S,EAAKrM,KAAKib,WAAW,WAAe+D,EAAKrf,MAAsB,cAAdqf,EAAKrf,KAQtD6a,EAAM1I,KAAKkN,OARkE,CAC7E,MAAMipD,EAAY57D,EAAKrM,KAAKmb,MAAM,KAAK,IAAM,MACvC+sD,EAAY,IAAIC,KAAK,CAACnpD,GAAO,gBAAgBzY,KAAKC,SAASyhE,IAAa,CAC1EjoE,KAAMgf,EAAKhf,OAEfwa,EAAM1I,KAAKo2D,EACf,CAKR,CACJ,CACI1tD,EAAMpO,OAAS,GACfq7D,EAAYjtD,IAEjB,CAACgsD,EAAiBiB,IAEfW,EAAwBl/D,EAAaO,IACnCA,EAAEF,OAAOiR,OAAS/Q,EAAEF,OAAOiR,MAAMpO,OAAS,IAC1Cq7D,EAAYh+D,EAAEF,OAAOiR,OAErB/Q,EAAEF,OAAOtJ,MAAQ,KAEtB,CAACwnE,IACEY,EAAiBn/D,EAAY,KAC/Bg+D,EAAaxxD,SAASuxB,SACvB,IAEGqhC,EAAuBp/D,EAAapI,IAEtC,MAAMynE,EAAe,OAAOznE,EAAInB,aAAamB,EAAIH,MAC3C6nE,EAAevoE,GAAS,GACxBwoE,EAAY7nE,EAAI8U,SAASgzD,gBAAkBF,EAAap8D,OACxDu8D,EAAWH,EAAa9lD,UAAU,EAAG+lD,GAAaF,EAAeC,EAAa9lD,UAAU+lD,GAC9F3X,EAAS6X,GACTrB,GAAmB,IACpB,CAACrnE,IACE2oE,EAAa,KACf,MAAMnjE,EAAUxF,EAAMsP,QACjB9J,GAAWyK,GAAYm2D,IAE5BF,EAAO1gE,GACPqrD,EAAS,MAEP+X,EAAa,KACXzC,IAAWE,GACXF,KAIF0C,GAAgB35D,EAAO,GA0BvB45D,GAAuB7/D,EAAY,KACrC,MAAM8/D,EAAWpoE,EAAI8U,QACjBszD,IACAA,EAASplE,MAAMb,OAAS,OACxBimE,EAASplE,MAAMb,OAAS,GAAG8D,KAAKG,IAAIgiE,EAASC,aAAc,WAEhE,IACH9jE,EAAU,KACN4jE,MACD,CAAC9oE,EAAO8oE,KACX,MAuBMG,GAAiB/e,EAAc/9C,OAAS,GAAK26D,EAAkB36D,OAAS,GAAMw6D,GAAmBA,EAAgBpiE,KAAO,EAC9H,OAAQ1E,EAAM,MAAO,CAAEN,UAAW,mEAAmE+nE,EAAa,iDAAmD,MAAM/nE,GAAa,KAAMoE,MAAO,CAAEulE,UAAW,SAAWva,WAAYD,EAAgBG,YAAa+Y,EAAiB5b,OAAQ6b,EAAYzoE,SAAU,CAACkoE,GAAehoE,EAAK,MAAO,CAAEC,UAAW,2HAA4HH,SAAUS,EAAM,MAAO,CAAEN,UAAW,uEAAwEH,SAAU,CAACE,EAAKusD,GAAY,CAAEtsD,UAAW,WAAa,4BAAgCgnE,GAAoBjnE,EAAK,QAAS,CAAEqB,IAAKsmE,EAAclnE,KAAM,OAAQ42C,UAAU,EAAMwyB,OAAQ1C,EAAmB72D,SAAUu4D,EAAuB5oE,UAAW,WAAc0pE,IAAmBppE,EAAM,MAAO,CAAEN,UAAW,2BAA4BH,SAAU,EAAE8qD,EAAc/9C,OAAS,GAAMw6D,GAAmBA,EAAgBpiE,KAAO,IAAQ1E,EAAM,MAAO,CAAET,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,+BAAgCH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAU,mBAAqBE,EAAK6Q,EAAU,CAAE7C,YAAa,sGAAuG8C,UAAW,MAAO7L,KAAM,KAAMnF,SAAUE,EAAK8pE,GAAgB,CAAE7pE,UAAW,iDAAqDM,EAAM,MAAO,CAAEN,UAAW,uBAAwBH,SAAU,CAAC8qD,EAAc/pD,IAAK4e,GAAUlf,EAAM,MAAO,CAAEN,UAAW,sFAAuFH,SAAU,CAACE,EAAK+pE,GAAc,CAAE9pE,UAAW,2BAA6BD,EAAK,OAAQ,CAAEC,UAAW,yBAA0BH,SAAU2f,EAAKrf,OAAS8mE,GAAiBlnE,EAAK,SAAU,CAAEmD,QAAS,IAAM+jE,EAAaznD,EAAKre,IAAKnB,UAAW,8DAA+DH,SAAUE,EAAK0sB,GAAO,CAAEzsB,UAAW,eAAoBwf,EAAKre,KAAOimE,GAAmBp/D,MAAMgJ,KAAKo2D,EAAgBllE,UAAUtB,IAAK4e,GAAUlf,EAAM,MAAO,CAAEN,UAAW,2DAA0Dwf,EAAKhT,SAAWu9D,GAAqBjyD,MACxoE,qCACA0H,EAAKhT,SAAWu9D,GAAqBC,MACjC,6BACA,kCAAoCnqE,SAAU,CAAC2f,EAAKhT,SAAWu9D,GAAqBE,WAAclqE,EAAK8pC,EAAS,CAAE7kC,KAAM,OAAUwa,EAAKhT,SAAWu9D,GAAqBG,YAAenqE,EAAK8pC,EAAS,CAAE7kC,KAAM,OAAUwa,EAAKhT,SAAWu9D,GAAqBC,OAAUjqE,EAAKoqE,GAAW,CAAEnqE,UAAW,aAAgBwf,EAAKhT,SAAWu9D,GAAqBjyD,OAAU/X,EAAK0sB,GAAO,CAAEzsB,UAAW,aAAgBD,EAAK,OAAQ,CAAEC,UAAW,yBAA0BH,SAAU2f,EAAKrf,OAASG,EAAM,OAAQ,CAAEN,UAAW,qBAAsBH,SAAU,CAAC2f,EAAKhT,SAAWu9D,GAAqBE,WAAa,eAAgBzqD,EAAKhT,SAAWu9D,GAAqBG,YAAc,gBAAiB1qD,EAAKhT,SAAWu9D,GAAqBC,OAAS,QAASxqD,EAAKhT,SAAWu9D,GAAqBjyD,QAAU0H,EAAKvD,OAAS,cAAiBuD,EAAKre,WAAgBomE,EAAkB36D,OAAS,GAAMtM,EAAM,MAAO,CAAET,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,+BAAgCH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAU,yBAA2BE,EAAK6Q,EAAU,CAAE7C,YAAa,0IAA2I8C,UAAW,MAAO7L,KAAM,KAAMnF,SAAUE,EAAK8pE,GAAgB,CAAE7pE,UAAW,iDAAqDD,EAAK,MAAO,CAAEC,UAAW,uBAAwBH,SAAU0nE,EAAkB3mE,IAAKU,GAAShB,EAAM,MAAO,CAAEN,UAAW,0HAA2HH,SAAU,CAACE,EAAK+pE,GAAc,CAAE9pE,UAAW,aAAeD,EAAK,OAAQ,CAAEC,UAAW,yBAA0BH,SAAUyB,EAAInB,OAASqnE,GAAqBznE,EAAK,SAAU,CAAEmD,QAAS,IAAMskE,EAAiBlmE,EAAIH,IAAKnB,UAAW,8DAA+DH,SAAUE,EAAK0sB,GAAO,CAAEzsB,UAAW,eAAoBsB,EAAIH,cAAqB6lE,GAAmBM,IAA0BhnE,EAAM,MAAO,CAAEN,UAAW,kBAAmBH,SAAU,CAACmnE,GAAoB1mE,EAAMyL,EAAQ,CAAEC,QAAS,UAAWhH,KAAM,KAAM9B,QAAS2lE,EAAgBn4D,SAAUA,GAAYi6C,EAAc/9C,QAAUu6D,EAAUnnE,UAAW,UAAWH,SAAU,CAACE,EAAKusD,GAAY,CAAEtsD,UAAW,oBAAsB,YAAesnE,GAAyBhnE,EAAMyL,EAAQ,CAAEC,QAAS,UAAWhH,KAAM,KAAM9B,QAAS,IAAM4kE,GAAmB,GAAOp3D,SAAUA,EAAU1Q,UAAW,UAAWH,SAAU,CAACE,EAAK+pE,GAAc,CAAE9pE,UAAW,oBAAsB,yBAA8BM,EAAM,MAAO,CAAEN,UAAW,2BAA4BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,kCAAmCH,SAAU,CAACE,EAAK,WAAY,CAAEqB,IAAKA,EAAKX,MAAOA,EAAOyQ,UA/DztFjH,IACb,GAAc,UAAVA,EAAEkH,MAAoBlH,EAAEmH,SAAU,CAClCnH,EAAEoH,iBACiB5Q,EAAMsP,OAAOnD,OAAS,GAGrCw8D,GAGR,CAEA,GAAc,WAAVn/D,EAAEkH,KAAoB6N,GAAe4nD,EAAQ,CAC7C,MAAM5/D,EAAMD,KAAKC,MACbA,EAAMsiE,GAAcpzD,QAAU,KAE9BmzD,IACAC,GAAcpzD,QAAU,GAGxBozD,GAAcpzD,QAAUlP,CAEhC,GA0C0vFqJ,SAAWpG,GAAMqnD,EAASrnD,EAAEF,OAAOtJ,OAAQ2pE,QAAS7B,EAAa73D,SAAUA,EAAUpC,YAAa0Q,EAAc,wCAA2CgoD,EAAkB,wCAA0C14D,EAActO,UAAW,uRAAuRkP,GAAkB,KAAMm7D,KAAM,EAAGjmE,MAAO,CAAEulE,UAAW,OAAQW,UAAW,YAAe7C,GAAsB1nE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShM,UAAW,eAAgB0Q,UAAW0T,EAAalhB,QAAS,IAAM0kE,GAAqB,GAAOj+D,IAAK,cAAe9J,SAAUE,EAAKwqE,GAAe,CAAEvqE,UAAW,gBAAqBgf,GAAe4nD,IAAWnmE,EAAMsP,OAAUzP,EAAMyL,EAAQ,CAAE7I,QAASmmE,EAAY34D,SAAUo2D,EAAY9mE,UAAW,qDAAsDqB,MAAO,iBAAkBxB,SAAU,CAACinE,EAAa/mE,EAAK8pC,EAAS,CAAE7kC,KAAM,KAAMhF,UAAW,SAAYD,EAAKyqE,GAAgB,CAAExqE,UAAW,gBAAkB,WAAgBM,EAAMyL,EAAQ,CAAE7I,QAASkmE,EAAY14D,SAAUA,GAAYm2D,IAAcpmE,EAAMsP,QAAUs3D,EAAoBrnE,UAAW,cAAeqB,MAAOgmE,EAAqB,2CAAwCv6D,EAAWjN,SAAU,CAACgnE,EAAY9mE,EAAK8pC,EAAS,CAAE7kC,KAAM,KAAMhF,UAAW,SAAYD,EAAK0qE,GAAU,CAAEzqE,UAAW,gBAAkBqnE,EAAqB,gBAAkB,aAAiBtnE,EAAK,MAAO,CAAEC,UAAW,sCAAuCH,SAAUknE,EAAkB,EAAKzmE,EAAM,MAAO,CAAEN,UAAW,mCAAoCH,SAAU,CAACE,EAAK2qE,GAAU,CAAE1qE,UAAW,gCAAkCM,EAAM,OAAQ,CAAET,SAAU,CAAC,aAAcknE,EAAiB,qBAA0C,IAApBA,EAAwB,IAAM,GAAI,iBAAsB/nD,EACvnJ,iEACAtO,EACI,6DACA,8CAAgD+2D,GAAsBnnE,EAAM2wC,EAAQ,CAAEvuC,OAAQilE,EAAmBh8C,QAAS,IAAMi8C,GAAqB,GAAQ5nE,UAAW,eAAgBH,SAAU,CAACE,EAAKmxC,EAAa,CAAErxC,SAAU,gBAAkBE,EAAKoxC,EAAY,CAAEnxC,UAAW,OAAQH,SAAUE,EAAKwwD,GAAgB,CAAElgD,SAhCpTgkB,IAExB,MAEM00C,EAAe,IAFD10C,EAAOxxB,YAAYxB,OAASgzB,EAAOl0B,MAAQ,mBAC9Ck0B,EAAOlzB,MAGlB6nE,EAAevoE,GAAS,GACxBwoE,EAAY7nE,EAAI8U,SAASgzD,gBAAkBF,EAAap8D,OACxDu8D,EAAWH,EAAa9lD,UAAU,EAAG+lD,GAAaF,EAAeC,EAAa9lD,UAAU+lD,GAE9F3X,EAAS6X,GAETvB,GAAqB,GAErBvmD,WAAW,KACP,GAAIjgB,EAAI8U,QAAS,CACb9U,EAAI8U,QAAQgc,QAEZ,MAAMy4C,EAAe1B,EAAYF,EAAan8D,OAC9CxL,EAAI8U,QAAQ00D,kBAAkBD,EAAcA,EAChD,GACD,aAWkXrD,GAAwBA,EAAqB,CAC1Z5kE,OAAQmlE,EACRl8C,QAAS,IAAMm8C,GAAmB,GAClC75D,SAAU66D,MAE1B,CCvGA,MAAM+B,GAAyBv7D,EAAMjF,KAxFrC,UAAyCygE,KAAEA,EAAIC,iBAAEA,EAAgBroE,OAAEA,EAAMipB,QAAEA,EAAOq/C,MAAEA,EAAQ,GAAEC,gBAAEA,EAAkB,EAACC,aAAEA,EAAe,SAEhI,OAAKxoE,EAIGpC,EAAM,MAAO,CAAEN,UAAW,0DAA2DH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,iEAAkEH,SAAU,CAACE,EAAK,KAAM,CAAEC,UAAW,sBAAuBH,SAAU,SAAWS,EAAMyL,EAAQ,CAAEC,QAAS,QAAS9I,QAASyoB,EAAS9rB,SAAU,CAACE,EAAK8J,GAAG,CAAE7J,UAAW,WAAaD,EAAK,OAAQ,CAAEC,UAAW,UAAWH,SAAU,gBAAoBS,EAAM,MAAO,CAAEN,UAAW,sBAAuBoE,MAAO,CAC/db,OAAQ,oBACR+mE,UAAW,uBACZzqE,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,iDAAkDH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,qCAAsCH,SAAU,kBAAoBE,EAAK,MAAO,CAAEC,UAAW,0BAA2BH,SAAU,MAE5O,MAAMsrE,EAAYL,EAAKA,MAAQ,GACzBM,EAAaD,EAAUv+D,OAE7B,IAAIy+D,EAAiB,EACjBD,EAAa,GAEbD,EAAUz2D,QAAS42D,IACf,GAAIA,GAAQA,EAAKnqE,GAAI,CACjB,MAAMoqE,EAASD,EAAKnqE,GAAG4jB,WAEJ,cADAgmD,EAAiBt2D,IAAI82D,IAEpCF,GAER,IAIR,MAAMG,EAAqBJ,EAAa,EAClC/jE,KAAKiyB,MAAO+xC,EAAiBD,EAAc,KAC3C,EACN,OAAQ9qE,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,mCAAoCH,SAAUE,EAAK,MAAO,CAAEC,UAAW,iCAAkCoE,MAAO,CAAEkC,MAAO,GAAGklE,UAA+BzrE,EAAK,OAAQ,CAAEC,UAAW,qBAAsBH,SAAUurE,EAAa,EAAI,GAAGC,KAAkBD,IAAe,UAC5U,EAvB+O,QAuBnOJ,EAAMp+D,OAAS,GAAMtM,EAAM,MAAO,CAAEN,UAAW,yCAA0CH,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAS9I,QAAS,IAAMgoE,EAAa7jE,KAAKG,IAAIwjE,EAAMp+D,OAAS,EAAGq+D,EAAkB,IAAKv6D,SAAUu6D,GAAmBD,EAAMp+D,OAAS,EAAG/M,SAAU,eAAiBE,EAAK,MAAO,CAAEC,UAAW,qBAAsBH,SAAUmrE,EAAMC,IAAkBh5D,UACrX,IAAIlL,KAAKikE,EAAMC,GAAiBh5D,WAAWw5D,qBAC3C,iBAAmB1rE,EAAKgM,EAAQ,CAAEC,QAAS,QAAS9I,QAAS,IAAMgoE,EAAa7jE,KAAKE,IAAI,EAAG0jE,EAAkB,IAAKv6D,SAAUu6D,GAAmB,EAAGprE,SAAU,kBAAsBS,EAAM,MAAO,CAAEN,UAAW,oCAAqCH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,wCAAyCH,SAAUE,EAAK,MAAO,CAAEC,UAAW,sBAAuBH,SAAU,wBAA2BE,EAAK,MAAO,CAAEC,UAAW,qEAAsEH,SAAUirE,EAAKA,MAAQA,EAAKA,KAAKl+D,OAAS,EAAKk+D,EAAKA,KAAKlqE,IAAI,CAAC0qE,EAAM3iE,KAEnkB,MAAM4iE,EAASD,EAAKnqE,GAAKmqE,EAAKnqE,GAAG4jB,WAAa,QAAQpc,IAChD+iE,EAAWJ,EAAKK,MAAQ,QAAQhjE,EAAQ,IAE9C,IAAI6D,EAAS8+D,EAAK9+D,QAAU,UACxBu+D,EAAiB56D,IAAIo7D,KACrB/+D,EAASu+D,EAAiBt2D,IAAI82D,IAGlC,IAAIK,EAAaC,GACb13B,EAAc,aASlB,MARe,gBAAX3nC,GACAo/D,EAAaj0D,GACbw8B,EAAc,aAEE,cAAX3nC,IACLo/D,EAAapgE,GACb2oC,EAAc,gBAEV7zC,EAAM,MAAO,CAAEN,UAAW,gBAAiBH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,uCAAwCH,SAAU0rE,IAAWjrE,EAAM,MAAO,CAAEN,UAAW,SAAUH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,sCAAuCH,SAAU6rE,IAAaprE,EAAM,MAAO,CAAEN,UAAW,qCAAsCH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,6BAA6Bm0C,IAAet0C,SAAUE,EAAK6rE,EAAY,CAAE5rE,UAAW,eAAkBD,EAAKH,EAAO,CAAEoM,QAAoB,cAAXQ,EAAyB,UAAuB,gBAAXA,EAA2B,OAAS,UAAW3M,SAAqB,cAAX2M,EACvjB,YACW,gBAAXA,EACI,cACA,oBAAyB7D,KAC5DrI,EAAM,MAAO,CAAEN,UAAW,oCAAqCH,SAAU,CAACE,EAAK0L,GAAa,CAAEzL,UAAW,uCAAyCD,EAAK,IAAK,CAAEC,UAAW,UAAWH,SAAU,kCAAoCE,EAAK,IAAK,CAAEC,UAAW,eAAgBH,SAAU,8DAAoE,MAEtW,MAAMisE,EAAc,IAAIr8D,KAAKq7D,EAAKA,MAAQ,IACrC5uD,OAAQovD,GAASA,GAAQA,EAAKnqE,IAC9BP,IAAK0qE,GAASA,EAAKnqE,GAAG4jB,aAErBgnD,EAAoB/jE,MAAMgJ,KAAK+5D,EAAiB3vD,WAAWc,OAAO,EAAE/a,KAAe,SAAPA,IAAkB2qE,EAAY37D,IAAIhP,IAEpH,OAAO4qE,EAAkBn/D,OAAS,EAAKtM,EAAM,MAAO,CAAEN,UAAW,8DAA+DH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,mFAAoFH,SAAUE,EAAK,MAAO,CAAEC,UAAW,sBAAuBH,SAAU,kBAAqBE,EAAK,MAAO,CAAEC,UAAW,MAAOH,SAAUE,EAAK,MAAO,CAAEC,UAAW,yBAA0BH,SAAUksE,EAAkBnrE,IAAI,EAAEO,EAAIqL,MAChc,IAAIo/D,EAAaC,GACb13B,EAAc,gBACd63B,EAAW,+BACX/pC,EAAa,UAajB,MAZe,gBAAXz1B,GACAo/D,EAAaj0D,GACbw8B,EAAc,YACd63B,EAAW,aACX/pC,EAAa,eAEG,cAAXz1B,IACLo/D,EAAapgE,GACb2oC,EAAc,eACd63B,EAAW,gBACX/pC,EAAa,aAET3hC,EAAM,MAAO,CAAEN,UAAW,mCAAmCgsE,IAAYnsE,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,UAAUm0C,IAAet0C,SAAUE,EAAK6rE,EAAY,CAAE5rE,UAAW,kBAAqBD,EAAK,MAAO,CAAEC,UAAW,SAAUH,SAAUE,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAUsB,MAAUpB,EAAK,OAAQ,CAAEC,UAAW,sBAAuBH,SAAUoiC,MAAkB9gC,YAC/Z,IACnC,EA3ByW,SAxD/W,IAoFf,GCzFO,SAASgD,MAAM8nE,GAClB,OAAOC,GAAQ/pE,EAAK8pE,GACxB,CCkLA,MAAME,GAAqBrjE,OAAcgE,GCzKzC,SAASs/D,IAAiBnwD,MAAEA,EAAKowD,WAAEA,IAC/B,OAAQtsE,EAAK,MAAO,CAAEC,UAAW,mFAAoFH,SAAUS,EAAM,MAAO,CAAEN,UAAW,cAAeH,SAAU,CAACS,EAAM,IAAK,CAAEN,UAAW,qDAAsDH,SAAU,CAAC,iBAAkBwsE,GAAc,YAAa,YAActsE,EAAK,IAAK,CAAEC,UAAW,gEAAiEH,SAAUoc,QAC7a,CAEA,SAASqwD,IAAiB5pE,OAAEA,EAAMipB,QAAEA,EAAOtqB,MAAEA,EAAK0M,YAAEA,EAAWlO,SAAEA,IAC7D,OAAQE,EAAKwsE,GAAgBC,KAAM,CAAEnjE,KAAM3G,EAAQ+pE,aAAepjE,IAAUA,GAAQsiB,IAAW9rB,SAAUS,EAAMisE,GAAgBv4B,OAAQ,CAAEn0C,SAAU,CAACE,EAAKwsE,GAAgBG,QAAS,CAAE1sE,UAAW,wMAA0MM,EAAMisE,GAAgB7kC,QAAS,CAAE1nC,UAAW,2YAA4Y2sE,gBAAiBhhD,EAAS9rB,SAAU,CAACE,EAAKwsE,GAAgBK,MAAO,CAAE97D,SAAS,EAAMjR,SAAUE,EAAK,SAAU,CAAEmD,QAASyoB,EAAS3rB,UAAW,gLAAiL,aAAc,mBAAoBH,SAAUE,EAAK8J,GAAG,CAAE7J,UAAW,iDAAqDD,EAAK,MAAO,CAAEC,UAAW,8EAA+EH,SAAUA,IAAaE,EAAK,MAAO,CAAEC,UAAW,mJAAoJH,SAAUS,EAAM,MAAO,CAAEN,UAAW,gBAAiBH,SAAU,CAACE,EAAKwsE,GAAgBM,MAAO,CAAE7sE,UAAW,2DAA4DH,SAAUwB,GAAS,cAAgB0M,GAAgBhO,EAAKwsE,GAAgBO,YAAa,CAAE9sE,UAAW,kDAAmDH,SAAUkO,gBACt2D,CAwBA,MAAMg/D,GAAe,CAEjBC,YAAa,CACT,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGJC,MAAO,CAAC,UAAW,UAAW,UAAW,UAAW,WACpDC,QAAS,CAAC,UAAW,UAAW,UAAW,UAAW,WAGtDC,UAAW,CAAC,UAAW,UAAW,UAAW,UAAW,YAmJ5D,SAASC,GAAaC,EAAMC,GACxB,IAAKD,IAASA,EAAKE,SACf,OAAO,EACX,IAAK,MAAMnrB,KAASkrB,EAChB,IAAK,MAAME,KAAWnrD,OAAOngB,OAAOmrE,EAAKE,UACrC,GAAIC,GAA8B,iBAAZA,GAAwBA,EAAQprB,QAAUA,EAC5D,OAAO,EAKnB,GAAIp6C,MAAMkT,QAAQmyD,EAAKI,OACnB,IAAK,MAAMA,KAASJ,EAAKI,MACrB,GAAIL,GAAaK,EAAOH,GACpB,OAAO,EAGnB,OAAO,CACX,CAIA,SAASI,GAAqBL,EAAMC,GAChC,IAAKD,EACD,OAAO,EACX,MAAMM,EAAiBJ,IACnB,IAAKA,EACD,OAAO,EACX,MAAMK,EAAaL,EAAS/oE,OAAO49C,MACnC,OAAOwrB,GAAcN,EAAOj0D,SAASu0D,IAEzC,GAAID,EAAcN,EAAKE,UACnB,OAAO,EAEX,GAAIvlE,MAAMkT,QAAQmyD,EAAKI,OACnB,IAAK,MAAMA,KAASJ,EAAKI,MACrB,GAAIE,EAAcF,EAAMF,UACpB,OAAO,EAGnB,OAAO,CACX,CAKA,SAASM,GAAuBC,EAAMC,EAAc,IAChD,MAAMC,EAAa,GACnB,IAAKF,GAAwB,iBAATA,EAChB,OAAOE,EAGX,GAAIF,EAAKh5D,MAA6B,iBAAdg5D,EAAKh5D,KAAmB,CAC5C,MAAMsB,EAAM03D,EAAKh5D,KAAKsB,IACH,iBAARA,GAAoBA,EAAIqF,WAAW,cAC1CuyD,EAAW17D,KAAK,CACZ0E,KAAM,IAAI+2D,EAAa,QACvBvyD,aAAcpF,EAAIoD,QAAQ,aAAc,IAAIzJ,QAGxD,CAEA,MAAMk+D,EAAa,CAAC,QAAS,UAAW,UAAW,SAAU,OAAQ,SAAU,SAC/E,IAAK,MAAM98D,KAAO88D,EACd,GAAI98D,KAAO28D,EAAM,CACb,MAAMrtE,EAAQqtE,EAAK38D,GACfnJ,MAAMkT,QAAQza,GACdA,EAAMiU,QAAQ,CAAC7H,EAAMlE,KACjBqlE,EAAW17D,QAAQu7D,GAAuBhhE,EAAM,IAAIkhE,EAAa58D,EAAKiI,OAAOzQ,QAG3D,iBAAVlI,GAAgC,OAAVA,GAClCutE,EAAW17D,QAAQu7D,GAAuBptE,EAAO,IAAIstE,EAAa58D,IAE1E,CAEJ,OAAO68D,CACX,CA8IY,MAACE,GAAgB7jE,EAAK,UAAuByjE,KAAEA,EAAI3zD,cAAEA,IAC7D,MAAM9Y,MAAEA,EAAK0M,YAAEA,EAAa+/D,KAAMK,EAAQngE,QAAEA,GAAY8/D,GACjDhX,EAAayL,GAAkBt/D,GAAS,IACxCmrE,EAAUC,GAAeprE,GAAS,IAClCgZ,EAAO6b,GAAY70B,EAAS,OAC5BwmC,EAAcC,GAAmBzmC,GAAS,GAC3CqrE,EAAU3+D,EAAO,MACjB4+D,EAAoB5+D,EAAO,MAC3B0U,EAAe1U,EAAO,OAEtBqJ,OAAEA,GD/PL,WACH,MAAM8+C,EAAU7uD,EAAWkjE,IAC3B,IAAKrU,EACD,MAAM,IAAIrsC,MAAM,4DAEpB,OAAOqsC,CACX,CCyPuB7+C,GACbC,EAAWrC,MACV23D,EAAcC,GAAmBxrE,EAAS,OAC1CyrE,EAAoBC,GAAyB1rE,GAAS,IACtD2rE,EAAeC,GAAoB5rE,EAAS,MAE7Cc,EAAOiK,GAASjK,MAAQ,QACxB+qE,EAAuB,cAAT/qE,EACdgrE,EAAuB/gE,GAASghE,kBAAoBF,EAEpDG,EAAajhE,GAASzK,QA3ahC,SAA6BuqE,EAAM/pE,GAC/B,GAAa,UAATA,EACA,OAbqB,IAgBzB,IAAImrE,EAAW,EACf,GAAIpB,EAAKqB,QACLD,EAAWlnE,MAAMkT,QAAQ4yD,EAAKqB,SAAWrB,EAAKqB,QAAQviE,OAAS,OAE9D,GAAIkhE,EAAK7oB,OAAQ,CAClB,MAAMpC,EAAUirB,EAAKjrB,SAAW,EAC1B73C,EAAQhD,MAAMkT,QAAQ4yD,EAAK7oB,QAAU6oB,EAAK7oB,OAAOr4C,OAAS,EAChEsiE,EAAW7nE,KAAK+0B,KAAKpxB,EAAQ63C,EACjC,MACSirB,EAAKzvB,QAEV6wB,EAAW,GAGf,OAAO7nE,KAAKE,IA7BiB,IA6BwB,IAAX2nE,EAAiB,GAC/D,CAuZ0CE,CAAoBjB,EAAUpqE,GAEpE4B,EAAU,KACN,MAAMqoE,EAAaH,GAAuBM,GAE1C,GAA0B,IAAtBH,EAAWphE,OAIX,OAHA6hE,EAAgBN,GAChBQ,GAAsB,QACtBE,EAAiB,MAGrB,IAAI9uD,GAAY,EAChB4uD,GAAsB,GACtBE,EAAiB,MAuFjB,MAtFyBv4D,WACrB,MAAM+4D,EAAe,IAAIn7D,IACzB,IAAK,MAAM9S,KAAO4sE,EACd,IACI,MAAMsB,EAAUluE,EAAI4V,KAAKmE,KAAK,KAC9B,IAAI/E,EAEJ,GAAI+D,IAAkB/Y,EAAIoa,aAAaC,WAAW,WAAY,CAE1D,MAAMK,EAAWhF,GAAoBqD,EAAe/Y,EAAIoa,aAAc,UACtE,GAAItC,EACA9C,QAAY8C,EAAS7C,WAAWyF,EAAUxF,gBACjB0C,EAAOgC,MAAMe,uBAAuB5B,EAAe/Y,EAAIoa,aAAc,WAC5EpF,SAGjB,CAEDA,SADqB4C,EAAOgC,MAAMe,uBAAuB5B,EAAe/Y,EAAIoa,aAAc,WAC7EpF,GACjB,CACJ,KACK,CAED,MAAM0F,EAAW5E,GAAgB9V,EAAIoa,cACrC,GAAItC,EACA9C,QAAY8C,EAAS7C,WAAWyF,EAAUxF,gBACjB0C,EAAOgC,MAAMuS,eAAensB,EAAIoa,eACvCpF,SAGjB,CAEDA,SADqB4C,EAAOgC,MAAMuS,eAAensB,EAAIoa,eACxCpF,GACjB,CACJ,CAEA,MAAMoa,QAAiBsR,MAAM1rB,GAC7B,IAAKoa,EAASwR,GACV,MAAM,IAAIvW,MAAM,kCAAkC+E,EAASyR,cAI/D,IAAIntB,EACJ,GAFc1T,EAAIoa,aAAa5B,cAAc21D,SAAS,QAE3C,CAEP,MAAMC,QAAgBh/C,EAASrqB,OACzBspE,EAAcC,GAAKz4C,MAAMu4C,EAAS,CACpCG,QAAQ,EACRC,gBAAgB,EAChBC,eAAe,IAEfJ,EAAYtkD,OAAOve,OAAS,GAC5BoG,QAAQ2d,KAAK,0BAA0BvvB,EAAIoa,gBAAiBi0D,EAAYtkD,QAE5ErW,EAAO26D,EAAY36D,IACvB,KACK,CAED,MAAMg7D,QAAiBt/C,EAASiF,OAChC3gB,EAAO9M,MAAMkT,QAAQ40D,GAAYA,EAAW,CAACA,EACjD,CAEA98D,QAAQC,IAAI,YAAY7R,EAAIoa,wBAAwB1G,EAAKlI,eAEpDkI,GAAwB,IAAhBA,EAAKlI,QACdoG,QAAQ2d,KAAK,YAAYvvB,EAAIoa,qCAEjC6zD,EAAa96D,IAAI+6D,EAASx6D,EAC9B,CACA,MAAO8B,GAKH,OAJA5D,QAAQiJ,MAAM,+BAA+B7a,EAAIoa,eAAgB5E,QAC5DmJ,GACD8uD,EAAiB,sCAAsCztE,EAAIoa,gBAGnE,CAEJ,IAAKuE,EAAW,CACZ,MAAMgwD,EA1PtB,SAA6BjC,EAAMuB,GAC/B,MAAMxtC,EAAS31B,KAAK+qB,MAAM/qB,KAAKC,UAAU2hE,IACzC,IAAK,MAAOwB,EAASx6D,KAASu6D,EAAc,CACxC,MAAMr4D,EAAOs4D,EAAQ3zD,MAAM,KAC3B,IAAIzF,EAAU2rB,EACd7uB,QAAQC,IAAI,oCAAoCq8D,iBAAwBt4D,GAExE,IAAK,IAAI3U,EAAI,EAAGA,EAAI2U,EAAKpK,OAAS,EAAGvK,IAAK,CACtC,QAAyByK,IAArBoJ,EAAQc,EAAK3U,IAAmB,CAChC2Q,QAAQ2d,KAAK,kCAAkCtuB,WAAW2U,EAAK3U,oBAAqBggB,OAAOC,KAAKpM,IAChG,KACJ,CACAA,EAAUA,EAAQc,EAAK3U,GAC3B,CAEA,MAAM2tE,EAAUh5D,EAAKA,EAAKpK,OAAS,GACnC,GAAIsJ,EAAQ85D,IAAwC,iBAArB95D,EAAQ85D,GAAuB,CAC1D,MAAMC,EAAS/5D,EAAQ85D,GAAS55D,WACzBF,EAAQ85D,GAAS55D,IACxBF,EAAQ85D,GAAS9tE,OAAS4S,EAC1B9B,QAAQC,IAAI,0BAA0Bg9D,WAAgBn7D,EAAKlI,mBAC/D,MAEIoG,QAAQ2d,KAAK,sCAAsC2+C,cAAoBU,MAAa95D,EAAQ85D,GAEpG,CACA,OAAOnuC,CACX,CA+NgCquC,CAAoB/B,EAAUkB,GAE9Cr8D,QAAQC,IAAI,oCAAqC/G,KAAKC,UAAU4jE,GAAShxD,MAAM,EAAG,KAAO,OACzF0vD,EAAgBsB,GAChBpB,GAAsB,EAC1B,GAEJwB,GACO,KACHpwD,GAAY,IAEjB,CAACouD,EAAUh0D,EAAenB,EAAQE,IAErC,MAAOk3D,EAAYC,GAAiBptE,GAAS,GAC7C0C,EAAU,KACN,MAAM2qE,EAAgB,KAClBD,EAAcv/C,SAASy/C,gBAAgBC,UAAUhhB,SAAS,UAE9D8gB,IACA,MAAMx2C,EAAW,IAAI22C,iBAAiBH,GAEtC,OADAx2C,EAASK,QAAQrJ,SAASy/C,gBAAiB,CAAEG,YAAY,EAAMC,gBAAiB,CAAC,WAC1E,IAAM72C,EAASM,cACvB,IAEH,MAAOw2C,EAAgBC,GAAqB5tE,EAAS,GACrD0C,EAAU,KACN,IAAK0e,EAAanO,QACd,OACJ,MAAM4oB,EAAiB,IAAIC,eAAgB3jB,IACvC,IAAK,MAAM4e,KAAS5e,EAChBy1D,EAAkB72C,EAAM82C,YAAYxqE,SAM5C,OAHAw4B,EAAe3E,QAAQ9V,EAAanO,SAEpC26D,EAAkBxsD,EAAanO,QAAQkoB,aAChC,IAAMU,EAAe1E,cAC7B,IAEH,MAAM22C,EAAwBlvE,EAAQ,IAC3BgsE,GAAuBM,GAAUvhE,OAAS,EAClD,CAACuhE,IAGE6C,EAAgBnvE,EAAQ,KAG1B,GAAIkvE,IAA0BvC,EAC1B,OAAO,KAEX,IAAIyC,EAAYzC,GAAgBL,EAChC,OAAK8C,GAGDjjE,GAASkjE,kBACTD,EA9bL,SAA8BnD,EAAMoD,GACvC,IAAKA,GAA2D,IAAxC7uD,OAAOC,KAAK4uD,GAAiBtkE,OACjD,OAAOkhE,EAEX,MAAMjsC,EAAS31B,KAAK+qB,MAAM/qB,KAAKC,UAAU2hE,IAEnCqD,EAAgB3vE,IAClB,IAAK,MAAM4vE,KAAS5vE,EACZ4vE,GAA0B,iBAAVA,GAAsBA,EAAMjxE,MAAQixE,EAAMjxE,QAAQ+wE,IAClEE,EAAM3wE,MAAQywE,EAAgBE,EAAMjxE,QAK5C6H,MAAMkT,QAAQ2mB,EAAOrgC,SACrB2vE,EAAatvC,EAAOrgC,QAGxB,MAAM6vE,EAAqBC,IACvB,GAAKtpE,MAAMkT,QAAQo2D,GAEnB,IAAK,MAAMjE,KAAQiE,EAYf,GAXIjE,GAAQrlE,MAAMkT,QAAQmyD,EAAK7rE,SAC3B2vE,EAAa9D,EAAK7rE,QAGlB6rE,EAAK8B,SACLkC,EAAkBhE,EAAK8B,SACvB9B,EAAKkE,SACLF,EAAkBhE,EAAKkE,SACvBlE,EAAKpoB,QACLosB,EAAkBhE,EAAKpoB,QAEvBj9C,MAAMkT,QAAQmyD,EAAKI,OACnB,IAAK,MAAMA,KAASJ,EAAKI,MACjBA,GAASzlE,MAAMkT,QAAQuyD,EAAMjsE,SAC7B2vE,EAAa1D,EAAMjsE,SAYvC,GANIqgC,EAAOstC,SACPkC,EAAkBxvC,EAAOstC,SACzBttC,EAAO0vC,SACPF,EAAkBxvC,EAAO0vC,SACzB1vC,EAAOojB,QACPosB,EAAkBxvC,EAAOojB,QACzBj9C,MAAMkT,QAAQ2mB,EAAO4rC,OACrB,IAAK,MAAMA,KAAS5rC,EAAO4rC,MACnBA,GAASzlE,MAAMkT,QAAQuyD,EAAMjsE,SAC7B2vE,EAAa1D,EAAMjsE,QAI/B,OAAOqgC,CACX,CAsYwB2vC,CAAqBP,EAAWjjE,EAAQkjE,kBAtgBhE,SAAoCpD,GAEhC,MAAMjsC,EAAS31B,KAAK+qB,MAAM/qB,KAAKC,UAAU2hE,IAEnC2D,EAAa,CAAC,UAAW,UAAW,UAE1C,IADuBA,EAAW/0D,KAAKvL,GAAOnJ,MAAMkT,QAAQ2mB,EAAO1wB,KAG/D,OAAO0wB,EAGX,MAAM6vC,EAAsB,GAC5B,GAAI1pE,MAAMkT,QAAQ2mB,EAAOrgC,QACrB,IAAK,MAAM4vE,KAASvvC,EAAOrgC,OACnB4vE,GAA0B,iBAAVA,GAAsBA,EAAMjxE,MAAQixE,EAAMxqB,QAC1D8qB,EAAoBp/D,KAAK,CAAEnS,KAAMixE,EAAMjxE,KAAMixE,UAIzD,GAAmC,IAA/BM,EAAoB9kE,OAEpB,OAAOi1B,EAKX,IAAK,MAAQ1hC,KAAMwxE,EAASP,MAAEA,KAAWM,EAAqB,CAC1D,MAAME,EAAeR,EAAMxqB,QAAQ0mB,QAAU,GACvCuE,EAA0C,WAAvBT,EAAMxqB,QAAQkrB,KAEvC,IAAIC,EAAc,KAClB,IAAK,MAAM5gE,KAAOsgE,EACd,GAAIzpE,MAAMkT,QAAQ2mB,EAAO1wB,IAAO,CAC5B4gE,EAAclwC,EAAO1wB,GACrB,KACJ,CAEJ,IAAK4gE,GAAsC,IAAvBA,EAAYnlE,OAC5B,SAGJ,IAAIolE,EAAkB,EACtB,IAAK,IAAI3vE,EAAI,EAAGA,EAAI0vE,EAAYnlE,OAAQvK,IAAK,CACzC,MAAMgrE,EAAO0E,EAAY1vE,GACzB,GAAI+qE,GAAaC,EAAMuE,IAAkBC,GAAoBnE,GAAqBL,EAAMuE,GAAgB,CACpGI,EAAkB3vE,EAClB,KACJ,CACJ,CAEA,MAAM4vE,EAAaF,EAAYC,GAC1BC,EAAWzwE,SACZywE,EAAWzwE,OAAS,IAExBywE,EAAWzwE,OAAO8Q,KAAK8+D,GAEvBvvC,EAAOrgC,OAASqgC,EAAOrgC,OAAO0a,OAAQ2oB,GAAMA,EAAE1kC,OAASwxE,EAG3D,CAKA,OAHI3pE,MAAMkT,QAAQ2mB,EAAOrgC,SAAoC,IAAzBqgC,EAAOrgC,OAAOoL,eACvCi1B,EAAOrgC,OAEXqgC,CACX,CAuceqwC,CAA2BjB,IALvB,MAMZ,CAACzC,EAAcL,EAAU4C,EAAuB/iE,GAASkjE,kBAEtDiB,EAAkBzoE,EAAY,CAACokE,EAAMsE,KACvC,IAAKtE,GAAwB,iBAATA,EAChB,OAAOA,EAEX,GAAIA,EAAKyD,SAAWvpE,MAAMkT,QAAQ4yD,EAAKyD,SAAU,CAC7C,MAAMc,EAAavE,EAAKyD,QAAQ3kE,OAE1B0lE,GADUxE,EAAKyE,SAAW,KACAF,EAAa,GACvCG,EAAgBnrE,KAAKkS,OAAO64D,EAAiBE,GAAgBD,GACnE,MAAO,IACAvE,EACHyD,QAASzD,EAAKyD,QAAQ3wE,IAAK6xE,GAAUN,EAAgBM,EAAOD,IAEpE,CAEA,GAAI1E,EAAKqB,SAAWnnE,MAAMkT,QAAQ4yD,EAAKqB,SACnC,MAAO,IACArB,EACHqB,QAASrB,EAAKqB,QAAQvuE,IAAK6xE,GAAUN,EAAgBM,EAAOL,KAIpE,GAAItE,EAAK7oB,QAAUj9C,MAAMkT,QAAQ4yD,EAAK7oB,QAAS,CAC3C,MAAMpC,EAAUirB,EAAKjrB,SAAWirB,EAAK7oB,OAAOr4C,OAEtC0lE,GADUxE,EAAKyE,SAAW,KACA1vB,EAAU,GACpC2vB,EAAgBnrE,KAAKkS,OAAO64D,EAAiBE,GAAgBzvB,GACnE,MAAO,IACAirB,EACH7oB,OAAQ6oB,EAAK7oB,OAAOrkD,IAAK6xE,GAAUN,EAAgBM,EAAOD,IAElE,CAEA,MAAME,EAAe5E,EAAKxnE,MAC1B,MAAqB,cAAjBosE,GAAyD,iBAAjBA,GAA6BA,EAAeN,EAC7E,IAAKtE,EAAMxnE,MAAO8rE,GAEtBtE,GACR,IAEG6E,EAAgBjpE,EAAY,CAACnG,EAAQqvE,GAAgB,KACvD,IAAK5B,EACD,OAAO,KACX,MAAMloD,EApUd,SAA2B+pD,GACvB,MAAMC,EAAa,CACfC,WAAY,cACZ1F,KAAM,CAAExwD,OAAQ,eAEhBm2D,MAAO,CACHC,SAAUlG,GAAaC,YACvBG,UAAWJ,GAAaI,UACxB+F,QAASnG,GAAaG,QACtBiG,KAAMpG,GAAaE,OAGvBmG,KAAM,CAAEvsC,SAAS,GACjBwsC,IAAK,CACDxsC,SAAS,EACTysC,oBAAqB,EACrBC,qBAAsB,GAE1BC,KAAM,CACF3sC,SAAS,EACT7pB,YAAa,IACby2D,UAAW,SAEfC,MAAO,CACH7sC,SAAS,EACT7hC,KAAM,GACN2uE,QAAQ,GAEZC,KAAM,CACF/sC,SAAS,EACTgtC,YAAa,GACbL,MAAM,GAEVM,KAAM,CACFjtC,SAAS,EACTktC,aAAc,GAElBC,IAAK,CACDntC,SAAS,EACTktC,aAAc,GAElBE,OAAQ,CACJptC,SAAS,EACT7hC,KAAM,KAGd,OAAI6tE,EACO,IACAC,EACHoB,KAAM,CACFC,WAAY,UACZC,WAAY,UACZC,UAAW,UACXC,YAAa,UACbC,UAAW,UACXC,UAAW,+BACXC,UAAW,+BACXC,cAAe,GACfC,cAAe,GACfC,gBAAiB,KAErBC,OAAQ,CACJV,WAAY,UACZC,WAAY,UACZI,UAAW,+BACXC,UAAW,+BACXC,cAAe,GACfC,cAAe,GACfG,WAAY,KAEhBzzE,MAAO,CACHmD,MAAO,UACPuwE,KAAM,+BACNC,SAAU,GACVC,WAAY,MAIjB,IACAnC,EACHoB,KAAM,CACFC,WAAY,UACZC,WAAY,UACZC,UAAW,UACXC,YAAa,UACbC,UAAW,UACXC,UAAW,+BACXC,UAAW,+BACXC,cAAe,GACfC,cAAe,GACfC,gBAAiB,KAErBC,OAAQ,CACJV,WAAY,UACZC,WAAY,UACZI,UAAW,+BACXC,UAAW,+BACXC,cAAe,GACfC,cAAe,GACfG,WAAY,KAEhBzzE,MAAO,CACHmD,MAAO,UACPuwE,KAAM,+BACNC,SAAU,GACVC,WAAY,KAGxB,CAwNuBC,CAAkB9E,GAE3B+E,EAAkBvC,EACC,oBAAXxpE,OAAyB/B,KAAKG,IAAI4B,OAAOgsE,WAAa,GAAI,MAAQ,KACzExE,EAAiB,EAAIA,EAAiB,GAAK,IAE5CyE,EAAqB,YAAarE,GAAiB,YAAaA,GAAiB,WAAYA,EAE7FsE,EAAWD,EACX,CAAE70E,KAAM,MAAOgvD,SAAU,WACzB,CAAEhvD,KAAM,MAAOgvD,SAAU,WAE/B,IAAI+lB,EAAavE,EACbqE,GAAsBF,IACtBI,EAAapD,EAAgBnB,EAAemE,IAGhD,MAAMK,EAAYD,EAAWjvE,MACvBA,EAAQ+uE,OAAqBvoE,EAA2B,cAAd0oE,EAA4BL,EAAmBK,GAAaL,GAEpG7uE,MAAOmvE,KAAeC,GAAqBH,EACnD,MAAO,CACHI,QAAS,sDACJN,GAAsB/uE,EAAQ,CAAEA,SAAU,CAAA,EAC/C/C,OAAQqvE,OAAgB9lE,EAAYvJ,EACpC+xE,cACID,EAAqBE,EAAaG,KAElCr0E,IAAU2vE,EAAc3vE,MAAQ,CAAEA,SAAU,GAEhDynB,OAAQ,IACDA,KACAkoD,EAAcloD,UAG1B,CAACkoD,EAAe3vE,EAAO+uE,EAAYQ,EAAgBuB,IAChDyD,EAAalsE,EAAY4M,UAC3B,MAAM+2D,EAAO5jC,EAAe8kC,EAAkBr4D,QAAUo4D,EAAQp4D,QAChE,GAAKm3D,IAAQe,EAEb,WACyBf,EAAKwI,SAAS,IAC5BC,OAAOx/D,MAAOo6B,IACbA,UACMtkC,UAAUC,UAAUqlB,MAAM,CAC5B,IAAIqkD,cAAc,CAAE,YAAarlC,MAErC29B,GAAY,GACZhtD,WAAW,IAAMgtD,GAAY,GAAQ,OAE1C,YACP,CACA,MAAOz3D,GACH5D,QAAQiJ,MAAM,wBAAyBrF,EAC3C,GACD,CAACw3D,EAAU3kC,IACRusC,EAAetsE,EAAY4M,UAC7B,MAAM+2D,EAAO5jC,EAAe8kC,EAAkBr4D,QAAUo4D,EAAQp4D,QAChE,GAAKm3D,IAAQvW,EAAb,CAEAyL,GAAe,GACf,IACI,MAAMnsD,QAAYi3D,EAAK4I,WAAW,MAAO,GACnC1lC,EAAOzf,SAASE,cAAc,KACpCuf,EAAKC,SAAW,GAAGnvC,GAAS,cAC5BkvC,EAAKzmC,KAAOsM,EACZm6B,EAAK9I,OACT,CACA,MAAO7wB,GACH5D,QAAQiJ,MAAM,0BAA2BrF,EAC7C,CACR,QACY2rD,GAAe,EACnB,CAdI,GAeL,CAAClhE,EAAOy1D,EAAartB,IAClBysC,EAAgBxsE,EAAa2jE,IAC/BiB,EAAQp4D,QAAUm3D,EAClBv1C,EAAS,OACV,IACGq+C,EAA0BzsE,EAAa2jE,IACzCkB,EAAkBr4D,QAAUm3D,GAC7B,IACGjyC,EAAc1xB,EAAakN,IAC7B5D,QAAQiJ,MAAM,6BAA8BrF,GAC5CkhB,EAASlhB,aAAe6U,MAAQ7U,EAAI3Q,QAAU,kBAC/C,IACGmwE,EAAmB1sE,EAAY,KACjCggC,EAAgB5jC,IAASA,IAC1B,IAEHH,EAAU,KACNmyB,EAAS,OACV,CAACq2C,IAEJ,MAAMkI,EAAU,EAAGr2E,eAAiBM,EAAM,MAAO,CAAEN,UAAWmE,GAAG,0BAA2BnE,GAAYH,SAAU,CAACS,EAAM,SAAU,CAAE4C,QAAS0yE,EAAYllE,SAAU09D,EAAUpuE,UAAW,4PAA6PqB,MAAO,oBAAqBxB,SAAU,CAAYE,EAAXquE,EAAgBnO,GAAwC30B,GAAjC,CAAEtrC,UAAW,YAAqDouE,EAAW,SAAW,UAAY9tE,EAAM,SAAU,CAAE4C,QAAS8yE,EAActlE,SAAUomD,EAAa92D,UAAW,wRAAyRqB,MAAO,gBAAiBxB,SAAU,CAACE,EAAKsnC,GAAU,CAAErnC,UAAW,YAAc82D,EAAc,eAAiB,YAAciY,GAAyBzuE,EAAM,SAAU,CAAE4C,QAASkzE,EAAkBp2E,UAAW,wOAAyOqB,MAAOooC,EAAe,kBAAoB,aAAc5pC,SAAU,CAAgBE,EAAf0pC,EAAoB6sC,GAA4CxsC,GAAjC,CAAE9pC,UAAW,YAA0DypC,EAAe,OAAS,mBAIjjD,GAAIilC,GAAuBqC,IAA0BvC,EACjD,OAAQzuE,EAAK,MAAO,CAAEC,UAAW,6FAA8FH,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,oCAAqCH,SAAUE,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAUwB,GAAS,YAAetB,EAAK,MAAO,CAAEC,UAAW,uEAAwEoE,MAAO,CAAEkC,MAAO,OAAQ/C,OAAQ0rE,GAAcpvE,SAAUS,EAAM,MAAO,CAAEN,UAAW,2DAA4DH,SAAU,CAACE,EAAK4M,GAAS,CAAE3M,UAAW,yBAA2BD,EAAK,OAAQ,CAAEC,UAAW,UAAWH,SAAU,6CAGxuB,GAAI+uE,EACA,OAAQ7uE,EAAK,MAAO,CAAEC,UAAW,6FAA8FH,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,oCAAqCH,SAAUE,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAUwB,GAAS,YAAetB,EAAK,MAAO,CAAEqE,MAAO,CAAEkC,MAAO,OAAQ/C,OAAQ0rE,GAAcpvE,SAAUE,EAAKqsE,GAAkB,CAAEnwD,MAAO2yD,EAAevC,WAAYhrE,WAE1gB,GAAI4a,EACA,OAAQlc,EAAK,MAAO,CAAEC,UAAW,6FAA8FH,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,oCAAqCH,SAAUE,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAUwB,GAAS,YAAetB,EAAK,MAAO,CAAEqE,MAAO,CAAEkC,MAAO,OAAQ/C,OAAQ0rE,GAAcpvE,SAAUE,EAAKqsE,GAAkB,CAAEnwD,MAAOA,EAAOowD,WAAYhrE,WAGlgB,MAAMk1E,EAAY5D,EAAc1D,GAC1BuH,GAAiB7D,EAAc,GAAG,GAExC,IAAK4D,EACD,OAAO,KAGXvjE,QAAQC,IAAI,gCAAiC,CACzC5R,QACAo1E,UAAWF,EAAUzhE,MAAM5S,OAC3Bw0E,WAAYH,EAAUzhE,MAAM5S,QAAQ0K,OACpCkhE,KAAM5hE,KAAKC,UAAUoqE,GAAWx3D,MAAM,EAAG,KAAQ,QAGrD,MAAM43D,GAAWJ,EAAUzhE,KAK3B,OAJkB6hE,KAAaA,GAASz0E,SAAWy0E,GAASvgE,KAExDpD,QAAQ2d,KAAK,6BAA8B4lD,GAEvCj2E,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAWmE,GAAG,6FAA8F2qE,GAAe,YAAajvE,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,oCAAqCH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAUwB,IAAUytE,EAAc,YAAc,WAAaA,GAAgB/uE,EAAK,OAAQ,CAAEC,UAAW,yGAA0GH,SAAU,mBAAuBE,EAAKs2E,EAAS,CAAA,MAAStoE,GAAgBhO,EAAK,OAAQ,CAAEC,UAAW,2CAA4CH,SAAUkO,IAAiBhO,EAAK,MAAO,CAAEqB,IAAKijB,EAAcrkB,UAAW,oDAAqDoE,MAAO,CAAEkC,MAAO,OAAQ/C,OAAQ0rE,EAAY2H,SAAU,GAAK/2E,SAAUE,EAAK82E,GAAW,CAAE/I,KAAMyI,EAAWO,QAAUj1C,GAAWq0C,EAAcr0C,EAAOwrC,MAAOz1C,QAASwD,EAAaptB,QAAS,CAAEk0C,SAAUl0C,GAASk0C,UAAY,SAAUiiB,SAAS,YAAsB7jE,EAAMgsE,GAAkB,CAAE5pE,OAAQ+mC,EAAc9d,QAAS,IAAM+d,GAAgB,GAAQroC,MAAOA,IAAUytE,EAAc,YAAc,SAAU/gE,YAAaA,EAAalO,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,0CAA2CH,SAAU22E,IAAmBz2E,EAAK82E,GAAW,CAAE/I,KAAM0I,GAAgBM,QAAUj1C,GAAWs0C,EAAwBt0C,EAAOwrC,MAAOz1C,QAASwD,EAAaptB,QAAS,CAAEk0C,SAAUl0C,GAASk0C,UAAY,SAAUiiB,SAAS,OAAgBpkE,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAUE,EAAKs2E,EAAS,CAAEr2E,UAAW,0GACxvD,EAAG,CAACgN,EAAWC,IAEJf,KAAKC,UAAUa,EAAU8gE,QAAU5hE,KAAKC,UAAUc,EAAU6gE,OAC/D9gE,EAAUmN,gBAAkBlN,EAAUkN,eChwBxC48D,GAAS,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAC7F,MAAMC,WAA2BvzD,EAC7B,WAAAC,CAAYlJ,GACRmJ,MAAMnJ,GACNoJ,KAAKC,MAAQ,CAAEC,UAAU,EAAO7H,MAAO,KAC3C,CACA,+BAAO8H,CAAyB9H,GAC5B,MAAO,CAAE6H,UAAU,EAAM7H,QAC7B,CACA,iBAAAqsB,CAAkBrsB,EAAOssB,GACrBv1B,QAAQiJ,MAAM,0BAA0B2H,KAAKpJ,MAAMy8D,cAAeh7D,EAAOssB,EAC7E,CACA,MAAAvkB,GACI,OAAIJ,KAAKC,MAAMC,SACH/jB,EAAK,MAAO,CAAEC,UAAW,mFAAoFH,SAAUS,EAAM,MAAO,CAAEN,UAAW,cAAeH,SAAU,CAACS,EAAM,IAAK,CAAEN,UAAW,qDAAsDH,SAAU,CAAC,iBAAkB+jB,KAAKpJ,MAAMy8D,UAAW,YAAcl3E,EAAK,IAAK,CAAEC,UAAW,gEAAiEH,SAAU+jB,KAAKC,MAAM5H,OAAOhW,SAAW,uBAE9b2d,KAAKpJ,MAAM3a,QACtB,EAGG,SAASq3E,GAAepJ,GAC3B,MAAwB,cAAjBA,EAAKqJ,OAChB,CAEO,SAASC,GAAetJ,GAC3B,OAAyB,aAAjBA,EAAKqJ,cAA2CrqE,IAAjBghE,EAAKqJ,YAA4B,SAAUrJ,EACtF,CACA,SAASuJ,GAAaC,GAClB,IAAKC,SAASD,GACV,OAAOl+D,OAAOk+D,GAClB,MAAMlnD,EAAM/oB,KAAK+oB,IAAIknD,GACrB,OAAIlnD,GAAO,KACCknD,EAAI,KAAe/rE,QAAQ,GAAK,IACxC6kB,GAAO,KACCknD,EAAI,KAAW/rE,QAAQ,GAAK,IACpC6kB,GAAO,KACCknD,EAAI,KAAO/rE,QAAQ,GAAK,IAC7B+rE,EAAExkB,gBACb,CAEY,MAAC0kB,GAAantE,EAAK,UAAoByjE,KAAEA,EAAI3zD,cAAEA,IAEvD,OAAI+8D,GAAepJ,GACR/tE,EAAKmuE,GAAe,CAAEJ,KAAMA,EAAM3zD,cAAeA,IAGrDpa,EAAK03E,GAAe,CAAE3J,KAAMA,GACvC,EAAG,CAAC9gE,EAAWC,IAEJf,KAAKC,UAAUa,EAAU8gE,QAAU5hE,KAAKC,UAAUc,EAAU6gE,OAC/D9gE,EAAUmN,gBAAkBlN,EAAUkN,eAG9C,SAASu9D,GAAmB5J,GAExB,GAAIA,EAAK6J,MACL,OAAO7J,EAAK6J,MAEhB,MAAMC,EAAU,CACZC,SAAY,MACZC,UAAa,OACbC,UAAa,OACbC,SAAY,MACZC,aAAgB,UAChBC,WAAc,QACdC,YAAe,SACfC,QAAW,UACXC,cAAiB,WACjBC,eAAkB,aAEtB,OAAIxK,EAAKttE,MAAQo3E,EAAQ9J,EAAKttE,MACnBo3E,EAAQ9J,EAAKttE,MAEjB,KACX,CAEA,MAAMi3E,GAAgBptE,EAAK,UAAuByjE,KAAEA,IAEhD,MAAMyK,EAAiB,IAChBzK,EACH6J,MAAOD,GAAmB5J,GAE1B0K,KAAM1K,EAAK0K,MAAQ1K,EAAK2K,QAAQC,UAAY,OAE5CC,OAAQ7K,EAAK6K,QAAU7K,EAAK8K,MAAMh4E,IAAKwU,IAAC,CACpCjE,IAAKiE,EAAEsjE,UAAYtjE,EAAEyjE,QACrBr0E,MAAO4Q,EAAEnN,MAAQmN,EAAE5Q,MACnBmM,MAAOyE,EAAEjV,SACN2tE,EAAKgL,OAAOl4E,IAAKm4E,IAAC,CACrB5nE,IAAK4nE,EAAEL,UAAYK,EAAEF,QACrBr0E,MAAOu0E,EAAEl8D,QAAUk8D,EAAEv0E,MACrBmM,MAAOooE,EAAE54E,SACN,KAELw3E,MAAEA,EAAKt2E,MAAEA,EAAK0M,YAAEA,EAAW+G,KAAEA,EAAI0jE,KAAEA,EAAIG,OAAEA,EAAMK,MAAEA,EAAKhrE,QAAEA,EAAOirE,QAAEA,EAAOC,SAAEA,EAAQC,KAAEA,EAAIC,QAAeA,EAAOP,QAAEA,GAAaN,GAC5HzhB,EAAayL,GAAkBt/D,GAAS,IACxCmrE,EAAUC,GAAeprE,GAAS,GACnCo2E,EAAW1pE,EAAO,MAClBimE,EAAalsE,EAAY4M,UAC3B,GAAK+iE,EAASnjE,UAAWk4D,EAEzB,IACI,MAAMkL,QAAgBC,GAAMF,EAASnjE,QAAS,CAC1CsjE,gBAAiB,UACjBC,WAAY,IAEVjpD,QAAiBsR,MAAMw3C,GACvB5oC,QAAalgB,EAASkgB,aACtBtkC,UAAUC,UAAUqlB,MAAM,CAC5B,IAAIqkD,cAAc,CAAE,YAAarlC,MAErC29B,GAAY,GACZhtD,WAAW,IAAMgtD,GAAY,GAAQ,IACzC,CACA,MAAOz3D,GACH5D,QAAQiJ,MAAM,wBAAyBrF,EAC3C,GACD,CAACw3D,IACE4H,EAAetsE,EAAY4M,UAC7B,GAAK+iE,EAASnjE,UAAW4gD,EAAzB,CAEAyL,GAAe,GACf,IACI,MAAM+W,QAAgBC,GAAMF,EAASnjE,QAAS,CAC1CsjE,gBAAiB,UACjBC,WAAY,IAEVlpC,EAAOzf,SAASE,cAAc,KACpCuf,EAAKC,SAAW,GAAGnvC,GAAS,cAC5BkvC,EAAKzmC,KAAOwvE,EACZ/oC,EAAK9I,OACT,CACA,MAAO7wB,GACH5D,QAAQiJ,MAAM,0BAA2BrF,EAC7C,CACR,QACY2rD,GAAe,EACnB,CAjBI,GAkBL,CAAClhE,EAAOy1D,IAEL4iB,EAAaf,GAAU,GACvBgB,EAAW7kE,GAAQ,GACnB8kE,EAAct5E,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK85E,GAAO,CAAEhB,QAASL,EAAMsB,KAAM,CAAE9E,SAAU,MAASj1E,EAAKg6E,GAAO,CAAEC,QAAS,OAAQC,cAAe5C,GAAc1mE,MAAOqoE,GAAO9zE,MAAMyL,MAAQ,CAAElQ,MAAOu4E,EAAM9zE,KAAKyL,MAAOupE,OAAO,GAAKjpD,SAAU,mBAAiBnkB,IAAc4sE,EAAWh9D,KAAMg3B,GAAoB,UAAdA,EAAEsmC,UAAyBj6E,EAAKg6E,GAAO,CAAEC,QAAS,QAASG,YAAa,QAASF,cAAe5C,GAAc1mE,MAAOqoE,GAAO9nD,OAAOvgB,MAAQ,CAAElQ,MAAOu4E,EAAM9nD,MAAMvgB,MAAOupE,OAAO,GAAKjpD,SAAU,oBAAkBnkB,OAClfstE,EAAkB95E,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAKs6E,GAAe,CAAEC,gBAAiB,QAAUv6E,EAAKw6E,GAAS,CAAEC,UAAY/5E,GAA4B,iBAAVA,EAAqB42E,GAAa52E,GAAS2Y,OAAO3Y,KAAYV,EAAK06E,GAAQ,CAAA,GAAKzsE,GAAS0sE,eAAiB36E,EAAK46E,GAAe,CAAEC,EAAG,EAAG/9D,OAAQ,OAAQy9D,gBAAiB,WACtTO,EAAe,IAAMnB,EAAW94E,IAAI,CAAC8yC,EAAGvhC,KAC1C,MAAM3N,EAAQkvC,EAAElvC,OAASuyE,GAAO5kE,EAAM4kE,GAAOnqE,QACvCotE,EAAUtmC,EAAEsmC,SAAW,OAC7B,MAAc,SAAVrC,EACQ53E,EAAK+6E,GAAM,CAAEt6E,KAAM,WAAYq4E,QAASnlC,EAAEviC,IAAKhR,KAAMuzC,EAAE/iC,OAAS+iC,EAAEviC,IAAK0L,OAAQrY,EAAO0B,IAAKwtC,EAAExtC,MAAO,EAAO8zE,QAASA,GAAWtmC,EAAEviC,KAE/H,SAAVwmE,EACQ53E,EAAKg7E,GAAM,CAAEv6E,KAAM,WAAYq4E,QAASnlC,EAAEviC,IAAKhR,KAAMuzC,EAAE/iC,OAAS+iC,EAAEviC,IAAK0L,OAAQrY,EAAOyD,KAAMzD,EAAOqvE,YAAa,GAAKmH,QAAShtE,GAASitE,QAAWvnC,EAAEsnC,SAAW,aAAWluE,EAAWktE,QAASA,GAAWtmC,EAAEviC,KAEzM,QAAVwmE,GAA8B,QAAXjkC,EAAElzC,KACbT,EAAKm7E,GAAK,CAAErC,QAASnlC,EAAEviC,IAAKhR,KAAMuzC,EAAE/iC,OAAS+iC,EAAEviC,IAAKlJ,KAAMzD,EAAOw2E,QAAShtE,GAASitE,QAAWvnC,EAAEsnC,SAAW,aAAWluE,EAAWktE,QAASA,GAAWtmC,EAAEviC,KAEpJ,SAAXuiC,EAAElzC,KACMT,EAAKg7E,GAAM,CAAEv6E,KAAM,WAAYq4E,QAASnlC,EAAEviC,IAAKhR,KAAMuzC,EAAE/iC,OAAS+iC,EAAEviC,IAAK0L,OAAQrY,EAAOyD,KAAMzD,EAAOqvE,YAAa,GAAKmH,QAAShtE,GAASitE,QAAWvnC,EAAEsnC,SAAW,aAAWluE,EAAWktE,QAASA,GAAWtmC,EAAEviC,KAG/MpR,EAAK+6E,GAAM,CAAEt6E,KAAM,WAAYq4E,QAASnlC,EAAEviC,IAAKhR,KAAMuzC,EAAE/iC,OAAS+iC,EAAEviC,IAAK0L,OAAQrY,EAAO0B,IAAKwtC,EAAExtC,MAAO,EAAO8zE,QAASA,GAAWtmC,EAAEviC,OAyE7I,OAAQpR,EAAK,MAAO,CAAEC,UAAW,6FAA8FH,SAAUS,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,oCAAqCH,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAUwB,GAAS,UAAYf,EAAM,MAAO,CAAEN,UAAW,qDAAsDH,SAAU,CAACS,EAAM,SAAU,CAAE4C,QAAS0yE,EAAYllE,SAAU09D,EAAUpuE,UAAW,4PAA6PqB,MAAO,oBAAqBxB,SAAU,CAAYE,EAAXquE,EAAgBnO,GAAwC30B,GAAjC,CAAEtrC,UAAW,YAAqDouE,EAAW,SAAW,UAAY9tE,EAAM,SAAU,CAAE4C,QAAS8yE,EAActlE,SAAUomD,EAAa92D,UAAW,wRAAyRqB,MAAO,gBAAiBxB,SAAU,CAACE,EAAKsnC,GAAU,CAAErnC,UAAW,YAAc82D,EAAc,eAAiB,kBAAsB/oD,GAAgBhO,EAAK,OAAQ,CAAEC,UAAW,2CAA4CH,SAAUkO,IAAiBhO,EAAK,MAAO,CAAEqB,IAAKi4E,EAAUr5E,UAAW,oCAAqCoE,MAAO,CAAEkC,MAAO,OAAQ/C,OAAQ,IAAKqzE,SAAU,GAAK/2E,SAAUE,EAAKi3E,GAAoB,CAAEC,UAAWU,EAAO93E,SAAUE,EAAKo7E,GAAqB,CAAE70E,MAAO,OAAQ/C,OAAQ,OAAQ1D,SA1BpwD,MAChB,OAAQ83E,GACJ,IAAK,MACD,OAAQr3E,EAAMu3E,GAAU,CAAE/iE,KAAM6kE,EAAU95E,SAAU,CAAC+5E,EAAYQ,EAAgBS,OACrF,IAAK,OACD,OAAQv6E,EAAMw3E,GAAW,CAAEhjE,KAAM6kE,EAAU95E,SAAU,CAAC+5E,EAAYQ,EAAgBS,OACtF,IAAK,OACD,OAAQv6E,EAAMy3E,GAAW,CAAEjjE,KAAM6kE,EAAU95E,SAAU,CAAC+5E,EAAYQ,EAAgBS,OACtF,IAAK,WAcL,QACI,OAAQv6E,EAAM+3E,GAAe,CAAEvjE,KAAM6kE,EAAU95E,SAAU,CAAC+5E,EAAYQ,EAAgBS,OAb1F,IAAK,MACD,OAnDAv6E,EAAM03E,GAAU,CAAEn4E,SAAU,CAACE,EAAKq7E,GAAK,CAAEtmE,KAAM6kE,EAAUd,QAFpDK,GAAY,QAEuDD,QAHnEA,GAAW,OAGuEoC,GAAI,MAAOC,GAAI,MAAOC,YADjGvtE,GAASutE,aAAe,EACmGC,YAAa,IAAK7qE,OAA+B,IAAxB3C,GAASytE,WAAsB57E,SAAU85E,EAAS/4E,IAAI,CAAC8H,EAAGC,IAAW5I,EAAK27E,GAAM,CAAEzzE,KAAM8uE,GAAOpuE,EAAQouE,GAAOnqE,SAAW,QAAQjE,QAAe5I,EAAKw6E,GAAS,CAAEC,UAAY/5E,GAA4B,iBAAVA,EAAqB42E,GAAa52E,GAAS2Y,OAAO3Y,KAAYV,EAAK06E,GAAQ,CAAA,MAoD7a,IAAK,UACD,MAlDe,MACvB,MAAMkB,EAAWnD,EACXoD,EAAWzC,GAAQ,IACzB,OAAQ74E,EAAM23E,GAAc,CAAEp4E,SAAU,CAACE,EAAKs6E,GAAe,CAAEC,gBAAiB,QAAUv6E,EAAK85E,GAAO,CAAEhB,QAAS8C,EAAUx7E,KAAMw7E,EAAU7B,KAAM,CAAE9E,SAAU,MAASj1E,EAAKg6E,GAAO,CAAElB,QAAS+C,EAAUz7E,KAAMy7E,EAAU3B,cAAe5C,KAAiBt3E,EAAKw6E,GAAS,CAAEC,UAAY/5E,GAA4B,iBAAVA,EAAqB42E,GAAa52E,GAAS2Y,OAAO3Y,KAAYV,EAAK06E,GAAQ,IAAKf,EAAW9sE,OAAS,EAAK8sE,EAAW94E,IAAI,CAAC8yC,EAAGvhC,IAASpS,EAAK87E,GAAS,CAAE17E,KAAMuzC,EAAE/iC,OAAS+iC,EAAEviC,IAAK2D,KAAM6kE,EAAU1xE,KAAMyrC,EAAElvC,OAASuyE,GAAO5kE,EAAM4kE,GAAOnqE,SAAW8mC,EAAEviC,MAAWpR,EAAK87E,GAAS,CAAE17E,KAAM,OAAQ2U,KAAM6kE,EAAU1xE,KAAM8uE,GAAO,SA+C3kB+E,GACX,IAAK,QACD,MA9Ca,MACrB,MAAMC,EAAO3C,GAAWZ,EACxB,OAAQl4E,EAAM43E,GAAY,CAAEmD,GAAI,MAAOC,GAAI,MAAOE,YAAa,IAAK1mE,KAAM6kE,EAAU95E,SAAU,CAACE,EAAKi8E,GAAW,CAAA,GAAKj8E,EAAKk8E,GAAgB,CAAEpD,QAASkD,EAAMjC,KAAM,CAAE9E,SAAU,MAASj1E,EAAKm8E,GAAiB,CAAEjC,cAAe5C,KAAiBqC,EAAW94E,IAAI,CAAC8yC,EAAGvhC,IAASpS,EAAKo8E,GAAO,CAAEh8E,KAAMuzC,EAAE/iC,OAAS+iC,EAAEviC,IAAK0nE,QAASnlC,EAAEviC,IAAK0L,OAAQ62B,EAAElvC,OAASuyE,GAAO5kE,EAAM4kE,GAAOnqE,QAAS3E,KAAMyrC,EAAElvC,OAASuyE,GAAO5kE,EAAM4kE,GAAOnqE,QAASinE,YAAa,IAAOngC,EAAEviC,MAAQpR,EAAKw6E,GAAS,CAAEC,UAAY/5E,GAA4B,iBAAVA,EAAqB42E,GAAa52E,GAAS2Y,OAAO3Y,KAAYV,EAAK06E,GAAQ,QA4CriB2B,GACX,IAAK,YACD,MA3CiB,MACzB,MAAMC,EAAOpD,GAAW,OAClBqD,EAAOpD,GAAY,QACnBqD,EAAavuE,GAASuuE,YAAc,IACpCC,EAAWxuE,GAASwuE,UAAY,EAEtC,OAAQl8E,EAAMg4E,GAAgB,CAAE+C,GAAI,MAAOC,GAAI,MAAOC,YADlCvtE,GAASutE,aAAe,GACoCC,YAAa,IAAKiB,QAAS,GAAI3nE,KAAM6kE,EAAU4C,WAAYA,EAAYC,SAAUA,EAAU38E,SAAU,CAACE,EAAK28E,GAAW,CAAE/rE,MAAO,CAAEsgB,SAAU,cAAehpB,KAAM,OAAQ+sE,SAAU,IAAMjC,YAAY,EAAM8F,QAASyD,EAAMz8E,SAAU85E,EAAS/4E,IAAI,CAAC8H,EAAGC,IAAW5I,EAAK27E,GAAM,CAAEzzE,KAAM8uE,GAAOpuE,EAAQouE,GAAOnqE,SAAW,QAAQjE,QAAe5I,EAAKw6E,GAAS,CAAEC,UAAY/5E,GAA4B,iBAAVA,EAAqB42E,GAAa52E,GAAS2Y,OAAO3Y,KAAYV,EAAK06E,GAAQ,CAAEkC,SAAU,GAAI16B,OAAQ,WAAY26B,cAAe,SAAU7vD,MAAO,QAASytD,UAAW,CAAC/5E,EAAOu5B,KACnmB,MAAMntB,EAAO8sE,EAAS34D,KAAM/D,GAAMA,EAAEo/D,KAAU57E,GAASwc,EAAEq/D,KAAUtiD,EAAMuqB,SAAS9jD,OAClF,OAAOoM,EAAOA,EAAKwvE,GAAQ57E,SAmC5Bo8E,GACX,IAAK,SACD,MAjCc,MACtB,MAAMR,EAAOpD,GAAW,OAClBqD,EAAOpD,GAAY,QACzB,OAAQ54E,EAAM63E,GAAa,CAAEt4E,SAAU,CAACE,EAAKw6E,GAAS,CAAEC,UAAY/5E,GAA4B,iBAAVA,EAAqB42E,GAAa52E,GAAS2Y,OAAO3Y,KAAYH,EAAMw8E,GAAQ,CAAEjE,QAASyD,EAAMxnE,KAAM6kE,EAAUoD,mBAAmB,EAAMl9E,SAAU,CAAC85E,EAAS/4E,IAAI,CAAC8H,EAAGC,IAAW5I,EAAK27E,GAAM,CAAEzzE,KAAM8uE,GAAOpuE,EAAQouE,GAAOnqE,SAAW,QAAQjE,OAAoC,IAAxBqF,GAASytE,YAAyB17E,EAAKi9E,GAAW,CAAE/rD,SAAU,SAAUhpB,KAAM,OAAQ4U,OAAQ,OAAQg8D,QAASwD,WA8B3aY,GACX,IAAK,UACD,OA3BAl9E,EAAKq4E,GAAS,CAAEtjE,KAAM6kE,EAAUd,QAD3BA,GAAWK,GAAY,QACmBjgD,YAAa,EAAI,EAAGpc,OAAQ,OAAQ5U,KAAM,UAAWgE,QAAS,EAAGixE,IAAGtC,IAAGt0E,QAAO/C,SAAQpD,OAAMM,QAAOkI,WAE1IrI,EAAM,IAAK,CAAET,SAAU,CAACE,EAAK,OAAQ,CAAEm9E,EAAGA,EAAGtC,EAAGA,EAAGt0E,MAAOA,EAAO/C,OAAQA,EAAQa,MAAO,CAAE6D,KADrF8uE,GAAOpuE,EAAQouE,GAAOnqE,QACqEiQ,OAAQ,OAAQG,YAAa,KAAQ1W,EAAQ,IAAM/C,EAAS,IAAOjD,EAAMggB,EAAW,CAAEzgB,SAAU,CAACE,EAAK,OAAQ,CAAEm9E,EAAGA,EAAI52E,EAAQ,EAAGs0E,EAAGA,EAAIr3E,EAAS,EAAI,EAAG45E,WAAY,SAAUl1E,KAAM,OAAQ+sE,SAAU,GAAIn1E,SAAUM,IAASJ,EAAK,OAAQ,CAAEm9E,EAAGA,EAAI52E,EAAQ,EAAGs0E,EAAGA,EAAIr3E,EAAS,EAAI,GAAI45E,WAAY,SAAUl1E,KAAM,OAAQ+sE,SAAU,GAAIn1E,SAAUw3E,GAAa52E,eA8B80C28E,aACtyD,EAAG,CAACpwE,EAAWC,IAEJf,KAAKC,UAAUa,EAAU8gE,QAAU5hE,KAAKC,UAAUc,EAAU6gE,OCvOjEuP,GAAoB,CACtB1F,MAPqB,EAAG32E,WACxB,MAAM8sE,EAAOjsE,EAAQ,IACVqK,KAAK+qB,MAAMj2B,GACnB,CAACA,IACJ,OAAOjB,EAAKy3E,GAAY,CAAE1J,KAAMA,MAKpC,SAASwP,IAAsBlnE,IAAEA,EAAGpV,KAAEA,IAClC,MAAOyiB,EAAW85D,GAAgBt6E,EAAS,MAU3C,OATA0C,EAAU,KACN63E,OAA0BpnE,GAAK7J,KAAKkxE,IAGhCF,EAAa,IAAME,EAAOtwE,WAC3BwJ,MAAMC,IACL5D,QAAQiJ,MAAM,+CAAgD7F,EAAKQ,MAExE,CAACR,IACGqN,EAAY1jB,EAAK0jB,EAAW,CAAEziB,KAAMA,IAAU,IACzD,CAgDO,SAAS08E,IAAoB79E,SAAEA,IAClC,MAAMmZ,OAAEA,GAAWC,MACZqB,EAAYqjE,GAAiB16E,EAASo6E,IAU7C,OATA13E,EAAU,MAlDd2Q,eAAiC0C,GAC7B,MAAM4kE,QAAsB5kE,EAAO6kE,KAAKC,iBAAiB,SACnDC,EAAO,IAAItuE,IACjB,IAAK,MAAMuuE,KAAOJ,EACd,IAAK,MAAM/wE,KAAQmxE,EAAIC,SAASC,kBAAoB,GAAI,CACpD,MACMC,EADaC,GAAwBvxE,GAChBuJ,IAC3B,GAAI+nE,EAAQ1iE,WAAW,YAAc0iE,EAAQ1iE,WAAW,YAAa,CACjE,MAAMpZ,EAAI87E,EAAQ37B,QAAQ,SAC1B,GAAIngD,EAAI,EAAG,CACP,MAAM+T,EAAM+nE,EAAQj7D,UAAU,EAAG7gB,GACjC07E,EAAKttE,IAAI2F,EAAM,eACnB,CACJ,CACJ,CAEJ,MAAMioE,QAAmBhjE,QAAQC,IAAItT,MAAMgJ,KAAK+sE,GAAMn9E,IAAIwV,GAC/C0rB,MAAM1rB,GAAK7J,KAAKihB,IACnB,IAAKA,EAAEwU,GACH,MAAM,IAAIvW,MAAM,4BAA4B+B,EAAEhhB,UAAUghB,EAAEyU,cAE9D,OAAOzU,EAAEiI,SACVlpB,KAAKuI,IACJ,MAAMwpE,EAAU,GACVC,EAAazpE,EAAKwpE,QACxB,IAAK,MAAOn+E,EAAMM,KAAU4hB,OAAOjH,QAAQmjE,GACvCD,EAAQhsE,KAAK,CAAEnS,OAAMkhE,UAAY7mD,GAAUza,EAAKu9E,GAAuB,CAAElnE,IAAK3V,EAAM2V,IAAKpV,KAAMwZ,EAAMxZ,SAEzG,OAAOs9E,IACR3nE,MAAM,KACL3D,QAAQiJ,MAAM,sCAAuC7F,GAC9C,SAGTkoE,EAAU,CAAA,EAChB,IAAK,MAAME,KAAcH,EAAW/2B,OAC5Bk3B,IACAF,EAAQE,EAAWr+E,MAAQq+E,EAAWnd,WAG9C,OAAOid,CACX,EAWQG,CAAkBzlE,GAAQzM,KAAK+xE,IAC3BX,EAAc,IACPN,MACAiB,OAGZ,IACKv+E,EAAK2+E,GAA2B,CAAEpkE,WAAYA,EAAYza,SAAUA,GAChF,CCpCO,SAAS8+E,GAAwBnkE,GACpC,MAAMsP,IAAEA,EAAGo6C,cAAEA,GAAkB1pD,EAC/B,GAAIsP,EAAK,CAEL,MAAM80D,EAAU,UAAW90D,EACrBA,EACA,CACE/S,MAAO+S,EAAI+0D,OACXxxD,WAAYvD,EAAIg1D,aAExB,OAAQ/+E,EAAK29E,GAAqB,CAAE79E,SAAUE,EAAKg/E,GAA8B,IAAKvkE,EAAOsP,IAAK80D,KACtG,CACK,OAAI1a,EAEEnkE,EAAKi/E,GAAmB,IAAKxkE,IAI7Bza,EAAKk/E,GAAY,GAEhC,CAEA,SAASA,KACL,OAAQ3+E,EAAMqpD,GAAY,CAAEn9C,OAAQ,OAAQc,KAAMvN,EAAK2X,GAAK,CAAE1X,UAAW,4BAA8BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,mCAAoCH,SAAU,+BAAiCE,EAAK,MAAO,CAAEC,UAAW,0BAA2BH,SAAU,8DAC5R,CAGA,SAASm/E,IAAkBE,eAAEA,EAAchb,cAAEA,EAAav4C,QAAEA,EAAOC,QAAEA,GAAU,EAAK+5C,UAAEA,GAAY,EAAKr3D,YAAEA,EAAc,uBAAsB6wE,gBAAEA,EAAkB,cAAa99E,MAAEA,EAAQ,yBAAwB+9E,gBAEhNA,EAAeC,kBAAEA,EAAiBnY,kBAElCA,EAAoB,kEAAiEC,SAAEA,EAAW,IAC9F,MAAMnuD,OAAEA,GAAWC,MACZ7J,EAAYC,GAAiBpM,EAAS,KACtC4jE,EAAWyY,GAAgBr8E,GAAS,IACpC6mB,EAAKy1D,GAAUt8E,IAChBwH,EAAQC,IACRgF,EAAWC,EAAO,MAClB+3D,EAAe/3D,EAAO,OAErB6vE,EAAaC,GAAkBx8E,EAAS,KAExC8kE,EAAYC,GAAiB/kE,GAAS,GACvCy8E,EAAiB/vE,EAAO,GAExBgwE,EAAkBj2E,EAAaO,IACjCA,EAAEoH,iBACFpH,EAAEC,kBACFw1E,EAAexpE,UACXjM,EAAEylD,cAAcz5B,OAAO5c,SAAS,UAChC2uD,GAAc,IAEnB,IACG7Y,EAAiBzlD,EAAaO,IAChCA,EAAEoH,iBACFpH,EAAEC,mBACH,IACGm+D,EAAkB3+D,EAAaO,IACjCA,EAAEoH,iBACFpH,EAAEC,kBACFw1E,EAAexpE,UACgB,IAA3BwpE,EAAexpE,SACf8xD,GAAc,IAEnB,IACGM,EAAa5+D,EAAaO,IAK5B,GAJAA,EAAEoH,iBACFpH,EAAEC,kBACFw1E,EAAexpE,QAAU,EACzB8xD,GAAc,GACV/9D,EAAEylD,cAAc10C,OAAS/Q,EAAEylD,aAAa10C,MAAMpO,OAAS,EAAG,CAC1D,MAAMgzE,EAAa53E,MAAMgJ,KAAK/G,EAAEylD,aAAa10C,OAC7CykE,EAAe35E,GACM,IAAIA,KAAS85E,GAAY7gE,MAAM,EAAGooD,GAG3D,GACD,CAACA,IACEyB,EAAwBl/D,EAAaO,IACvC,GAAIA,EAAEF,OAAOiR,OAAS/Q,EAAEF,OAAOiR,MAAMpO,OAAS,EAAG,CAC7C,MAAMgzE,EAAa53E,MAAMgJ,KAAK/G,EAAEF,OAAOiR,OACvCykE,EAAe35E,GACM,IAAIA,KAAS85E,GAAY7gE,MAAM,EAAGooD,GAG3D,CAEAl9D,EAAEF,OAAOtJ,MAAQ,IAClB,CAAC0mE,IACE0Y,EAAmBn2E,EAAaf,IAClC82E,EAAe35E,GAAQA,EAAKoW,OAAO,CAACxT,EAAGrG,IAAMA,IAAMsG,KACpD,IACHhD,EAAU,KAEF+J,EAASwG,SACTxG,EAASwG,QAAQgc,SAEtB,IAEH,MAAM4tD,EAA2BxpE,UAC7B,IAAK4tD,EACD,OACJ,MAAMj+D,EAAUmJ,EAAWW,OAC3B,GAAK9J,IAAW4gE,EAAhB,CAEAyY,GAAa,GACb,IAEIS,eAAeC,WAAW,oBAC1Bv1E,EAAM,CACFpJ,MAAOm+E,EAAY5yE,OAAS,EAAI,wCAA0C,oBAC1EJ,OAAQ,OACR5I,SAAU,MAGd,MAAMq8E,EAAeb,OAAuB,GAE5C,IAAIjmE,EAAiBlT,EACrB,GAAIg6E,EAAarzE,OAAS,IAAM,YAAYkN,KAAK7T,GAAU,CAEvDkT,EAAiB,CAAClT,EAAS,GAAI,kBADjBg6E,EAAar/E,IAAKO,GAAO,SAASA,MACSga,KAAK,KAClE,CACA,MAAM+kE,QAAehc,EAAc/qD,GACnC,GAAI+mE,EAAQ,CAER,GAAIV,EAAY5yE,OAAS,EAAG,CACxB,IAAK,MAAM4S,KAAQggE,EACf,IACI,MAAMhkE,EAAe,SAASgE,EAAKrf,aAC7B6Y,EAAOgC,MAAMmlE,eAAeD,EAAOrB,OAAQrjE,EAAcgE,SAEzDxG,EAAO2U,MAAMC,UAAUwyD,WAAWF,EAAOpB,YAAaoB,EAAOrB,OAAQ,eAAgB,CACvF19E,GAAI,QAAQ4F,KAAKC,SAASK,KAAKC,SAASyd,SAAS,IAAIs7D,OAAO,EAAG,KAC/DlgF,KAAMqf,EAAKrf,KACXmgF,aAAc9gE,EAAKhf,MAAQ,2BAC3B+/E,UAAW,YAAY/kE,IACvBglE,cAAehlE,GAEvB,CACA,MAAOilE,GACHztE,QAAQiJ,MAAM,gCAAgCuD,EAAKrf,QAASsgF,EAEhE,CAEJhB,EAAe,GACnB,CAEAJ,MACAE,EAAO,CACHxoE,MAAOmpE,EAAOrB,OACdxxD,WAAY6yD,EAAOpB,cAEvBzvE,EAAc,IACd5E,EAAM,CACFpJ,MAAO,gBACPmL,OAAQ,UACR5I,SAAU,KAElB,CACJ,CACA,MAAOgT,GACHnM,EAAM,CACFpJ,MAAO,0BACPmL,OAAQ,QACR5I,SAAU,IACVmK,YAAa6I,aAAe6U,MAAQ7U,EAAI3Q,QAAU,iBAE1D,CACR,QACYq5E,GAAa,EACjB,CAlEI,GA2ER,OAAIx1D,EACQ/pB,EAAKg/E,GAA8B,CAAEpzD,UAASC,UAASszD,iBAAgB5wE,cAAawb,IAAKA,EAAKzoB,MAAOA,IAEzGf,EAAM,MAAO,CAAEN,UAAW,qFAAoF+nE,EAAa,kCAAoC,IAAM1Y,YAAaswB,EAAiBvwB,WAAYD,EAAgBG,YAAa+Y,EAAiB5b,OAAQ6b,EAAYzoE,SAAU,CAACkoE,GAAehoE,EAAK,MAAO,CAAEC,UAAW,2HAA4HH,SAAUS,EAAM,MAAO,CAAEN,UAAW,+EAAgFH,SAAU,CAACE,EAAKusD,GAAY,CAAEtsD,UAAW,WAAa,sCAA0CD,EAAK,QAAS,CAAEqB,IAAKsmE,EAAclnE,KAAM,OAAQ42C,UAAU,EAAMwyB,OAAQ1C,EAAmB72D,SAAUu4D,EAAuB5oE,UAAW,WAAaM,EAAM,MAAO,CAAEN,UAAW,sHAAuHH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,8BAA+BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,MAAOH,SAAUE,EAAK2gF,GAAK,CAAE1gF,UAAW,0BAA6BD,EAAK,OAAQ,CAAEC,UAAW,uDAAwDH,SAAUwB,OAAcsqB,IAAYC,GAAY7rB,EAAKgM,EAAQ,CAAE/G,KAAM,KAAMgH,QAAS,QAAS9I,QAASyoB,EAAStqB,MAAO,QAASrB,UAAW,sCAAuCH,SAAUE,EAAK0sB,GAAO,CAAEzsB,UAAW,gBAAqBM,EAAM,MAAO,CAAEN,UAAW,6EAA4E2lE,EAAY,4BAA8B,+BAAiC9lE,SAAU,CAACq/E,GAAmBn/E,EAAK,MAAO,CAAEC,UAAW,sIAAqI2lE,EAAY,SAAW,YAAc9lE,SAAUq/E,IAAoB5+E,EAAM,MAAO,CAAEN,UAAW,mFAAkF2lE,EAAY,SAAW,YAAc9lE,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,2DAA4DH,SAAU,4CAA8CS,EAAM,MAAO,CAAEN,UAAW,kDAAmDH,SAAU,CAAC,qDAAsDs/E,EAAiB,IAAK,oBAAwB7+E,EAAM,MAAO,CAAEN,UAAW,oFAAqFH,SAAU,CAAC2/E,EAAY5yE,OAAS,GAAM7M,EAAK,MAAO,CAAEC,UAAW,4BAA6BH,SAAU2/E,EAAY5+E,IAAI,CAAC4e,EAAM7W,IAAWrI,EAAM,MAAO,CAAEN,UAAW,wFAAyFH,SAAU,CAACE,EAAK+pE,GAAc,CAAE9pE,UAAW,aAAeD,EAAK,OAAQ,CAAEC,UAAW,yBAA0BH,SAAU2f,EAAKrf,OAASJ,EAAK,OAAQ,CAAEC,UAAW,qBAAsBH,SAAU,WAAaE,EAAK,SAAU,CAAEmD,QAAS,IAAM28E,EAAiBl3E,GAAQ3I,UAAW,2CAA4CH,SAAUE,EAAK0sB,GAAO,CAAEzsB,UAAW,eAAmB,GAAGwf,EAAKrf,QAAQwI,QAAgB5I,EAAK,MAAO,CAAEC,UAAW,kBAAmBH,SAAUS,EAAMyL,EAAQ,CAAEC,QAAS,UAAWhH,KAAM,KAAM9B,QAAS,IAAMwkE,EAAaxxD,SAASuxB,QAAS/2B,SAAUm2D,GAAa2Y,EAAY5yE,QAAUu6D,EAAUnnE,UAAW,UAAWH,SAAU,CAACE,EAAKusD,GAAY,CAAEtsD,UAAW,oBAAsB,cAAiBM,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,SAAUH,SAAUE,EAAK,QAAS,CAAEqB,IAAKsO,EAAUjP,MAAO2O,EAAYiB,SAAWpG,GAAMoF,EAAcpF,EAAEF,OAAOtJ,OAAQyQ,UAVriHjH,IACL,UAAVA,EAAEkH,KAAoBlH,EAAEmH,WACxBnH,EAAEoH,iBACFyuE,MAO8kHxxE,YAAaA,EAAaoC,SAAUm2D,EAAW7mE,UAAW,qLAAwLM,EAAMyL,EAAQ,CAAE7I,QAAS48E,EAA0BpvE,UAAWtB,EAAWW,QAAU82D,EAAW7mE,UAAW,kIAAmIH,SAAU,CAACgnE,EAAa9mE,EAAK8pC,EAAS,CAAE7kC,KAAM,KAAMhF,UAAW,WAAgBD,EAAK0qE,GAAU,CAAEzqE,UAAW,oBAAuBm/E,QAAyBp/E,EAAK,MAAO,CAAEC,UAAW,4DAA6DH,SAAU2/E,EAAY5yE,OAAS,EAC1yI,GAAG4yE,EAAY5yE,cAAc4yE,EAAY5yE,OAAS,EAAI,IAAM,mDAC5D,kDAC9B,CAEA,SAASmyE,IAA6Bj1D,IAAEA,EAAGzoB,MAAEA,EAAKsmB,YAAEA,GAAc,EAAIgE,QAAEA,EAAOC,QAAEA,GAAU,EAAK+5C,UAAEA,GAAY,EAAKr3D,YAAEA,EAAc,uBAAsB6d,cAAEA,EAAaw+B,cAExKA,EAAasc,aAAEA,EAAYC,kBAAEA,EAAiBC,SAAEA,EAAQG,qBAExDA,EAAoBC,kBAAEA,EAAiBC,iBAAEA,EAAgBC,kBAEzDA,EAAiB2X,gBAEjBA,EAAeC,kBAAEA,EAAiB12B,YAElCA,GAAc,EAAK15C,wBAEnBA,EAAuBC,eAAEA,IACrB,MAAM8J,OAAEA,GAAWC,KACbiL,EAAYvU,EAAO,MACnBgxE,EAAkBhxE,EAAO,OACxBmE,EAAU8sE,GAAe39E,EAAS,KAClCmhB,EAAay8D,GAAkB59E,GAAS,IACxC4jE,EAAWyY,GAAgBr8E,GAAS,IACpCkhB,EAAU28D,GAAe79E,EAAS,YAClC89E,EAAkBC,GAAuB/9E,GAAU2oB,IACnDk7C,EAAYma,GAAiBh+E,GAAS,IAEtC+nE,EAAOkW,GAAYj+E,EAAS,KAE5BgoE,EAAiBkW,GAAsBl+E,EAAS,IAEhDm+E,EAAqBC,IAA0Bp+E,EAAS,IAAIiR,MAC5DmP,GAAsBi+D,IAA2Br+E,EAAS,GAC3DwH,GAAQC,KACP62E,GAAWC,IAAgBv+E,EAAS0kB,IACpC85D,GAAgBC,IAAqBz+E,EAAS,OAG9C8Q,GAAmB4tE,IAAwB1+E,EAAS,IAAIiR,MAExDkzD,GAAiBwa,IAAsB3+E,EAAS,IAAIiR,KAErDmzD,GAAqBxlE,EAAQ,IAAMmG,MAAMgJ,KAAKo2D,GAAgBllE,UAAUwa,KAAKuD,GAAKA,EAAEzT,SAAWu9D,GAAqBE,WAAahqD,EAAEzT,SAAWu9D,GAAqBG,YAAa,CAAC9C,KAGjLya,GAAyBlyE,EAAO,IAAIuE,KACpC4tE,GAA0BnyE,EAAO,OAEhCoyE,GAAkBC,IAAsB/+E,EAAS,IACjDg/E,GAAmBC,IAAuBj/E,EAAS,IACnDk/E,GAAiBC,IAAsBn/E,GAAS,GACjDo/E,GAAoB1yE,EAAO,MAC3B2yE,GAAuB54E,EAAY,KACjCm4E,GAAuB3rE,QAAQlR,KAAO,IACtC28E,GAAqB,IAAIztE,IAAI2tE,GAAuB3rE,UACpDgsE,GAAoB3rB,GAAKA,EAAI,IAEjCurB,GAAwB5rE,QAAU,MACnC,KAEI6xD,GAAYC,IAAiB/kE,GAAS,GACvCy8E,GAAiB/vE,EAAO,GAExB4yE,GAAgB1gF,EAAQ,KAC1B,MAAM2gF,EAAkBxX,EAAMC,IAAoB,CAC9CH,KAAM,CAAEA,KAAM,IACd74D,UAAW,GAETwwE,EAA0BrB,EAAoB3sE,IAAI+tE,EAAgBvwE,YAAc,IAAIiC,IAC1F,MAAO,CACH42D,KAAM0X,EAAgB1X,KACtBC,iBAAkB0X,IAEvB,CAACzX,EAAOC,EAAiBmW,IAEtBsB,GAAwBh5E,EAAY,KACtCs3E,EAAqBl7E,IACZA,GACDi6E,eAAexxD,QAAQ,mBAAoB,SAEvCzoB,KAEb,IACG68E,GAAmBj5E,EAAaf,IAClCw4E,EAAmBx4E,IACpB,IACGi6E,GAAuBl5E,EAAY,KACrCs3E,GAAoB,IACrB,IAEHr7E,EAAU,KACN,IAAKye,EAAa,CACd,MAAMy+D,EAAWh9E,YAAY,KACzBy7E,GAAwB,IAAMj6E,KAAKkS,MAAMlS,KAAKC,UAAYsK,GAAiBhF,OAAS,MACrF,KACH,MAAO,IAAM7G,cAAc88E,EAC/B,GACD,CAACz+D,IAWJze,EAAU,KAENi7E,EAAY,IACZM,EAAS,IACTC,EAAmB,GACnBE,GAAuB,IAAIntE,KAC3B8sE,GAAoB,GACpBU,GAAkB,MAClBC,GAAqB,IAAIztE,KAlBDoC,WACxB,IACI,MAAMwsE,QAAqB9pE,EAAO2U,MAAMC,UAAUm1D,cAAcj5D,EAAI/S,MAAO+S,EAAIuD,YAC/Eq0D,GAAkBoB,EAAat2E,OACnC,CACA,MAAOyP,GACHjJ,QAAQiJ,MAAM,mCAAoCA,EACtD,GAYA+mE,GACAhqE,EAAO2U,MAAMC,UAAUq1D,eAAen5D,EAAIuD,WAAYvD,EAAI/S,MAAQ9Q,IAI9D,GAAIA,EAAQzF,OAASiS,GAAiB2F,gBAAiB,CACnD,MAAMhF,EAAUnN,EAAQmN,QACxB,IAAKA,GAAS8vE,aACV,OAEJlB,GAAmBzrB,GAAKA,EAAI,GAC5B6rB,IAAmB,GACfC,GAAkBnsE,SAClBoL,aAAa+gE,GAAkBnsE,SACnCmsE,GAAkBnsE,QAAUmL,WAAW,IAAM+gE,IAAmB,GAAQ,IAExE,MAAMlsE,EAAU2rE,GAAuB3rE,QAAQzB,IAAIrB,EAAQ8vE,eAAiB,CACxE/8E,KAAM,GACN8O,aAAchP,EAAQ8M,cACtBmC,eAAgBnO,KAAKC,OAEnBm8E,EAAUjtE,EAAQ/P,MAAQF,EAAQA,SAAW,IAWnD,OAVA47E,GAAuB3rE,QAAQ3B,IAAInB,EAAQ8vE,aAAc,CACrD/8E,KAAMg9E,EACNluE,aAAchP,EAAQ8M,cACtB3H,WAAYgI,EAAQgwE,SACpBluE,eAAgBgB,EAAQhB,sBAGY,OAApC4sE,GAAwB5rE,UACxB4rE,GAAwB5rE,QAAUzO,sBAAsB66E,KAGhE,CAEA,GAAIr8E,EAAQzF,OAASiS,GAAiB0F,OAAQ,CAC1C,MAAM/E,EAAUnN,EAAQmN,QACxB,GAA6B,oBAAzBA,GAASsS,aAAqCtS,EAAQ4H,MAQtD,YAPA4mE,GAAmB97E,IACf,MAAMu9E,EAAS,IAAInvE,IAAIpO,GACvB,IAAK,MAAM0Z,KAAQpM,EAAQ4H,MACvBqoE,EAAO9uE,IAAIiL,EAAKre,GAAIqe,GAExB,OAAO6jE,GAKnB,CAGIp9E,EAAQzF,OAASiS,GAAiB2E,SAClCyqE,GAAuB3rE,QAAQotE,QACS,OAApCxB,GAAwB5rE,UACxBxO,qBAAqBo6E,GAAwB5rE,SAC7C4rE,GAAwB5rE,QAAU,MAEtCyrE,GAAqB,IAAIztE,MAIzBjO,EAAQzF,OAASiS,GAAiBC,WAClCmvE,GAAuB3rE,QAAQotE,QACS,OAApCxB,GAAwB5rE,UACxBxO,qBAAqBo6E,GAAwB5rE,SAC7C4rE,GAAwB5rE,QAAU,MAEtCyrE,GAAqB,IAAIztE,MAEzBjO,EAAQA,SACR26E,EAAa2C,IAET,GAAIA,EAAcviE,KAAMjP,GAAMA,EAAEE,YAAchM,EAAQgM,WAClD,OAAOsxE,EAGX,GAAIt9E,EAAQzF,OAASiS,GAAiBoF,WAAa5R,EAAQmN,SAASowE,YAAa,CAC7E,MAAMC,EAAoBF,EAAcrnE,OAAQnK,KAAQA,EAAEvR,OAASiS,GAAiBoF,UAChF9F,EAAEqB,SAASowE,aACXzxE,EAAE9L,UAAYA,EAAQA,UAE1B,OADA4L,GAAwB4xE,EAAmBx9E,GACpC,IAAIw9E,EACf,CAEA,OADA5xE,GAAwB0xE,EAAet9E,GAChC,IAAIs9E,OAKhB,KACH3C,EAAY,IAE4B,OAApCkB,GAAwB5rE,UACxBxO,qBAAqBo6E,GAAwB5rE,SAC7C4rE,GAAwB5rE,QAAU,MAEtC2rE,GAAuB3rE,QAAQotE,UAGpC,CAACx5D,EAAI/S,MAAOiC,EAAO2U,MAAMC,UAAW00D,KAGvC38E,EAAU,KACNk7E,G/F/aD,SAAsB/sE,GACzB,IAAKA,EAASlH,OACV,OAAO,EAEX,MAAMoZ,EAAqB,IAAI9R,IAY/B,GAXAJ,EAASY,QAASzO,IACd,MAAMgP,EAAenC,GAAgB7M,GAChC+f,EAAmB7V,IAAI8E,IACxB+Q,EAAmBzR,IAAIU,EAAc,IAEzC+Q,EAAmBvR,IAAIQ,GAAc3C,KAAKrM,KAG9C+M,QAAQC,IAAI,oCAAqCjL,MAAMgJ,KAAKgV,EAAmB1D,SAG/C,IAA5B0D,EAAmBhhB,OAAeghB,EAAmB7V,IAAI,QAAS,CAClE,MAAMuzE,EAAmB19D,EAAmB1D,OAAOlb,OAAO3G,OAAS,UACnEuS,QAAQC,IAAI,6CAA6CywE,wBACzD,MAAMC,EAAqB39D,EAAmBvR,IAAIivE,GAC5CliE,EAAcmiE,EAAmBA,EAAmB/2E,OAAS,GAGnE,OAFAoG,QAAQC,IAAI,wDAAwDuO,EAAYhhB,QAE3EgS,GAAY6G,SAASmI,EAAYhhB,OAItCwS,QAAQC,IAAI,gDACL,IAJHD,QAAQC,IAAI,wDACL,EAIf,CAEA,GAAI+S,EAAmB7V,IAAI,QAAS,CAChC,MAAMyzE,EAAqB59D,EAAmBvR,IAAI,QAElD,GAAkC,IAA9BmvE,EAAmBh3E,OAEnB,OADAoG,QAAQC,IAAI,iFACL,EAGX,MAAM4wE,EAAkBD,EAAmBA,EAAmBh3E,OAAS,GAEvE,OADAoG,QAAQC,IAAI,wDAAwD4wE,EAAgBrjF,QAC/EgS,GAAY6G,SAASwqE,EAAgBrjF,OAI1CwS,QAAQC,IAAI,gDACL,IAJHD,QAAQC,IAAI,wDACL,EAIf,CAGAD,QAAQC,IAAI,qFACZ,IAAK,MAAOgC,EAAcgR,KAASD,EAAmB5K,UAClD,GAAI6K,EAAKrZ,OAAS,EAAG,CACjB,MAAM4U,EAAcyE,EAAKA,EAAKrZ,OAAS,GACvC,IAAK4F,GAAY6G,SAASmI,EAAYhhB,MAElC,OADAwS,QAAQC,IAAI,6BAA6BgC,sBAClC,CAEf,CAGJ,OADAjC,QAAQC,IAAI,iDACL,CACX,C+FiXwB6wE,CAAahwE,IAGR,IAAjBk3D,EAAMp+D,QAENo0E,GAAoB,IAGzB,CAACltE,EAAUk3D,EAAMp+D,SAEpBjH,EAAU,KAEN,GAAqB,IAAjBqlE,EAAMp+D,SACLm0E,IACAhB,eAAe1xD,QAAQ,oBAAqB,CAE7C,MAAM01D,EAAsB1iE,WAAW,KACnC2/D,GAAoB,GAEpBjB,eAAexxD,QAAQ,mBAAoB,SAC5C,KACH,MAAO,IAAMjN,aAAayiE,EAC9B,CAEAjwE,EAASY,QAASzO,IACd,GAAIA,EAAQzF,OAASiS,GAAiBwF,KAClC,IAEIjF,QAAQC,IAAI,yBAA0BhN,EAAQzF,MAC9C,IAAIwjF,EAAiB,KAUrB,GARI/9E,EAAQmN,SAAsC,iBAApBnN,EAAQmN,SAE9BnN,EAAQmN,QAAQ03D,MAAQ9iE,MAAMkT,QAAQjV,EAAQmN,QAAQ03D,QACtD93D,QAAQC,IAAI,kDACZ+wE,EAAiB,CAAElZ,KAAM7kE,EAAQmN,QAAQ03D,OAI7CkZ,EAAgB,CAChB,MAAM/xE,EAAyC,iBAAtBhM,EAAQgM,UAC3BhM,EAAQgM,UACR,IAAIlL,KAAKd,EAAQgM,WAAWC,UAGlC,IAA2B,IADD84D,EAAM54D,UAAWyyB,GAAMA,EAAE5yB,YAAcA,IACjC+xE,EAAgB,CAC5ChxE,QAAQC,IAAI,kCAEZ,MAAMgxE,EAAU,CACZnZ,KAAMkZ,EACN/xE,aAGJe,QAAQC,IAAI,8BAA+BgxE,GAC3C/C,EAAUp7E,IACN,MAAMo+E,EAAW,CAACD,KAAYn+E,GAE9B,OADAkN,QAAQC,IAAI,mBAAoBixE,GACzBA,IAGX/C,EAAmB,GAEnBnuE,QAAQC,IAAI,oCACZ+tE,GAAoB,GAEpB,MAAMmD,EAAsB,IAAIjwE,IAEhCiwE,EAAoB5vE,IAAI,OAAQ,eAE5BvM,MAAMkT,QAAQ8oE,EAAelZ,OAC7BkZ,EAAelZ,KAAKp2D,QAAS42D,IACzB,GAAIA,GAAwB,iBAATA,GAAqBA,EAAKnqE,GAAI,CAC7C,MAAMoqE,EAASD,EAAKnqE,GAAG4jB,WAEvBo/D,EAAoB5vE,IAAIg3D,EAAQD,EAAK9+D,QAAU,UACnD,IAIR60E,GAAwBv7E,IACpB,MAAMu9E,EAAS,IAAInvE,IAAIpO,GAEvB,OADAu9E,EAAO9uE,IAAItC,EAAWkyE,GACfd,GAEf,CACJ,CACJ,CACA,MAAOpnE,GACHjJ,QAAQiJ,MAAM,qCAAsCA,EACxD,CAGAhW,EAAQzF,OAASiS,GAAiBsF,QAAU9R,EAAQmN,SAGhDnN,EAAQmN,QAAQs6C,SAAW1lD,MAAMkT,QAAQjV,EAAQmN,QAAQs6C,UACzD16C,QAAQC,IAAI,4FAMxB,MAAMuO,EAAc1N,EAASA,EAASlH,OAAS,GAC3C4U,IACIA,EAAYhhB,OAASiS,GAAiBI,YACtC2uE,IAAa,GACbE,GAAkB,eAIdF,KADA75D,GAIanG,EAAYhhB,OAASiS,GAAiBG,iBAIhE,CAACkB,EAAUk3D,EAAOC,IAErB,MAAMmZ,GAAqBn+E,IACvB,MAAMsV,EAAUtV,EAAQ8J,OACxB,IAAKwL,GAAWsrD,EACZ,OAEJ,GAAIQ,GAOA,YANA58D,GAAM,CACF+B,OAAQ,UACRnL,MAAO,yBACP0M,YAAa,gEACbnK,SAAU,MAIlB07E,GAAa,GAEb,MAAM+E,EAAsBt9E,KAAKC,MAC3Bs9E,EAAoB,CACtBryE,UAAWoyE,EACXpqE,gBAAiB6P,EAAI/S,MACrBvW,KAAMiS,GAAiBoF,SACvB5R,QAASsV,EACTxI,cAAe,OACfK,QAAS,CAAEowE,aAAa,IAE5BxwE,QAAQC,IAAI,oCAAqCsI,GACjDqlE,EAAa96E,IACT,MAAMy+E,EAAc,IAAIz+E,EAAMw+E,GAQ9B,OANAC,EAAYpvE,KAAK,CAAC9C,EAAG+C,KACoB,iBAAhB/C,EAAEJ,UAAyBI,EAAEJ,UAAY,IAAIlL,KAAKsL,EAAEJ,WAAWC,YAC/C,iBAAhBkD,EAAEnD,UAAyBmD,EAAEnD,UAAY,IAAIlL,KAAKqO,EAAEnD,WAAWC,YAGxFc,QAAQC,IAAI,mCAAoCsxE,EAAY33E,OAAQ,YAC7D23E,IAGX,MAAMtE,EAAeb,OAAuB,GAE5C,IAAIjmE,EAAiBoC,EACrB,GAAI0kE,EAAarzE,OAAS,IAAM,YAAYkN,KAAKyB,GAAU,CAEvDpC,EAAiB,CAACoC,EAAS,GAAI,kBADjB0kE,EAAar/E,IAAKO,GAAO,SAASA,MACSga,KAAK,KAClE,CACAnC,EAAO2U,MAAMC,UACRwyD,WAAWt2D,EAAIuD,WAAYvD,EAAI/S,MAAO,YAAa,CACpD9Q,QAASkT,EACToqB,SAAU08C,EAAarzE,OAAS,EAAI,CAAE43E,cAAevE,QAAiBnzE,IAErEP,KAAK,KACNs0E,GAAe,GAEfxB,QAEC1oE,MAAOC,IAERgqE,EAAa96E,GAASA,EAAKoW,OAAQnK,GAAMA,EAAEE,YAAcoyE,IACzD55E,GAAM,CACF+B,OAAQ,QACRnL,MAAO,yBACP0M,YAAa6I,aAAe6U,MAAQ7U,EAAI3Q,QAAU,gBAClDrC,SAAU,QAGb+lC,QAAQ,KACT21C,GAAa,MAIfmF,GAAmB/6E,EAAY4M,MAAO0E,IACxC,IAAK,MAAMwE,KAAQxE,EAAO,CACtB,MAAM0pE,EAAS,QAAQ39E,KAAKC,SAASK,KAAKC,SAASyd,SAAS,IAAIs7D,OAAO,EAAG,KACpE7kE,EAAe,SAASgE,EAAKrf,OAE7BwkF,EAAY,CACdxjF,GAAIujF,EACJvkF,KAAMqf,EAAKrf,KACXmgF,aAAc9gE,EAAKhf,MAAQ,2BAC3BwE,KAAMwa,EAAKxa,KACXwH,OAAQu9D,GAAqBE,UAC7Bh/D,WAAYlE,KAAKC,OAErB46E,GAAmB97E,GAAQ,IAAIoO,IAAIpO,GAAMyO,IAAImwE,EAAQC,IACrD,UAEU3rE,EAAOgC,MAAMmlE,eAAer2D,EAAI/S,MAAOyE,EAAcgE,GAE3DoiE,GAAmB97E,IACf,MAAMu9E,EAAS,IAAInvE,IAAIpO,GACjBma,EAAIojE,EAAO5uE,IAAIiwE,GAMrB,OALIzkE,IACAA,EAAEzT,OAASu9D,GAAqBG,WAChCjqD,EAAEugE,cAAgBhlE,EAClByE,EAAEsgE,UAAY,YAAY/kE,KAEvB6nE,UAGLrqE,EAAO2U,MAAMC,UAAUwyD,WAAWt2D,EAAIuD,WAAYvD,EAAI/S,MAAO,eAAgB,CAC/E5V,GAAIujF,EACJvkF,KAAMqf,EAAKrf,KACXmgF,aAAc9gE,EAAKhf,MAAQ,2BAC3B+/E,UAAW,YAAY/kE,IACvBglE,cAAehlE,GAEvB,CACA,MAAOS,GAEH2lE,GAAmB97E,IACf,MAAMu9E,EAAS,IAAInvE,IAAIpO,GACjBma,EAAIojE,EAAO5uE,IAAIiwE,GAMrB,OALIzkE,IACAA,EAAEzT,OAASu9D,GAAqBjyD,MAChCmI,EAAEhE,MAAQA,aAAiBwP,MAAQxP,EAAMhW,QAAU,gBACnDga,EAAE/U,aAAenE,KAAKC,OAEnBq8E,IAEX54E,GAAM,CACF+B,OAAQ,QACRnL,MAAO,gBACP0M,YAAakO,aAAiBwP,MAAQxP,EAAMhW,QAAU,wBACtDrC,SAAU,KAElB,CACJ,GACD,CAACoV,EAAQ8Q,EAAKrf,KAEXk1E,GAAkBj2E,EAAaO,IACjCA,EAAEoH,iBACFpH,EAAEC,kBACFw1E,GAAexpE,UAEX4T,GAAO7f,EAAEylD,cAAcz5B,OAAO5c,SAAS,UACvC2uD,IAAc,IAEnB,CAACl+C,IACEqlC,GAAiBzlD,EAAaO,IAChCA,EAAEoH,iBACFpH,EAAEC,mBACH,IACGm+D,GAAkB3+D,EAAaO,IACjCA,EAAEoH,iBACFpH,EAAEC,kBACFw1E,GAAexpE,UACgB,IAA3BwpE,GAAexpE,SACf8xD,IAAc,IAEnB,IACGM,GAAa5+D,EAAaO,IAM5B,GALAA,EAAEoH,iBACFpH,EAAEC,kBACFw1E,GAAexpE,QAAU,EACzB8xD,IAAc,GAEVl+C,GAAO7f,EAAEylD,cAAc10C,OAAS/Q,EAAEylD,aAAa10C,MAAMpO,OAAS,EAAG,CACjE,MAAMgzE,EAAa53E,MAAMgJ,KAAK/G,EAAEylD,aAAa10C,OAC7CypE,GAAiB7E,EACrB,GACD,CAAC91D,EAAK26D,KA0DHG,GAAcvjF,GAASyoB,EAAIuD,WAAW1R,MAAM,KAAK,IAAM,sBA0BtDq0B,GAAgBC,IAAqBhtC,GAAS,GA0CrD,OAAQlD,EAAK+V,GAA0B,CAAEjW,SAAUE,EAAKwJ,GAAuB,CAAE1J,SAAUS,EAAM,MAAO,CAAEN,UAAW,+CAA8C+nE,GAAa,kCAAoC,IAAM1Y,YAAaswB,GAAiBvwB,WAAYD,GAAgBG,YAAa+Y,GAAiB5b,OAAQ6b,GAAYzoE,SAAU,CAACkoE,IAAehoE,EAAK,MAAO,CAAEC,UAAW,2HAA4HH,SAAUS,EAAM,MAAO,CAAEN,UAAW,+EAAgFH,SAAU,CAACE,EAAKusD,GAAY,CAAEtsD,UAAW,WAAa,4BAAgCM,EAAM,MAAO,CAAEc,IAAKu/E,EAAiB3gF,UAAW,0CAAyC+gF,EAC9vB,kBACApb,EACI,gBACA,mBAAmB/5C,EAAwB,GAAd,cAAsB/rB,SAAU,CAACsiF,IAAoBpiF,EAAK,MAAO,CAAEC,UAAW,8BAA+BH,SAAUE,EAAK,MAAO,CAAEC,UAAW,kFAAsFD,EAAK,MAAO,CAAEC,UAAW,gBAAiBH,SAAUE,EAAK2rB,GAAQ,CAAErqB,MAAOujF,GAAaxgE,YAAaA,EAAauH,QAASA,EAASC,QAASA,EAAS9B,IAAKA,EAAK3F,SAAUA,EAAU0H,iBAAkBi1D,EAAah1D,cAAei1D,EAAkBh1D,QAASi/C,EAAMp+D,OAAS,EAAGof,kBAAmB02D,GAAuBz2D,WAtE5jB3V,UACzB,IACI,MAAMF,QAsFXE,eAAkCkQ,EAAU8G,GAC/C,OAAO9G,EAASxL,MACXuS,eAAe,UAAUD,uBACzB/gB,KAAMihB,GAAMA,EAAEpX,IACvB,CA1F8BqX,CAAmBzU,EAAQ8Q,EAAI/S,OAC7CX,GACAhN,OAAOC,KAAK+M,EAAK,SACzB,CACA,MAAOQ,GACH5D,QAAQiJ,MAAM,kCAAmCrF,GACjDnM,GAAM,CACF+B,OAAQ,QACRnL,MAAO,kCACPuC,SAAU,KAElB,GAyDunBsoB,YAtDzmB,KACd9f,UAAUC,UAAUC,UAAUwd,EAAI/S,OAClCtM,GAAM,CACF+B,OAAQ,UACRnL,MAAO,gBACPuC,SAAU,OAiDioBuoB,cAAeA,EAAeC,YA7CnpB,KACrBu0D,EAAgBzqE,QASrB+5B,IAAkB,GARdxlC,GAAM,CACF+B,OAAQ,QACRnL,MAAO,oBACP0M,YAAa,8CACbnK,SAAU,WAuCytB,IAApBkQ,EAASlH,QAAiBwX,EAA4lBrkB,EAAKkkB,GAAkB,CAAEnQ,SAAUA,EAAUoQ,UAAWA,EAAWC,SAAUA,EAAUC,YAAaA,EAAa0mD,KAAMyX,GAAczX,KAAMC,iBAAkBwX,GAAcxX,iBAAkBj/C,cAAei1D,EAAkB/0D,kBAAmB02D,GAAuB1X,MAAOA,EAAOC,gBAAiBA,EAAiBC,aAAcyX,GAAkBkC,WAAYtC,GAAczX,KAAKA,MAAMp1D,OAAO,CAACovE,EAAKxZ,KACvrDA,EAAKnqE,IAAMmqE,EAAKK,MAChBmZ,EAAIvwE,IAAI+2D,EAAKnqE,GAAG4jB,WAAYumD,EAAKK,MAE9BmZ,GACR,IAAI5wE,KAAQH,kBAAmBA,GAAmByE,cAAe4rE,GAAmB/gE,qBAAsBA,KAL2nBtjB,EAAK,MAAO,CAAEC,UAAW,2EAA4EH,SAAUS,EAAM,MAAO,CAAEN,UAAW,uDAAwDH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,mCAAoCH,SAAU,CAACE,EAAKgF,GAAiB,CAAEC,KAAM,KAAMR,MAAO,SAAWzE,EAAK,MAAO,CAAEC,UAAW,iCAAkCH,SAAU+R,GAAiByR,SAA8BtjB,EAAK,MAAO,CAAEC,UAAW,2BAA4BH,SAAUE,EAAKwE,GAAsB,CAAEC,MAAO,OAAQxE,UAAW,gBAKtpCD,EAAK,MAAO,CAAEC,UAAW,gBAAiBoE,MAAO,CAAE2gF,cAAe,oCAAsCllF,SAAU4hF,IAAqC,YAAnBA,GAAgCnhF,EAAMqpD,GAAY,CAAEn9C,OAA2B,cAAnBi1E,GAAiC,UAAY,OAAQn0E,KAAM,KAAMtN,UAAW,MAAOH,SAAU,CAAC,oBAAqB4hF,MAAsBF,IAAcxhF,EAAK2mE,GAAc,CAAEC,OAAQyd,GAAmBxd,OArI/gBtwD,UACvB,IAAIwwD,EAAJ,CAEAma,GAAc,GACd,UACUjoE,EAAO2U,MAAMC,UAAUwyD,WAAWt2D,EAAIuD,WAAYvD,EAAI/S,MAAO,OAAQ,CACvE9Q,QAAS,wBAEbwE,GAAM,CACF+B,OAAQ,OACRnL,MAAO,oBACP0M,YAAa,6CACbnK,SAAU,MAEdi9E,GAAe,EACnB,CACA,MAAOjqE,GACHnM,GAAM,CACF+B,OAAQ,QACRnL,MAAO,sBACP0M,YAAa6I,aAAe6U,MAAQ7U,EAAI3Q,QAAU,gBAClDrC,SAAU,KAElB,CACR,QACYq9E,GAAc,EAClB,CAxBI,GAmI8jBvwE,SAAUi4C,EAAake,UAAWA,GAAale,EAAame,WAAYA,EAAY9nD,aAAcoF,EAAaA,YAAaA,EAAa2iD,gBAxGprB,MACvB,IAAKjzD,EAASlH,OACV,OAAO,EAEX,MAAMoZ,EAAqB,IAAI9R,IAC/BJ,EAASY,QAASzO,IACd,MAAMgP,EAAenC,GAAgB7M,GAChB,SAAjBgP,GAA4C,QAAjBA,IACtB+Q,EAAmB7V,IAAI8E,IACxB+Q,EAAmBzR,IAAIU,EAAc,IAEzC+Q,EAAmBvR,IAAIQ,GAAc3C,KAAKrM,MAIlD,IAAI++E,EAAc,EAClB,IAAK,MAAOt8E,EAAGud,KAASD,EAAmB5K,UACvC,GAAI6K,EAAKrZ,OAAS,EAAG,CACjB,MAAM4U,EAAcyE,EAAKA,EAAKrZ,OAAS,GAElC,CAAC6F,GAAiBC,SAAUD,GAAiBE,MAAM0G,SAASmI,EAAYhhB,OACzEwkF,GAER,CAEJ,OAAOA,GA+EqtBC,GAAsB32E,YAAaA,EAEnuB04D,gBAAiByd,GAAkB95B,cAAeA,EAAesc,aAAcA,EAAcC,kBAAmBA,EAAmBC,SAAUA,EAE7IC,gBAAiBA,GAAiBC,mBAAoBA,GAEtDC,qBAAsBA,EAAsBC,kBAAmBA,EAAmBC,iBAAkBA,EAEpGC,kBAAmBA,EAEnBznE,UAAWiP,EAAyBC,eAAgBA,SAA2B6xE,GAAqBhhF,EAAK,MAAO,CAAEC,UAAW,2BAA4BH,SAAUE,EAAK8qE,GAAwB,CAAEC,KAAMyX,GAAczX,KAAMC,iBAAkBwX,GAAcxX,iBAAkBroE,OAAQq+E,EAAkBp1D,QAASi3D,GAAsB5X,MAAOA,EAAOC,gBAAiBA,EAAiBC,aAAcyX,OAAyBriF,EAAM2wC,EAAQ,CAAEvuC,OAAQstC,GAAgBrkB,QAAS,IAAMskB,IAAkB,GAAQpwC,SAAU,CAACE,EAAKmxC,EAAa,CAAErxC,SAAU,+BAAiCS,EAAM6wC,EAAY,CAAEtxC,SAAU,CAACE,EAAK,IAAK,CAAEC,UAAW,OAAQH,SAAU,8EAAgFE,EAAK,IAAK,CAAEC,UAAW,qBAAsBH,SAAU,oFAAyFS,EAAM8wC,EAAc,CAAErkB,MAAO,QAASltB,SAAU,CAACE,EAAKgM,EAAQ,CAAEC,QAAS,QAAShH,KAAM,KAAM9B,QAAS,IAAM+sC,IAAkB,GAAQpwC,SAAU,WAAaE,EAAKgM,EAAQ,CAAE/G,KAAM,KAAM9B,QAhD3hC,KAC3B,IAAKy9E,EAAgBzqE,QAOjB,YANAzL,GAAM,CACF+B,OAAQ,QACRnL,MAAO,oBACP0M,YAAa,8CACbnK,SAAU,MAIlB,MAAMytC,EAAW,GAAGuzC,QAAiB96D,EAAI/S,QACnCtJ,EA1zBd,SAA2BojB,EAAexvB,GACtC,GAAsB,oBAAX+H,QAA8C,oBAAb0nB,SACxC,OAAO,EAGX,MAAMC,EAASD,SAASE,cAAc,UACtCD,EAAO3sB,MAAM6sB,SAAW,QACxBF,EAAO3sB,MAAM8sB,MAAQ,IACrBH,EAAO3sB,MAAM+sB,OAAS,IACtBJ,EAAO3sB,MAAMkC,MAAQ,IACrByqB,EAAO3sB,MAAMb,OAAS,IACtBwtB,EAAO3sB,MAAMgJ,OAAS,IACtB2jB,EAAO3sB,MAAMgtB,WAAa,SAC1BN,SAASnuB,KAAK0uB,YAAYN,GAC1B,MAAMO,EAAeP,EAAOQ,cAC5B,IAAKD,EAED,OADAP,EAAOS,YAAYC,YAAYV,IACxB,EAEX,MAAMzvB,EAAMgwB,EAAaR,SAezB,OAdAxvB,EAAI+H,OACJ/H,EAAIowB,MAAM,qCAAqCrwB,wCAC/CC,EAAIqwB,QACJrwB,EAAID,MAAQA,EACGyvB,SAASc,iBAAiB,iCAClCld,QAAS6F,IACZjZ,EAAIuwB,KAAKR,YAAY9W,EAAKuX,WAAU,MAExCxwB,EAAIqB,KAAKsvB,UAAYpB,EAAcoB,UACnCX,EAAaY,QACbZ,EAAaa,QACb9Q,WAAW,KACP0P,EAAOS,YAAYC,YAAYV,IAChC,MACI,CACX,CAuxBwBH,CAAkB+vD,EAAgBzqE,QAASm7B,GACtD5jC,GASLhD,GAAM,CACF+B,OAAQ,UACRnL,MAAO,mBACP0M,YAAa,iDACbnK,SAAU,MAEdqsC,IAAkB,IAddxlC,GAAM,CACF+B,OAAQ,QACRnL,MAAO,oBACP0M,YAAa,+BACbnK,SAAU,OA+BqkC/D,SAAU,kCACzmC,CC72Be,SAASqlF,IAAgBpxE,SAAEA,IAEtC,MAAM0B,EAAiBlG,EAAMzN,QAAQ,IAAM,IAAIiS,GAAUqB,KAAK,CAAC9C,EAAG+C,KACzB,iBAAhB/C,EAAEJ,UAAyBI,EAAEJ,UAAY,IAAIlL,KAAKsL,EAAEJ,WAAWC,YAC/C,iBAAhBkD,EAAEnD,UAAyBmD,EAAEnD,UAAY,IAAIlL,KAAKqO,EAAEnD,WAAWC,YAEpF,CAAC4B,IACL,OAAQ/T,EAAK,MAAO,CAAEC,UAAW,+CAAgDH,SAAU2V,EAAe5U,IAAI,CAACqF,EAAS0C,IAAW5I,EAAKuY,GAAa,CAAErS,QAASA,EAASsS,qBAAqB,GAAS,GAAGtS,EAAQgM,aAAatJ,OACnO,CCRe,SAASw8E,IAAkBrxE,SAAEA,EAAQoQ,UAAEA,EAASlkB,UAAEA,EAASolF,kBAAEA,EAAiBC,eAAEA,IAC3F,MAAMhhE,EAAe/U,EAAMK,OAAO,MAElChK,EAAU,KACFue,EAAUhO,SACVgO,EAAUhO,QAAQyO,eAAe,CAAEC,SAAU,YAElD,CAAC9Q,EAAUoQ,IAEd,MAAM1O,EAAiBlG,EAAMzN,QAAQ,IAAM,IAAIiS,GAAUqB,KAAK,CAAC9C,EAAG+C,KACzB,iBAAhB/C,EAAEJ,UAAyBI,EAAEJ,UAAY,IAAIlL,KAAKsL,EAAEJ,WAAWC,YAC/C,iBAAhBkD,EAAEnD,UAAyBmD,EAAEnD,UAAY,IAAIlL,KAAKqO,EAAEnD,WAAWC,YAEpF,CAAC4B,IACL,OAAQ/T,EAAK,MAAO,CAAEqB,IAAKijB,EAAcrkB,UAAW,0FAA0FA,GAAa,KAAM,cAAe,qBAAsBH,SAAoC,IAA1B2V,EAAe5I,OAAgB7M,EAAK,MAAO,CAAEC,UAAW,4DAA4DqlF,GAAkB,KAAMxlF,SAAUE,EAAK,MAAO,CAAEC,UAAW,4CAA6CH,SAAU,oCAA0CE,EAAK,MAAO,CAAEC,UAAW,qDAAqDolF,GAAqB,KAAMvlF,SAAUE,EAAKmlF,GAAiB,CAAEpxE,SAAU0B,EAAgB4O,aAAa,OACtpB,CCVO,SAASkhE,GAAgC9jF,GAC5C,MAAMH,MAAEA,EAAKkkF,UAAEA,EAASC,WAAEA,EAAUC,QAAEA,EAAO13E,YAAEA,EAAW23E,kBAAEA,GAAsBlkF,EAiBlF,MAfa,CACT8mB,QAAS,MACT6uD,QAAS,WACTQ,MAAO,MACPt2E,MAAOA,GAAS,sBAChB0M,cACA+G,KAPS2wE,EAAQ7kF,IAAKmR,IAAC,CAAQpB,MAAOoB,EAAEpB,MAAOzL,KAAM6M,EAAE7M,KAAMgsB,MAAOnf,EAAEmf,SAQtEsnD,KAAM,QACNG,OAAQ,CACJ,CAAExnE,IAAK,OAAQR,MAAO40E,EAAW/kF,KAAM,OACvC,CAAE2Q,IAAK,QAASR,MAAO60E,EAAYhlF,KAAM,QAE7Cw4E,MAAO,CAAE9zE,KAAM,CAAEyL,MAAO,UACxB3C,QAAS,CAAEitE,SAAS,EAAOP,eAAe,EAAOgL,qBAGzD,CAIO,SAASC,GAA+BnkF,GAC3C,MAAMH,MAAEA,EAAKokF,QAAEA,EAAO13E,YAAEA,EAAW23E,kBAAEA,GAAsBlkF,EAmB3D,MAda,CACT8mB,QAAS,MACT6uD,QAAS,WACTQ,MAAO,MACPt2E,MAAOA,GAAS,0BAChB0M,cACA+G,KAVS2wE,EAAQ7kF,IAAKmR,IAAC,CACvBpB,MAAOoB,EAAEpB,MACTi1E,SAAqB,IAAX7zE,EAAE7M,MAAe6M,EAAEmf,MAAQnf,EAAE7M,MAAQ6M,EAAE7M,KAAQ,IAAM,KAS/DszE,KAAM,QACNG,OAAQ,CACJ,CAAExnE,IAAK,WAAYR,MAAO,WAAYnQ,KAAM,QAEhDw4E,MAAO,CAAE9zE,KAAM,CAAEyL,MAAO,aACxB3C,QAAS,CAAEitE,SAAS,EAAOP,eAAe,EAAMgL,qBAGxD,CAIO,SAASG,GAAgB/X,GAE5B,MAAO,CACH,WAFS5hE,KAAKC,UAAU2hE,EAAM,KAAM,GAIpC,OACF3yD,KAAK,KACX,CAIO,SAAS2qE,GAA2BtkF,GACvC,MAAMH,MAAEA,EAAK0M,YAAEA,EAAWs8D,KAAEA,EAAIqb,kBAAEA,GAAsBlkF,EAsBxD,MArBa,CACT8mB,QAAS,MACT6uD,QAAS,WACTQ,MAAO,WACPt2E,MAAOA,GAAS,oBAChB0M,cACA+G,KAAMu1D,EAAKzpE,IAAK4sB,IAAC,CACbu4D,OAAQv4D,EAAEu4D,OACVC,MAAOx4D,EAAEw4D,MACTC,cAAez4D,EAAEy4D,cACjBC,YAAa14D,EAAE04D,aAAgB14D,EAAEy4D,cAAgBz4D,EAAEw4D,SAEvDxN,KAAM,SACNG,OAAQ,CACJ,CAAExnE,IAAK,QAASR,MAAO,QAASnQ,KAAM,MAAOgE,MAAO,WACpD,CAAE2M,IAAK,gBAAiBR,MAAO,gBAAiBnQ,KAAM,MAAOgE,MAAO,WACpE,CAAE2M,IAAK,cAAeR,MAAO,eAAgBnQ,KAAM,OAAQgE,MAAO,UAAWw1E,QAAS,QAAS9zE,KAAK,IAExG8yE,MAAO,CAAE9zE,KAAM,CAAEyL,MAAO,UAAYugB,MAAO,CAAEvgB,MAAO,QACpD3C,QAAS,CAAEitE,SAAS,EAAOP,eAAe,EAAMgL,qBAGxD,CAIO,SAASS,GAA0B3kF,GACtC,MAAMH,MAAEA,EAAK0M,YAAEA,EAAWs8D,KAAEA,EAAIqb,kBAAEA,GAAsBlkF,EAuBxD,MAhBa,CACT8mB,QAAS,MACT6uD,QAAS,WACTQ,MAAO,OACPt2E,MAAOA,GAAS,wBAChB0M,cACA+G,KAZSu1D,EAAKzpE,IAAK4sB,IAAC,CACpBu4D,OAAQv4D,EAAEu4D,OACVK,KAAM54D,EAAE44D,MAAQ,KAChBC,IAAK74D,EAAE64D,KAAO,KACdC,KAAM94D,EAAE84D,MAAQ,QAShB9N,KAAM,SACNG,OAAQ,CACJ,CAAExnE,IAAK,OAAQR,MAAO,OAAQnQ,KAAM,OAAQgE,MAAO,UAAW0B,KAAK,GACnE,CAAEiL,IAAK,MAAOR,MAAO,MAAOnQ,KAAM,OAAQgE,MAAO,UAAW0B,KAAK,GACjE,CAAEiL,IAAK,OAAQR,MAAO,OAAQnQ,KAAM,OAAQgE,MAAO,UAAW0B,KAAK,IAEvE8yE,MAAO,CAAE9zE,KAAM,CAAEyL,MAAO,iBACxB3C,QAAS,CAAEitE,SAAS,EAAOP,eAAe,EAAMgL,qBAGxD,CAIO,SAASa,GAAsB/kF,GAClC,MAAMH,MAAEA,EAAK0M,YAAEA,EAAWs8D,KAAEA,EAAIkb,UAAEA,EAASC,WAAEA,EAAUE,kBAAEA,GAAsBlkF,EAgB/E,MAfa,CACT8mB,QAAS,MACT6uD,QAAS,WACTQ,MAAO,OACPt2E,MAAOA,GAAS,iBAChB0M,cACA+G,KAAMu1D,EACNmO,KAAM,SACNG,OAAQ,CACJ,CAAExnE,IAAK,YAAaR,MAAO,UAAU40E,IAAa/kF,KAAM,OAAQgE,MAAO,UAAW0B,KAAK,GACvF,CAAEiL,IAAK,aAAcR,MAAO,UAAU60E,IAAchlF,KAAM,OAAQgE,MAAO,UAAW0B,KAAK,IAE7F8yE,MAAO,CAAE9zE,KAAM,CAAEyL,MAAO,iBACxB3C,QAAS,CAAEitE,SAAS,EAAOP,eAAe,EAAMgL,qBAGxD,CAIO,SAASc,GAAkBhlF,GAC9B,MAAMH,MAAEA,EAAK0M,YAAEA,EAAWs8D,KAAEA,EAAIqb,kBAAEA,GAAsBlkF,EAexD,MAda,CACT8mB,QAAS,MACT6uD,QAAS,WACTQ,MAAO,OACPt2E,MAAOA,GAAS,gBAChB0M,cACA+G,KAAMu1D,EAAKzpE,IAAI4sB,IAAC,CAAOu4D,OAAQv4D,EAAEu4D,OAAQU,IAAKj5D,EAAEi5D,OAChDjO,KAAM,SACNG,OAAQ,CACJ,CAAExnE,IAAK,MAAOR,MAAO,MAAOnQ,KAAM,OAAQgE,MAAO,UAAW0B,KAAK,IAErE8yE,MAAO,CAAE9zE,KAAM,CAAEyL,MAAO,QACxB3C,QAAS,CAAEitE,SAAS,EAAOP,eAAe,EAAMgL,qBAGxD,CCzJY,MAACgB,GAA4B,CACrCvmF,KAAM,eACN4N,YAAa,q2bAsYb44E,aAAc,CACVnmF,KAAM,SACNqC,WAAY,CACR80E,MAAO,CACHn3E,KAAM,SACNwB,KAAM,CAAC,MAAO,OAAQ,OAAQ,WAAY,MAAO,UAAW,QAAS,YAAa,SAAU,WAC5F+L,YAAa,2BAEjB1M,MAAO,CACHb,KAAM,SACNuN,YAAa,eAEjBA,YAAa,CACTvN,KAAM,SACNuN,YAAa,8CAEjB+G,KAAM,CACFtU,KAAM,QACNuN,YAAa,wBACb/C,MAAO,CACHxK,KAAM,SACNomF,sBAAsB,IAG9BpO,KAAM,CACFh4E,KAAM,SACNuN,YAAa,qEAEjBorE,KAAM,CACF34E,KAAM,SACNuN,YAAa,gDAEjBkrE,QAAS,CACLz4E,KAAM,SACNuN,YAAa,6EAEjBmrE,SAAU,CACN14E,KAAM,SACNuN,YAAa,sEAEjBqrE,QAAS,CACL54E,KAAM,SACNuN,YAAa,oCAEjB8qE,QAAS,CACLr4E,KAAM,SACNuN,YAAa,iCAEjB4qE,OAAQ,CACJn4E,KAAM,QACNuN,YAAa,6DACb/C,MAAO,CACHxK,KAAM,SACNqC,WAAY,CACRsO,IAAK,CACD3Q,KAAM,SACNuN,YAAa,sBAEjB4C,MAAO,CACHnQ,KAAM,SACNuN,YAAa,gBAEjBvN,KAAM,CACFA,KAAM,SACNwB,KAAM,CAAC,MAAO,OAAQ,QACtB+L,YAAa,qCAEjBvJ,MAAO,CACHhE,KAAM,SACNuN,YAAa,kBAEjBisE,QAAS,CACLx5E,KAAM,SACNwB,KAAM,CAAC,OAAQ,SACf+L,YAAa,uBAEjB7H,IAAK,CACD1F,KAAM,UACNuN,YAAa,uCAGrB0qD,SAAU,CAAC,SAGnBugB,MAAO,CACHx4E,KAAM,SACNuN,YAAa,uBACblL,WAAY,CACRqC,KAAM,CACF1E,KAAM,SACNqC,WAAY,CACR8N,MAAO,CAAEnQ,KAAM,YAGvB0wB,MAAO,CACH1wB,KAAM,SACNqC,WAAY,CACR8N,MAAO,CAAEnQ,KAAM,cAK/BwN,QAAS,CACLxN,KAAM,SACNuN,YAAa,gBACblL,WAAY,CACRo4E,QAAS,CACLz6E,KAAM,UACNuN,YAAa,oBAEjB2sE,cAAe,CACXl6E,KAAM,UACNuN,YAAa,8BAEjBk6B,YAAa,CACTznC,KAAM,UACNuN,YAAa,gCAEjB23E,kBAAmB,CACfllF,KAAM,UACNuN,YAAa,mBAEjBwtE,YAAa,CACT/6E,KAAM,SACNuN,YAAa,mDAEjB0tE,WAAY,CACRj7E,KAAM,UACNuN,YAAa,mCAEjBwuE,WAAY,CACR/7E,KAAM,SACNuN,YAAa,4CAEjByuE,SAAU,CACNh8E,KAAM,SACNuN,YAAa,2CAK7B0qD,SAAU,CAAC,QAAS,UAOfouB,GAA4B,0qCAqClC,SAASC,GAAehZ,GAE3B,GAAqB,cAAjBA,EAAKqJ,QAAyB,CAE9B,IADiBrJ,EACHA,KACV,MAAM,IAAIriD,MAAM,+DAGpB,MAAO,gBADMvf,KAAKC,UAAU2hE,EAAM,KAAM,YAE5C,CAEA,MAAMiZ,EAAejZ,EACrB,KAAKiZ,EAAapP,OAAUoP,EAAajyE,MAASiyE,EAAavO,MAASuO,EAAapO,QACjF,MAAM,IAAIltD,MAAM,2EAEpB,IAAKzjB,MAAMkT,QAAQ6rE,EAAajyE,MAC5B,MAAM,IAAI2W,MAAM,6CAEpB,IAAKzjB,MAAMkT,QAAQ6rE,EAAapO,SAA0C,IAA/BoO,EAAapO,OAAO/rE,OAC3D,MAAM,IAAI6e,MAAM,wDAIpB,MAAO,gBADMvf,KAAKC,UAAU2hE,EAAM,KAAM,YAE5C,CAKO,SAASkZ,GAAkBC,GAC9B,MAAMC,EAAkB,gCAClBC,EAAQ,GACd,IAAI5kD,EACJ,KAAoD,QAA5CA,EAAQ2kD,EAAgB1kD,KAAKykD,KACjC,IACI,MAAMnZ,EAAO5hE,KAAK+qB,MAAMsL,EAAM,IAC9B4kD,EAAM70E,KAAKw7D,EACf,CACA,MAAO7jE,GACH+I,QAAQ2d,KAAK,8BAA+B1mB,EAChD,CAEJ,OAAOk9E,CACX,CCpnBO,SAASC,IAAsBvnF,SAAEA,EAAQwiD,SAAEA,IAC9C,OAAIglC,GACOtnF,EAAKsnF,GAAuB,CAAEhlC,SAAUA,EAAUxiD,SAAUA,IAG5DE,EAAKunF,GAAe,CAAEC,kBAAmBllC,EAAUxiD,SAAUA,GAE5E,CACA,IAAIwnF,GAAwB,KACrB,SAASG,GAA0BC,GACtCJ,GAAwBI,CAC5B,CCVO,SAASC,IAAmB7nF,SAAEA,IACjC,OAAQE,EAAKqnF,GAAuB,CAAE/kC,SAAUslC,GAAoB9nF,SAAUA,GAClF,CACA,SAAS8nF,IAAmB1rE,MAAEA,IAC1B,OAAQ3b,EAAMqpD,GAAY,CAAEn9C,OAAQ,QAASnL,MAAO,iCAAkCxB,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAAC,8IAAoJE,EAAK,IAAK,CAAEC,UAAW,YAAa8J,KAAM,gCAAiCjK,SAAU,2BAA6B,OAASoc,GAAOhW,SACxZlG,EAAK,OAAQ,CAAEC,UAAW,6CAA8CH,SAAUoc,EAAMhW,YACxG,CCPO,SAAS2hF,IAAiB/nF,SAAEA,IAC/B,OAAQE,EAAKqnF,GAAuB,CAAE/kC,SAAUwlC,GAAkBhoF,SAAUA,GAChF,CACA,SAASgoF,IAAiB5rE,MAAEA,IACxB,OAAQlc,EAAK,KAAM,CAAEF,SAAUS,EAAM,KAAM,CAAE2iD,QAAS,IAAKpjD,SAAU,CAACE,EAAK,OAAQ,CAAEC,UAAW,UAAWH,SAAU,wBAA0BE,EAAK,KAAM,CAAA,GAAKA,EAAK,OAAQ,CAAEC,UAAW,cAAeH,SAAUoc,GAAOhW,cAC7N,CCLO,SAAS6hF,IAAoBjoF,SAAEA,IAClC,OAAQE,EAAKqnF,GAAuB,CAAE/kC,SAAU0lC,GAAqBloF,SAAUA,GACnF,CACA,SAASkoF,IAAoB9rE,MAAEA,IAE3B,OADAjJ,QAAQC,IAAI,cAAegJ,GACnB3b,EAAM,MAAO,CAAEN,UAAW,UAAWH,SAAU,CAAC,iDAAkDoc,GAAOhW,SACrGlG,EAAK,MAAO,CAAEF,SAAUoc,EAAMhW,YAC9C,CCHO,SAAS+hF,IAAqBhoF,UAAEA,EAASH,SAAEA,EAAQwB,MAAEA,EAAK0M,YAAEA,EAAWo2D,QAAEA,EAAO8jB,YAAEA,EAAWC,UAAEA,GAAY,EAAKC,sBAAEA,GAAwB,IAC7I,MAAM5zD,EAAWC,KACjB,SAAS4zD,EAAY/mF,GACjB,OAAOA,EACFmY,QAAQ,QAAS,KACjBmC,MAAM,KACN/a,IAAIynF,GAAQC,GAAWD,IACvBltE,KAAK,IACd,CACA,MAAMotE,EAAwBvuD,IAC1B,MAAMlwB,EAAOkwB,GAAOlwB,MAAQ,GAC5B,IAAKA,EACD,MAAO,OACX,MACM0+E,EADY1+E,EAAK6R,MAAM,KAAK,GAAGA,MAAM,KAAK,GACjBA,MAAM,KAAKO,OAAQ03B,GAAYA,EAAQhnC,OAAS,GAC/E,GAA4B,IAAxB47E,EAAa57E,OAAc,CAC3B,GAAIotB,EAAM34B,QAAUyvB,SAASzvB,OAAS24B,EAAM34B,MACxC,OAAO24B,EAAM34B,MAGjB,MAAO,GAAG+mF,EADYI,EAAa,kBACgBA,EAAa,GAAGzpE,OAAM,KAC7E,CACK,OAAIypE,EAAa57E,QAAU,EACrBw7E,EAAYI,EAAaA,EAAa57E,OAAS,IAEzB,IAAxB47E,EAAa57E,OACXw7E,EAAYI,EAAa,IAE7B,QAmCLC,EAhCuB,MACzB,MAAMz9E,EAAQ,GAEd,GAAIm9E,GAA2C,oBAAX/+E,QAA0BA,OAAOqhB,QAAQ5G,OAAO6kE,aAAc,CAC9F,MAAMA,EAAet/E,OAAOqhB,QAAQ5G,MAAM6kE,aAC1CA,EAAah0E,QAAQ,CAACslB,EAAOrxB,KACzB,MAAMggF,EAAYD,EAAa97E,OAASjE,EACxCqC,EAAMsH,KAAK,CACP3B,MAAO43E,EAAqBvuD,GAC5BlwB,KAAMkwB,EAAMlwB,KACZ5G,QAAS,IAAMqxB,EAASyF,EAAMlwB,KAAM,CAAE6+E,UAAWA,OAG7D,CAiBA,OAfIV,GAAeA,EAAYr7E,OAAS,GACpCq7E,EAAYvzE,QAASk0E,IAEjB,MAAMj4E,EAA+C,iBAAhCi4E,GAAYpuE,OAAO3a,SAClC+oF,EAAWpuE,MAAM3a,SACjB,OACNmL,EAAMsH,KAAMs2E,GAAYpuE,OAAO1Q,KAAQ,CACnCA,KAAM8+E,GAAYpuE,OAAO1Q,KACzB6G,MAAOA,EACPzN,QAAS,IAAMqxB,EAASq0D,EAAWpuE,MAAM1Q,KAAM,CAAE0P,QAASovE,EAAWpuE,MAAMquE,oBAC3E,CACAl4E,MAAOA,MAIZ3F,GAEa89E,GACxB,OAAQxoF,EAAM,MAAO,CAAEN,UAAWmC,EAAK+lF,EAAY,OAAS,OAAQ,oBAAqBloF,GAAYH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,yBAA0BH,SAAU,CAACS,EAAM,MAAO,CAAEN,UAAW,wEAAyEH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,oCAAqCH,SAAU4oF,EAAgB77E,OAAS,GAAM7M,EAAKgpF,GAAa,CAAE/xE,KAAMyxE,EAAiBO,UAAWjpF,EAAK6L,GAAc,CAAE5L,UAAW,gBAAkBipF,SAAU,MAAU3oF,EAAM,MAAO,CAAEN,UAAW,0BAA2BH,SAAU,CAACE,EAAK,KAAM,CAAEC,UAAW,kCAAmCH,SAAUwB,IAAU0M,GAC3mBhO,EAAK6Q,EAAU,CAAE7C,YAAaA,EAAalO,SAAUE,EAAKiY,GAAM,CAAEhY,UAAW,8BAAmCD,EAAK,MAAO,CAAEC,UAAW,wBAAyBH,SAAUskE,OAAgBtkE,GAAYE,EAAK,MAAO,CAAEC,UAAW,2BAA4BH,SAAUA,MAC/S,CCvEO,SAASqpF,OACZ,OAAQ5oF,EAAM,MAAO,CAAEN,UAAW,oBAAqBH,SAAU,CAACE,EAAK,KAAM,CAAEC,UAAW,kCAAmCH,SAAU,QAAUE,EAAK,IAAK,CAAEC,UAAW,WAAYH,SAAU,qBAClM,CCHO,SAASspF,MAASC,GACrB,MAAMvkD,EAAI78B,MAAMgJ,KAAKo4E,GAErB,OADAvkD,EAAEwkD,WAAY,EACPxkD,CACX,CACO,SAASykD,MAASF,GACrB,OAAOphF,MAAMgJ,KAAKo4E,EACtB,CACO,SAASG,GAAQH,GACpB,OAAiC,IAA1BA,EAAYC,SACvB,CCLO,MAAMG,GACTC,aACAC,MACAN,YACA,WAAA1lE,CAAYo0C,EAAS4xB,GACjB,IAAK5xB,EAAQ6xB,UACT,MAAM,IAAIl+D,MAAM,uCAEpB7H,KAAK6lE,aAAeC,EACpB,MAAME,EAAY,IAAIn6E,IAAIqoD,EAAQ6xB,UAAUE,eAAiB,IAC7D,GAAI/xB,EAAQ6xB,UAAUG,cAClB,IAAK,MAAM3rC,KAAQ2Z,EAAQ6xB,UAAUG,cACjCF,EAAUn5E,IAAI0tC,GAGtBv6B,KAAK8lE,MAAQE,EAEb,MAAMhpF,EAAM,CAAA,EACZ,IAAK,MAAMu9C,KAAQurC,EACf9oF,EAAIu9C,EAAKh+C,MAAQg+C,EAAKirC,YAE1B,MAAMA,EAAc,IAAI35E,IACxB,IAAK,MAAM0uC,KAAQyrC,EAAW,CAC1B,MAAMG,EAAkBnpF,EAAIu9C,GAC5B,GAAI4rC,EACA,IAAK,MAAMC,KAAcD,EACrBX,EAAY34E,IAAIu5E,EAG5B,CACApmE,KAAKwlE,YAAcA,CACvB,CACA,aAAAa,CAAcD,GACV,GAA0B,iBAAfA,EACP,OAAOpmE,KAAKwlE,YAAYj5E,IAAI65E,GAE3B,GAAIT,GAAQS,GACb,OAAOA,EAAWttE,KAAKmoB,GAAKjhB,KAAKwlE,YAAYj5E,IAAI00B,IAGjD,IAAK,MAAMA,KAAKmlD,EACZ,IAAKpmE,KAAKwlE,YAAYj5E,IAAI00B,GACtB,OAAO,EAGf,OAAO,CAEf,EAEC,MAACqlD,GAAyBphF,OAAcgE,GAEtC,SAASq9E,KACZ,MAAMC,EAAQnhF,EAAWihF,IACzB,IAAKE,EACD,MAAM,IAAI3+D,MAAM,uEAEpB,OAAO2+D,CACX,CACO,SAASC,IAAuBxqF,SAAEA,IACrC,MAAMi4D,EAAU7+C,MACVnE,KAAEA,EAAImH,MAAEA,EAAK1N,UAAEA,GAAcm6B,EAAS,IACpCovB,EAAQ1f,KACD0f,EAAQ9+C,OAAOw/B,IAAIkxC,MAAMxvB,OAGzB7+C,QAAQqN,aAAQ5b,GAE5B,CAACgrD,EAAQ1f,OACNgyC,EAAQvoF,EAAQ,IACdi2D,EAAQ6xB,WAAa70E,IAASvG,EACvB,IAAIi7E,GAAgB1xB,EAAShjD,QAGpC,EAEL,CAACgjD,EAAShjD,EAAMvG,IACnB,OAAI0N,EACOlc,EAAKyoC,EAAU,CAAEnnC,MAAO,gCAAiCxB,SAAUoc,EAAMhW,UAE7EmkF,GAAUrqF,EAAKmqF,GAAuBtgF,SAAU,CAAEnJ,MAAO2pF,EAAOvqF,SAAUA,GACrF,CClFO,SAASyqF,IAAaN,WAAEA,EAAUr1B,WAAEA,EAAUtzD,MAAEA,EAAKxB,SAAEA,KAAaquD,IAOvE,OANci8B,KACcF,cAAcD,KAEtCr1B,GAAa,EACbtzD,EAAQ,qDAEJtB,EAAKgM,EAAQ,CAAE4oD,WAAYA,EAAYtzD,MAAOA,KAAU6sD,EAAQruD,SAAUA,GACtF,CCRO,SAAS0qF,IAAkBP,WAAEA,KAAe97B,IAG/C,OAFci8B,KACcF,cAAcD,GAK9BjqF,EAAKyqF,GAAa,IAAKt8B,IAHxB,IAKf,CCPO,SAAS7U,IAAWjB,KAAEA,IAUzB,OAAQ93C,EAAM,MAAO,CAAEN,UAAW,oBAAqBH,SAAU,CAACE,EAAK,MAAO,CAAEC,UAAW,UAAWH,SATlF,MAChB,GAAKu4C,EAAK6B,QAKN,OAAOl6C,EAAK,MAAO,CAAEC,UAAW,oCAAqCmJ,IAAKivC,EAAK6B,QAAStwC,IAAKyuC,EAAKj4C,OALnF,CACf,MAAMsqF,EAAWryC,EAAKj4C,KAAKwb,MAAM,KAAK/a,IAAK02E,GAAMA,EAAE,IAAIn8D,KAAK,IAC5D,OAAOpb,EAAK,OAAQ,CAAEC,UAAW,6EAA8EH,SAAUE,EAAK,OAAQ,CAAEC,UAAW,8CAA+CH,SAAU4qF,KAChN,GAK4GC,KAAkBpqF,EAAM,MAAO,CAAEN,UAAW,OAAQH,SAAU,CAACE,EAAK,IAAK,CAAEC,UAAW,iFAAkFH,SAAUu4C,EAAKj4C,MAAQ,iBAAmBJ,EAAK,IAAK,CAAEC,UAAW,kFAAmFH,SAAUu4C,EAAK2B,OAAS,sBACxc"}
|